Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   TFDConection StartTransaction no hace el Rollback (https://www.clubdelphi.com/foros/showthread.php?t=93203)

Soa Pelaez 14-06-2018 22:05:20

TFDConection StartTransaction no hace el Rollback
 
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.
Código Delphi [-]
//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





Código Delphi [-]
 //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


La franja horaria es GMT +2. Ahora son las 06:25:04.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi