PDA

Ver la Versión Completa : Consulta de principiante por Transactions


Leopard2
14-03-2014, 16:26:58
Hola, estoy trabajando con firebird 2.5 en Delphi y tengo una duda sobre las IBtransactions, la pregunta es si en una rutina donde tengo 3 bases, al grabar tengo que hacer un llamado a transaction por cada base o se puede hacer un transaction por las 3 ? y en el caso de la bases maestro/detalle basta con hacer un transaction al maestro o hay que hacer a ambos (maestro y detalle)
asi es como esta ahora, un transaction por cada base :


Try
Masterdb.Repuestos.Post;
Masterdb.IBTrsc.CommitRetaining;
Except
Masterdb.Repuestos.Cancel;
Masterdb.IBTrsc.RollbackRetaining;
ShowMessage('!ERROR! No se grabo los datos del Repuesto ');
End;
.
.
.
.
try
ExecQuery;
Masterdb.IBTrsc.CommitRetaining;
except
on E: Exception do
begin
Masterdb.IBTrsc.RollbackRetaining;
Application.MessageBox( PChar( E.Message ), 'Error, NO se grabo el Movimiento ', MB_ICONSTOP );
end;


Saludos y gracias por cualquier ayuda.

Casimiro Notevi
14-03-2014, 16:47:31
¿DBX, IBX, ADO, etc.?

Leopard2
14-03-2014, 17:22:02
IBX.
saludos

Casimiro Notevi
14-03-2014, 17:28:33
Entonces, en un datamodule, pones un IBDatabase y un IBTransaction, ambos relacionados entre sí, y se acabó, te olvidas de las transacciones.
Tan solo recuerda que tras hacer un .post debes hacer un transaction.commit / commitretaining en el evento afterpost del query.

Leopard2
15-03-2014, 18:11:38
Ok. gracias por la respuesta pero me queda la duda de como manejar las excepciones en el ejemplo que tu planteas ya que en forma manual hacia el rollback y enviaba un mensaje de aviso :


Try
Masterdb.Repuestos.Post;
Masterdb.IBTrsc.CommitRetaining;
Except
Masterdb.Repuestos.Cancel;
Masterdb.IBTrsc.RollbackRetaining;
ShowMessage('!ERROR! No se grabo los datos del Repuesto ');
End;