Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Ayuda con ADO y MS Access

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Ayuda con ADO y MS Access Responder citando

Estimado, necesito algo de ayuda para solucionar un problema con el manejo de tablas de access 2000 utilizando ADO.
Paso a detallar el codigo que estoy utilizando:

Aqui va la parte de la conexion:
Código:
CadenaConexion = "Persist Security Info=False;Extended Properties=\"DBQ=" ;
CadenaConexion +=  NomPathBase; //ej: "C:\\Proyecto\\mibase.mdb""
CadenaConexion +=  ";DRIVER=Microsoft Access Driver (*.mdb)\"";
cnnConexion->ConnectionString = CadenaConexion;
cnnConexion->LoginPrompt = false;
cnnConexion->ConnectionTimeout =15;
cnnConexion->KeepConnection = true;
cnnConexion->Open();


Aqui va la parte de la consulta:
Código:
ADOQuery1->Connection = frmMain->cnnConexion;
ADOQuery1->LockType = ltBatchOptimistic;
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("SELECT A.ID, LA.IDAutor, LA.IDAutorOld, A.NombreCompleto, LA.IDLibro, A.IDOld");
ADOQuery1->SQL->Add("FROM tblAutor A") ;
ADOQuery1->SQL->Add("INNER JOIN tblLibroAutor LA ON A.IDOld = LA.IDAutorOld");
ADOQuery1->SQL->Add("WHERE  A.ID <> LA.IDAutor");
ADOQuery1->SQL->Add("ORDER BY A.NombreCompleto, LA.IDLibro");

ADOQuery1->Open();

DataSource1->DataSet = ADOQuery1;
DBGrid1->DataSource = DataSource1;


Finalmente me propongo hacer una modificacion en todol los datos de esta consulta evaluandolos dentro de un bucle:

Código:
ADOQuery1->First();
while (! ADOQuery1->Eof)
   {
   i++;
   ADOQuery1->Edit();
   ADOQuery1->FieldByName("IDAutor")->AsInteger = ADOQuery1->FieldByName("ID")->AsInteger ;
   ADOQuery1->UpdateRecord();
   ADOQuery1->Next();
   }
ADOQuery1->Requery();

El Query se actualiza bien, pero no asi en la base de datos. Luego de hacer el Requery() compruebo que los datos no fueron actualizados en la base de datos.
Aquí estoy parado desde la semana pasada y no sé que hacer.
Escucho todo tipo de sugerencias.

gracias y saludos
diego
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

¡Hola!

Perdona que te dejara de responder repentinamente. Me surgió un viaje a Italia (soy español) y volví ayer. Fue repentino, por eso no caí en avisarte.

He estado mirando la ayuda y creo que el problema viene por usar el método "UpdateRecord()", que no refleja los cambios realizados en la base de datos. Utiliza en su lugar el método "Post()". Si no funciona, dilo y seguimos mirándo qué es lo que pasa.

Salu2 y perdona por dejarte colgado. Wink
Volver arriba
Mensaje    Asunto: Responder citando

Hola Tecno, no te preocupes, aunque un poco te extrañé estos dias Laughing.
Lamentablemente tampoco funciona con el método Post(). Esto ya me tiene frustrado, por eso escribi un nuevo mensaje, porque tal vez encaré mal el uso de ADO. No se si es mas apropiado el uso de tablas o si está bien como lo estoy intentando hacer desde el Query. En fin, espero poder llegara buen puerto.

saludos
diego
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

¡Hola!

Creo que ya tengo la solución (eso espero, porque se me acaban las ideas). La query la has abierto con un bloqueo (LockType) de tipo "ltBatchOptimistic". Para que luego se reflejen los datos en la base de datos has de llamar al método "UpdateBatch()". Tu código quedaría así:

ADOQuery1->First();
while (! ADOQuery1->Eof)
{
i++;
ADOQuery1->Edit();
ADOQuery1->FieldByName("IDAutor")->AsInteger = ADOQuery1->FieldByName("ID")->AsInteger ;
ADOQuery1->UpdateRecord();
ADOQuery1->Next();
}
ADOQuery1->UpdateBatch();
ADOQuery1->Requery();

Quizás por eso a mi me funciona tu código, porque yo uso el bloqueo "ltOptimistic".
Mira en la ayuda la explicación que tiene sobre este método.

Ya me contarás.Salu2. Wink
Volver arriba
Mensaje    Asunto: Responder citando

Hola,
Cambie el LockType de ltBatchOptimistic a ltOptimistic pero me da error al llegar a ADOQuery1->Next(). El mensaje de error es 'Informacion de columna clave insuficiente para realizar la operacion Update o Refresh'.
Este era el cambio que habia hecho la semana pasado (la de pasarlo a ltBatchOptimistic).
Revisé las relaciones de las tablas utilizadas y no detecto cual es el problema. Lo unico que se me ocurre es mandarte el archivo de access para ver si a vos te anda.

saludos
diego
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

¡Hola!

Esta es mi dirección de correo: apgperi@terra.es

¿Has probado lo del UpdateBatch()?

Salu2. Wink
Volver arriba
Mensaje    Asunto: Responder citando

hola, si ya habia probado con el UpdateBatch(). Creo que el problema esta en la "complegidad" de la consulta (son dos tablas) o en la base de datos. Ya te mandé la base.

saludos y gracias
diego
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

bueno Tecno. Problema solucionado. efectivamente era un problema entre la consulta y la base. A la tabla tblLibroAutor (que relaciona cada libro con el o los autores) le agregué un campo de clave promaria autonumerico y agregué dicho campo a la consulta. Con esto funciono perfctamente y actualizo los datos sin problema.

mil gracia spor toda la ayuda.
diego
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

¡Hola Diego!

Por mas vueltas que le doy me sale el mismo error que a tí. Y creo que es por el motivo que dices, eso de coger datos de dos tablas y luego querer actualizar no le sienta bien a ADO. Lo único que se me ocurre para realizar lo que pretendes es, o bien desde un procedimiento almacenado (creo que no se pueden hacer en Access pero no estoy seguro) o bien a mano, es decir, hacer un bucle en el que además de cambiar los valores oportunamente tambien lances un INSERT para que vaya reflejándo los cambios. Lógicamente esto va a ser muy lento, pero si solo lo tienes que hacer una vez yo creo que merece la pena. Otra cosa sería si fuese un proceso a repetir continuamente. Entonces el procedimiento almacenado es la mejor solución que se me ocurre, pero para eso tendrás que cambiar de base de datos (si es que Access no admite procedimientos almacenados).
Siento no poder darte mejores soluciones pero no doy mas de sí.

Salu2. Wink
Volver arriba
Mensaje    Asunto: Responder citando

¡Vaya!, no ví la última respuesta. Me alegro de que lo hayas sacado. Ahora que lo dices me parece obvio, pero no se me ocurrió hacer algo así. Menos mal que uno de los dos piensa de vez en cuando Laughing

Nos vemos or aquí. Salu2
Volver arriba
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.