| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
el diego Master


Registrado: 23 Ago 2002Mensajes: 232Ubicación: Paris
|
Publicado: Mar 17 Sep, 2002 11:46 am Asunto: Ayuda con ADO y MS Access |
|
|
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 |
|
 |
tecno Invitado
|
Publicado: Jue 19 Sep, 2002 12:59 pm Asunto: |
|
|
¡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.  |
|
| Volver arriba |
|
 |
el diego Master


Registrado: 23 Ago 2002Mensajes: 232Ubicación: Paris
|
Publicado: Jue 19 Sep, 2002 1:18 pm Asunto: |
|
|
Hola Tecno, no te preocupes, aunque un poco te extrañé estos dias .
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 |
|
 |
tecno Invitado
|
Publicado: Jue 19 Sep, 2002 3:30 pm Asunto: |
|
|
¡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.  |
|
| Volver arriba |
|
 |
el diego Master


Registrado: 23 Ago 2002Mensajes: 232Ubicación: Paris
|
Publicado: Jue 19 Sep, 2002 4:02 pm Asunto: |
|
|
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 |
|
 |
tecno Invitado
|
Publicado: Jue 19 Sep, 2002 4:28 pm Asunto: |
|
|
¡Hola!
Esta es mi dirección de correo: apgperi@terra.es
¿Has probado lo del UpdateBatch()?
Salu2.  |
|
| Volver arriba |
|
 |
el diego Master


Registrado: 23 Ago 2002Mensajes: 232Ubicación: Paris
|
Publicado: Vie 20 Sep, 2002 8:41 am Asunto: |
|
|
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 |
|
 |
el diego Master


Registrado: 23 Ago 2002Mensajes: 232Ubicación: Paris
|
Publicado: Vie 20 Sep, 2002 9:30 am Asunto: |
|
|
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 |
|
 |
tecno Invitado
|
Publicado: Vie 20 Sep, 2002 1:48 pm Asunto: |
|
|
¡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.  |
|
| Volver arriba |
|
 |
tecno Invitado
|
Publicado: Vie 20 Sep, 2002 1:50 pm Asunto: |
|
|
¡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
Nos vemos or aquí. Salu2 |
|
| Volver arriba |
|
 |
|