2

objects(primary key object_ID) flags(primary key flag_ID) とobject_flags(cross-tabel between objectsand flagswith some extra info)の3 つのテーブルがあります。

すべてのフラグを返すクエリがあり、特定のオブジェクトに特定のフラグがある場合は 1 または 0 を返します。

SELECT
  f.*,
  of.*,
  of.objectID IS NOT NULL AS object_has_flag,
FROM
  flags f
  LEFT JOIN object_flags of
    ON (f.flag_ID = of.flag_ID) AND (of.object_ID = :objectID);

アプリケーション(Delphi で作成)では、すべての行がコンポーネントにロードされます。ユーザーは、テーブルのチェック ボックスをクリックしてデータを変更することにより、フラグを割り当てることができます。

1 行が編集されたとします。object_has_flag の値に応じて、次のことを行う必要があります。

  • object_has_flag が true であり、まだ true である場合は、objects_flags の関連する行で UPDATE を実行する必要があります。
  • object_has_flag が false でしたが、現在は true であり、INSERT を実行する必要がある場合
  • object_has_flag が true でしたが、現在は false の場合、行を削除する必要があります

これは、1 つのクエリhttps://stackoverflow.com/questions/7927114/conditional-replace-or-delete-in-one-queryでは実行できないようです。

MyDAC の TMyQuery をデータセットとして使用しています。行への変更を保存するために必要なクエリを実行する別のコードを作成しましたが、これをデータセットに結合するにはどうすればよいですか? どのイベント ハンドラーを使用する必要がありますか? また、投稿ではなく更新するように TMyQuery に指示するにはどうすればよいですか?

編集:明らかに、問題が何であるかは完全には明らかではありません。標準の UpdateSQL、DeleteSQL、および InsertSQL は使用できません。これは、行を編集した後 (行を削除したり、行を挿入したりせずに)、INSERTまたはDELETEを実行する必要がある場合があるためです。

4

2 に答える 2

0

簡単な答えは、ここであなたの答えを言い換えることです:

  • 「MyDACデータセットコンポーネントを使用したデータの更新」(MyDAC 5.80以降)のドキュメントを参照してください。

すべてのTCustomDADataSet (TMyQueryなど)の子孫には、 SQLInsertSQLUpdate、およびSQLDeleteプロパティを使用して更新SQLステートメントを設定する機能があります。

TMyUpdateSQLは、カスタム更新操作の有望なコンポーネントでもあります。

于 2011-12-15T12:46:16.253 に答える
0

最も簡単な方法は、BeforePostイベントを使用し、いくつかのフィールドのOldValueおよびプロパティを使用して何を行う必要があるかを判断することです。NewValue

于 2012-02-18T14:25:25.453 に答える