PDA

Ver la Versión Completa : Commit no se ejecuta hasta que cierro la aplicación...


MAXIUM
19-02-2018, 04:20:44
¿Alguna razón por la que el segundo COMMIT no se aplica o no funciona hasta que le doy cerrar a la aplicación? :confused:

Componentes FireDAC sobre Delphi 7. Gracias ^\||/


// Borra el estado financiero.
DataModule1.ADQuery1.SQL.Clear;
DataModule1.ADQuery1.SQL.Text:= 'Delete From FINANZAS Where ALUMNO_RUT = :RUT';
DataModule1.ADQuery1.ParamByName('RUT').AsString:= RutParcial;

DataModule1.ADTransaction1.StartTransaction;
Try
DataModule1.ADQuery1.ExecSQL;
DataModule1.ADTransaction1.Commit;
Except
DataModule1.ADTransaction1.Rollback;
Raise;
End;

// Borra el alumno del registro
DataModule1.ADQuery1.SQL.Clear;
DataModule1.ADQuery1.SQL.Text:= 'Delete From ALUMNOS Where ALUMNO_RUT = :RUT';
DataModule1.ADQuery1.ParamByName('RUT').AsString:= RutParcial;

DataModule1.ADTransaction1.StartTransaction;
Try
DataModule1.ADQuery1.ExecSQL;
DataModule1.ADTransaction1.Commit;
Except
DataModule1.ADTransaction1.Rollback;
Raise;
End;

Casimiro Notevi
19-02-2018, 09:52:05
No sé qué problema es el que tienes, pero aparte de eso, siempre debes cerrar el dataset antes de hacer cambios en él.

// Borra el estado financiero.
DataModule1.ADQuery1.SQL.Close; // <--- !!!!!!!!!!!!!!!!!!!
DataModule1.ADQuery1.SQL.Text:= 'Delete From FINANZAS Where ALUMNO_RUT = :RUT';
DataModule1.ADQuery1.ParamByName('RUT').AsString:= RutParcial;

DataModule1.ADTransaction1.StartTransaction;
Try
DataModule1.ADQuery1.ExecSQL;
DataModule1.ADTransaction1.Commit;
Except
DataModule1.ADTransaction1.Rollback;
Raise;
End;

// Borra el alumno del registro
DataModule1.ADQuery1.SQL.Close; // <--- !!!!!!!!!!!!!!!!!!!
DataModule1.ADQuery1.SQL.Text:= 'Delete From ALUMNOS Where ALUMNO_RUT = :RUT';
DataModule1.ADQuery1.ParamByName('RUT').AsString:= RutParcial;

DataModule1.ADTransaction1.StartTransaction;
Try
DataModule1.ADQuery1.ExecSQL;
DataModule1.ADTransaction1.Commit;
Except
DataModule1.ADTransaction1.Rollback;
Raise;
End;

AgustinOrtu
19-02-2018, 21:26:40
No habras iniciado alguna transaccion antes de ejecutar el codigo que nos mostraste?

Evalua la propiedad Active (http://docwiki.embarcadero.com/Libraries/en/FireDAC.Comp.Client.TFDCustomTransaction.Active) a ver si esta a True antes de ejecutar los Start Transaction

Veo que estas usando un componente dedicado TFDTransaction. Nunca lo he utilizado y siempre he operado de manera directa con el componente TFDConnection. Como se puede ver, este componente tambien tiene los mismos metodos para trabajar con transacciones: StartTransaction (http://docwiki.embarcadero.com/Libraries/en/FireDAC.Comp.Client.TFDCustomConnection.StartTransaction), Commit (http://docwiki.embarcadero.com/Libraries/en/FireDAC.Comp.Client.TFDCustomConnection.Commit) y Rollback (http://docwiki.embarcadero.com/Libraries/en/FireDAC.Comp.Client.TFDCustomConnection.Rollback)

Segun la documentacion, el componente TFDTransaction es opcional (http://docwiki.embarcadero.com/RADStudio/en/Managing_Transactions_(FireDAC))


Note: The use of the TFDTransaction component is optional in FireDAC.


Al parecer, el uso de este componente esta justificado para Firebird o Interbase ya que soporta el concepto de multiples transacciones, que estos motores implementan

MAXIUM
24-02-2018, 15:44:20
Cambie el TFDTransaction por el TFDConnection y funciono. Gracias Agustin.