【iDempiere Lab】トランザクションデータの削除のポイント

 JPiereでは、【JPIERE-0158】クライアントの初期化と削除 において、いろいろな要望に応じてデータを削除できるようにしていますが、その要望の中で多いのはトランザクションデータだけを削除したいというもののようです。そこで、トランザクションデータを削除するためのポイントについてまとめておきました。

 トランザクションデータだけを削除する時の参考にして下さい。

クライアントの初期化と削除プロセス
クライアントの初期化と削除プロセス

【ポイント】データ削除は計画的に‼

トランザクションデータの削除のポイント

 【JPIERE-0158】クライアントの初期化と削除 では、"クライアントのトランザクション削除"という選択肢が用意されており、これを選択すれば、JPiereのトランザクションデータをすべて削除してくれそうですが、残念ながらそのような仕様にはなっていません。

 ここで削除対象となるテーブルは、iDempiereの標準機能の伝票(Document)のテーブルであり、JPiereで追加されている伝票のテーブルは削除の対象にはなっていません。

 【JPIERE-0158】クライアントの初期化と削除は、JPPS(JPiere Plugins)として、この機能だけでプラグインとして独立しており、JPiere以外のiDempiereの各ディストリビューションでも使用できるように意図しています。そのため、トランザクションテーブルとして予め定義しているのは、iDempiereの標準機能の伝票のテーブルだけであり、JPiereで追加したトランザクションテーブルは含めていません。

【JPIERE-0158】クライアントの初期化と削除 における"トランザクションテーブル"とは、iDempiereの標準機能の伝票(Document)のテーブルが中心であり、JPiereで追加されているテーブルは1つも含まれていない!!

 また、何をもってトランザクションデータとするかは、人によって見解が分かれるところもあり、かつiDempiereとしてもトランザクションテーブルと明確に区分しているわけではありませんので、すべての人の希望に沿うようなトランザクションデータだけを削除するということはそもそも不可能です。

何をもってトランザクションデータとするかは人それぞれ!!

 トランザクションデータの削除は、あくまでもトランザクションデータを削除するための設定を簡素化するための区分と考えて頂いて、トランザクションデータとして一緒に削除したいテーブルがあったら削除プロファイルを使用して追加して下さい。

JPiereで追加されているトランザクションテーブルのデータを削除する場合や、他に削除したいテーブルのデータがある場合には、「削除プロファイル」を使用する。

クライアントの初期化と削除プロセス
クライアントの初期化と削除プロセス

 「削除プロファイル」は、削除したいテーブルを自由に指定する事ができます。トランザクションデータだけでなく、必要に応じて削除したいテーブルを追加して活用して下さい。

削除プロファイルのSQL WHERE句
削除プロファイルのSQL WHERE句

「トランザクションデータの削除」においては、削除プロファイルにはデータを削除したいテーブルを登録するわけですが、そのSQL WHERE句のフィールドには残したい(削除したくない)データの条件を指定します。そして、SQL WHERE句のフィールドが空欄だと、そのテーブルのデータは全て残したい(削除したくない)という設定になってしまいますので、" AD_Clinet_ID = 0 " などと入力する事で、全てのデータが削除対象となります。

削除プロファイルには、トランザクションデータとして一緒に追加でデータを削除したいテーブルを登録するが、SQL WHERE句が空欄だと削除されない。そのため、データをすべて削除したい場合には"AD_Client_ID=0"という条件を設定するのがおススメ!!

この仕様は少しわかりにくい仕様だと思います。^^;

このような仕様にしている理由は、"クライアントの初期化"の設定の手間を軽減して、削除漏れの可能性を低くするためです。

"クライアントの初期化"では、"初期化テーブル"と"削除プロファイル"に登録されているテーブル以外のテーブルのデータは全て削除されます。削除プロファイルに設定が無いテーブルは基本方針として削除対象とする事で削除プロファイルを設定する手間を少なくして、データの削除漏れの可能性が低くなるようにしています

 つまり、"削除プロファイル"には本当はデータを削除したくないテーブルの情報を登録する仕様になっています。そして、この仕様はトランザクションデータの削除においても実は同様で、削除したくないテーブルと削除したくないデータの条件を設定する事で、その条件に合致しないデータを削除しています。

データの削除漏れに注意する

 トランザクションデータの削除の処理は、トランザクションテーブルとして定義されているテーブルと、削除プロファイルに設定されているテーブルが処理の対象となりますので、そこに含まれないテーブルのデータは基本的に削除されません。そのためデータの削除漏れが無いように気を付けて下さい。削除漏れがあると、"外部参照制約エラー"や"Not null制約エラー"などになります。

 削除漏れが嫌な場合は、「クライアントの初期化」を試してみて下さい。クライアントの初期化であれば、"初期化テーブル"と削除プロファイルに設定されているテーブル以外のテーブルはデータ削除の対象となりますので削除漏れになる可能性が低くなります(言い換えると"クライアントの初期化"では削除したくないテーブルは漏れなく削除プロファイルに設定しておく必要があります)。

トランザクションテーブルとは!? その確認方法は!?

トランザクションデータを削除するのに何をもってトランザクションデータとするのか、その定義は重要です。【JPIERE-0158】クライアントの初期化と削除においては、トランザクションデータはどのテーブルに登録されているデータの事が予め定義されいて、「クライアントのトランザクション削除」や「全クライアントのトランザクション削除」を選択した時に削除対象となるテーブルは決まっています。削除対象となるテーブルを確認したい場合は「削除テーブルの確認レポート」で確認できます。

削除テーブルの確認レポート

削除対象となるテーブルを確認したい削除プロファイルを選択して下さい。

表示された一覧レポートの説明欄に「トランザクションテーブル」となっているのが、「クライアントの初期化と削除プロセス」において、トランザクションテーブルと定義されて削除対象となっているテーブルになります。

削除プロファイルで追加されているテーブルは、「カスタム削除プロファイルのテーブル」と表示されます。

[全テーブルを表示する]にすると削除対象となっていないテーブルも表示され、その旨が示されます。削除漏れが無いように確認して下さい。

トランザクションデータのTruncate

トランザクションデータの削除方法は、「クライアントのトランザクション削除」と「全クライアントのトランザクション削除」の2種類が用意されています。

そして、「全クライアントのトランザクション削除」を選択すると"Truncate"での削除を選択実行できます。

クライアントの初期化と削除プロセス
クライアントの初期化と削除プロセス

"Truncate"を指定した削除は強力です。トランザクションテーブルの他に、削除プロファイルに指定されているテーブルのデータを全削除して、さらに削除対象のデータを参照しているレコードも削除されます。Truncate 実行時に CASCADE を指定して実行します

【注意】Truncateの注意

Truncateを選択した場合、削除プロファイルのSQL WHERE句の条件指定に関わらず、処理対象となっているテーブルの全てのデータが削除されますので注意して下さい。