在庫領域の機能構築をする際、「過去の特定時点の在庫数量を取得したい」という要件が出ることがある。
今回はテーブルMARD(保管場所在庫)およびMARDH(保管場所在庫の履歴)の特徴について説明し、そういった要件への対応方法について整理する。
SAPの在庫数量履歴の取得方法
テーブル:MARD,MARDHが保持する情報
・MARD 品目の保管場所データ
・MARDH 品目マスタ保管場所セグメント:履歴
・テーブル:MARD
テーブルMARDは品目・プラント・保管場所ごとの在庫数量を保持しており、「現時点」での在庫数量を確認することが出来る。
テーブルキーは品目/プラント/保管場所。
下図のようなイメージでレコードを保持しており、利用可能在庫(他にも在庫数量の項目はあるが、いったん簡略化のため利可在庫のみ例示)は入出庫が発生するたびに更新される。
・テーブル:MARDH
一方、MARDHには年度/月ごとの過去の在庫数量が格納されている。
テーブルキーは品目/プラント/保管場所まではMARDと同じだが、そこに年度・月が加わる。
下図のようなイメージでレコードを保持しており、各月末時点での在庫数量が格納されている。
過去月の数量が書き換わることはない。
過去のある時点の在庫数量を確認したい場合、これら二つのテーブルを活用する。
(例:2018年12月末時点での在庫数量がいくつあったかを知りたい、など)
・参考:末尾Hのテーブルについて
ちなみに、テーブルIDの末尾に「H」が付く場合は履歴(History)テーブルである事が多い。
例として、以下のような履歴テーブルもある。
MBEWH 品目評価:履歴
MCHBH ロット在庫:履歴
テーブル:MARD,MARDHの更新手順
MARDは品目の保管場所で入出庫が起きて在庫数量が変動するたび、更新される。
では、履歴テーブルであるMARDHはいつ更新されるか?
実を言うと、MARDHのテーブルキーに「年/月」は入っているものの、このテーブルは毎月更新されるわけではない。
MARDHが更新される条件・手順は以下の通りだ。
・現在の状態
まず初期状態として下図の状態があるとする。
このとき、品目「DDDDDDD」の現在の在庫数量は100となっている。
MARDの年度及び月は2020年6月を示している。これは、2020年6月以降、この品目・保管場所で在庫移動が起きていないことを表す。
つまり数量100というのは現時点の在庫数量でもあり、5月末時点の在庫数量でもある。
・在庫移動発生
ここに、8月の転記日で数量50の入庫があったとする。
(在庫数量は100+50=150となる)
入出庫が起きると、システムはまずMARDの年度/月を参照する。ここで現在の年度/月とMARDの年度/月が等しくない場合に、MARDHが更新対象となる。
MARDの年度/月は2020年5月で、今回新たに8月の入出庫が起きたので、システムは更新前の数量をMARDHに退避する(前月である7月として更新)。
次に、MARDの利用可能在庫が最新の在庫数量に更新され、年度/月は2020年8月に書き換わる。
このようにして、MARDHには履歴が退避され、同時にMARDが更新されるという関係になっている。
過去のある時点での在庫数量を取得するには
例えば、下図の状態において「2020年6月の月末在庫を知りたい」となったら、どのような手順で求めればよいだろうか。
なお、2020年6月は既に経過し在庫締めがされているものとする。
手順としては以下の通りとなるだろう。
まずMARDの年月を検索する。検索年月≧MARDの年月であれば、そのMARDの数量を採用する。今回はMARDは2020年8月を示しているので、条件に合致しない。
手順2.
上記1で条件に該当しなかった場合は、MARDHを検索する。
この際、検索年月より若いMARDHの履歴をすべて一緒に取得すること。
検索年月でMARDHのレコードがあるとは限らないためだ。
手順3.
MARDHに、検索年月に該当する年月のレコードがあるのであれば、それを月末在庫として採用する。
手順4.
MARDHに、検索年月に該当する年月のレコードが無い場合は、検索年月に最も近く新しい月の在庫数量を月末在庫として採用する。
図の場合で言えば、「2020年6月」の履歴レコードは無いので、それに最も近く新しい「2020年7月」のレコードを採用する。(この場合、6,7月には在庫移動が無かったことを示している)
この手順を用いれば、アドオン中でも過去時点の在庫履歴を取得するロジックを組むことが出来る。
(参考)標準トランザクションでの確認(Tr:MB5B)
最後に、過去時点の在庫数量はトランザクションMB5B(転記日付の在庫数量)でも確認できる。
このトランザクションでは転記日の下限と上限を指定すると、それぞれを期首期末として在庫数量を提示してくれるとともに、指定した期間中の在庫移動も一覧化される。
日単位(転記日)での在庫数量を把握したい場合に使用できるトランザクションだ。