Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   como saber transacciones pendientes (https://www.clubdelphi.com/foros/showthread.php?t=80394)

mRoman 25-09-2012 00:13:04

como saber transacciones pendientes
 
Hola amigos....

Estoy investigando acerca de como saber que transacciones tengo pendientes, para notificarle al usuario que existen transacciones pendientes que no se han confirmado.

Como hacer esto?, ....como saber si tengo transacciones pendientes?

He visto en google acerca current_transaction....sigo investigando !!!...

Saludos.

Casimiro Notevi 25-09-2012 00:40:50

Hola, no creo que sea práctico informar a un usuario de las transacciones pendientes, lo asustarás y no comprenderá nada.
En todo caso, si por ejemplo, el usuario está dando de alta un cliente y le da a "salir" sin haber "aceptado/guardado", sacar un aviso indicándoselo al usuario, el típico: "¿Salir sin guardar? --Sí-- --No--
Para ello sólo has de consultar la propiedad InTransaction del componente Transaction, algo así como:

Código Delphi [-]
if dataset.transaction.intrasaction then
  // preguntar aquí qué hacer
else
  close;

movorack 25-09-2012 00:44:09

Hola mRoman

No manejo hace mucho IB y estoy desactualizado pero entre los componentes de IB siempre hay un objeto de Transaccion (IBTransaction) con la propiedad InTransaction.

Esta propiedad te permite saber si hay una transaccion pendiente y puedas realizar la acción necesaria.

Cita:

Examine InTransaction at run-time to determine if a database transaction is currently in progress. InTransaction is true if a transaction is in progress, false otherwise.

The value of InTransaction cannot be changed directly. Calling StartTransaction sets InTransaction to true. Calling Commit or Rollback sets InTransaction to false.
Documentación de embarcadero

Edito: Ya Casimiro te dió la misma respuesta :D

mRoman 25-09-2012 05:45:37

Ok...les agradezco a ambos las respuestas que me dieron. Pondré en practica y luego les informo el resultado....

ecfisa 25-09-2012 06:27:36

Hola mRoman.

Si tenes más de un IBTransaction que dependen de un IBDatabase y deseas trabajar con el conjunto de ellos, podes usar las propiedades TransactionCount y Transactions de este último componente.

A modo de ejemplo, este código pone inactivos a todos los IBTransactions activos relacionados con un IBDatabase:
Código Delphi [-]
...
var
  i: Integer;
begin
  with IBDatabase1 do
    for i:= 0 to TransactionCount-1 do
      if Transactions[i].InTransaction then
        Transactions[i].Active:= False;
end;

Saludos.

ElMug 25-09-2012 06:59:34

En mi ver, lo mas prudente es que en una transaccion se compelete lo acometido o se haga roll-back.

Y con el cogigo no dar posibilidades de que haya transacciones pendientes.

Aunque si la pregunta fuese del total de transacciones pendientes de TODOS los usuarios, creo que eso no se ha abordado en las respuestas.

Y precisamente, por eso, es que cada usuario no pueda tener mas de una transaccion pendiente.

Pero me gustaria saber de casos en los cuales se requiera eso.

mRoman 26-09-2012 05:25:25

Les agradezco las respuestas de ecfisa, elmug y de casimiro asi como de movorack y comentarles que ya lo solucione gracias a sus comentarios, los cuales aplique y me queda con la sugerencia de casimiro. En realidad es mas sencillo de lo que propone ElMug, lo que realmente necesitaba era solamente "avisarle" al usuario que se estaba saliendo sin grabar los movimientos realizados.

Total....asi quedo:
Código Delphi [-]
     if dsUnidadOperativa.Transaction.InTransaction then
     begin
        if Application.MessageBox('Desea GUARDAR los movimientos realizados?','Pregunta',mb_YesNo+mb_IconQuestion)=idYes then
        begin
            DataModule2.trsCasas.Commit;
        end Else
        begin
            DataModule2.trsCasas.Rollback;
            Action:=caFree;
        end;
     end;

Gracias a todos....Saludos !

Casimiro Notevi 26-09-2012 07:57:41

Cita:

Empezado por mRoman (Mensaje 445422)
Código Delphi [-]
if dsUnidadOperativa.Transaction.InTransaction then      
begin         
  if Application.MessageBox('Desea GUARDAR los movimientos realizados?','Pregunta',mb_YesNo+mb_IconQuestion)=idYes then         
  begin             
    DataModule2.trsCasas.Commit;         
  end 
  Else         
  begin             
    DataModule2.trsCasas.Rollback;             
    Action:=caFree;         
  end;      
end;

Y si el usuario contesta que sí, que se graben los cambios, haces commit y... ¿el Action:=caFree? :confused:

mRoman 27-09-2012 19:35:30

Uppss
 
jajaja....tienes razon !!!.....bueno, "Al mejor cazador se le va la liebre"....
entonces quedaria asi:
Código Delphi [-]
if dsUnidadOperativa.Transaction.InTransaction then      
begin         
  if Application.MessageBox('Desea GUARDAR los movimientos realizados?','Pregunta',mb_YesNo+mb_IconQuestion)=idYes then         
  begin             
    DataModule2.trsCasas.Commit;         
  end 
  Else         
  begin             
    DataModule2.trsCasas.Rollback;             
//    Action:=caFree;         (Este no va aqui)
  end;      
  Action:=caFree;
end;

Casimiro Notevi 27-09-2012 19:53:06

Tampoco puede ir ahí :)

Supongo que si pones Action := caFree; es porque ese form lo has creado tú en tiempo de ejecución y tienes que liberarlo, en caso contrario no hace falta.
Pero de todas formas en ese código que has puesto, imagina que dsUnidadOperativa.Transaction.InTransaction es False, (que no hay ninguna transacción), ¿qué ocurriría?, que no se ejecutaría el Action := caFree;
Por lo tanto, debes sacarlo fuera de ese condicionante.

Código Delphi [-]
begin
  if dsUnidadOperativa.Transaction.InTransaction then 
  begin            
    if Application.MessageBox('Desea GUARDAR los movimientos realizados?','Pregunta',mb_YesNo+mb_IconQuestion)=idYes then            
      DataModule2.trsCasas.Commit
    else            
      DataModule2.trsCasas.Rollback;
  end;
  Action:=caFree;
end;

mRoman 30-09-2012 08:36:31

Ok....casimiro....tienes razón....Gracias ! por el Tip !

Leopard2 16-10-2012 17:29:48

Una consulta, que el IBTransaction tenga la propiedad DefaultAction en TACommit no es igual a un Commit automatico ?
Saludos


La franja horaria es GMT +2. Ahora son las 00:55:05.

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