TQueryのデータをDBGridで編集可能にする
TQuery内で複数テーブルをJOINしている場合、その内容を DBGrid上で直接編集することはできません。
TQuery の RequestLive プロパティを True に設定することはできますが、更新しようとすると(Openすると)上記のようなエラーが表示されます。
これを解決するには、まず、Query の、CacheUpdate プロパティを
True に、RequestLive プロパティを True
に設定します。
次に、ツールパレット上の UpdateSQL コンポーネントを使います。
BDEパレットあたりにあります。それをフォームに配置し、Query の UpdateObject
プロパティに今配置した UpdateSQL を指定します。
次に UpdateSQL を選択し、右クリックのポップアップメニューから 「UpdateSQL の設定」を選びます。
すると以下のようなダイアログが表示されます。
テーブル名のコンボボックスにはSELECTされているテーブルの一覧が表示されます。この中から変更対象となるテーブルを選択します。
次にキー項目リストの中からそのテーブルのプライマリキーを選択します。複数ある場合は [ SHIFT ] か、[ CONTROL
] を押しながら選択します。
次に更新する項目の中から同じように、変更対象となるフィールドを選択します。グリッド上で修正させる項目です。
ここまで終わったら [ SQL文を生成 ] ボタンをクリックし、 [ OK ] をクリックします。
あとはキャッシュアップデートを制御するコードをちょこちょこ記述します。
今回の例ではフォームロード時にトランザクションを開始し、ボタン1でコミット、ボタン2でロールバックします。
■ キャッシュアップデートの例 |
implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin Database1.StartTransaction; end; procedure TForm1.Button1Click(Sender: TObject); begin if (Query1.UpdatesPending) then begin Query1.ApplyUpdates; end; Database1.Commit; Query1.CommitUpdates; end; procedure TForm1.Button2Click(Sender: TObject); begin if (Query1.UpdatesPending) then begin Query1.CancelUpdates; end; Database1.Rollback; end; |
このキャッシュアップデートと言う仕組みは、フォーム上での編集内容を即座にデータベースに通知するのではなく、ローカルに保存しておき、最後に変更内容をデータベースへ送信します。ですので、最後にデータベースへ送信するコードが必要になります。それが ApplyUpdates メソッドです。逆に、変更内容を送信せず破棄する場合は CancelUpdates メソッドを使います。データベースに反映させていない更新内容があるかどうかは、UpdatesPending プロパティで確認できます。