PDA

Ver la Versión Completa : como saber transacciones pendientes


mRoman
25-09-2012, 00:13:04
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:

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.


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 (http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/IBDatabase_TIBTransaction_InTransaction.html)

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:

...
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:

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
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
jajaja....tienes razon !!!.....bueno, "Al mejor cazador se le va la liebre"....
entonces quedaria asi:
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.

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