2012-04-13 6 views
1

Ich bearbeite einen Datensatz mit einer dbedit-Komponente, ich habe eine Schaltfläche zum Abbrechen, aber ich bin mir nicht sicher, wie ich es machen kann, so dass alle mit den dbedit-Komponenten vorgenommenen Änderungen rückgängig gemacht werden.Stornieren von Datensatzänderungen

Ich überlegte, den Datensatz entweder in eine temporäre Tabelle zu kopieren oder den Datensatz in derselben Tabelle zu duplizieren, wodurch ich den alten Datensatz entfernen konnte, wenn die Änderungen gespeichert wurden, oder den kopierten Datensatz löschte (das Original belassen) ist storniert.

Ich möchte nur den besten Weg wissen, dies zu handhaben, ohne unnötige Tabellen zu erstellen und zu viele Prozeduren zu erstellen.

Antwort

4

Wenn ich nicht falsch bin, werden Änderungen an einer Paradox-Tabelle erst nach einem post Befehl in die Datenbank geschrieben. Wenn Sie die Änderung abbrechen möchten, tun nur

TForm1.CancelButtonPresss(Sender: TObject); 
begin 
    ParadoxTable.Cancel; 
end; 

TForm1.OKButtonPress(Sender: TObject); 
begin 
    ParadoxTable.Post; 
end; 

BTW seine, eine lange, lange Zeit, seit ich mit Paradox-Tabellen gearbeitet habe, so meine Erinnerung falsch meine, bitte frei fühlen, diese Antwort zu überstimmen wenn ich mich irre.
Ich tippe dies auf dem Mac, so kann ich es jetzt nicht überprüfen.

Wird sehen, ob ich Ihnen später eine fundiertere Antwort liefern kann.

+2

Das sollte für alle (oder zumindest die meisten) TDataSet-Nachkommen gelten. Solange die Daten noch nicht gebucht wurden, sollten Sie in der Lage sein, .cancel aufzurufen, um den Datensatz in seinen ursprünglichen Zustand zurückzuversetzen. – ESG

3

Johan Antwort Kompliment (TDataSet.Cancel verwenden), wenn Sie ein TCustomClientDataSet verwenden, können Sie auch die RevertRecord Methode verwenden, um die Änderungen an den aktuellen Datensatz zu entfernen, sofern sie noch im Änderungsprotokoll sind.

Sie können auch einen Snapshot mit SavePoint erstellen und in diesen Status zurückkehren, wobei alle zwischenzeitlich vorgenommenen Änderungen rückgängig gemacht werden.

+0

+1 für den SavePoint. Das ist der richtige Weg, um mit dieser Situation umzugehen, wenn Sie mit einem TDataset arbeiten. –

3

Johans Antwort ist gut für einzelne Aufnahme. Wenn Sie mit einer SQL-Datenbank (Oracle, MSSql, MySql, Firebird usw.) arbeiten, gibt es einen zusätzlichen Ansatz, der für mehrere Datensätze verwendet werden kann: Transaktionen. Mit ADO als Beispiel

TForm1 = class(TForm) 
    ADOConnection: TADOConnection; 
… 

    // start the transaction 
    ADOConnection.BeginTrans; 
… 

    // create records and post them 
… 

    // rollback removes the records posted 
    // since the transaction was started 
    ADOConnection.RollbackTrans; 
… or … 
    // commit completes saving the records posted 
    // since the transaction was started 
    ADOConnection.CommitTrans; 

Wenn Sie nicht explizit eine Transaktion starten, wird automatisch gestartet und engagiert als Datensätze in die Datenbank geschrieben werden.

Die Antwort von François ist vergleichbar mit Transaktionen, funktioniert aber nur mit ClientDatasets.

Verwandte Themen