在庫管理データテンプレート
在庫管理データテンプレート
- 収集を推奨する属性
- プロセスディスカバリーで追跡する主要アクティビティ
- SAP S/4HANA向けの抽出ガイド
在庫管理の属性
| 名前 | 説明 | ||
|---|---|---|---|
| イベント時刻 EventTime | 在庫アクティビティがシステムに記録された正確な日付と時刻です。 | ||
| 説明 イベント時刻は、アクティビティが発生した正確な日時を記録するタイムスタンプです。在庫ロットごとのプロセスフローを再構成するために、イベントを時系列に並べる際に欠かせません。時間に基づくプロセスマイニング分析の基礎となります。 サイクルタイム、リードタイム、所要時間などの主要なKPIを算出するには、イベント時刻の正確性が重要です。異なる期間のプロセスパフォーマンスを分析し、ボトルネックの発生時期を特定できます。また、品質検査から解除されるまでロットが費やした時間など、プロセス遅延を把握するための事実に基づく情報を提供します。 重要な理由 イベントを時系列に並べ、所要時間やパフォーマンスに関するすべての計算の基礎となるタイムスタンプです。 入手先 通常、マテリアル伝票ヘッダーのMKPFテーブルにある転記日付(MKPF-BUDAT)と入力時刻(MKPF-CPUTM)を組み合わせた値です。 例 2023-10-26T09:00:00Z2023-11-15T14:35:10Z2024-01-05T23:15:00Z | |||
| 在庫ロット InventoryBatchLot | 製品の特定数量を識別する一意の識別子であり、ライフサイクルを追跡するためのケースIDとして機能します。 | ||
| 説明 在庫ロット番号は、特定の製品数量に関するすべてのアクティビティをまとめる主要なケース識別子です。これにより、倉庫への初回入荷から、さまざまな社内移動やステータス変更を経て、販売、生産、または廃棄のために出庫されるまで、在庫数量の移動を時系列で確認できます。 プロセス分析では、この属性が基本となります。ロットごとのエンドツーエンドの流れを追跡し、サイクルタイムを正確に測定し、プロセスのばらつきを特定して、ロットごとの取扱いの違いを把握できます。医薬品、食品・飲料、化学品など、トレーサビリティ、品質管理、使用期限の管理が欠かせない業界では、ロット単位の分析が特に重要です。 重要な理由 関連するすべての在庫イベントを1つのケースに結び付ける中核識別子であり、エンドツーエンドのプロセス分析を可能にします。 入手先 通常はロット番号です。SAPでは、MCHA(ロットマスタ)やMCH1(ロット)などのテーブルのCHARG項目に格納されています。 例 B001-A452023L202405-XYZ789456123BATCH-05-24 | |||
| アクティビティ ActivityName | 在庫管理プロセスの特定時点で発生した業務イベントの名称です。 | ||
| 説明 アクティビティ属性は、ロットの在庫ライフサイクルにおける1つのステップまたはイベントを表します。入荷、在庫移動、品質検査、マテリアルの出庫など、主要な業務アクションを示します。各アクティビティは、特定の時点で在庫ロットに起きた事象の記録です。 アクティビティの分析は、プロセスマイニングの基盤です。プロセスフローを可視化し、頻出経路と稀な経路を特定し、アクティビティの遅延が発生するボトルネックを検出して、手戻りループを分析できます。「在庫を廃棄」や「品質検査」などのアクティビティの順序と頻度を把握することで、プロセス改善や業務効率化の対象を特定できます。 重要な理由 プロセスのステップを定義し、在庫ライフサイクルの可視化と分析を可能にします。 入手先 導出属性です。通常、SAPの移動タイプ(MSEG-BWART)またはトランザクションコード(MKPF-TCODE2)から、利用者に分かりやすい名称へマッピングされます。 例 入庫記録完了棚入れ移送の転記出荷向け出庫を転記在庫を廃棄 | |||
| プラント Plant | 工場や配送センターなど、在庫が存在する施設を表す組織単位です。 | ||
| 説明 プラントは、生産施設、中央倉庫、企業本社などを表すSAPの中核的な組織単位です。すべての在庫は、物理的または論理的にプラント内に配置されます。 プラント別の分析は、異なる拠点間でプロセスパフォーマンスを比較するうえで基本となります。「棚入れのサイクルタイムが最も長いプラントはどこか」「プラントAの在庫差異率はプラントBより高いか」といった問いに答えられます。この地理的または組織別の切り分けは、拠点固有の問題を特定し、組織全体でベストプラクティスを共有するうえで重要です。 重要な理由 異なる拠点間で在庫プロセスとパフォーマンスを比較できます。 入手先 マテリアル伝票明細テーブルMSEGのWERKS項目(プラント)に格納されています。 例 10001710DE01US01 | |||
| マテリアル番号 MaterialNumber | 管理対象の製品またはマテリアルを識別する一意の識別子です。 | ||
| 説明 マテリアル番号は、SKU(Stock Keeping Unit)とも呼ばれる、特定の製品に割り当てられた一意のコードです。在庫管理における基本的なマスターデータ項目であり、商品の数量、金額、移動を追跡するために使用されます。 プロセスマイニングでマテリアル番号別に分析すると、在庫プロセスを製品単位で確認できます。品質検査に最も時間がかかる製品、廃棄が最も多い製品、社内移動の量が最も多い製品などを特定できます。この切り分けは、製品固有の問題を見つけ、商品の種類に応じて在庫戦略を最適化するうえで重要です。 重要な理由 製品別に分析を切り分け、特定の品目に固有のパターンや問題を明らかにできます。 入手先 マテリアル伝票明細テーブルMSEGのMATNR項目に格納されています。マスターデータはMARAテーブルにあります。 例 RM-1001FG-2050-B100-400-A | |||
| ユーザー名 UserName | SAPでトランザクションを実行した担当者のユーザーIDです。 | ||
| 説明 在庫管理プロセスで伝票を転記した、またはアクティビティを実行した従業員のSAPユーザーIDを記録する属性です。特定のアクションを誰が担当したかを示し、トレーサビリティを確保します。 ユーザー別の分析は、パフォーマンス、コンプライアンス、トレーニングの必要性を把握するうえで重要です。たとえば「手動在庫調整の要因」ダッシュボードでは、この属性を使って調整を最も多く実行しているユーザーを確認できます。追加トレーニングが必要なユーザーの特定、不正なアクティビティの発見、優れたパフォーマンスの担当者の把握にも役立ちます。 重要な理由 説明責任を明確にし、ユーザー固有の行動、トレーニングの必要性、コンプライアンス上の問題を特定できます。 入手先 マテリアル伝票ヘッダーテーブルMKPFのUSNAM項目(ユーザー名)に格納されています。 例 JSMITHMBROWNWAREHOUSE_OPS | |||
| 保管場所 StorageLocation | プラント内で在庫を物理的に保管する特定の場所です。 | ||
| 説明 保管場所は、プラント内のマテリアル在庫を区別するための組織単位です。たとえば、原材料、完成品、品質検査在庫を別々の保管場所で管理できます。 この属性は、プラントよりも詳細な場所情報を提供します。入荷エリアから主倉庫までの移動に要するリードタイムなど、異なる在庫エリア間の移動を分析するために使用されます。保管場所別に保管スペースの利用状況や移動頻度を分析すると、倉庫レイアウトや社内物流を最適化できます。 重要な理由 プラント内の在庫場所を詳細に把握し、社内移動や保管効率を分析できます。 入手先 マテリアル伝票明細テーブルMSEGのLGORT項目(保管場所)に格納されています。 例 0001RM01FG01QI01 | |||
| 数量 Quantity | 在庫移動の対象となったマテリアルの数量です。 | ||
| 説明 特定のアクティビティで移動、受領、出庫、または調整されたマテリアルの量を表す属性です。マテリアルの基本数量単位で記録されます。 数量を分析すると、在庫プロセスの規模と影響を把握できます。「SKU別出庫処理量」など、取扱商品の量を可視化するダッシュボードを作成できます。また、「廃棄・処分在庫比率」などのKPIの算出にも使用され、イベント数だけでは分からない定量的な視点をプロセス分析に加えます。 重要な理由 各アクティビティのマテリアル量を数値化し、処理量、廃棄量、調整の影響を分析できます。 入手先 マテリアル伝票明細テーブルMSEGのMENGE項目(数量)に格納されています。 例 10012.55000-10 | |||
| 移動タイプ MovementType | SAPで商品の移動をどのように転記するかを制御する3桁のキーです。 | ||
| 説明 移動タイプは、マテリアル移動の特性を決定する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 | |||
| マテリアル伝票番号 MaterialDocumentNumber | 商品の移動を記録するマテリアル伝票を識別する一意の番号です。 | ||
| 説明 SAPで商品の移動を転記すると、システムはその移動の証跡としてマテリアル伝票を生成します。この属性は、その伝票を識別する一意の識別子です。1つのマテリアル伝票に複数の明細またはアクティビティが含まれる場合があります。 プロセスマイニングでは、マテリアル伝票番号を使って、同時に転記された関連イベントをグループ化できます。監査や、プロセス分析からソースシステムへドリルダウンして特定のトランザクションを調査する際にも欠かせません。 重要な理由 監査に使用するトランザクションキーとして機能し、同時に実行されたアクティビティをグループ化できます。 入手先 MKPF(ヘッダー)およびMSEG(明細)テーブルのMBLNR項目(マテリアル伝票番号)に格納されています。 例 490000123450000056784900002345 | |||
| 保管ビン StorageBin | 倉庫内でマテリアルを物理的に保管する、最も細かい単位です。 | ||
| 説明 保管ビンは、ラックの位置など、倉庫内の特定の座標を表します。通常、SAP Warehouse Management(WM)またはExtended Warehouse Management(EWM)を導入している場合に使用されます。 「倉庫保管スペース利用率」ダッシュボードでは、この属性が欠かせません。倉庫スペースの利用効率を分析し、混雑しやすい場所を特定して、非効率な棚入れ経路やピッキング経路を明らかにできます。保管ビン間の移動を分析すると、倉庫レイアウトを最適化し、作業者の移動時間を短縮できます。 重要な理由 最も詳細な場所情報を提供し、倉庫スペースの利用状況や業務効率を分析できます。 入手先 WMを使用している場合は、LTAK/LTAPなどのTransfer Orderテーブルに格納されています。在庫伝票では、MSEG-LGPBEに格納されている場合があります。SAP S/4HANAのドキュメントを参照してください。 例 A-01-01-AB-05-10-CRCV-AREA-01 | |||
| 最終データ更新 LastDataUpdate | このレコードのデータがソースシステムから最後に更新された時点を示すタイムスタンプです。 | ||
| 説明 ソースシステムからデータを最後に抽出または更新した日時を記録する属性です。分析対象の情報がどの程度新しいかを示す重要なメタデータです。ほぼリアルタイムのデータを見ているのか、過去の期間のスナップショットを見ているのかを把握できます。 どの分析でも、データの適時性を把握することは、妥当で正確な結論を導くうえで重要です。この項目により、アナリストや業務担当者はデータが最新かどうかを確認できます。提示された分析結果の背景情報として、ダッシュボードに表示されることもよくあります。 重要な理由 データの鮮度を示し、最新の情報に基づいて分析できるようにします。 入手先 データの抽出、変換、ロード(ETL)処理中に生成され、追加されるタイムスタンプです。 例 2024-05-21T08:00:00Z2024-05-20T08:00:00Z | |||
| 受注処理サイクルタイム OrderFulfillmentCycleTime | ピッキングの開始から出荷向けの出庫までにかかるエンドツーエンドの所要時間です。 | ||
| 説明 「ピッキングを開始」アクティビティから「出荷向け出庫を転記」アクティビティまでの総時間を測定する計算指標です。プロセス開始後、倉庫が顧客注文を準備して出荷するまでに要した時間を表します。 この属性は、「受注処理サイクルタイム」KPIを直接測定します。この所要時間を分析すると、顧客需要への対応力を把握できます。製品、倉庫、顧客別に分解して、ピッキング、梱包、出荷のどこで遅延が発生しているかを特定でき、顧客満足度や物流効率に直接影響する要因を明らかにします。 重要な理由 倉庫からの出庫処理の速度と効率を測定し、顧客満足度を左右する重要な要因を把握できます。 入手先 これは計算された属性です。各バッチについて、「Picking Initiated」イベントと「Goods Issue for Delivery Posted」イベントの時間差を計算して導出します。 例 7200144003600 | |||
| 在庫タイプ StockType | 無制限使用可、品質検査中、ブロック済みなど、在庫のステータスを示します。 | ||
| 説明 在庫タイプは、使用可否に基づいて在庫を分類します。主なタイプには、自由に使用できる無制限使用可在庫、品質確認を待つ品質検査在庫、使用できないブロック済み在庫があります。商品の移動に伴い、在庫タイプが変更されることがあります。 在庫タイプの変更を追跡することは、在庫可用性のプロセスを理解するうえで基本となります。「在庫を品質検査へ転記」や「在庫ステータスをブロック済みに変更」などのアクティビティを直接支えます。各在庫タイプ、特に「品質検査」に費やした時間を分析すると、販売や生産で商品を利用できるようになるまでの遅延を特定できます。 重要な理由 在庫の使用可否ステータスを追跡し、品質検査や在庫可用性に関する遅延を分析できます。 入手先 マテリアル伝票明細テーブルMSEGのINSMK項目(在庫タイプ)に格納されています。 例 無制限使用可能品質検査保留在庫 | |||
| 数量単位 UnitOfMeasure | マテリアルの数量を測定する単位です(例:個、キログラム)。 | ||
| 説明 数量単位は、「数量」属性で使用する単位を指定します。一般的な例として、個(PC)、キログラム(KG)、リットル(L)、箱(BOX)があります。数量項目を正しく解釈するために必要な情報です。 単なる説明項目として扱われることもありますが、データ品質の確保や、異なる単位を共通の基準に換算する分析では重要です。たとえば、廃棄在庫の総額を正確に算出するには、異なる単位の数量を把握し、必要に応じて換算する必要があります。 重要な理由 「数量」属性を正しく解釈するための情報を提供し、マテリアル量を正確に把握できるようにします。 入手先 マテリアル伝票明細テーブルMSEGのMEINS項目(基本数量単位)に格納されています。 例 PCKGEAM | |||
| 有効期限 ExpirationDate | マテリアルのロットが期限切れとなり、使用できなくなる日付です。 | ||
| 説明 使用期限(SLED)は、生鮮品や時間制約のある商品のマスターデータとして重要です。ロット単位で管理され、製品を販売または消費できなくなる時点を定めます。 この属性は、「陳腐化・期限切れ在庫分析」ダッシュボードに欠かせません。有効期限を基準にアクティビティを分析すると、期限切れのリスクがあるロットを特定し、事前に対策を講じられます。先に期限が切れる商品から出庫するFEFO(First-Expired-First-Out)などの在庫ローテーション方針の有効性を測定し、期限切れ在庫の廃棄による損失を定量化する際にも役立ちます。 重要な理由 陳腐化在庫や期限切れ在庫を分析し、廃棄や財務上の損失を抑えられます。 入手先 ロットマスタテーブルMCH1またはMCHAのVFDAT項目(使用期限)に格納されています。 例 2024-12-312025-06-302024-09-01 | |||
在庫管理アクティビティ
| アクティビティ | 説明 | ||
|---|---|---|---|
| 入庫記録完了 | 通常、サプライヤーまたは生産現場から倉庫へ在庫バッチが最初に入庫したことを示します。商品を受け取ると品目伝票が作成されるため、このイベントはSAP S/4HANAに明示的に記録されます。 | ||
| 重要な理由 在庫ライフサイクルの主要な開始イベントです。このアクティビティから棚入れなどの後続アクティビティまでの時間を分析することは、入荷ドックの効率を測定するうえで重要です。 入手先 MATDOCテーブルに記録されます。購買発注の入庫を示す101や、ブロック在庫への入庫を示す103など、特定の移動タイプ(BWART)で識別します。 取得 対応する入庫移動タイプを持つMATDOCの品目伝票から取得します。 イベントタイプ explicit | |||
| 出荷向け出庫を転記 | 出荷処理の最終段階を記録します。ロットの所有権が顧客または運送業者に移り、在庫が減少して会計に計上される明示的なトランザクションです。 | ||
| 重要な理由 受注処理の完了を示す重要なイベントです。納期遵守を測定し、受注処理全体のサイクルタイムを算出するうえで欠かせません。 入手先 MATDOCテーブルに記録されます。販売受注の出荷に対する出庫の移動タイプ(BWART)によって識別され、通常は601です。 取得 移動タイプ601が設定されたMATDOCのマテリアル伝票から取得されます。 イベントタイプ explicit | |||
| 品質検査在庫のリリース | バッチが品質検査に合格し、使用または棚入れできる状態になったことを示します。通常、品質検査在庫から利用可能在庫など別の在庫タイプへ移す明示的な転記として記録されます。 | ||
| 重要な理由 品質プロセスの完了を示すマイルストーンであり、在庫が利用可能になります。ここで遅延が発生すると、生産や受注処理などの後続業務に大きな影響が生じる可能性があります。 入手先 MATDOCテーブルに転記として記録されます。通常は、移動タイプ(BWART)321により、「Quality Inspection」から「Unrestricted-use」へ在庫を移動した記録として識別します。 取得 移動タイプ321のMATDOCの品目伝票から取得します。 イベントタイプ explicit | |||
| 在庫を廃棄 | 在庫ロットを在庫記録から恒久的に削除し、最終処分したことを示します。通常、期限切れ、破損、または陳腐化した在庫に対して行われます。 | ||
| 重要な理由 財務上の損失を表す終了イベントです。廃棄イベントを分析すると、在庫の滞留、取扱手順、需要予測に関する問題を特定できます。 入手先 MATDOCテーブルに記録されます。551(無制限使用可から)、553(品質検査から)、555(ブロック済みから)など、廃棄用の移動タイプ(BWART)によって識別されます。 取得 廃棄用の移動タイプ(例:551)が設定されたMATDOCのマテリアル伝票から取得されます。 イベントタイプ explicit | |||
| 在庫調整を転記 | 実地棚卸しやその他の差異によって生じた在庫数量の変更を記録します。帳簿上の在庫を実地棚卸しの数量に合わせるための明示的な調整イベントです。 | ||
| 重要な理由 こうした調整は、在庫の正確性を維持するうえで欠かせません。調整の頻度が高い場合、在庫の取扱い、セキュリティ、データ入力に根本的な問題がある可能性があります。 入手先 MATDOCテーブルに記録されます。701(在庫増)や702(在庫減)など、実地棚卸し用の移動タイプ(BWART)によって識別されます。 取得 実地棚卸しの調整用移動タイプ(例:701、702)が設定されたMATDOCのマテリアル伝票から取得されます。 イベントタイプ explicit | |||
| 棚入れ移送の転記 | 入荷エリアまたは仮置きエリアから、最終保管場所または保管ビンまで、ロットが物理的に移動したことを表します。SAPでは、在庫移動のマテリアル伝票として記録されます。 | ||
| 重要な理由 入荷処理を完了します。このアクティビティの完了に要した時間は入庫時間と呼ばれ、倉庫の効率を測る重要なKPIです。 入手先 MATDOCテーブルに在庫移動として記録されます。多くの場合、保管場所間の移動です(例:移動タイプ311)。具体的な移動内容は、倉庫の構造によって異なります。 取得 中間または入荷用の保管場所から最終保管場所へ在庫を移動する、MATDOCの在庫移動伝票によって識別されます。 イベントタイプ explicit | |||
| 生産向け出庫を転記 | 生産指図またはプロセス指図で在庫ロットが消費されたことを表します。このトランザクションにより在庫が減少し、材料費が製造指図に割り当てられます。 | ||
| 重要な理由 主要な消費イベントであり、部品の在庫ライフサイクルの終了を示します。生産向けの材料可用性や消費パターンを分析するうえで重要です。 入手先 MATDOCテーブルに記録されます。261など、指図への出庫に使用される移動タイプ(BWART)によって識別されます。 取得 移動タイプ261が設定されたMATDOCのマテリアル伝票から取得されます。 イベントタイプ explicit | |||
| ピッキングを開始 | 出荷処理の開始を示します。倉庫タスクが作成され、保管ビンからロットをピッキングします。通常、Transfer OrderまたはWarehouse Taskの作成時に記録されます。 | ||
| 重要な理由 このアクティビティがピッキング処理の起点になります。このイベントからピッキング完了までの時間を分析すると、倉庫作業者の効率を測定し、遅延を特定できます。 入手先 通常、MATDOCには記録されません。Warehouse Management(WM/EWM)を使用するシステムでは、Transfer Order(LTAKテーブル)またはWarehouse Taskの作成時刻から推定されます。 取得 マテリアルロットに関連付けられたTransfer Order(WM)またはWarehouse Task(EWM)の作成レコードから推定されます。 イベントタイプ inferred | |||
| ロットステータスを変更 | 「無制限使用可」から「制限付き」への変更など、ロットマスタレコードの変更を表します。物理的な在庫移動ではなく、記録されたマスターデータの変更です。 | ||
| 重要な理由 ロットステータスの変更は、販売や生産での使用可否に直接影響します。こうした変更を分析すると、物理的な移動を伴わない期限切れ在庫や品質管理上の問題を明らかにできます。 入手先 ロットマスタテーブル(MCH1、MCHA)の変更ログから推定されます。CDHDRおよびCDPOSテーブルで、ロットステータス項目(MCH1-ZUSTD)の変更を追跡します。 取得 ロットマスタレコードのステータス項目(MCH1-ZUSTD)に関するCDHDR/CDPOSの変更文書から導出されます。 イベントタイプ inferred | |||
| 品質検査在庫への転記 | 入庫したバッチを品質検査の保留ステータスへ移動し、検査で承認されるまで使用できない状態にすることを示します。SAPでは、バッチの在庫タイプを変更する明示的な取引として記録されます。 | ||
| 重要な理由 このアクティビティによって品質検査プロセスが開始されます。ここから品質検査在庫のリリースまでの所要時間は、品質関連の遅延を把握するための重要な指標です。 入手先 MATDOCテーブルに記録されます。Stock Type(INSMK)を「Q」(Quality Inspection)に設定した入庫移動(例:101)や、転記移動(例:322)として記録される場合があります。 取得 在庫を「Quality Inspection」在庫タイプへ移動するMATDOCの品目伝票で識別します。 イベントタイプ explicit | |||
| 在庫ステータスをブロック済みに変更 | ロットのステータスが変更され、払出しに使用できなくなったことを表します。破損、保留依頼などが原因となる場合があります。SAPでは、明示的な在庫移動として記録されます。 | ||
| 重要な理由 在庫を利用できない状態が発生したことを示します。ブロックイベントの頻度が高い場合、取扱い、保管条件、またはサプライヤー品質に問題がある可能性があります。 入手先 MATDOCテーブルに在庫移動として記録されます。通常、移動タイプ(BWART)344は「ブロック済み」から「無制限使用可」への移動に、343は「無制限使用可」から「ブロック済み」への移動に使用されます。このアクティビティは343に該当します。 取得 移動タイプ343が設定されたMATDOCのマテリアル伝票によって識別されます。 イベントタイプ explicit | |||
| 在庫ステータスを無制限使用可に変更 | ロットのステータスが変更され、ブロックまたは品質保留が解除されて使用可能になったことを表します。明示的な在庫移動として記録されます。 | ||
| 重要な理由 在庫保留が解消されたことを示すアクティビティです。在庫がブロック状態に置かれていた時間を分析すると、解消プロセスを改善できます。 入手先 MATDOCテーブルに在庫移動として記録されます。移動タイプ(BWART)344により、「ブロック済み」から「無制限使用可」へ在庫を移動します。 取得 移動タイプ344が設定されたMATDOCのマテリアル伝票によって識別されます。 イベントタイプ explicit | |||
| 社内在庫移動を転記 | 同一プラント内の異なる保管場所または保管ビン間で、在庫ロットが移動したことを記録します。マテリアル伝票を作成する明示的なトランザクションです。 | ||
| 重要な理由 社内移動を追跡すると、倉庫業務の効率を分析し、不要な移動を特定して、保管場所間の在庫補充に要するリードタイムを測定できます。 入手先 MATDOCテーブルに記録されます。保管場所間の移動では、通常、移動タイプ(BWART)311によって識別されます。 取得 社内在庫移動用の移動タイプ(例:311)が設定されたMATDOCのマテリアル伝票から取得されます。 イベントタイプ explicit | |||
| 販売返品を受領 | 出庫済みのロットが顧客から倉庫へ返却されたことを記録します。在庫を増加させる明示的なトランザクションです。 | ||
| 重要な理由 返品を追跡すると、製品品質の問題や顧客の不満を把握できます。返品の処理や処分方法の決定にも、非効率が生じる可能性があります。 入手先 MATDOCテーブルに記録されます。651(無制限使用可へ)や653(品質検査へ)など、販売返品用の移動タイプ(BWART)によって識別されます。 取得 販売返品用の移動タイプ(例:651、653)が設定されたMATDOCのマテリアル伝票から取得されます。 イベントタイプ explicit | |||
抽出ガイド
ステップ
- システムアクセスを確立します:SAP S/4HANAシステムでCore Data Services(CDS)Viewを照会するために必要な権限を持つユーザーを用意します。通常はシステム管理者によるアクセス権の付与が必要です。
- SQLクライアントを選択します:SAP HANAデータベースに接続できるSQLクライアントツールを選びます。SAP HANA Studio、SAP HANA Database Explorer、DBeaverなどのサードパーティ製ツールが一般的です。
- データベース接続を設定します:SQLクライアントで新しいデータベース接続を作成します。HANAデータベースのホスト名、ポート番号(通常は3<instance_number>15)、データベースユーザーの認証情報が必要です。
- SQLクエリを準備します:このドキュメントの「query」セクションに記載された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 Viewに対する
SELECT権限が必要です:I_MaterialDocumentItem、I_BatchChangeDocument、I_WarehouseTask。これらのViewが存在する基盤データベーススキーマへのアクセスも必要です。 - 日付範囲のフィルタリング:
PostingDate、ChangeDocumentCreationDate、またはWarehouseTaskCreationDateフィールドに日付範囲フィルターを設定することが重要です。分析では通常、3~12か月の範囲を指定します。複数年分を照会すると、パフォーマンスに大きな影響が出る可能性があります。 - 組織フィルター:パフォーマンスを高め、対象を絞り込むには、
PlantまたはCompanyCodeでフィルタリングするWHERE句を追加します。これによりデータ量を減らし、業務上必要な範囲に抽出対象を限定できます。 - データ量:在庫管理システムでは大量のデータが生成されます。日付範囲を広くすると数百万行に達する可能性があり、抽出中のソースシステムとクライアントツールのパフォーマンスに影響する場合があります。
- Extended Warehouse Management(EWM):「Picking Initiated」アクティビティは
I_WarehouseTaskCDS Viewに依存しており、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 HANA SQLへの直接アクセスが承認済みであり、抽出ユーザーがシステムで必要なMATDOCおよびバッチマスターテーブルを読み取れることを確認します。物理スキーマの所有者を確認し、[Your SAP HANA schema]を承認済みのスキーマ名に置き換えます。
- 対象のSAP S/4HANAリリースで利用できるMATDOCおよびバッチテーブルのフィールドを確認します。以下のクエリでは、一般的に利用できるMATDOCフィールドとMCHAフィールドを使用していますが、フィールドの有無や名称はリリース、導入形態、有効化した範囲によって異なる場合があります。実行前に、[Configure based on your system]と記載されたフィールドを置き換えます。
- [Start timestamp]と[End timestamp]をISO形式のタイムスタンプに置き換え、抽出期間を定義します。最初は3~6か月の期間で抽出し、データ量とパフォーマンスを確認してから期間を延長します。
- 承認済みのSQLクライアント、SAP HANA Database Explorer、または同等の認証済みデータベースツールでクエリを実行します。対応するフィルターのプレースホルダーを置き換え、必要な会社コード、プラント、伝票タイプ、移動タイプに結果を限定します。
- アクティビティCTEの移動タイプマッピングを確認します。移動タイプはシステム設定と業務設定に依存します。入庫、品質検査、リリース、棚入れ、社内移動、保留在庫、利用可能在庫、在庫調整、ピッキング、出庫、製造出庫、返品、廃棄に対して対象システムで設定されている移動タイプに合わせ、例示された移動タイプのリストを置き換えます。
- 各出力行にInventoryBatchLot、ActivityName、EventTimeが含まれていることを確認します。バッチ識別子がProcessMindのケース識別子として十分に安定していることを確認します。組織単位をまたいで同じバッチ値を区別する必要がある場合は、バッチ値だけでなく、設定済みの複合ケース識別子を使用します。
- イベントの順序、重複行、取消伝票、キャンセル済み伝票、タイムゾーンの扱いを検証します。MATDOCは伝票の転記を記録するため、明示的に除外またはマッピングしない限り、取消やキャンセルの記録が別イベントとして現れる場合があります。
- クエリ結果を、1イベント1行のフラットファイルとしてエクスポートします。列はInventoryBatchLot、ActivityName、EventTime、MaterialNumber、UserName、MovementType、Plant、StorageLocation、Quantity、MovementReasonCodeとします。タイムスタンプは一貫したISO 8601形式で保持し、品目、バッチ、プラント、保管場所の先頭ゼロも保持します。
- 生成したイベントログをProcessMindにアップロードし、InventoryBatchLotをケース識別子、ActivityNameをアクティビティ、EventTimeをイベントタイムスタンプとしてマッピングします。ProcessMindがアクティビティの推測、レコードの統合、欠落イベントの導出を行うことを前提にしないでください。
設定
- 抽出方法:SAP HANAの在庫データおよびバッチデータに対する直接SQLクエリです。クエリはMATDOCを読み取り、MCHAのバッチマスターデータを結合します。MCH1などの別のバッチテーブルを追加する場合は、対象システムの該当フィールドとバッチレベルを確認してから行ってください。
- 日付範囲:最初は3~6か月に設定します。EventTimeには、MATDOCで利用できる品目伝票の転記日付と時刻を使用します。増分ロードでは、遅れて転記されたデータを取り込めるよう管理された重複期間を設け、その後、設定した伝票および明細識別子で重複を排除します。
- 必須フィルター:プロセスの対象範囲に応じて、会社コード、プラント、品目伝票タイプ、移動タイプ、バッチの有無、転記日付を設定します。会社コードと伝票タイプのフィールドは、クエリに追加する前に導入済みリリースで確認してください。
- アクティビティマッピング:移動タイプの意味は設定によって異なります。承認済みのマッピングテーブルを管理するか、クエリ内の移動タイプリストを業務で使用する値に置き換えます。例示されたリストをSAP共通の意味として扱わないでください。
- バッチ範囲:ケース識別子にInventoryBatchLotを使用するため、バッチ値のない行は除外します。別のソースからバッチを導出する必要がある場合は、抽出前にそのソースを明示的に設定します。
- イベントの粒度:条件に合致する各MATDOC明細を1つのイベント行として出力します。後続のレコードからピッキング、品質判定、バッチステータス変更などのアクティビティを推測することはありません。
- バッチマスターの変更:バッチステータスの変更は、MATDOCだけでは正確に表現できません。「Batch Status Changed」アクティビティには、変更文書またはバッチ履歴のソースを設定してください。クエリにはプレースホルダーの分岐が含まれているため、実行前に検証済みのソースへ接続する必要があります。
- ピッキング:ピッキング開始は通常、MATDOCの転記ではなく倉庫実行データです。検証済みの倉庫タスクまたは移送指図のソースを設定し、実行前にプレースホルダーの分岐を置き換えます。
- パフォーマンス:転記タイムスタンプまたは転記日付、プラント、会社コード、関連する移動タイプでフィルタリングします。必要な列だけを選択し、履歴全体を無制限に走査しないでください。承認された稼働時間帯に実行し、大量のMATDOCを扱う場合は分割抽出または増分抽出を推奨します。
- 権限と前提条件:承認済みのデータベース接続、スキーマアクセス、読み取り権限、SAP S/4HANA在庫データへのアクセス、およびMATDOC以外の2つのアクティビティで使用する倉庫実行または変更履歴ソースへのアクセスを取得します。直接データベースアクセスが、組織のSAP運用モデルとサポートポリシーに準拠していることを確認してください。
- タイムゾーン:データベースとアプリケーションのタイムゾーンを確認します。ProcessMindへのアップロード前にEventTimeを一貫した基準へ変換します。
- データ保護:ユーザーID、品目データ、顧客関連データ、データベース認証情報について、組織の管理策を適用します。クエリ本文に認証情報を記載しないでください。
a サンプルクエリ sql
WITH
params AS (
SELECT
TO_TIMESTAMP('[Start timestamp]') AS start_ts,
TO_TIMESTAMP('[End timestamp]') AS end_ts
FROM DUMMY
),
movement_map AS (
SELECT '101' AS movement_type, 'Goods Receipt Posted' AS activity_name FROM DUMMY
UNION ALL SELECT '105', 'Goods Receipt Posted' FROM DUMMY
UNION ALL SELECT '107', 'Goods Receipt Posted' FROM DUMMY
UNION ALL SELECT '109', 'Goods Receipt Posted' FROM DUMMY
UNION ALL SELECT '321', 'Stock Posted to Quality Inspection' FROM DUMMY
UNION ALL SELECT '322', 'Quality Inspection Stock Released' FROM DUMMY
UNION ALL SELECT '343', 'Stock Status Changed to Unrestricted' FROM DUMMY
UNION ALL SELECT '344', 'Stock Status Changed to Blocked' FROM DUMMY
UNION ALL SELECT '311', 'Internal Stock Transfer Posted' FROM DUMMY
UNION ALL SELECT '309', 'Internal Stock Transfer Posted' FROM DUMMY
UNION ALL SELECT '301', 'Internal Stock Transfer Posted' FROM DUMMY
UNION ALL SELECT '311', 'Put-Away Transfer Posted' FROM DUMMY
UNION ALL SELECT '309', 'Put-Away Transfer Posted' FROM DUMMY
UNION ALL SELECT '701', 'Inventory Adjustment Posted' FROM DUMMY
UNION ALL SELECT '702', 'Inventory Adjustment Posted' FROM DUMMY
UNION ALL SELECT '703', 'Inventory Adjustment Posted' FROM DUMMY
UNION ALL SELECT '704', 'Inventory Adjustment Posted' FROM DUMMY
UNION ALL SELECT '705', 'Inventory Adjustment Posted' FROM DUMMY
UNION ALL SELECT '706', 'Inventory Adjustment Posted' FROM DUMMY
UNION ALL SELECT '601', 'Goods Issue for Delivery Posted' FROM DUMMY
UNION ALL SELECT '602', 'Goods Issue for Delivery Posted' FROM DUMMY
UNION ALL SELECT '261', 'Goods Issue for Production Posted' FROM DUMMY
UNION ALL SELECT '262', 'Goods Issue for Production Posted' FROM DUMMY
UNION ALL SELECT '651', 'Sales Return Received' FROM DUMMY
UNION ALL SELECT '653', 'Sales Return Received' FROM DUMMY
UNION ALL SELECT '654', 'Sales Return Received' FROM DUMMY
UNION ALL SELECT '551', 'Stock Scrapped' FROM DUMMY
UNION ALL SELECT '552', 'Stock Scrapped' FROM DUMMY
),
matdoc_events AS (
SELECT
m.MATNR AS MaterialNumber,
m.CHARG AS InventoryBatchLot,
COALESCE(m.BUDAT_MKPF, m.BUDAT) AS EventTime,
CAST(NULL AS NVARCHAR(80)) AS UserName,
CAST(m.BWART AS NVARCHAR(3)) AS MovementType,
m.WERKS AS Plant,
m.LGORT AS StorageLocation,
m.MENGE AS Quantity,
m.GRUND AS MovementReasonCode,
mm.activity_name AS ActivityName,
m.MBLNR AS MaterialDocumentNumber,
m.MJAHR AS MaterialDocumentYear,
m.ZEILE AS MaterialDocumentItem
FROM [Your SAP HANA schema].MATDOC m
INNER JOIN movement_map mm
ON CAST(m.BWART AS NVARCHAR(3)) = mm.movement_type
CROSS JOIN params p
WHERE m.CHARG IS NOT NULL
AND TRIM(m.CHARG) <> ''
AND COALESCE(m.BUDAT_MKPF, m.BUDAT) >= p.start_ts
AND COALESCE(m.BUDAT_MKPF, m.BUDAT) < p.end_ts
AND m.WERKS IN ([Configure based on your system])
),
batch_enriched_events AS (
SELECT
e.InventoryBatchLot,
e.ActivityName,
e.EventTime,
e.MaterialNumber,
e.UserName,
e.MovementType,
e.Plant,
e.StorageLocation,
e.Quantity,
e.MovementReasonCode,
e.MaterialDocumentNumber,
e.MaterialDocumentYear,
e.MaterialDocumentItem,
c.CUOBJ_BM AS BatchObjectNumber
FROM matdoc_events e
LEFT JOIN [Your SAP HANA schema].MCHA c
ON c.MATNR = e.MaterialNumber
AND c.CHARG = e.InventoryBatchLot
AND c.WERKS = e.Plant
),
verified_batch_status_events AS (
SELECT
CAST(NULL AS NVARCHAR(40)) AS InventoryBatchLot,
'Batch Status Changed' AS ActivityName,
CAST(NULL AS TIMESTAMP) AS EventTime,
CAST(NULL AS NVARCHAR(40)) AS MaterialNumber,
CAST(NULL AS NVARCHAR(80)) AS UserName,
CAST(NULL AS NVARCHAR(3)) AS MovementType,
CAST(NULL AS NVARCHAR(4)) AS Plant,
CAST(NULL AS NVARCHAR(4)) AS StorageLocation,
CAST(NULL AS DECIMAL(31,3)) AS Quantity,
CAST(NULL AS NVARCHAR(3)) AS MovementReasonCode,
CAST(NULL AS NVARCHAR(20)) AS MaterialDocumentNumber,
CAST(NULL AS NVARCHAR(4)) AS MaterialDocumentYear,
CAST(NULL AS NVARCHAR(6)) AS MaterialDocumentItem,
CAST(NULL AS NVARCHAR(40)) AS BatchObjectNumber
FROM DUMMY
WHERE 1 = 0
),
verified_picking_events AS (
SELECT
CAST(NULL AS NVARCHAR(40)) AS InventoryBatchLot,
'Picking Initiated' AS ActivityName,
CAST(NULL AS TIMESTAMP) AS EventTime,
CAST(NULL AS NVARCHAR(40)) AS MaterialNumber,
CAST(NULL AS NVARCHAR(80)) AS UserName,
CAST(NULL AS NVARCHAR(3)) AS MovementType,
CAST(NULL AS NVARCHAR(4)) AS Plant,
CAST(NULL AS NVARCHAR(4)) AS StorageLocation,
CAST(NULL AS DECIMAL(31,3)) AS Quantity,
CAST(NULL AS NVARCHAR(3)) AS MovementReasonCode,
CAST(NULL AS NVARCHAR(20)) AS MaterialDocumentNumber,
CAST(NULL AS NVARCHAR(4)) AS MaterialDocumentYear,
CAST(NULL AS NVARCHAR(6)) AS MaterialDocumentItem,
CAST(NULL AS NVARCHAR(40)) AS BatchObjectNumber
FROM DUMMY
WHERE 1 = 0
),
all_events AS (
SELECT InventoryBatchLot, ActivityName, EventTime, MaterialNumber, UserName, MovementType, Plant, StorageLocation, Quantity, MovementReasonCode, MaterialDocumentNumber, MaterialDocumentYear, MaterialDocumentItem, BatchObjectNumber FROM batch_enriched_events
UNION ALL SELECT InventoryBatchLot, ActivityName, EventTime, MaterialNumber, UserName, MovementType, Plant, StorageLocation, Quantity, MovementReasonCode, MaterialDocumentNumber, MaterialDocumentYear, MaterialDocumentItem, BatchObjectNumber FROM verified_batch_status_events
UNION ALL SELECT InventoryBatchLot, ActivityName, EventTime, MaterialNumber, UserName, MovementType, Plant, StorageLocation, Quantity, MovementReasonCode, MaterialDocumentNumber, MaterialDocumentYear, MaterialDocumentItem, BatchObjectNumber FROM verified_picking_events
)
SELECT
InventoryBatchLot,
ActivityName,
EventTime,
MaterialNumber,
UserName,
MovementType,
Plant,
StorageLocation,
Quantity,
MovementReasonCode
FROM all_events
WHERE InventoryBatchLot IS NOT NULL
AND EventTime IS NOT NULL
ORDER BY InventoryBatchLot, EventTime, MaterialDocumentYear, MaterialDocumentNumber, MaterialDocumentItem, ActivityName; ステップ
- ABAPエディターにアクセスします:SAP S/4HANAシステムにログインします。トランザクションコード
SE38でABAPエディターを開きます。 - 新しいプログラムを作成します:「Program」フィールドに新しいプログラム名を入力します。例:
Z_PM_INVENTORY_EXTRACT。「Create」ボタンをクリックし、説明的なタイトルを入力して、「Type」を「Executable Program」に設定し、パッケージに保存します。 - プログラムパラメーターを定義します:プログラムエディターで、抽出用のユーザーインターフェースとなる選択画面を定義します。これにより、ユーザーは抽出する日付範囲やプラントなどのパラメーターを指定できます。
- 抽出ロジックを実装します:「Query」セクションに記載されたABAPコード全体をコピーし、ABAPエディターに貼り付けます。このコードは、SAPの複数のテーブルから在庫管理に必要な14種類すべてのアクティビティのデータを選択するよう設計されています。
- 中核ロジックを確認します:プログラムは、品目移動のMKPFやMSEG、マスターデータ変更のCDHDRやCDPOSなど、各在庫アクティビティのソーステーブルからデータを選択します。各選択結果を
UNION ALLで結合し、イベントログを表す単一の内部テーブルにまとめます。 - ファイル出力を設定します:コードの最後の部分で、内部テーブルに統合したデータをファイルへ書き込みます。
OPEN DATASETステートメントを使ってSAPアプリケーションサーバー上にファイルを作成します。SAPシステムユーザーに書き込み権限がある有効なサーバーパスを指定してください。 - プログラムを実行します:ABAPプログラムを保存して有効化します(Ctrl+F3)。F8キーで実行し、選択画面で対象の日付範囲と、プラントや会社コードなどの関連フィルターを入力します。
- バックグラウンドジョブとして実行します:大量のデータを扱う場合は、セッションタイムアウトを避けるため、プログラムをバックグラウンドジョブとして実行することが重要です。実行画面(F8)で「Program -> Execute in Background」を選択し、負荷の低い時間帯にジョブをスケジュールします。
- 出力ファイルを取得します:ジョブが完了したら、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. 始める準備はできていますか?
このテンプレートを使ってデータを確実に準備し、在庫管理業務の改善につながる情報を見つけ出します。効率化とコスト削減に向けた取り組みを、今日から始められます。
SAP S/4HANAの在庫管理を最適化
非効率を特定し、サイクルタイムを30%短縮してコストを削減します。
クレジットカード不要・数分で設定