在庫管理データテンプレート
SAP S/4HANA在庫管理データテンプレート
- 収集を推奨する項目
- プロセスディスカバリで追跡すべき主要な活動
- SAP S/4HANAに特化した抽出ガイダンス
在庫管理属性
| 名前 | 説明 | ||
|---|---|---|---|
| イベント日時 EventTime | 在庫活動がシステムに記録された正確な日付と時刻。 | ||
| 説明 イベント時間(Event Time)は、アクティビティがいつ発生したかを正確に記録するタイムスタンプです。このデータポイントは、各在庫バッチのプロセスフローを再構築するために、イベントを時系列順に並べるために不可欠です。これは、すべての時間ベースのプロセスマイニング分析の基礎となります。 イベント時間の正確性は、サイクルタイム、リードタイム、所要時間などの主要業績評価指標(KPI)を計算する上で極めて重要です。これにより、異なる期間におけるプロセスパフォーマンスの分析が可能になり、ボトルネックの発生時期の特定を支援し、バッチがリリースされる前に品質検査に費やした時間など、プロセスの遅延を理解するための事実に基づいた根拠を提供します。 その重要性 このタイムスタンプはイベントを時系列に並べ、すべての期間およびパフォーマンス計算の基盤となります。 取得元 これは通常、品目伝票ヘッダテーブルMKPFからの転記日付(MKPF-BUDAT)と入力時刻(MKPF-CPUTM)の組み合わせです。 例 2023-10-26T09:00:00Z2023-11-15T14:35:10Z2024-01-05T23:15:00Z | |||
| 在庫バッチ/ロット InventoryBatchLot | 製品の特定の数量に対する一意の識別子であり、そのライフサイクルを追跡するためのケースIDとして機能します。 | ||
| 説明 在庫バッチまたはロット番号は、特定の異なる製品数量に関連するすべての活動をグループ化する主要なケース識別子です。これにより、在庫数量が倉庫に最初に入荷されてから、さまざまな内部移動やステータス変更を経て、最終的に販売、生産、または処分されるまでの全行程を時系列で完全に把握することができます。 プロセス分析において、この属性は非常に重要です。各バッチのエンドツーエンドのフローを追跡し、サイクルタイムを正確に測定し、プロセス変動を特定し、異なるバッチがどのように処理されているかを理解できます。トレーサビリティ、品質管理、有効期限管理が重要となる医薬品、食品・飲料、化学品などの業界では、バッチレベルでのプロセス分析が不可欠です。 その重要性 これは、関連するすべての在庫イベントを単一のケースに連結し、エンドツーエンドのプロセス分析を可能にする中核となる識別子です。 取得元 これは通常、バッチ番号であり、SAPテーブルMCHA(バッチマスタ)またはMCH1(バッチ)のフィールドCHARGで見つけることができます。 例 B001-A452023L202405-XYZ789456123BATCH-05-24 | |||
| アクティビティ ActivityName | 在庫管理プロセスの特定の時点で発生したビジネスイベントの名称。 | ||
| 説明 「活動」(Activity)属性は、バッチの在庫ライフサイクルにおける単一のステップまたはイベントを記述します。これらのイベントは、品目の受領、在庫移動、品質検査の実施、資材の出庫など、主要なビジネスアクションを表します。各活動は、特定の時点に在庫バッチに何が起こったかの記録です。 活動の分析は、プロセスマイニングの基盤です。これにより、プロセスフローの可視化、頻繁な経路と稀な経路の特定、活動が遅延しているボトルネックの検出、および手戻りループの分析が可能になります。「在庫廃棄」や「品質検査」のような活動の順序と頻度を理解することで、企業はプロセス改善と運用効率向上のための領域を特定できます。 その重要性 プロセスのステップを定義し、在庫ライフサイクルの可視化と分析を可能にします。 取得元 これは派生属性であり、多くの場合、SAP移動タイプ(MSEG-BWART)またはトランザクションコード(MKPF-TCODE2)からユーザーフレンドリーな名前にマッピングされます。 例 入庫記帳済み入庫振替転記済み出荷用の出庫が転記されました在庫廃棄済み | |||
| `品目コード` MaterialNumber | 管理されている製品または資材の一意の識別子。 | ||
| 説明 「品目番号」(Material Number)は、SKU(Stock Keeping Unit)とも呼ばれ、特定の製品に割り当てられる固有のコードです。これは在庫管理における基本的なマスタデータ要素であり、品目の数量、価値、移動を追跡するために使用されます。 プロセスマイニングでは、品目番号による分析により、在庫プロセスを製品中心に捉えることができます。これにより、どの製品の品質検査時間が最も長いか、どの製品が最も頻繁に廃棄されているか、あるいはどの製品が最も多くの内部振替を伴うかといった疑問に答えるのに役立ちます。このセグメンテーションは、製品固有の問題を特定し、異なる種類の品目に対する在庫戦略を最適化するために不可欠です。 その重要性 製品ごとの分析をセグメント化することで、特定の品目に特有のパターンや問題を明らかにすることができます。 取得元 品目伝票明細テーブルMSEGのフィールドMATNRにあります。マスタデータはテーブルMARAにあります。 例 RM-1001FG-2050-B100-400-A | |||
| ユーザー名 UserName | SAPでトランザクションを実行した担当者のユーザーID。 | ||
| 説明 この属性は、伝票を転記した、または活動を実行した従業員のSAPユーザーIDを捕捉します。これにより、在庫管理プロセス内での特定のアクションに誰が責任を持っているかを示すことで、トレーサビリティを提供します。 ユーザーごとの分析は、パフォーマンス、コンプライアンス、およびトレーニングのニーズを理解する上で不可欠です。例えば、「手動在庫調整の要因」ダッシュボードでは、この属性を使用して誰が最も多くの調整を行っているかを確認します。これにより、追加トレーニングが必要なユーザーを特定したり、不正な活動を浮き彫りにしたり、トップパフォーマーを認識したりするのに役立ちます。 その重要性 説明責任を明確にし、ユーザー特有の行動、トレーニングの必要性、またはコンプライアンス問題を特定するのに役立ちます。 取得元 品目伝票ヘッダテーブルMKPFのフィールドUSNAM(ユーザー名)にあります。 例 JSMITHMBROWNWAREHOUSE_OPS | |||
| 保管場所 StorageLocation | プラント内で在庫が物理的に保管されている特定の場所です。 | ||
| 説明 保管場所(Storage Location)は、プラント内の品目在庫を区別するための組織単位です。例えば、1つのプラント内に原材料、完成品、品質検査在庫のための個別の保管場所を設けることができます。 この属性は、プラントよりも詳細な場所の情報を提供します。受入エリアからメイン倉庫への移送リードタイムなど、異なる在庫エリア間の移動を理解するための分析に使用されます。保管場所ごとの保管活用状況や移動頻度を分析することで、倉庫レイアウトや内部物流の最適化に役立ちます。 その重要性 プラント内の在庫ロケーションを詳細に表示し、内部移動と保管効率の分析に役立ちます。 取得元 品目伝票明細テーブルMSEGのフィールドLGORT(保管場所)にあります。 例 0001RM01FG01QI01 | |||
| 工場 Plant | 工場や配送センターなど、在庫が保管されている施設を表す組織単位。 | ||
| 説明 プラント(Plant)はSAPにおける中心的な組織単位であり、製造施設、中央保管場所、または本社などを表します。すべての在庫は、物理的または論理的にプラント内に配置されます。 プラント別の分析は、異なる拠点間でのプロセスパフォーマンスを比較するための基本です。「どのプラントの棚入れサイクルタイムが最も長いか?」「プラントAの在庫差異率はプラントBよりも高いか?」といった問いに答えるのに役立ちます。この地理的または組織的なセグメンテーションは、拠点固有の問題を特定し、組織全体でベストプラクティスを共有するための鍵となります。 その重要性 異なる会社の拠点間で在庫プロセスとパフォーマンスを比較することを可能にします。 取得元 品目伝票明細テーブルMSEGのフィールドWERKS(プラント)にあります。 例 10001710DE01US01 | |||
| 数量 Quantity | 在庫移動に関わる資材の数量。 | ||
| 説明 この属性は、特定の活動で移動、受領、出庫、または調整された資材の量を表します。資材の基本単位で記録されます。 数量を分析することは、在庫プロセスの規模と影響を理解するために不可欠です。これにより、「SKU別出庫スループット」のような、処理される品目の量を視覚化するダッシュボードの作成が可能になります。また、「廃棄/処分在庫比率」のようなKPIの計算にも使用され、単にイベント数を数えるだけではない、プロセス分析に定量的な側面を提供します。 その重要性 各アクティビティにおける資材の量を定量化し、スループット、廃棄量、調整の影響の分析を可能にします。 取得元 品目伝票明細テーブルMSEGのフィールドMENGE(数量)にあります。 例 10012.55000-10 | |||
| 異動タイプ MovementType | SAPにおいて、在庫移動の転記方法を管理する3桁のキーです。 | ||
| 説明 「移動タイプ」(Movement Type)は、SAP在庫管理における重要な制御キーであり、資材移動の特性を決定します。どの勘定科目が更新されるか、トランザクションの画面レイアウトがどのように表示されるか、どの数量または金額フィールドが更新されるかを指定します。例えば、「101」は品目受領、「311」は振替転記、「551」は廃棄用です。 この属性は、ユーザーフレンドリーな「活動」名を導出するための情報源となることがよくあります。移動タイプによるプロセス分析は、在庫がどのように流れているかを詳細かつ技術的に把握することを可能にします。プロセスマップの正確性を検証し、ボトルネックや逸脱の原因となっている特定の種類のトランザクションを特定するために不可欠です。 その重要性 各在庫イベントを正確かつ技術的に分類することで、アクティビティの導出や詳細な分析に不可欠な情報を提供します。 取得元 品目伝票明細テーブルMSEGのフィールドBWART(移動タイプ)にあります。 例 101311261551601 | |||
| 移動理由コード MovementReasonCode | 在庫移動の理由を示すコードです。 | ||
| 説明 「移動理由」コードは、品目移動が実行された理由に関する追加のコンテキストを提供します。在庫調整、返品、廃棄などの計画外の移動を説明するためによく使用されます。 この属性は根本原因分析にとって極めて価値があります。「手動在庫調整の要因」ダッシュボードでは、理由コードで分析することで、破損、盗難、データ入力エラーなど、不整合が発生する理由を明らかにできます。このインサイトは、企業が症状を修正するだけでなく、根本的な問題に対処するのに役立ちます。 その重要性 予期せぬ在庫移動の「理由」を解明し、的を絞った根本原因分析を可能にします。 取得元 品目伝票明細テーブルMSEGのフィールドGRUND(移動理由)にあります。 例 00010005102 | |||
| ソースシステム SourceSystem | データが抽出されたソースシステムを特定します。 | ||
| 説明 この属性は、在庫管理データの発生元である記録システムを指定します。この文脈では、特定のSAP S/4HANAインスタンスを指します。この情報は、複数のERP、倉庫管理システム、またはレガシーシステムからデータが引き出される可能性がある環境では非常に重要です。 単一システム分析では静的に見えるかもしれませんが、異なるソースからのデータを統合して全体的なプロセスビューを作成する際には不可欠となります。データガバナンス、データ抽出の問題トラブルシューティング、およびデータリネージの明確化に役立ちます。 その重要性 データの発生源に関するコンテキストを提供し、データガバナンスとマルチシステム分析に不可欠です。 取得元 これは通常、データ変換プロセス中に特定のSAP S/4HANAインスタンスを識別するために設定されるハードコード値です。 例 S4H_PROD_100SAP_S4_FINANCES4HANA_GLOBAL | |||
| 保管ビン StorageBin | 倉庫内で資材が物理的に配置されている、最も詳細な保管単位。 | ||
| 説明 棚番(Storage Bin)は、棚の位置など、倉庫内の特定の座標を表します。このレベルの詳細は、通常SAP Warehouse Management (WM) または Extended Warehouse Management (EWM) が導入されている場合に使用されます。 「倉庫保管活用(Warehouse Storage Utilization)」ダッシュボードにおいて、この属性は極めて重要です。倉庫スペースがどれほど効果的に使用されているかの分析、混雑が発生しやすい箇所の特定、および非効率な棚入れ・ピッキングルートの発見を可能にします。棚番間の移動を分析することで、倉庫レイアウトの最適化や作業者の移動時間の削減に役立てることができます。 その重要性 最も詳細なロケーションデータを提供し、倉庫スペース利用率と運用効率の分析を可能にします。 取得元 WMを使用している場合、LTAK/LTAPのような転送オーダーテーブルでこれを見つけることができます。在庫伝票の場合、MSEG-LGPBEにある可能性があります。SAP S/4HANAのドキュメントを参照してください。 例 A-01-01-AB-05-10-CRCV-AREA-01 | |||
| 最終データ更新 LastDataUpdate | このレコードのデータがソースシステムから最後に更新された日時を示すタイムスタンプ。 | ||
| 説明 この属性は、ソースシステムからの最新のデータ抽出または更新の日時を記録します。これにより、分析されている情報の鮮度に関する重要なメタデータを提供します。これは、ユーザーがほぼリアルタイムのデータを見ているのか、それとも以前の期間のスナップショットを見ているのかを理解するのに役立ちます。 あらゆる分析において、データの適時性を知ることは、関連性のある正確な結論を導き出すための鍵となります。このフィールドにより、アナリストやビジネスユーザーはデータの最新性を確認でき、提示されるインサイトにコンテキストを提供するためにダッシュボードで表示されることがよくあります。 その重要性 データの鮮度をユーザーに伝え、分析が最新情報に基づいていることを保証します。 取得元 この 例 2024-05-21T08:00:00Z2024-05-20T08:00:00Z | |||
| 受注処理サイクルタイム OrderFulfillmentCycleTime | ピッキング開始から出荷のために品目が出庫されるまでのエンドツーエンドの期間。 | ||
| 説明 これは、「ピッキング開始」活動から「出荷のための出庫転記」活動までの合計時間を測定する計算メトリックです。プロセスが開始されてから、倉庫が顧客注文を準備し出荷するまでにかかる総時間を表します。 この属性は、「受注処理サイクルタイム」KPIの直接的な測定値です。この期間を分析することで、企業は顧客需要への対応能力を理解するのに役立ちます。製品、倉庫、または顧客別に細分化して、ピッキング、梱包、出荷プロセスでどこに遅延が発生しているかを特定でき、顧客満足度とロジスティクス効率に直接影響します。 その重要性 倉庫の出庫プロセスの速度と効率を測定し、顧客満足度における重要な要素となります。 取得元 これは、各バッチの「ピッキング開始」イベントと「出荷のための出庫転記」イベントの間の時間差を計算して導出される、計算された属性です。 例 7200144003600 | |||
| 品目伝票番号 MaterialDocumentNumber | 品目移動を記録する品目伝票を一意に識別する番号。 | ||
| 説明 SAPで入出庫が転記されると、システムは移動の証拠として品目伝票を生成します。この属性は、その伝票の一意の識別子です。1つの品目伝票には、複数の明細やアクティビティが含まれる場合があります。 プロセスマイニングにおいて、品目伝票番号は重要なトランザクション識別子であり、一緒に転記された関連イベントをグループ化するために使用できます。また、監査や、プロセス分析からソースシステムへドリルダウンして特定のトランザクションを調査する上でも不可欠です。 その重要性 監査のためのトランザクションキーとして機能し、同時に実行されたアクティビティをグループ化することを可能にします。 取得元 テーブルMKPF(ヘッダ)およびMSEG(明細)のフィールドMBLNR(品目伝票番号)にあります。 例 490000123450000056784900002345 | |||
| 品質検査サイクルタイム QualityInspectionCycleTime | バッチがリリースされる前に品質検査に費やす期間。 | ||
| 説明 この計算されたメトリックは、特定の在庫バッチについて、「品質検査に在庫転記」活動と「品質検査済み在庫リリース」活動との間の経過時間を測定します。これは、品質管理プロセスにより品目が使用不可となっている期間を表します。 この属性は、「品質検査サイクルタイム」KPIおよびダッシュボードを直接サポートします。この期間を計算・分析することで、企業は品質プロセスにおけるボトルネックを特定し、異なる資材やプラント間でのパフォーマンスを比較し、検査を合理化して全体の在庫可用性を向上させ、リードタイムを短縮する機会を見つけることができます。 その重要性 品質管理による遅延を定量化し、在庫の可用性とプロセス速度を向上させる機会を明確にします。 取得元 これは、品質検査フェーズの開始活動と終了活動のタイムスタンプ間の時間差を見つけることで導出される、計算フィールドです。 例 2880086400172800 | |||
| 在庫タイプ StockType | 制約なし、品質検査中、またはブロック済みなど、在庫のステータスを示します。 | ||
| 説明 在庫タイプは、在庫の利用可能性に基づいて在庫を分類します。主なタイプは、非制限利用在庫(自由に利用可能)、品質検査在庫(品質チェック待ち)、および保留在庫(利用不可)です。品目移動には、しばしば在庫タイプの変更が伴います。 在庫タイプの変更を追跡することは、在庫の可用性プロセスを理解する上で不可欠です。「品質検査に在庫転記」や「在庫ステータスを保留に変更」といった活動を直接サポートします。各在庫タイプ、特に「品質検査」に費やされた時間を分析することは、販売または生産のための品目の可用性に影響を与える遅延を特定するための鍵となります。 その重要性 在庫の使用可能ステータスを追跡し、品質検査の遅延や在庫の可用性を分析する上で重要です。 取得元 品目伝票明細テーブルMSEGのフィールドINSMK(在庫タイプ)にあります。 例 非制限利用品質検査ブロック在庫 | |||
| 有効期限 ExpirationDate | 資材バッチの有効期限が切れ、もはや使用できなくなる日付。 | ||
| 説明 「有効期限」(Shelf Life Expiration Date、SLED)は、生鮮品や時間制約のある品目にとって重要なマスタデータの一部です。バッチレベルで管理され、製品がもはや販売または消費できなくなる時期を決定します。 この属性は、「陳腐化および期限切れ在庫分析」ダッシュボードにとって不可欠です。有効期限のコンテキストで活動を分析することで、企業は期限切れのリスクがあるバッチを特定し、積極的な対策を講じることができます。これは、先入れ先出し(FEFO)などの在庫回転ポリシーの有効性を測定し、廃棄された期限切れ在庫による損失を定量化するのに役立ちます。 その重要性 陳腐化・期限切れ在庫の分析を可能にし、無駄と経済的損失の最小化に貢献します。 取得元 バッチマスタテーブルMCH1またはMCHAのフィールドVFDAT(有効期限日)にあります。 例 2024-12-312025-06-302024-09-01 | |||
| 測定単位 UnitOfMeasure | 資材の数量が測定される単位(例:個、キログラム)。 | ||
| 説明 「数量」属性の単位を指定するのが「測定単位」(Unit of Measure)です。一般的な例としては、個(PC)、キログラム(KG)、リットル(L)、箱(BOX)などがあります。これは数量フィールドに不可欠なコンテキストを提供します。 単純な記述子として使われることが多いですが、この属性はデータ品質を保証し、異なる単位を共通の基準に変換する必要がある分析にとって重要です。例えば、廃棄された在庫の総価値を正確に計算するには、異なる単位の数量を理解し、必要に応じて変換する必要があります。 その重要性 「数量」属性に不可欠なコンテキストを提供し、資材量の正確な解釈を保証します。 取得元 品目伝票明細テーブルMSEGのフィールドMEINS(基本単位)にあります。 例 PCKGEAM | |||
在庫管理活動
| アクティビティ | 説明 | ||
|---|---|---|---|
| 入庫振替転記済み | 受領またはステージングエリアから最終保管場所またはビンへのバッチの物理的な移動を表します。これはSAPで振替転記品目伝票として記録されます。 | ||
| その重要性 入庫プロセスを完了します。この活動の完了にかかる時間(入庫時間として知られる)は、倉庫効率にとって重要なKPIです。 取得元 MATDOCテーブルに振替転記として記録され、多くの場合、保管場所間(例:移動タイプ311)で行われます。具体的な移動は倉庫構造によって異なる場合があります。 取得 仮/受入SLocから最終保管SLocへ在庫を移動するMATDOCの振替伝票によって識別されます。 イベントタイプ explicit | |||
| 入庫記帳済み | 在庫バッチが倉庫に最初に入庫されることを記録します。通常、サプライヤーまたは生産拠点からの入庫です。このイベントは、品目受領時にSAP S/4HANAで品目伝票が作成されることで明確に捕捉されます。 | ||
| その重要性 これは在庫ライフサイクルにおける主要な開始イベントです。この活動から入庫などの他の活動までの時間を分析することは、受入ドックの効率を測定するために重要です。 取得元 MATDOCテーブルに記録されます。特定の移動タイプ(BWART)によって識別され、例えば購買発注入庫の101や、保留在庫へのGRの103などです。 取得 入庫移動タイプに対応するMATDOCの品目伝票から取得されます。 イベントタイプ explicit | |||
| 出荷用の出庫が転記されました | 出庫プロセスの最終ステップを記録し、バッチの所有権が顧客または運送業者に移転されます。これは、在庫を減らし、会計に転記する明示的なトランザクションです。 | ||
| その重要性 これは受注処理プロセスの主要な完了イベントです。オンタイム配送の測定と、全体の受注処理サイクルタイムの計算に不可欠です。 取得元 MATDOCテーブルに記録されます。販売注文出荷に対する出庫の移動タイプ(BWART)によって識別され、通常は601です。 取得 移動タイプ601のMATDOCの品目伝票から取得されます。 イベントタイプ explicit | |||
| 品質検査済み在庫リリース | バッチが品質検査に合格し、使用または保管可能になったことを示します。これは、品質検査在庫から自由利用可能在庫などの別の在庫タイプへの明示的な振替転記として記録されます。 | ||
| その重要性 このマイルストーンは品質プロセスの完了を示し、在庫が利用可能になります。ここでの遅延は、生産またはフルフィルメントにおいて重大な下流の問題を引き起こす可能性があります。 取得元 MATDOCテーブルに振替転記として記録されます。通常、移動タイプ(BWART)321によって識別され、「品質検査」から「非制限利用」へ在庫を移動させます。 取得 移動タイプ321のMATDOCの品目伝票から取得されます。 イベントタイプ explicit | |||
| 在庫廃棄済み | 在庫バッチの最終的な処分を記録し、在庫記録から永久に削除します。これは通常、期限切れ、破損、または陳腐化在庫に対して行われます。 | ||
| その重要性 これは財務損失を表す終了イベントです。廃棄イベントを分析することで、在庫の陳腐化、取り扱い手順、または需要予測に関する問題を特定するのに役立ちます。 取得元 MATDOCテーブルに記録されます。廃棄の移動タイプ(BWART)によって識別され、例えば551(非制限から)、553(QIから)、または555(保留から)などです。 取得 廃棄移動タイプ(例:551)を持つMATDOCの品目伝票から取得されます。 イベントタイプ explicit | |||
| 在庫調整が転記されました | 実地棚卸数またはその他の差異によって生じる在庫数量の変更を記録します。このイベントは、帳簿在庫を実地棚卸数と一致させるために明示的に調整します。 | ||
| その重要性 これらの調整は、在庫の正確性を維持するために極めて重要です。調整の頻度が高いことは、在庫の取り扱い、セキュリティ、またはデータ入力における根本的な問題を示唆しています。 取得元 MATDOCテーブルに記録されます。実地棚卸の移動タイプ(BWART)によって識別され、例えば701(棚卸差異増)または702(棚卸差異減)などです。 取得 棚卸調整移動タイプ(例:701、702)を持つMATDOCの品目伝票から取得されます。 イベントタイプ explicit | |||
| 生産用の出庫が転記されました | 生産オーダーまたはプロセスオーダーによる在庫バッチの消費を表します。このトランザクションは在庫を減らし、資材コストを製造オーダーに割り当てます。 | ||
| その重要性 これは主要な消費イベントであり、コンポーネントの在庫ライフサイクルの終了を示します。生産のための資材可用性と消費パターンを分析するために重要です。 取得元 MATDOCテーブルに記録されます。注文に対する出庫の移動タイプ(BWART)によって識別され、例えば261などです。 取得 移動タイプ261のMATDOCの品目伝票から取得されます。 イベントタイプ explicit | |||
| バッチステータス変更済み | バッチマスタレコードの変更、例えばステータスを「非制限」から「制限付き」に変更することなどを反映します。これは品目の移動ではなく、マスタデータの変更であり、ログに記録されます。 | ||
| その重要性 バッチステータスの変更は、販売や生産における使い勝手に直接影響します。これらの変更を分析することで、物理的な移動を伴わない、在庫の期限切れや品質管理に関する問題を明らかにできます。 取得元 バッチマスタテーブル(MCH1、MCHA)の変更ログから推測されます。CDHDRおよびCDPOSテーブルは、バッチステータスフィールド(MCH1-ZUSTD)への変更を追跡します。 取得 バッチマスタレコード(MCH1-ZUSTD)のステータスフィールドに対するCDHDR/CDPOSの変更伝票から導出されます。 イベントタイプ inferred | |||
| ピッキング開始 | 受注処理プロセスが開始され、保管ビンからバッチをピッキングするための倉庫タスクが作成されることを記録します。これは通常、転送オーダーまたは倉庫タスクが作成されたときに捕捉されます。 | ||
| その重要性 この活動はピッキングプロセスのトリガーとなります。このイベントからピッキング完了までの時間を分析することで、倉庫作業員の効率を測定し、遅延を特定するのに役立ちます。 取得元 これは通常、MATDOCにはありません。倉庫管理(WM/EWM)システムでは、転送オーダー(LTAKテーブル)または倉庫タスクの作成タイムスタンプから推測されます。 取得 品目バッチにリンクされた転送オーダー(WMの場合)または倉庫タスク(EWMの場合)の作成記録から推測されます。 イベントタイプ inferred | |||
| 内部在庫振替が転記されました | 同一プラント内の異なる保管場所またはビン間で在庫バッチが移動する様子を記録します。これは品目伝票を作成する明示的なトランザクションです。 | ||
| その重要性 内部振替の追跡は、倉庫の運用効率を分析し、不要な移動を特定し、場所間の在庫補充のリードタイムを測定するのに役立ちます。 取得元 MATDOCテーブルに記録されます。保管場所間の振替には、一般的に移動タイプ(BWART)311で識別されます。 取得 内部在庫移動用の移動タイプ(例:311)を持つMATDOCの品目伝票から取得されます。 イベントタイプ explicit | |||
| 品質検査に在庫転記 | 受領したバッチを品質検査保留ステータスに移動させることを表し、クリアされるまで使用できない状態にします。これはSAPにおける明示的なトランザクションであり、バッチの在庫タイプを変更します。 | ||
| その重要性 この活動は品質検査プロセスを開始します。この活動とQIからのリリースまでの期間は、品質関連の遅延を理解するための重要な指標です。 取得元 MATDOCテーブルに記録されます。これは、在庫タイプ(INSMK)が「Q」(品質検査)に設定された品目受領移動(例:101)または振替転記(例:322)である可能性があります。 取得 在庫を「品質検査」在庫タイプに置くMATDOCの品目伝票によって識別されます。 イベントタイプ explicit | |||
| 在庫ステータスを保留に変更 | バッチのステータス変更を表し、多くの場合、破損、保留要求、またはその他の理由により、出庫できない状態にします。これはSAPにおける明示的な振替転記です。 | ||
| その重要性 在庫の利用可能性の中断を強調します。ブロックイベントの頻度が高い場合は、ハンドリング、保管条件、または仕入先の品質に関する問題を示唆している可能性があります。 取得元 MATDOCテーブルに振替転記として記録されます。一般的に、移動タイプ(BWART)344を使用して在庫を「保留」から「非制限」に移動させ、343を使用して「非制限」から「保留」に移動させます。このアクティビティは343用です。 取得 移動タイプ343のMATDOCの品目伝票によって識別されます。 イベントタイプ explicit | |||
| 在庫ステータスを非制限に変更 | バッチのステータス変更を表し、保留または品質検査による保留を解除し、使用可能にします。これは明示的な振替転記として記録されます。 | ||
| その重要性 この活動は在庫保留の解消を示します。在庫が保留状態にある時間を分析することで、解消プロセスを改善できます。 取得元 MATDOCテーブルに振替転記として記録されます。移動タイプ(BWART)344は、在庫を「保留」から「非制限利用」に移動させます。 取得 移動タイプ344のMATDOCの品目伝票によって識別されます。 イベントタイプ explicit | |||
| 販売返品受領済み | 以前に出荷されたバッチが顧客から倉庫に返品される様子を記録します。これは在庫を増加させる明示的なトランザクションです。 | ||
| その重要性 返品の追跡は、製品の品質問題や顧客不満を理解するために不可欠です。返品の処理と処分に関するプロセスも、非効率性の原因となる可能性があります。 取得元 MATDOCテーブルに記録されます。販売返品の移動タイプ(BWART)によって識別され、例えば651(非制限へ)または653(品質検査へ)などです。 取得 販売返品移動タイプ(例:651、653)を持つMATDOCの品目伝票から取得されます。 イベントタイプ explicit | |||
抽出ガイド
ステップ
- システムアクセスの確立: SAP S/4HANAシステムでCore Data Services (CDS) ビューをクエリするために必要な権限を持つユーザーを確保します。通常、これにはシステム管理者によるアクセス許可が必要です。
- SQLクライアントの選択: SAP HANAデータベースに接続できるSQLクライアントツールを選択します。一般的な選択肢には、SAP HANA Studio、SAP HANA Database Explorer、またはDBeaverなどのサードパーティ製ツールがあります。
- データベース接続の設定: SQLクライアントを使用して、新しいデータベース接続を作成します。HANAデータベースのホスト名、ポート番号(通常は3<インスタンス番号>15)、およびデータベースユーザーの資格情報が必要です。
- SQLクエリの準備: このドキュメントの「クエリ」セクションにある完全なSQLクエリをコピーして、SQLクライアントのエディタに貼り付けます。
- クエリパラメータの設定: クエリ内のプレースホルダーを探します。
I_MaterialDocumentItem.PostingDate BETWEEN 'YYYYMMDD' AND 'YYYYMMDD'を、希望する日付範囲(例:BETWEEN '20230101' AND '20230630')に置き換えます。また、MaterialDocumentItem.Plant IN ('Plant1', 'Plant2')のような会社やプラント固有のフィルターも、組織構造に合わせて更新してください。 - クエリの実行: 修正したSQLクエリをS/4HANAデータベースに対して実行します。実行時間は、日付範囲とシステム内の在庫データの量によって異なります。
- データの確認: クエリが完了したら、SQLクライアントで結果を確認し、正しく完全であるかチェックします。異なるアクティビティが含まれているか、主要な属性にデータが入っているかを確認してください。
- イベントログの書き出し: SQLクライアントから結果セット全体をCSVファイルにエクスポートします。文字化けを防ぐため、エクスポート設定でUTF-8エンコーディングを使用していることを確認してください。
- アップロードの準備: CSVファイルの列名を、クエリの別名(例:
InventoryBatchLot、ActivityName、EventTimeなど)と正確に一致させます。これでプロセスマイニングツールにアップロードする準備が整いました。
設定
- 権限: クエリを実行するユーザーには、以下のCDSビューに対する
SELECT権限が必要です:I_MaterialDocumentItem、I_BatchChangeDocument、I_WarehouseTask。また、これらのビューが存在する基盤となるデータベーススキーマへのアクセス権も必要です。 - 日付範囲によるフィルタリング:
PostingDate、ChangeDocumentCreationDate、またはWarehouseTaskCreationDateの各フィールドに日付範囲フィルターを適用することが極めて重要です。分析の一般的な範囲は3〜12ヶ月です。複数年にわたるクエリを実行すると、パフォーマンスに重大な問題が発生する可能性があります。 - 組織フィルター: パフォーマンスの向上と対象を絞った分析のために、
WHERE句を追加してPlant(プラント)またはCompanyCode(会社コード)でフィルタリングしてください。これによりデータ量が削減され、ビジネスの関連部分に焦点を当てた抽出が可能になります。 - データボリューム: 在庫管理システムは膨大なデータを生成することに注意してください。広範な日付範囲を指定すると数百万行の結果になる可能性があり、抽出時のソースシステムとクライアントツールのパフォーマンスの両方に影響を及ぼす場合があります。
- Extended Warehouse Management (EWM): 「Picking Initiated(ピッキング開始)」アクティビティは
I_WarehouseTaskCDSビューに依存しており、これはSAP Extended Warehouse Managementを使用している場合にのみデータが入力されます。従来のWarehouse Management (WM) モジュールやInventory Management (IM) のみを使用している場合、この特定のアクティビティは抽出されません。
a クエリ例 sql
SELECT
mat_doc.Batch AS "InventoryBatchLot",
CASE
WHEN mat_doc.MovementType = '101' AND mat_doc.InventoryStockType = '2' THEN 'Stock Posted to Quality Inspection'
WHEN mat_doc.MovementType = '101' THEN 'Goods Receipt Posted'
WHEN mat_doc.MovementType = '321' THEN 'Quality Inspection Stock Released'
WHEN mat_doc.MovementType = '311' THEN 'Internal Stock Transfer Posted'
WHEN mat_doc.MovementType = '344' THEN 'Stock Status Changed to Blocked'
WHEN mat_doc.MovementType IN ('343', '322') THEN 'Stock Status Changed to Unrestricted'
WHEN mat_doc.MovementType IN ('701', '702') THEN 'Inventory Adjustment Posted'
WHEN mat_doc.MovementType = '601' THEN 'Goods Issue for Delivery Posted'
WHEN mat_doc.MovementType = '261' THEN 'Goods Issue for Production Posted'
WHEN mat_doc.MovementType IN ('651', '653') THEN 'Sales Return Received'
WHEN mat_doc.MovementType = '551' THEN 'Stock Scrapped'
WHEN mat_doc.MovementType = '313' THEN 'Put-Away Transfer Posted' -- Example for two-step transfers
ELSE 'Unknown Material Movement'
END AS "ActivityName",
TO_TIMESTAMP(mat_doc.PostingDate || LPAD(mat_doc.CreationTime, 6, '0'), 'YYYYMMDDHH24MISS') AS "EventTime",
mat_doc.Material AS "MaterialNumber",
mat_doc.CreatedByUser AS "UserName",
mat_doc.MovementType AS "MovementType",
mat_doc.Plant AS "Plant",
mat_doc.StorageLocation AS "StorageLocation",
mat_doc.QuantityInEntryUnit AS "Quantity",
mat_doc.ReasonForMovement AS "MovementReasonCode"
FROM
I_MaterialDocumentItem AS mat_doc
WHERE
mat_doc.Batch IS NOT NULL AND mat_doc.Batch <> ''
AND mat_doc.PostingDate BETWEEN '20230101' AND '20231231' -- Placeholder: Set your date range
-- AND mat_doc.Plant IN ('Plant1', 'Plant2') -- Placeholder: Add filters for relevant plants
UNION ALL
SELECT
SPLIT_PART(change_doc.ChangeableObjectDescription, '/', 3) AS "InventoryBatchLot",
'Batch Status Changed' AS "ActivityName",
change_doc.ChangeDocumentCreationDateTime AS "EventTime",
SPLIT_PART(change_doc.ChangeableObjectDescription, '/', 1) AS "MaterialNumber",
change_doc.ChangedByUser AS "UserName",
NULL AS "MovementType",
SPLIT_PART(change_doc.ChangeableObjectDescription, '/', 2) AS "Plant",
NULL AS "StorageLocation",
NULL AS "Quantity",
NULL AS "MovementReasonCode"
FROM
I_BatchChangeDocument AS change_doc
WHERE
change_doc.ChangeDocumentTable = 'MCHA' AND change_doc.ChangeDocumentTableFieldName = 'ZUSTD'
AND TO_VARCHAR(change_doc.ChangeDocumentCreationDate) BETWEEN '20230101' AND '20231231' -- Placeholder: Set your date range
UNION ALL
SELECT
wh_task.Batch AS "InventoryBatchLot",
'Picking Initiated' AS "ActivityName",
wh_task.WarehouseTaskCreationDateTime AS "EventTime",
wh_task.Product AS "MaterialNumber",
wh_task.CreatedByUser AS "UserName",
NULL AS "MovementType",
wh_task.Plant AS "Plant",
wh_task.SourceStorageLocation AS "StorageLocation",
wh_task.TargetQuantity AS "Quantity",
NULL AS "MovementReasonCode"
FROM
I_WarehouseTask AS wh_task
WHERE
wh_task.Batch IS NOT NULL AND wh_task.Batch <> ''
AND wh_task.WarehouseProcessType IN ('P210', 'P220') -- Placeholder: Adjust process types based on your picking configuration
AND TO_VARCHAR(wh_task.WarehouseTaskCreationDate) BETWEEN '20230101' AND '20231231'; -- Placeholder: Set your date range ステップ
- システムアクセスの確立: SAP S/4HANAシステムでCore Data Services (CDS) ビューをクエリするために必要な権限を持つユーザーを確保します。通常、これにはシステム管理者によるアクセス許可が必要です。
- SQLクライアントの選択: SAP HANAデータベースに接続できるSQLクライアントツールを選択します。一般的な選択肢には、SAP HANA Studio、SAP HANA Database Explorer、またはDBeaverなどのサードパーティ製ツールがあります。
- データベース接続の設定: SQLクライアントを使用して、新しいデータベース接続を作成します。HANAデータベースのホスト名、ポート番号(通常は3<インスタンス番号>15)、およびデータベースユーザーの資格情報が必要です。
- SQLクエリの準備: このドキュメントの「クエリ」セクションにある完全なSQLクエリをコピーして、SQLクライアントのエディタに貼り付けます。
- クエリパラメータの設定: クエリ内のプレースホルダーを探します。
I_MaterialDocumentItem.PostingDate BETWEEN 'YYYYMMDD' AND 'YYYYMMDD'を、希望する日付範囲(例:BETWEEN '20230101' AND '20230630')に置き換えます。また、MaterialDocumentItem.Plant IN ('Plant1', 'Plant2')のような会社やプラント固有のフィルターも、組織構造に合わせて更新してください。 - クエリの実行: 修正したSQLクエリをS/4HANAデータベースに対して実行します。実行時間は、日付範囲とシステム内の在庫データの量によって異なります。
- データの確認: クエリが完了したら、SQLクライアントで結果を確認し、正しく完全であるかチェックします。異なるアクティビティが含まれているか、主要な属性にデータが入っているかを確認してください。
- イベントログの書き出し: SQLクライアントから結果セット全体をCSVファイルにエクスポートします。文字化けを防ぐため、エクスポート設定でUTF-8エンコーディングを使用していることを確認してください。
- アップロードの準備: CSVファイルの列名を、クエリの別名(例:
InventoryBatchLot、ActivityName、EventTimeなど)と正確に一致させます。これでプロセスマイニングツールにアップロードする準備が整いました。
設定
- 権限: クエリを実行するユーザーには、以下のCDSビューに対する
SELECT権限が必要です:I_MaterialDocumentItem、I_BatchChangeDocument、I_WarehouseTask。また、これらのビューが存在する基盤となるデータベーススキーマへのアクセス権も必要です。 - 日付範囲によるフィルタリング:
PostingDate、ChangeDocumentCreationDate、またはWarehouseTaskCreationDateの各フィールドに日付範囲フィルターを適用することが極めて重要です。分析の一般的な範囲は3〜12ヶ月です。複数年にわたるクエリを実行すると、パフォーマンスに重大な問題が発生する可能性があります。 - 組織フィルター: パフォーマンスの向上と対象を絞った分析のために、
WHERE句を追加してPlant(プラント)またはCompanyCode(会社コード)でフィルタリングしてください。これによりデータ量が削減され、ビジネスの関連部分に焦点を当てた抽出が可能になります。 - データボリューム: 在庫管理システムは膨大なデータを生成することに注意してください。広範な日付範囲を指定すると数百万行の結果になる可能性があり、抽出時のソースシステムとクライアントツールのパフォーマンスの両方に影響を及ぼす場合があります。
- Extended Warehouse Management (EWM): 「Picking Initiated(ピッキング開始)」アクティビティは
I_WarehouseTaskCDSビューに依存しており、これはSAP Extended Warehouse Managementを使用している場合にのみデータが入力されます。従来のWarehouse Management (WM) モジュールやInventory Management (IM) のみを使用している場合、この特定のアクティビティは抽出されません。
a クエリ例 sql
SELECT
mat_doc.Batch AS "InventoryBatchLot",
CASE
WHEN mat_doc.MovementType = '101' AND mat_doc.InventoryStockType = '2' THEN 'Stock Posted to Quality Inspection'
WHEN mat_doc.MovementType = '101' THEN 'Goods Receipt Posted'
WHEN mat_doc.MovementType = '321' THEN 'Quality Inspection Stock Released'
WHEN mat_doc.MovementType = '311' THEN 'Internal Stock Transfer Posted'
WHEN mat_doc.MovementType = '344' THEN 'Stock Status Changed to Blocked'
WHEN mat_doc.MovementType IN ('343', '322') THEN 'Stock Status Changed to Unrestricted'
WHEN mat_doc.MovementType IN ('701', '702') THEN 'Inventory Adjustment Posted'
WHEN mat_doc.MovementType = '601' THEN 'Goods Issue for Delivery Posted'
WHEN mat_doc.MovementType = '261' THEN 'Goods Issue for Production Posted'
WHEN mat_doc.MovementType IN ('651', '653') THEN 'Sales Return Received'
WHEN mat_doc.MovementType = '551' THEN 'Stock Scrapped'
WHEN mat_doc.MovementType = '313' THEN 'Put-Away Transfer Posted' -- Example for two-step transfers
ELSE 'Unknown Material Movement'
END AS "ActivityName",
TO_TIMESTAMP(mat_doc.PostingDate || LPAD(mat_doc.CreationTime, 6, '0'), 'YYYYMMDDHH24MISS') AS "EventTime",
mat_doc.Material AS "MaterialNumber",
mat_doc.CreatedByUser AS "UserName",
mat_doc.MovementType AS "MovementType",
mat_doc.Plant AS "Plant",
mat_doc.StorageLocation AS "StorageLocation",
mat_doc.QuantityInEntryUnit AS "Quantity",
mat_doc.ReasonForMovement AS "MovementReasonCode"
FROM
I_MaterialDocumentItem AS mat_doc
WHERE
mat_doc.Batch IS NOT NULL AND mat_doc.Batch <> ''
AND mat_doc.PostingDate BETWEEN '20230101' AND '20231231' -- Placeholder: Set your date range
-- AND mat_doc.Plant IN ('Plant1', 'Plant2') -- Placeholder: Add filters for relevant plants
UNION ALL
SELECT
SPLIT_PART(change_doc.ChangeableObjectDescription, '/', 3) AS "InventoryBatchLot",
'Batch Status Changed' AS "ActivityName",
change_doc.ChangeDocumentCreationDateTime AS "EventTime",
SPLIT_PART(change_doc.ChangeableObjectDescription, '/', 1) AS "MaterialNumber",
change_doc.ChangedByUser AS "UserName",
NULL AS "MovementType",
SPLIT_PART(change_doc.ChangeableObjectDescription, '/', 2) AS "Plant",
NULL AS "StorageLocation",
NULL AS "Quantity",
NULL AS "MovementReasonCode"
FROM
I_BatchChangeDocument AS change_doc
WHERE
change_doc.ChangeDocumentTable = 'MCHA' AND change_doc.ChangeDocumentTableFieldName = 'ZUSTD'
AND TO_VARCHAR(change_doc.ChangeDocumentCreationDate) BETWEEN '20230101' AND '20231231' -- Placeholder: Set your date range
UNION ALL
SELECT
wh_task.Batch AS "InventoryBatchLot",
'Picking Initiated' AS "ActivityName",
wh_task.WarehouseTaskCreationDateTime AS "EventTime",
wh_task.Product AS "MaterialNumber",
wh_task.CreatedByUser AS "UserName",
NULL AS "MovementType",
wh_task.Plant AS "Plant",
wh_task.SourceStorageLocation AS "StorageLocation",
wh_task.TargetQuantity AS "Quantity",
NULL AS "MovementReasonCode"
FROM
I_WarehouseTask AS wh_task
WHERE
wh_task.Batch IS NOT NULL AND wh_task.Batch <> ''
AND wh_task.WarehouseProcessType IN ('P210', 'P220') -- Placeholder: Adjust process types based on your picking configuration
AND TO_VARCHAR(wh_task.WarehouseTaskCreationDate) BETWEEN '20230101' AND '20231231'; -- Placeholder: Set your date range ステップ
- ABAPエディタへのアクセス: SAP S/4HANAシステムにログインします。トランザクションコード
SE38を使用して、ABAPエディタを開きます。 - 新規プログラムの作成: 「プログラム」フィールドに新しいプログラム名(例:
Z_PM_INVENTORY_EXTRACT)を入力し、「作成」ボタンをクリックします。わかりやすいタイトルを指定し、「タイプ」を「実行可能プログラム」に設定して、パッケージに保存します。 - プログラムパラメータの定義: プログラムエディタで、抽出のユーザーインターフェースとなる選択画面を定義します。これにより、ユーザーはデータ抽出のための日付範囲やプラントなどのパラメータを指定できるようになります。
- 抽出ロジックの実装: 「クエリ」セクションに記載されている完全なABAPコードをコピーし、ABAPエディタに貼り付けます。このコードは、様々なSAPテーブルから必要な14の在庫アクティビティすべてのデータを選択するように設計されています。
- コアロジックの理解: プログラムは、品目移動用の
MKPFやMSEG、マスタデータ変更用のCDHDRやCDPOSなど、各ソーステーブルから個別の在庫アクティビティのデータを選択します。各選択結果はUNION ALLを使用して1つの内部テーブルに統合され、これがイベントログとなります。 - ファイル出力の設定: コードの最後で、内部テーブルから統合されたデータをファイルに書き込む処理を行います。
OPEN DATASET文を使用して、SAPアプリケーションサーバー上にファイルを作成します。SAPシステムユーザーが書き込み権限を持つ、有効なサーバーパスを指定する必要があります。 - プログラムの実行: ABAPプログラムを保存し、有効化します(Ctrl+F3)。F8キーを押して実行します。選択画面で、希望する日付範囲、およびプラントや会社コードなどの関連フィルターを入力します。
- バックグラウンドジョブとしての実行: データ量が多い場合、セッションタイムアウトを避けるためにプログラムをバックグラウンドジョブとして実行することが不可欠です。実行画面(F8)から、メニューの
プログラム -> バックグラウンドで実行を選択します。オフピークの時間帯に実行されるようジョブをスケジュールしてください。 - 出力ファイルの取得: ジョブが完了したら、SAPアプリケーションサーバー上の出力ファイルを確認します。トランザクションコード
AL11を使用してサーバーディレクトリを参照し、ファイルを見つけます。トランザクションCG3Yを使用して、アプリケーションサーバーからローカルコンピュータにファイルをダウンロードします。 - アップロードの準備: ダウンロードしたファイルをテキストエディタまたは表計算ソフトで開きます。ヘッダー行を含み、カンマを区切り文字、二重引用符をテキスト修飾子としたCSV形式であることを確認します。プロセスマイニングツールにアップロードする前に、列名が要件と一致していることを確認してください。
設定
- 転記日付範囲: 最も重要なパラメータです。良好なパフォーマンスを維持しシステムのタイムアウトを避けるため、一度に3〜6ヶ月分など、管理可能なバッチ単位でデータを抽出することをお勧めします。
- プラントフィルター: 1つ以上の特定のプラント(
WERKS)でフィルタリングすることを強く推奨します。すべてのプラントを同時に抽出すると、リソースを極端に消費する可能性があります。 - 会社コードフィルター: 同一システム内で複数の会社コードを運用している場合は、オプションで会社コード(
BUKRS)のフィルターを追加し、データ範囲をさらに制限できます。 - アプリケーションサーバーのファイルパス: ABAPプログラムには、SAPアプリケーションサーバー上の事前定義された有効なディレクトリパスが必要です。SAPシステムユーザー(
SY-UNAME)が、そのディレクトリにファイルを書き込むためのOSレベルの必要な権限を持っていることを確認してください。 - 権限: この抽出を実行するユーザーには、トランザクション
SE38(プログラムの作成と実行)の権限、テーブルMKPF、MSEG、MCH1、CDHDR、CDPOS、LTAK、LTAPの表示アクセス権、およびバックグラウンドジョブ(SM36/SM37)のスケジュール能力が必要です。
a クエリ例 abap
REPORT Z_PM_INVENTORY_EXTRACT.
" ====================================================================
" SELECTION SCREEN
" ====================================================================
SELECT-OPTIONS: s_budat FOR sy-datum OBLIGATORY.
SELECT-OPTIONS: s_werks FOR mseg-werks.
PARAMETERS: p_fpath TYPE string DEFAULT '/usr/sap/trans/tmp/inventory_log.csv' OBLIGATORY.
" ====================================================================
" DATA STRUCTURES
" ====================================================================
TYPES: BEGIN OF ty_event_log,
InventoryBatchLot TYPE charg,
ActivityName TYPE string,
EventTime TYPE string,
MaterialNumber TYPE matnr,
UserName TYPE xubname,
MovementType TYPE bwart,
Plant TYPE werks_d,
StorageLocation TYPE lgort_d,
Quantity TYPE menge_d,
MovementReasonCode TYPE grund,
END OF ty_event_log.
DATA: lt_event_log TYPE TABLE OF ty_event_log.
" ====================================================================
" DATA SELECTION
" ====================================================================
START-OF-SELECTION.
SELECT
mseg~charg AS InventoryBatchLot,
'Goods Receipt Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart IN ('101', '103', '105', '501', '521', '561')
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
CASE mseg~shkzg
WHEN 'H' THEN 'Stock Posted to Quality Inspection'
WHEN 'S' THEN 'Quality Inspection Stock Released'
END AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart = '321' " For QI to Unrestricted
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Put-Away Transfer Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart = '311' AND mseg~shkzg = 'H' " Assume put-away is the credit side
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Internal Stock Transfer Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart IN ('301', '311', '313', '315')
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
CASE mseg~bwart
WHEN '343' THEN 'Stock Status Changed to Blocked'
WHEN '344' THEN 'Stock Status Changed to Unrestricted'
END AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart IN ('343', '344')
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Inventory Adjustment Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart IN ('701', '702', '711', '712')
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Goods Issue for Delivery Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart = '601'
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Goods Issue for Production Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart = '261'
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Sales Return Received' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart IN ('651', '653')
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Stock Scrapped' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart = '551'
UNION ALL
SELECT
ltap~charg AS InventoryBatchLot,
'Picking Initiated' AS ActivityName,
CONCAT( ltak~bdatu, ltak~bzeit ) AS EventTime,
ltap~matnr AS MaterialNumber,
ltak~bname AS UserName,
ltak~bwart AS MovementType,
ltap~werks AS Plant,
ltap~lgort AS StorageLocation,
ltap~nista AS Quantity,
'' AS MovementReasonCode
FROM ltap
JOIN ltak ON ltak~tanum = ltap~tanum
WHERE ltak~bdatu IN s_budat
AND ltap~werks IN s_werks
AND ltap~charg IS NOT NULL AND ltap~charg <> ''
UNION ALL
SELECT
SUBSTRING( cdhdr~objectid, 5, 18 ) AS InventoryBatchLot, " Object ID for BATCH is MATNR+WERKS+CHARG
'Batch Status Changed' AS ActivityName,
CONCAT( cdhdr~udate, cdhdr~utime ) AS EventTime,
SUBSTRING( cdhdr~objectid, 1, 4 ) AS MaterialNumber,
cdhdr~username AS UserName,
'' AS MovementType,
'' AS Plant,
'' AS StorageLocation,
0 AS Quantity,
'' AS MovementReasonCode
FROM cdhdr
JOIN cdpos ON cdpos~objectclas = cdhdr~objectclas
AND cdpos~objectid = cdhdr~objectid
AND cdpos~changenr = cdhdr~changenr
WHERE cdhdr~udate IN s_budat
AND cdhdr~objectclas = 'BATCH'
AND cdpos~tabname = 'MCH1'
AND cdpos~fname = 'ZUSTD'
INTO TABLE @lt_event_log.
" ====================================================================
" WRITE OUTPUT FILE
" ====================================================================
DATA: lv_string TYPE string.
DATA: lo_conv TYPE REF TO cl_abap_conv_out_ce.
lo_conv = cl_abap_conv_out_ce=>create( encoding = 'UTF-8' ).
OPEN DATASET p_fpath FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc <> 0.
MESSAGE 'Error opening file.' TYPE 'E'.
RETURN.
ENDIF.
" Write Header
lv_string = 'InventoryBatchLot,ActivityName,EventTime,MaterialNumber,UserName,MovementType,Plant,StorageLocation,Quantity,MovementReasonCode'.
TRANSFER lv_string TO p_fpath.
" Write Data
LOOP AT lt_event_log ASSIGNING FIELD-SYMBOL(<fs_log>).
CONCATENATE
<fs_log>-InventoryBatchLot
<fs_log>-ActivityName
<fs_log>-EventTime
<fs_log>-MaterialNumber
<fs_log>-UserName
<fs_log>-MovementType
<fs_log>-Plant
<fs_log>-StorageLocation
<fs_log>-Quantity
<fs_log>-MovementReasonCode
INTO lv_string
SEPARATED BY ','.
TRANSFER lv_string TO p_fpath.
ENDLOOP.
CLOSE DATASET p_fpath.
WRITE: 'Extraction complete. File written to:', p_fpath.