TClientDataSetでDeleteしたKeyの再利用

解決


サトウ  2013-08-22 06:50:56  No: 45129

Netを検索したのですが、適当な解決方法が見つかりません。よろしくお願いいたします。

環境はWindowsXp proとDelphiXE3です。

プログラム内で生成したデータを表形式で表示する為に、TDbGridを利用し
サーバデータを表さないTClientDataSetを使おうとしています。
もちろん、プログラム終了時に、そのデータを保存する必要がありません。
TClientData へは、InsertとDeleteの操作のみの処理です。

この処理のなかで、一度、Deleteしたデータと同じキーのデータをInsertしようとすると、「例外クラス Edbclient(メッセージ'キーの違反です’)を送出しました」が発生します。

関連しそうな、PropertyとMethodを見てみましたが、LogChange Propertyぐらいしかないかなと思えます。LogChange=Falseに設定しています。

TDBClientDataでは、データをDeleteしても、実際には削除されず、単にデータが見えなくなるだけで、同一キーのデータがInsertされたときに、Deleteしたデータのキーと重複する為に例外が発生するのではないかと思えます。

このような処理で、TClientDataSetで「キー違反」の例外を起こさない方法がありましたら教えていただきたくお願いいたします。


DEKO  2013-08-23 21:09:16  No: 45130

外しているかもしれませんが、ApplyUpdate ですかね。
# コードを晒していただけると
# レスが付きやすいのではないかと思います。


サトウ  2013-08-24 05:46:54  No: 45131

DEKOさん、いつもHPを参照させていただいています。ありがとうございました。

折角メッセージをいただきましたが、今回の問題は私の勘違いでした。

実は、TClientDataSetにFilterをかけていました。
Filterをかけても、Locate文は、Filter前のデータに対して働くと思っていました。Filterをかけたデータ内を移動するときは、FindNext文などを利用するものだと考え、Locate文はFilter 前のデータに働くと勝手に思い込んでいました。

削除対象データにLocate文→Delete文を発行していたので、当然Delete文は働かず、データが残っている為、次のInsert文でキー違反を起こしていました。LogChangeプロパティも関係ありませんでした。

ただただ、恥をさらすだけの結果になり申し訳ありませんでした。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加