2

クエリ、データセット、編集可能なdbgrid、updatesqlコンポーネントを含むフォームがあります。dbgridで行った変更を保存する必要がある場合は、次の手順を呼び出します。

procedure TEditCardDetailForm.SaveChanges;
begin
  Database1.StartTransaction;
  try
    Query2.ApplyUpdates;
    Database1.Commit;
  except
    Database1.Rollback;
    raise;
  end;
  Query2.CommitUpdates;
end;

ただし、dbgridのセルを編集した後、Enterキーを押すか、別の行に移動すると、変更がデータベースに自動的に適用されるようにします。これは、TTableコンポーネントを使用する場合と同じ方法です。それを行う方法はありますか?

4

2 に答える 2

2

私が正しく理解している場合(そうでない場合は修正してください)、CachedUpdatesがtrueに設定されたTQueryがありますが、キャッシュされた即時更新を使用していないかのように動作させたいと考えています。その場合、TQueryを設定した方法は、希望する動作と矛盾します。キャッシュされた更新は、ApplyUpdatesを使用してデータベースに手動で投稿することを決定するまで、クライアント側で「保持」されます。

CachedUpdatesをfalseに設定できる場合は、次のことを行うだけで済みます。

  1. UpdateObjectプロパティを介してTUpdateSQLをTQueryにリンクします。
  2. insert、update、およびdeleteステートメントを記述し、それらをTUpdateSQLのInsertSQL、ModifySQL、およびDeleteSQLプロパティに割り当てます。

あなたはすでにこれらの2つのことを行っていると思いますので、CachedUpdatesをfalseにするとそれができるはずです。

Delphi 5のキャッシュされた更新の詳細については、こちらをご覧ください。

HTH

于 2012-10-03T19:17:58.233 に答える
1

ここで処理するシナリオは2つあります。

  1. グリッド行を変更するときに変更を保存する
  2. グリッド列を変更するときに変更を保存する

最初のものは、基礎となるデータセット( 、?)のイベントでSaveChangesプロシージャを呼び出すことで簡単に実装できます。AfterPostquery2TClientDataSet

query2.Post2つ目は、列が変更された後にのみ呼び出す必要があります。OnDataChangeこれは、の場合に実行できますdatasource。を呼び出す前に、挿入モードまたは編集Field <> nilモードになっていることを確認してください。datasetpost

于 2012-10-04T07:56:16.143 に答える