組織の変更履歴を記録するテーブルを追加しました。
そして、そのデータを使用して、各種伝票やマスタに組織マスタの名称の履歴を表示する事ができます。
組織の変更履歴タブ
組織ウィンドウの子タブに変更履歴タブを追加しました。
変更履歴タブ(JP_Org_Historyテーブル)
期間を重複して名称を持つことはできません。
◆名称
開始日付と終了日付の期間における組織名称を入力して下さい。
◆開始日付
名称が使用開始となった日付。
◆終了日付
名称が使用終了となった日付。
【ポイント】組織マスタには組織コードを管理するためのマスタと考え、組織の名称は組織の変更履歴に保存する運用方法を検討してみる。
頻繁に組織変更がある会社は多いと思います。どんなに組織変更が多い場合でも、変更前の組織は、変更後のいずれかの組織に引継がれるはずです。
組織マスタを組織コードを管理するためのマスタと考え、組織の変更履歴を組織の名称マスタとして考えると、変更前の組織を引き継いだ変更後の組織は同じ組織コードとする運用にすれば、組織マスタを新規で作成する必要はありません。変更前の名称と変更後の名称を、変更履歴タブに登録すれば良いだけです。
そのように考えれば、組織間でのデータを振替えるような作業が不要になりますので、組織変更に係る作業も軽減されるのではないでしょうか?
組織の変更履歴の活用法
ウィンドウでの活用法その1:モデルバリデータ(2019年9月11日追加機能)
組織の変更履歴タブの情報をもとに、各種伝票やマスタに組織名称の履歴を自動設定できるようにしました。この方法は、モデルバリデータにより取引を行った時点の組織名称をトランザクションデータ内に保持する事になりますので、その部分については正規化が崩れます。しかし、その分、システム的なパフォーマンスの影響最小限に抑える事ができます。
◆Step1:モデルバリデーターが設定されている事を確認して下さい
◆Step2:組織マスタの名称(履歴)を設定したいテーブルに"JP_Org_History_Name"カラムを追加して下さい。
「JP_Org_History_Name」カラムに組織の名称を自動設定します。その際に組織の名称は次のロジックで取得されます。
- 伝票(※DocActionをInterfaceしている場合)
->DateAcct(転記日付)の日付をもとに、組織マスタの変更履歴タブから該当する名称を取得します。もし該当する日付の名称が無い場合は、組織マスタの名称を取得します。
- マスタ(※DocActionをInterfaceしていない場合)
->Created(作成日)の日付をもとに、組織マスタの変更履歴タブから該当する名称を取得します。もし該当する日付の名称が無い場合は、組織マスタの名称を取得します。
【カスタマイズ情報】モデルバリデータ
「JP_Org_History_Name」カラムに組織の名称を自動設定しているのは、下記のモデルバリデーターです。
jpiere.base.plugin.org.adempiere.base.JPiereHistoricalOrgNameValidator
このモデルバリデータは、モデルバリデータの初期化の際に、「JP_Org_History_Name」カラムがあるテーブルに対して設定されます。
◆サーバーの再起動
サーバーの起動時にモデルバリデータが初期化されますので、「JP_Org_History_Name」カラムをテーブルに追加した場合には、サーバーを再起動して下さい。
これで、「JP_Org_History_Name」カラムのあるテーブルには、組織の名称を、JP_Org_Historyテーブルから取得して、自動的に「JP_Org_History_Name」カラムに設定します。
【技術情報】モデルクラスを使用したプログラムにおいて、この処理を意識する必要はありません(モデルバリデータのメリット)。
この組織名称の履歴を自動設定する処理は、モデルバリデータを使用して、beforeSave()メソッドで実行されます。モデルクラスを使用してデータ処理している分には勝手に必ずモデルバリデータが呼ばれますので、開発者はこの処理を意識する事無く通常通りモデルクラスを使用して開発してもらえれば、組織名称の履歴は自動設定されます。
レポートでの活用法:モデルバリデータ
モデルバリデータを使用した方法であれば、レコード内に過去の組織の名称情報を保持していますので、レポートへの活用も容易です。
ウィンドウでの活用法その2:バーチャルカラム
組織の変更履歴を記録しておく事で、伝票などのように日付があれば、バーチャルカラムの機能を使用して、その日付当時の組織の名称を表示する事もできます。この方法は、組織情報の正規化を維持する事ができますが、レコード表示の都度、バーチャルカラムのSQLが実行される事になりますので、その分システムリソースが消費され、少なからずシステムパフォーマンスに影響を与えます。
◆活用方法の下準備:旧組織名称を表示したいテーブルにバーチャルカラム(SQLカラム)を追加します。
ここでは例として、受注伝票(C_Orderテーブル)に、旧組織名称(JP_Org_OldName)カラムを追加し、転記日付(DateAcct)時点の組織の名称を表示します。
バーチャルカラムに設定するSQLは次のようになります。
【バーチャルカラムの場合】
(SELECT h.Name FROM JP_Org_History h WHERE h.AD_Org_ID = C_Order.AD_Org_ID AND h.DateFrom <= C_Order.DateAcct AND h.DateTo >= C_Order.DateAcct )
【バーチャルUIカラムの場合】
@SQL=SELECT h.Name FROM JP_Org_History h WHERE h.AD_Org_ID = @AD_Org_ID@ AND h.DateFrom <= TO_DATE('@DateAcct@','YYYY-MM-DD') AND h.DateTo >= TO_DATE('@DateAcct@','YYYY-MM-DD')
【補足説明】バーチャルカラムとバーチャルUIカラム
バーチャルカラムの設定を"@SQL="で開始する事で、"バーチャルUIカラム"という機能が発動し、レコードが選択された時にSQLが発行されるようになります。そのため、SQLがウィンドウを開いた時に必ず実行される"バーチャルカラム"と比較して、ウィンドウを開く際のパフォーマンスの観点で優れています。
しかしながらバーチャルUIカラムの場合は、レコード選択時にその都度SQLが1つ多く実行される事になります。わずかながらシステムのリソースを消費している事は意識しておく必要があると思います。
バーチャルUIカラムを使用する上で考慮すべき点は、レコードが選択されるまで、バーチャルUIカラムの情報は表示されないという事です。ウィンドウの一覧表示においてレコードが選択されて編集状態になるまで、バーチャルUIカラムの情報は表示されません。
その他のバーチャルカラムとバーチャルUIカラムの挙動の違いとして、バーチャルUIカラムはコールアウトのように挙動するのに対して、バーチャルカラムは保存した際に表示が変更になる事です。
これらの事を考慮して、バーチャルカラムを使用するかバーチャルUIカラムを使用するのか検討して下さい。
バーチャルUIカラムはiDempiere6.1より使用する事が出来る機能です。パフォーマンスの観点よりできるだけ、バーチャルUIカラムを使用する事をオススメ致します。
◆表示例
組織(AD_Org_ID)フィールドに選択した組織の、2017年11月6日時点の名称が、旧組織名称(JP_Org_OldName)に表示されています。
バーチャルUIカラムだと、一覧表示において選択されているレコードのみ旧組織名称が表示されます。すべてのレコードで旧組織名称を表示させたい場合は、バーチャルカラムの機能を使用する必要があります。
組織マスタは下記のように設定しています。
レポートでの活用法:バーチャルカラム
バーチャルカラムと同様にレポートでも、日付を指定して組織の変更履歴タブにJOINする事で、当時の組織の名称を表示する事ができます。
カスタマイズ情報
テーブル
- JP_Org_History
クラス
- jpiere.base.plugin.org.adempiere.model.MOrgHistory
- jpiere.base.plugin.org.adempiere.base.JPiereHistoricalOrgNameValidator(2019年9月11日追加)
カスタマイズ履歴
2019年9月11日
モデルバリデータを使用して、組織履歴タブの情報を各種伝票やマスタに設定できるようにしました。