Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-03-2007
Neomanar Neomanar is offline
Miembro
 
Registrado: ago 2005
Posts: 18
Poder: 0
Neomanar Va por buen camino
CommitRetaining no funciona!!

HOla a todos!
Tengo un problema que no consigo solucionar y quería compartirlo con ustedes.
En un DataModule tengo mi DB, una transacción asociada y un query (A). Luego tengo un formulario (1) que realiza un browse del query (A) y otro form que permite modificar un registro puntual de la tabla asociada. Cuando el usuario acepta este form de actualización, construyo una sentencia sql que actualiza el registro (IBSQL), la ejecuto (Execquery), luego realizo un CommitRetaining y por ultimo abro y cierro el Query (A) para que sus datos se actualicen. Más tarde llega el problema: al volver al form (1), los datos no se han actualizado. Ahora bien, si cierro la aplicación y la vuelvo a abrir, los datos aparecen modificados correctamente. Es como si guardara la transacción recién al cerrar el programa.
Lo mismo sucede en el caso de las altas y bajas de registros: no se ven los cambios hasta que cierro y abro la aplicación.
Alguna idea? Gracias
Responder Con Cita
  #2  
Antiguo 22-03-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Hola Neomanar:
Te recomiendo que eches un vistazo a este libro y te aclarará algunos conceptos.

Saludos
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #3  
Antiguo 22-03-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Intentaré ayudar en la medida de lo posible ya que no se expone ningún código para ver lo que haces en concreto.

Cuando comentas que 'construyes una sentencia SQL que actualice el registro', sobre qué elemento IBQuery lo realizas ? Sobre el mismo que tienes para la lectura ?

Si es así, en principio bien, pero si no es así, y utilizas un IBQuery diferente para esa sentencia de actualización, te tienes que asegurar que esté relacionado con la misma Transacción que el IBQuery de lectura.

Por otro lado, haz doble click sobre el IBTransaction que tengas y asegúrate del nivel de aislamiento que quieres. En el post anterior se te ha indicado un link que explica muy bien este asunto. Generalmente yo suelo utilizar 'ReadCommited'. Si no lo tienes puesto, una transacción no podrá ver las actualizaciones que realice otra transacción distinta, hasta que no la cierres y vuelvas a abrir, que es lo que al parecer ocurre en tu caso al salir y entrar al programa.

En cualquier caso, la sentencia de lectura, de modificación, de borrado y de refresco, todas las puedes incluir en un mismo IBQuery y te ahorras utilizar varios.

Siempre que todos los forms accedan al mismo IBQuery, en el mismo DataModule, no tendrás que hacer siquiera un CommitRetaining hasta que decidas definitivamente validar toda la información y guardarla definitivamente en tu Base de Datos.

Si tienes más dudas, podrías exponer un poco de código concreto y al o mejor se te puede ayudar mejor.

Saludos
__________________
Piensa siempre en positivo !
Responder Con Cita
  #4  
Antiguo 22-03-2007
Neomanar Neomanar is offline
Miembro
 
Registrado: ago 2005
Posts: 18
Poder: 0
Neomanar Va por buen camino
Unhappy No hay caso

Gracias por sus respuestas, pero lamentablemente no pude solucionarlo.
El query (QUsers) es sencillo: su SQL es "select * form usuarios".
A este query lo uso para mostrar la lista de usuarios en un TListView.
A su vez, en el form donde muestro dicho ListView tengo un TIBSQL cuya propiedad SQL la completo segun quiera insertar, borrar o modificar. A continuación los códigos:
FUsers.IBSQL.SQL.Clear;
FUsers.IBSQL.SQL.Add('UPDATE USUARIOS');
FUsers.IBSQL.SQL.Add('SET USERID='''+EUserId.Text+
''',APELLIDO='''+EApellido.Text+
''',NOMBRES='''+ENombres.Text+'''');
FUsers.IBSQL.SQL.Add('WHERE USERID='''+OrigKeyValue+'''');
end;
FUsers.IBSQL.ExecQuery;
dm_Users.TRUsers.CommitRetaining;
FUsers.QUsers.Active:=false; FUsers.QUsers.Active:=true;

donde:
QUsers es el IBQuery de la consulta
dm_users es el data module donde está la base de datos y el IBTransaction
TRUsers es la transacción a la que apuntan tanto el IBQuery como el IBSql

Todos los componentes apuntan a la misma transacción. Luego de este código en el que refresco el contenido de QUsers, borro el contenido del ListView y recorro secuencialmente QUsers para agregar los usuarios existentes, con los cambios realizados. Es aquí donde el ListView me vuelve a mostrar los datos originales, y sólo cerrando la aplicación y volviéndola a abrir puedo ver los datos actualizados. Les sirve esta info??
Responder Con Cita
  #5  
Antiguo 22-03-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
A la vista de que posteriormente cierras y abres el Query, es mejor que utilices
Commit en vez de CommitRetaining.
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #6  
Antiguo 22-03-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
No he utilizado nunca el TIBSQL, pero a primera vista parece que debería de funcionar como lo has puesto.

Asegúrate que verdaderamente ambos elementos apuntan a la misma transacción y que no lo cambias en alguna parte de tu código.

Si realmente está todo bien, y apuntan a la misma transacción, todo el proceso debe de funcionar sin tener que hacer siquiera un commitretaining de la transacción.

Algo debe de estar fallando por otro lado.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #7  
Antiguo 23-03-2007
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
rsp

Hay que tener mucho cuidado con el uso del comi retaining.

No lo uses solo para mantenr los datos que acaban d e modificar para eso arreglen la sentencia sql o verifiquen bien las propiedades del query que se encargaan de ubicarse en el registro despues de guardar.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #8  
Antiguo 10-01-2008
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
como esta configurado el componete TRUsers (la transacción)... haz doble clic y mira que opciones tiene... (wait o no wait, read_commit y otra que no recuerdo)
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #9  
Antiguo 10-01-2008
Avatar de Gaim2205
Gaim2205 Gaim2205 is offline
Miembro
 
Registrado: ago 2007
Ubicación: Durango, Mexico
Posts: 144
Poder: 17
Gaim2205 Va por buen camino
Yo tuve el mismo problema hace algun tiempo, aunque usaba los componentes MDO, y segun recuerdo lo solucioné como dicen los compañeros, utilizando Commit.

Inténtalo
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
IIS no funciona YaninaGenia .NET 2 26-07-2006 14:21:59
Commit - CommitRetaining Luzma Firebird e Interbase 3 27-06-2006 01:58:58
like no funciona ! dmasson Conexión con bases de datos 9 23-03-2004 14:10:50
¿Por qué CommitRetaining funciona después de agregar, pero no después de modificar? Al González Firebird e Interbase 7 16-02-2004 23:47:28
CommitRetaining con IBX Marina Conexión con bases de datos 7 10-08-2003 10:06:04


La franja horaria es GMT +2. Ahora son las 09:31:17.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi