Ir al contenido



Foto

Finalizar transacción Delphi + Firebird

Delphi Firebird

  • Por favor identifícate para responder
5 respuestas en este tema

#1 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 22 abril 2015 - 01:17

Hola a todos, ando por acá con una pregunta...

 

Me encuentro con ésta situación en una aplicación que tengo. Les comento el entorno con el que cuento:

 

Delphi 2007

Base de Datos Firebird 2.5

Conexión mediante DBExpress con la siguiente configuración:

 

CommitRetain=True
WaitOnLocks=True
Interbase TransIsolation=ReadCommited
 
En la base de datos tengo un trigger que se ejecuta BEFORE UPDATE de la tabla. 
 
Resulta que si yo hago, desde mi aplicación, alguna modificación a la tabla, éste cambio no se ve reflejado en la base de datos si no hasta que cierro la aplicación que es cuando se muestra. Si desactivo el trigger, la aplicación refleja sin problemas todos los cambios en la base de datos.
 
Alguna luz que me puedan echar sobre ésto ?  :  :  :  :
 
Saludox ! :)

  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 22 abril 2015 - 07:10

¿Cómo haces las actualizaciones desde Delphi? Con un SP?, con un ApplyUdtates? Utilizas DatasetProviders?. Con más información se puede llegar al fondo del asunto.

 

Un cordial saludo.


  • 0

#3 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.091 mensajes
  • LocationRepública Dominicana

Escrito 23 abril 2015 - 06:12

Saludos.

 

Abriendo una transacción y cerrándola (Commit) deberías poder ver el cambio con seguridad.


  • 0

#4 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 23 abril 2015 - 06:41

DbExpress normalmente ya controla las transacciones de forma implícita, normalmente no deberías preocuparte por ellas.

 

Es normal que Delphi no vea los cambios ejecutados por un trigger, puesto que esos cambios ocurren directamente en la base de datos. Para que los puedas ver en Delphi tienes que cerrar y volver a abrir tu consulta de datos cada vez que los modificas.


  • 0

#5 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 23 abril 2015 - 08:03

¿Cómo haces las actualizaciones desde Delphi? Con un SP?, con un ApplyUdtates? Utilizas DatasetProviders?. Con más información se puede llegar al fondo del asunto.

 

Un cordial saludo.

 

Para mis conexiones utilizo un SQLQuery + DataSetProvider + ClientDataSet (por aquello de la unidireccionalidad de DBExpress) y con un simple ClientDataSet.Edit; un ClientDataSet.Post; y un ClientDataSet.ApplyUpdates(-1);

 

Cuando hago procesos de inserciones a la base de datos utilizo directamente un SQLQuery.ExecSQL;

 

 

Saludos.

 

Abriendo una transacción y cerrándola (Commit) deberías poder ver el cambio con seguridad.

 

Ya hice ésto y tienes razón, visualizo los cambios perfectamente. Mi pregunta es porqué el Trigger me está impidiendo terminar la transacción porque si lo inactivo mi sistema vuelve a reflejar todos los cambios sin problemas.

 

Mi problema es que temo que tenga que iniciar transacciones con cada POST y cada EXECSQL que quiera hacer a la base de datos para que el famoso Trigger no me afecte  :s

 

 

DbExpress normalmente ya controla las transacciones de forma implícita, normalmente no deberías preocuparte por ellas.

 

Es normal que Delphi no vea los cambios ejecutados por un trigger, puesto que esos cambios ocurren directamente en la base de datos. Para que los puedas ver en Delphi tienes que cerrar y volver a abrir tu consulta de datos cada vez que los modificas.

 

De hecho no me importaría no ver el cambio realizado desde el Trigger ya que actualiza sólo datos de control, pero el problema es que no me deja ver ni los cambios (updates e inserciones) que yo hice desde la aplicación y no sólo en Delphi, si no en la misma base de datos  :|  :|  :| si no hasta que cierro la aplicación que inició la transacción.

 

Les agradezco mucho la ayuda y les actualizo esta información: Se generó el mismo comportamiento del Trigger pero en un SP que se manda llamar desde el Trigger AFTER UPDATE con al parecer buenos resultados hasta el momento. No me gusta tener que buscar soluciones alternas pero el tiempo a veces no me deja seguir investigando.

 

Si alguien pudiera seguir poniendo luz a este asunto, se los agradeceré como siempre  (y)

 

Saludox ! :)


  • 0

#6 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 23 abril 2015 - 09:14

El comportamiento que describes es bastante extraño porque como bien dice Marck el DatasetProvider se encarga de iniciar y terminar la transacción, hay un bug en Delphi 2005 y 2006 que describe un comportamiento parecido y que quizá no haya sido resuelto en Delphi 2007. http://qc.embarcader...in.aspx?d=11148

 

Nunca trabajé con Delphi 2007, creo que Rolphy trabaja o trabajó con esa versión y quizá nos pueda dar pistas, 

 

De momento prueba cambiando CommitRetain=False, y para guardar los cambios en el TClientDataset prueba con algo así a ver que pasa:


delphi
  1. if ClientDataSet.ApplyUpdates(0) >0 then
  2. Abort

luego intercepta el evento OnReconcileError del TClientDataset y coloca esto a ver si logras capturar algún error.


delphi
  1. procedure TForm2.ClientDataSet1ReconcileError(DataSet: TCustomClientDataSet;
  2. E: EReconcileError; UpdateKind: TUpdateKind; var Action: TReconcileAction);
  3. begin
  4. showmessage(E.Message)
  5. end;

No sobra configurar la propiedad Options>PoPropogateChanges del TDatasetProvider a True, esto hará que los cambios realizados durante la resolución de la transacción se propaguen hasta el TClientDataset.

También la propiedad ResolveToDataset debería estar en False.

 

Saludos.


  • 0





Etiquetado también con una o más de estas palabras: Delphi, Firebird