オープンソースのERP iDempiereでは、受注伝票明細で明細毎に注文を受けた数量に対する出荷済み数量と請求済み数量を確認する事ができます。つまりiDempiereでは受注伝票明細を確認すると、業務の進行状況が確認できるようになっています。
そして業務状況を確認する場合、その確認対象となるのは、処理中の受注伝票(未出荷残がある受注伝票明細や未請求残がある受注伝票明細などのこと)か、もしくは最近処理が完了した受注伝票がほとんどです。処理が完了して数年経つ過去のデータを参照する事はあまりないでしょう。
最近のデータを確認するという事では、JPiereでは注文日付(DateOrdered)にインデックスを追加していますので、注文日付をWhere句に指定すれば、効率よく検索する事ができます。
しかし、処理中の受注伝票(未出荷残がある受注伝票明細や未請求残がある受注伝票明細)を効率よく検索したい場合、未出荷残や未請求残を把握するためには計算する必要があり、インデックスを追加して効率よく検索する事がなかなか難しくなってきます。
データの件数で考えると、処理中の受注伝票と処理済みの受注伝票(注文を受けた数量の全てが請求まで完了している伝票)の比率は、運用期間が長くなればあんるほど、処理済みの受注伝票の方が圧倒的に多くなります。
処理中の受注伝票を確認するのに、処理済みの受注伝票は対象外として効率よく検索したいものです。そうすれば大量データ環境になってもレスポンスよく業務状況が確認できるはずです。
そこで、JPiereでは受注伝票明細に処理中の注文(IsProcessingOrderJP)フラグを追加して、処理中の受注伝票明細はONの状態にして、処理済みのデータと明確に区分するようにしました。
処理中の注文(IsProcessingOrderJP)フラグ
IsProcessingOrderJPは、次の場合にON(='Y')になります。
- 発注数量(QtyOrdered)と出荷済数量(QtyDelivered)と請求済数量(QtyInvoiced)と計上数量(JP_QtyRecognized)の数値が同数でない場合。同数の場合は、IsProcessingOrderJPはOFF(='N')になります。
- IsProcessingOrderJPは伝票ステータスには依存しません。あくまで上記の関係だけを判断して、ON←→OFFされます。
カスタマイズ情報
C_OrderLineテーブルにIsProcessingOrderJPフラグを追加
C_OrderLineテーブルにIsProcessingOrderJPカラムに部分インデックス(JP_IsProcessingOrderJP)を追加。部分インデックスの条件は、IsProcessingOrderJP='Y'
IsProcessingOrderJP='Y'のデータは、処理中の受注伝票明細の事であり、基本的にはある程度一定数で遷移するはずです。そして割合は、受注伝票明細が増えれば増えるほど、少なくなります。IsProcessingOrderJP='Y'を条件式に追加してクエリーを発行する事により、効率的に処理中の業務データを取得する事ができます。
jpiere.base.plugin.org.adempiere.base.JPiereContractOrderValidator にロジックを追加
IsProcessingOrderJPフラグのON←→OFFするロジックを追加しました。
効果検証
IsProcessingOrderJPカラムにインデックスを追加した効果を確認したいと思います。効果を確認するのに、ここではJPIERE-0054:未出荷受注伝票明細チェックリストを使用したいと思います。
未出荷受注伝票は、注文を受けて出荷していない受注伝票明細を一覧表示するレポートですが、基本的にシーケンシャルスキャンが行われるためデータが増えれば増えるほどパフォーマンスは悪化していきます。
実際、受注伝票明細を約1億レコードほど登録した環境では、このレポートを表示するのに数分(5分前後)必要でした。
下記は、インデックスが追加される前の、Explain analyzeの結果です。
インデックスを追加後は、IsProcessingOrderJP='Y'の条件を追加して、レポートを表示させると、インデックススキャンが行われれて、ものの数秒でレポートが表示されるようになりました。
関連するカスタマイズ
RV_OrderDetailビューにIsProcessingOrderJPカラムを追加
【JPIERE-0383】受注伝票明細に処理中の注文(IsProcessingOrderJP)フラグ追加にともない、RV_OrderDetailビューにIsProcessingOrderJPカラムを追加しました。基本的には既存のビューにAdd-onとなるカラムを追加するような事はしない方針なのですが、今回は特例としてレポートのパフォーマンスの観点から追加し、今後メンテナンスしていく予定です。このことに伴い、下記のレポートでもIsProcessingOrderJPカラムをWHERE条件に加えて、パフォーマンスを改善させています。