PDA

Ver la Versión Completa : TFDConection StartTransaction no hace el Rollback


Soa Pelaez
14-06-2018, 22:05:20
Buen día.

Tengo el siguiente código donde valido una transacción con un campo llave numérico, en caso de error realizo un rollback de la transacción y el campo llave lo aumento e inicio la transacción, el guarda el registro pero igual me tira el error de que la transacción no se podía realizar por error en llave y esa es la transacción que se debería cancelar con el rollback.

//Conexion --> TFDConnection
//Squema --> TDSchemaAdapter
//
Conexion.StartTransaction;
try
iErrors := Squema.ApplyUpdates(0);
if iErrors = 0 then
begin
for x := 0 to Squema .Count - 1 do
if Squema .DataSets[x].UpdatesPending then
begin
Squema .DataSets[x].CommitUpdates;
Conexion.Commit; //09/12/2015
end;
end
else
begin
Conexion.Rollback;
end;
except
on e: Exception do
begin
Conexion.Rollback;
raise;
end;
end;


Que error tengo en el código o que me falta para que cancele correctamente la transacción, uso un TFDConnection, TFDQuery, TDSchemaAdapter. La parte donde realizo el aumento de la llave numérica es en el evento OnError del TFDQuery.

Gracias de antemano.

gmontes
15-06-2018, 06:37:00
yo lo hago con componentes zeos asi



este es un codigo que no he revisado en años, pero es de una aplicacion que funciona





//inicia transaccion
DMSIU.zcDBase.StartTransaction;
try

with DMSIU.zqryModifica do
begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM ocxc WHERE clavef = '''+inttostr(iClavef)+'''');
Open;
if not (Eof) then
Begin
//Application.MessageBox('El documento ya existe en cobranza.', 'Error', MB_OK);
bAcepta:=False;
end;
Close;
end;
if bAcepta then
begin
with DMSIU.zqryModifica do
begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM oconcxc WHERE codigo = ''FAC''');
Open;
iClaveConCxC :=0;
if not (Eof) then
iClaveConCxC:=FieldByname('claveccxc').asinteger;
Close;
end;

sFechacxc:=copy(datetostr(date),7,4)+'/'+copy(datetostr(date),4,2)+'/'+copy(datetostr(date),1,2);
sFechaven:=copy(datetostr(date+30),7,4)+'/'+copy(datetostr(date+30),4,2)+'/'+copy(datetostr(date+30),1,2);
sFechae:=copy(sFechae,7,4)+'/'+copy(sFechae,4,2)+'/'+copy(sFechae,1,2);
with DMSIU.zqryModifica do
begin
Close;
SQL.Clear;
SQL.Add('INSERT INTO ocxc (clavec, claveccxc, clavef, documento, docto, referencia, importe, pagado, fechaaplic, fechavenc, fechaelab, estado, condicion,serie,folio) VALUES('''+IntToStr(iClavec)+''','''+IntToStr(iClaveConCxC)+''',');
SQL.Add(''''+IntToStr(iClavef)+''','''+sDocumento+''','''+sDocumento+''','''+sDocumento+''','''+floa ttostr(nImportet)+''',''0.0'','''+sFechacxc+''',');
SQL.Add(''''+sFechaven+''','''+sFechae+''','''+sEstatus+''','''+'Credito'+''','''+LeftStr(sDocumento ,1)+''','''+Trim(Copy(sDocumento,2,Length(sDocumento)))+''')');
ExecSQL;
Close;
SQL.Clear;
end;
end; //bAcepta

//transaccion
//Application.MessageBox('Datos capturados', 'Aceptar', MB_OK);
DMSIU.zcDBase.Commit;
except
Application.MessageBox('Error en datos', 'Aceptar', MB_OK);
DMSIU.zcDBase.Rollback;
end;
//transaccion