Also ich weiss nicht, an der Funktion ist doch Einiges nicht richtig.
Hier mal meine Version:
Delphi-Quellcode:
procedure PostFlush(Table : TIBCTable);
begin
with Table do
begin
if (State = dsEdit) or (State = dsInsert) then
begin
Post; // Daten speichern
// wenn keine Daten mit Post abgesendet wurden gibt es auch keinen Grund
// eine Transaktion zu "commiten"
if (Connection <> nil) then
begin
if Connection.InTransaction then Connection.Commit;
end
else
begin
Transaction.Commit;
end;
end;
end;
if Active then
Refresh;
end;
Sollte die Tabelle geschlossen sein, dann ist State = dsInactive.
Dies wird von meiner Version berücksichtigt; in der orginalen Version aber nicht.
Ich sehe auch nicht wirklich, weshalb man hier mit Transactions arbeitet; es macht wenig Sinn.
Transactions überspannen mehr als einen Datensatz.
Genau das aber wird hier missachtet.
Hier ein Beispiel für sinnvolle Anwendung von Transactions.
Es wird ein Betrag von einem Konto ab- und auf ein anderes Konto aufgebucht.
Zusätzlich wird noch mitgeloggt.
Delphi-Quellcode:
Transaction.
Begin;
try
if not TabKonto.Locate('
KontoNr', absender, [])
then
Raise Exception.Create(...);
TabKonto.Edit;
TabKonto['
Betrag'] := TabKonto['
Betrag'] - Ueberweisung;
TabKonto.Post;
if not TabKonto.Locate('
KontoNr', empfaenger, [])
then
Raise Exception.Create(...);
TabKonto.Edit;
TabKonto['
Betrag'] := TabKonto['
Betrag'] + Ueberweisung;
TabKonto.Post;
TabLogging.append;
TabLogging['
info'] := '
Überweisung Betrag bla, bla,......'
TabLogging.Post;
Transaction.Commit;
// Alles ok, alle Änderungen dauerhaft in die Datenbank
except
// bei einem Fehler ALLES zurücknehmen
Transaction.rollback;
end;