![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
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 |
#2
|
||||
|
||||
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 |
#3
|
||||
|
||||
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 ! |
#4
|
|||
|
|||
![]() 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?? |
#5
|
||||
|
||||
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 |
#6
|
||||
|
||||
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 ! |
![]() |
|
|
![]() |
||||
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 |
![]() |
|