Ver Mensaje Individual
  #10  
Antiguo 27-01-2009
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Reputación: 22
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
CommitRetaining es diferente a Commit.

CommitRetaining graba los datos, pero no libera la transacción. La sigue manteniendo abierta. Esto es útil en el caso de que estés entrando el detalle de una factura, por ejemplo. Después de cada línea haces un CommitRetaining y sigues insertando.

Si haces un Commit, la transacción graba los datos y finaliza. Para poder insertar otro dato tendrás que abrir otra. La contrapartida de esto, es que si haces un Commit después de cada línea de la factura, se cerrará el dataset y deberás volver a abirlo y posicionarte en el último registro.

Si solo deseas insertar, creo que deberías hacerlo más o menos así:

Código Delphi [-]
procedure TDMFactura.Insertar(Dato : string);
var
  Q : TFIBQuery;
begin
   {Creo el Query}
   Q := TFIBQuery.Create(nil);
   with Q do
   begin
      Close;
      DataBase := DMMain.DataBase ;
      {Creo la transacción del Query}
      Transaction := TFIBTransaction.Create(nil);
      Transaction.TRParams.Add('read_committed');
      Transaction.TRParams.Add('rec_version');
      Transaction.TRParams.Add('nowait');
      Transaction.DefaultDataBase := DMMain.DataBase;

      {Comieza transaccion}
      Transaction.StartTransaction;

      SQL.Text := 'insert into tabla (dato) values (?dato)';
      Params.ByName['DATO'].AsString := Dato;
      ExecQuery;

      {Finaliza transaccion}
      Transaction.Commit;
   end;

   {Libero el Query creado}
   FreeAndNil(Q);
end;

Última edición por duilioisola fecha: 27-01-2009 a las 18:53:44.
Responder Con Cita