Ver Mensaje Individual
  #6  
Antiguo 12-11-2007
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Reputación: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡Hola a todos!

Cita:
Empezado por Gran Cacique Ver Mensaje
Tengo un tClientDatset dentro de una transaccion, pero a pesar de estar dentro de la transaccion se ejecuta cuando le hago applyupdate, y no al hacer el commit. ¿Acaso no sirve colocar dentro de una transaccion el applyupdate? De antemano, muchas gracias
El método TClientDataSet.ApplyUpdates envía los cambios al servidor, los cuales todavía tienes oportunidad de deshacer revirtiendo (rollback) la transacción. El revertir (rollback) una transacción sólo aplica a la capa de la base de datos, por lo que después de esa operación resulta necesario refrescar el conjunto de datos (método Refresh), si quieres que éste muestre información acorde a la transacción revertida.

No es una solución muy agradable que digamos porque esto implica volver a cargar todas sus filas. De ahí que hace tiempo me dediqué a desarrollar un derivado de TClientDataSet, donde después de llamar a ApplyUpdates todavía puedes decirle que regrese a un estado previo (para ello le agregué un parámetro "ConfirmSuccess" a ApplyUpdates).

El truco está en usar los puntos de restauración (save points) nativos de la clase TClientDataSet y en evitar la llamada a MergeChangeLog que ApplyUpdates realiza internamente.

En mi caso, lo implementé de tal forma que cuando hago un Rollback, se revierten también todos los ApplyUpdates que previamente hayan sido "marcados" en el contexto de la transacción. Es decir, logro manejar transacciones multi-capa.

Un abrazo.

Al González.
Responder Con Cita