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
Q := TFIBQuery.Create(nil);
with Q do
begin
Close;
DataBase := DMMain.DataBase ;
Transaction := TFIBTransaction.Create(nil);
Transaction.TRParams.Add('read_committed');
Transaction.TRParams.Add('rec_version');
Transaction.TRParams.Add('nowait');
Transaction.DefaultDataBase := DMMain.DataBase;
Transaction.StartTransaction;
SQL.Text := 'insert into tabla (dato) values (?dato)';
Params.ByName['DATO'].AsString := Dato;
ExecQuery;
Transaction.Commit;
end;
FreeAndNil(Q);
end;