1

dbedit コンポーネントを使用してレコードを編集しています。キャンセル ボタンがありますが、どうすればよいかわからないため、dbedit コンポーネントを使用して行ったすべての変更が元に戻されます。

レコードを一時テーブルにコピーするか、同じテーブル内でレコードを複製することを考えていました。これにより、変更が保存された場合は古いレコードを削除でき、入力がキャンセルされた場合はコピーされたレコードを削除できます (元のレコードを残す)。

役に立たないテーブルを作成せずにこれを処理する最善の方法を知りたいだけで、あまりにも多くの手順を作成します。

4

3 に答える 3

3

私が間違っていない場合、パラドックステーブルへの変更は、postコマンドの後でのみデータベースに書き込まれます。変更をキャンセルしたい場合は、

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

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

ところで、私はパラドックステーブルを扱ってから長い時間が経ちました。私の記憶は間違っています。間違っている場合は、この回答に投票してください。
これをMacで入力しているので、今は確認できません。

後でもっと情報に基づいた答えを提供できるかどうかを確認します。

于 2012-04-13T21:01:00.513 に答える
2

Johanの回答(use TDataSet.Cancel)を補完するために、を使用する場合は、変更ログに残っている限り、このメソッドを使用して現在のレコードへの変更を削除する TCustomClientDataSetこともできます。RevertRecord

スナップショットを設定SavePointしてその状態に戻し、その間に行われたすべての変更をキャンセルすることもできます。

于 2012-04-13T21:09:06.423 に答える
2

ヨハンの答えは、単一のレコードに適しています。SQL データベース (Oracle、MSSql、MySql、Firebird など) を使用している場合、複数のレコードに使用できる追加のアプローチがあります: トランザクションです。例として ADO を使用する

  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;

トランザクションを明示的に開始しない場合、レコードがデータベースにポストされると、トランザクションが自動的に開始およびコミットされます。

François の答えはトランザクションに似ていますが、ClientDatasets でのみ機能します。

于 2012-04-13T21:45:48.403 に答える