在庫管理データテンプレート
在庫管理データテンプレート
- 収集を推奨する属性
- プロセスの発見に向けて追跡する主なアクティビティ
- SAP S/4HANAに合わせたデータ抽出ガイド
在庫管理の属性
| 名前 | 説明 | ||
|---|---|---|---|
| イベント時刻 EventTime | 在庫アクティビティがシステムに記録された正確な日時です。 | ||
| 説明 イベント時刻は、アクティビティが発生した正確な日時を記録するタイムスタンプです。在庫バッチごとのプロセスの流れを再構成するため、イベントを時系列に並べる際に欠かせないデータ項目です。時間に基づくプロセスマイニング分析の基礎となります。 サイクルタイム、リードタイム、所要時間などの重要業績評価指標を算出するには、イベント時刻の正確さが欠かせません。期間ごとのプロセス実績を分析し、ボトルネックが発生する時期を特定できます。また、品質検査中にバッチが解除を待つ時間など、プロセス遅延の実態を把握するための根拠にもなります。 重要な理由 イベントを時系列に並べるタイムスタンプであり、所要時間や実績の計算の基礎となります。 入手先 通常、品目伝票ヘッダテーブル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 | 在庫管理プロセスの特定の時点で発生した業務イベントの名称です。 | ||
| 説明 アクティビティ属性は、バッチの在庫ライフサイクルにおける個々の手順やイベントを表します。入庫、在庫移動、品質検査、品目の出庫など、主要な業務処理が該当します。それぞれのアクティビティは、特定の時点で在庫バッチに起きたことを記録します。 アクティビティの分析は、プロセスマイニングの基礎です。プロセスの流れを可視化し、頻繁に発生する経路やまれな経路を特定し、アクティビティの遅延が起きるボトルネックを検出し、手戻りのループを分析できます。「在庫の廃棄」や「品質検査」などのアクティビティの順序や頻度を把握することで、プロセス改善や業務効率化が必要な領域を特定できます。 重要な理由 プロセスの各手順を定義し、在庫ライフサイクルの可視化と分析を可能にします。 入手先 SAPの移動タイプ(MSEG-BWART)やトランザクションコード(MKPF-TCODE2)を、ユーザーにわかりやすい名称に対応付けて導出する属性です。 例 入庫計上棚入れの振替転記納品向け出庫の計上在庫の廃棄 | |||
| プラント Plant | 工場や配送センターなど、在庫を保管する施設を表す組織単位です。 | ||
| 説明 プラントは、SAPにおける中心的な組織単位です。生産施設、中央倉庫、または本社を表します。在庫はすべて、物理的または論理的にいずれかのプラントに属します。 プラント別の分析は、拠点間でプロセスのパフォーマンスを比較するうえで基本となります。「入庫棚入れのサイクルタイムが最も長いプラントはどこか」「プラントAの在庫差異率はプラントBより高いか」といった疑問の解明に役立ちます。地理的または組織的な単位で分けて分析することで、拠点固有の問題を特定し、組織内で優れた取り組みを共有できます。 重要な理由 会社の各拠点における在庫プロセスとパフォーマンスを比較できます。 入手先 品目伝票明細テーブルMSEGのWERKS(プラント)フィールドにあります。 例 10001710DE01US01 | |||
| ユーザー名 UserName | SAPで取引を実行したユーザーのIDです。 | ||
| 説明 この属性には、伝票を転記した従業員またはアクティビティを実行した従業員のSAPユーザーIDが記録されます。在庫管理プロセスの個々の処理を誰が担当したかを確認でき、追跡可能性が高まります。 ユーザー別の分析は、実績、コンプライアンス、トレーニングの必要性を把握するうえで欠かせません。たとえば「手作業による在庫調整の要因」ダッシュボードでは、この属性を使って調整を最も多く実行しているユーザーを確認できます。追加のトレーニングが必要なユーザーや、許可されていない処理を特定したり、優れた実績を上げている担当者を把握したりするのに役立ちます。 重要な理由 処理の責任を明確にし、ユーザーごとの行動、トレーニングの必要性、コンプライアンス上の問題を特定できます。 入手先 品目伝票ヘッダテーブルMKPFのUSNAM項目(ユーザー名)にあります。 例 JSMITHMBROWNWAREHOUSE_OPS | |||
| 保管場所 StorageLocation | プラント内で、在庫を物理的に保管する特定の場所です。 | ||
| 説明 保管場所は、プラント内の在庫を区分するための組織単位です。たとえば、原材料、完成品、品質検査中の在庫を、それぞれ別の保管場所に分けることができます。 この属性を使うと、プラントよりも細かい単位で場所を把握できます。入荷エリアから主倉庫への移動にかかるリードタイムなど、異なる在庫エリア間の移動を分析する際に役立ちます。保管場所ごとの保管スペースの利用状況や移動頻度を分析することで、倉庫のレイアウトや構内物流の改善につなげられます。 重要な理由 プラント内の在庫場所を細かく把握できるため、構内の移動や保管効率を分析できます。 入手先 品目伝票明細テーブルMSEGのLGORT(保管場所)フィールドにあります。 例 0001RM01FG01QI01 | |||
| 品目番号 MaterialNumber | 管理対象の製品または品目を識別する一意の番号です。 | ||
| 説明 品目番号はSKU(在庫管理単位)とも呼ばれ、特定の製品に割り当てられた一意のコードです。在庫管理の基本的なマスタデータ項目であり、商品の数量、価値、移動を追跡するために使われます。 プロセスマイニングで品目番号ごとに分析すると、製品別に在庫プロセスを確認できます。品質検査に最も時間がかかる製品、廃棄が最も多い製品、倉庫内の振替が最も多い製品などを把握できます。製品固有の問題を特定し、品目の種類に応じて在庫戦略を改善するうえで、この分類は重要です。 重要な理由 製品ごとに分析を分類し、特定の品目に固有のパターンや問題を明らかにできます。 入手先 品目伝票明細テーブルMSEGのMATNR項目にあります。マスタデータはMARAテーブルにあります。 例 RM-1001FG-2050-B100-400-A | |||
| 数量 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 | |||
| 保管棚番 StorageBin | 倉庫内で品目を物理的に保管する、最も細かい単位です。 | ||
| 説明 保管棚番は、倉庫内の棚の位置など、具体的な保管場所を示します。この詳細度は通常、SAP Warehouse Management(WM)またはExtended Warehouse Management(EWM)を導入している場合に利用できます。 「倉庫保管スペースの利用状況」ダッシュボードでは、この属性が重要です。倉庫スペースの利用効率を分析し、混雑しやすい場所を特定したり、棚入れやピッキングの経路に非効率がないかを確認したりできます。保管棚番間の移動を分析すると、倉庫レイアウトの改善や作業者の移動時間の短縮につながります。 重要な理由 最も細かい単位で保管場所を把握できるため、倉庫スペースの利用状況や業務効率を分析できます。 入手先 WMを使用している場合は、LTAK/LTAPなどの転送指図テーブルで確認できます。在庫伝票では、MSEG-LGPBEにある場合があります。SAP S/4HANAの文書を参照してください。 例 A-01-01-AB-05-10-C入荷エリア-01 | |||
| 最終データ更新 LastDataUpdate | このレコードのデータがソースシステムから最後に更新された日時を示すタイムスタンプです。 | ||
| 説明 この属性には、ソースシステムからデータを最後に抽出または更新した日時が記録されます。分析対象の情報がどの程度新しいかを示す重要なメタデータです。これにより、ほぼリアルタイムのデータを見ているのか、過去の時点のスナップショットを見ているのかを確認できます。 分析において、データの鮮度を把握することは、適切で正確な結論を導くうえで重要です。この項目を使って、アナリストや業務担当者はデータが最新かどうかを確認できます。また、提示するインサイトのコンテキストを示すため、ダッシュボードに表示されることもよくあります。 重要な理由 データがどの程度新しいかを示し、最新の情報に基づいて分析できるようにします。 入手先 このタイムスタンプは、データ抽出、変換、読み込み(ETL)の処理中に生成され、追加されます。 例 2024-05-21T08:00:00Z2024-05-20T08:00:00Z | |||
| 品目伝票番号 MaterialDocumentNumber | 入出庫を記録した品目伝票を特定する一意の番号です。 | ||
| 説明 SAPで入出庫を転記すると、移動の証跡として品目伝票が作成されます。この属性は、その伝票を一意に識別する番号です。1つの品目伝票に複数の明細やアクティビティが含まれる場合があります。 プロセスマイニングでは、品目伝票番号を使って、同時に転記された関連イベントをグループ化できます。また、監査や、プロセス分析からソースシステムにドリルダウンして個別の取引を調査する際にも欠かせません。 重要な理由 監査に使う取引キーとなり、同時に実行されたアクティビティをグループ化できます。 入手先 MKPF(ヘッダー)およびMSEG(明細)テーブルのMBLNR(品目伝票番号)フィールドにあります。 例 490000123450000056784900002345 | |||
| 在庫タイプ StockType | 利用可能、品質検査中、またはブロック中など、在庫の状態を示します。 | ||
| 説明 在庫タイプは、使用可否に応じて在庫を分類します。主なタイプは、自由に使用できる利用可能在庫、品質検査待ちの検査中在庫、使用できないブロック在庫です。入出庫に伴って在庫タイプが変更されることもあります。 在庫タイプの変化を追跡することは、在庫の利用可能性に関するプロセスを理解するうえで基本となります。「在庫を品質検査に転記」や「在庫ステータスをブロックに変更」といったアクティビティの分析に役立ちます。各在庫タイプ、特に「品質検査中」に費やす時間を分析すると、販売や生産に使える在庫の確保に影響する遅延を特定できます。 重要な理由 在庫の使用可否を追跡できるため、品質検査の遅延や在庫の利用可能性を分析できます。 入手先 品目伝票明細テーブルMSEGのINSMK(在庫タイプ)フィールドにあります。 例 利用可能在庫品質検査中ブロック在庫 | |||
| 数量単位 UnitOfMeasure | 品目の数量を表す単位です(例:個、キログラム)。 | ||
| 説明 数量単位は、「数量」属性で使われる単位を示します。一般的な例として、個(PC)、キログラム(KG)、リットル(L)、箱(BOX)などがあります。数量の値を正しく解釈するために必要な情報です。 単なる補足情報として扱われることもありますが、データ品質の確保や、異なる単位を共通の基準に換算する分析では重要な属性です。たとえば、廃棄在庫の総額を正確に算出するには、単位の異なる数量を把握し、必要に応じて換算する必要があります。 重要な理由 「数量」属性を正しく解釈するために必要な情報であり、品目の数量を正確に把握できます。 入手先 品目伝票明細テーブルMSEGのMEINS(基本数量単位)フィールドにあります。 例 個キログラム個メートル | |||
| 有効期限 ExpirationDate | 品目のロットが期限切れとなり、使用できなくなる日付です。 | ||
| 説明 有効期限(SLED)は、生鮮品や使用期限のある商品の重要なマスターデータです。ロット単位で管理され、製品を販売または消費できる期限を示します。 この属性は、「滞留・期限切れ在庫分析」ダッシュボードに欠かせません。有効期限を踏まえてアクティビティを分析すると、期限切れのリスクがあるロットを特定し、事前に対策を講じることができます。先入れ先出し(FEFO)などの在庫ローテーション方針の効果を測定したり、期限切れ在庫の廃棄による損失を定量化したりする際にも役立ちます。 重要な理由 滞留在庫や期限切れ在庫を分析し、廃棄や金銭的損失の抑制につなげられます。 入手先 ロットマスターテーブルMCH1またはMCHAのVFDAT(有効期限)フィールドにあります。 例 2024-12-312025-06-302024-09-01 | |||
| 注文履行サイクルタイム OrderFulfillmentCycleTime | ピッキング開始から納品のための出庫までにかかる一連の時間です。 | ||
| 説明 「ピッキング開始」アクティビティから「納品出庫転記」アクティビティまでの合計時間を測定する指標です。プロセス開始後、倉庫が顧客注文の商品を準備し、出荷するまでにかかる時間を表します。 この属性は、「注文履行サイクルタイム」の重要業績評価指標(KPI)を直接測定します。所要時間を分析すると、顧客需要への対応状況を把握できます。商品、倉庫、顧客別に分けて分析することで、ピッキング、梱包、出荷のどこで遅延が発生しているかを特定できます。こうした遅延は、顧客満足度や物流効率に直接影響します。 重要な理由 倉庫からの出荷プロセスの速度と効率を測定できます。顧客満足度を左右する重要な要素です。 入手先 計算属性です。各ロットについて、「ピッキング開始」と「納品出庫転記」のイベント間の時間差から算出します。 例 7200144003600 | |||
在庫管理のアクティビティ
| アクティビティ | 説明 | ||
|---|---|---|---|
| 入庫計上 | 通常、仕入先または生産元から倉庫に在庫バッチが最初に入庫したことを示します。SAP S/4HANAでは、入庫時に品目伝票が作成され、このイベントが明示的に記録されます。 | ||
| 重要な理由 在庫ライフサイクルの主な開始イベントです。このアクティビティから棚入れなどの後続アクティビティまでの時間を分析すると、荷受け場の効率を測定できます。 入手先 MATDOCテーブルに記録されます。購買発注の入庫を示す101や、入庫した在庫を保留在庫にする103など、特定の移動タイプ(BWART)で識別します。 記録 MATDOC内の品目伝票から、該当する入庫移動タイプを使って取得します。 イベントタイプ explicit | |||
| 品質検査在庫の解除 | バッチが品質検査に合格し、使用または棚入れが可能になったことを示します。品質検査在庫から自由使用在庫など別の在庫タイプへの振替転記として明示的に記録されます。 | ||
| 重要な理由 この節目は品質プロセスの完了を示し、在庫が使用可能になります。ここで遅延が発生すると、生産や注文履行に大きな影響が及ぶことがあります。 入手先 MATDOCテーブルに振替転記として記録されます。通常、移動タイプ(BWART)321で識別され、「品質検査」から「自由使用」へ在庫を移します。 記録 MATDOC内の移動タイプ321の品目伝票から取得します。 イベントタイプ explicit | |||
| 在庫の廃棄 | 在庫バッチを最終的に処分し、在庫記録から恒久的に除外することを示します。通常、期限切れ、破損、滞留などの在庫が対象です。 | ||
| 重要な理由 金銭的損失を示す終了イベントです。廃棄イベントを分析すると、在庫の長期滞留、取扱手順、需要予測に関する問題を特定できます。 入手先 MATDOCテーブルに記録されます。自由使用在庫からの551、品質検査在庫からの553、保留在庫からの555など、廃棄の移動タイプ(BWART)で識別します。 記録 MATDOC内の品目伝票から、廃棄の移動タイプ(例:551)を使って取得します。 イベントタイプ explicit | |||
| 在庫調整の計上 | 実地棚卸やその他の差異による在庫数量の変更を記録します。実在庫数に合わせて帳簿上の在庫を明示的に調整するイベントです。 | ||
| 重要な理由 在庫精度を維持するうえで、こうした調整は欠かせません。調整が頻繁に発生する場合、在庫の取扱い、セキュリティ、データ入力に根本的な問題がある可能性があります。 入手先 MATDOCテーブルに記録されます。在庫増を示す701や在庫減を示す702など、実地棚卸の移動タイプ(BWART)で識別します。 記録 MATDOC内の品目伝票から、実地棚卸の調整に使われる移動タイプ(例:701、702)を使って取得します。 イベントタイプ explicit | |||
| 棚入れの振替転記 | バッチを荷受け場または仮置き場から最終保管場所や保管棚へ物理的に移動することを示します。SAPでは振替転記の品目伝票として記録されます。 | ||
| 重要な理由 入庫プロセスの完了を示します。このアクティビティの完了までにかかる棚入れ時間は、倉庫効率を測る重要業績評価指標(KPI)です。 入手先 MATDOCテーブルに振替転記として記録されます。保管場所間の移動(例:移動タイプ311)として記録されることが多く、具体的な移動タイプは倉庫の構成によって異なります。 記録 MATDOC内で、仮の保管場所または荷受け用保管場所から最終保管場所へ在庫を移す振替転記伝票から識別します。 イベントタイプ explicit | |||
| 生産向け出庫の計上 | 生産指図またはプロセス指図で在庫バッチを消費したことを示します。この取引により在庫が減り、品目原価が製造指図に割り当てられます。 | ||
| 重要な理由 主要な消費イベントの1つで、構成品の在庫ライフサイクルの終了を示します。生産に必要な品目の在庫状況や消費パターンを分析するうえで重要です。 入手先 MATDOCテーブルに記録されます。移動タイプ(BWART)261など、指図向け出庫の移動タイプで識別します。 記録 MATDOC内の移動タイプ261の品目伝票から取得します。 イベントタイプ explicit | |||
| 納品向け出庫の計上 | 出庫プロセスの最終段階を記録します。バッチの所有権が顧客または運送業者に移る段階です。これは在庫を減らし、会計に計上する明示的な取引です。 | ||
| 重要な理由 注文履行プロセスの完了を示す重要なイベントです。納期遵守の測定や、注文履行サイクルタイム全体の算出に欠かせません。 入手先 MATDOCテーブルに記録されます。通常、販売注文の納品に対する出庫の移動タイプ(BWART)601で識別します。 記録 MATDOC内の移動タイプ601の品目伝票から取得します。 イベントタイプ explicit | |||
| バッチステータスの変更 | バッチマスタレコードの変更を示します。たとえば、ステータスを「自由使用」から「制限付き」に変更する場合です。品目の移動ではなく、ログに記録されるマスタデータの変更です。 | ||
| 重要な理由 バッチステータスの変更は、販売や生産での使用可否に直接影響します。こうした変更を分析すると、物理的な移動を伴わない期限切れ在庫や品質管理上の問題を明らかにできます。 入手先 バッチマスタテーブル(MCH1、MCHA)の変更ログから推定します。CDHDRテーブルとCDPOSテーブルで、バッチステータス項目(MCH1-ZUSTD)の変更を追跡します。 記録 バッチマスタレコードのステータス項目(MCH1-ZUSTD)に関するCDHDR/CDPOSの変更文書から導出します。 イベントタイプ inferred | |||
| ピッキング開始 | 倉庫タスクを作成し、保管棚からバッチをピッキングする注文履行プロセスの開始を示します。通常、移送オーダーまたは倉庫タスクの作成時に記録されます。 | ||
| 重要な理由 このアクティビティを起点にピッキングが始まります。このイベントからピッキング完了までの時間を分析すると、倉庫作業者の効率を測定し、遅延を特定できます。 入手先 通常、MATDOCには記録されません。倉庫管理(WM/EWM)を使用するシステムでは、移送オーダー(LTAKテーブル)または倉庫タスクの作成タイムスタンプから推定します。 記録 品目バッチに関連付けられた移送オーダー(WM)または倉庫タスク(EWM)の作成記録から推定します。 イベントタイプ inferred | |||
| 倉庫内在庫の振替転記 | 同一プラント内の異なる保管場所や保管棚の間で在庫バッチを移動したことを記録します。品目伝票を作成する明示的な取引です。 | ||
| 重要な理由 倉庫内の振替を追跡すると、倉庫業務の効率を分析し、不要な移動を特定できるほか、保管場所間の在庫補充にかかるリードタイムを測定できます。 入手先 MATDOCテーブルに記録されます。保管場所間の移動には、移動タイプ(BWART)311がよく使われます。 記録 MATDOC内の品目伝票から、倉庫内の在庫移動に使われる移動タイプ(例:311)を使って取得します。 イベントタイプ explicit | |||
| 在庫ステータスを保留に変更 | バッチのステータスを変更し、破損、保留依頼などの理由で出庫できない状態にすることを示します。SAPでは明示的な振替転記として記録されます。 | ||
| 重要な理由 在庫を利用できない状態になったことを示します。保留イベントが頻繁に発生する場合、取扱い、保管環境、仕入先の品質に問題がある可能性があります。 入手先 MATDOCテーブルに振替転記として記録されます。移動タイプ(BWART)344は「保留」から「自由使用」への移動、343は「自由使用」から「保留」への移動に一般的に使われます。このアクティビティは343に該当します。 記録 MATDOC内の移動タイプ343の品目伝票から識別します。 イベントタイプ explicit | |||
| 在庫ステータスを自由使用に変更 | バッチを保留または品質検査中の状態から解除し、使用可能にするステータス変更を示します。明示的な振替転記として記録されます。 | ||
| 重要な理由 このアクティビティは在庫の保留解除を示します。在庫が保留状態に置かれた期間を分析すると、解除プロセスの改善に役立ちます。 入手先 MATDOCテーブルに振替転記として記録されます。移動タイプ(BWART)344で、「保留」から「自由使用」へ在庫を移します。 記録 MATDOC内の移動タイプ344の品目伝票から識別します。 イベントタイプ explicit | |||
| 在庫を品質検査用に計上 | 入庫したバッチを品質検査中の保留状態に移し、検査完了まで使用できない状態にすることを示します。SAPでは、バッチの在庫タイプを変更する明示的な取引として記録されます。 | ||
| 重要な理由 このアクティビティを起点に品質検査が始まります。ここから品質検査在庫の解除までの期間は、品質関連の遅延を把握するための重要な指標です。 入手先 MATDOCテーブルに記録されます。移動タイプ101などの入庫で在庫タイプ(INSMK)が「Q」(品質検査)に設定されている場合や、移動タイプ322などの振替転記で識別できます。 記録 MATDOC内で在庫を「品質検査」タイプに移す品目伝票から識別します。 イベントタイプ explicit | |||
| 販売返品の受入 | 出庫済みのバッチが顧客から倉庫に返品されたことを記録します。在庫を増やす明示的な取引です。 | ||
| 重要な理由 返品を追跡することは、製品品質の問題や顧客の不満を把握するうえで欠かせません。返品の処理や処分のプロセスも、非効率の原因になることがあります。 入手先 MATDOCテーブルに記録されます。自由使用在庫への返品を示す651や、品質検査在庫への返品を示す653など、販売返品の移動タイプ(BWART)で識別します。 記録 MATDOC内の品目伝票から、販売返品の移動タイプ(例:651、653)を使って取得します。 イベントタイプ explicit | |||
データ抽出ガイド
ステップ
- システムへのアクセスを準備する:SAP S/4HANAシステムのCore Data Services(CDS)ビューを照会するために必要な権限を持つユーザーを用意します。通常、システム管理者によるアクセス権の付与が必要です。
- 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ビューに対する
SELECT権限が必要です:I_MaterialDocumentItem、I_BatchChangeDocument、I_WarehouseTask。これらのビューが存在する基盤データベーススキーマへのアクセス権も必要です。 - 日付範囲の指定:
PostingDate、ChangeDocumentCreationDate、またはWarehouseTaskCreationDateフィールドに日付範囲のフィルターを必ず設定してください。分析では通常、3~12か月の範囲を指定します。複数年分を照会すると、パフォーマンスに大きく影響する場合があります。 - 組織フィルター:パフォーマンスを高め、対象を絞って分析するには、
PlantまたはCompanyCodeで絞り込むWHERE句を追加します。データ量を抑え、業務上必要な範囲に対象を限定できます。 - データ量:在庫管理システムでは大量のデータが生成されます。日付範囲を広くすると数百万行に達することがあり、抽出中のソースシステムとクライアントツールの両方に影響する可能性があります。
- Extended Warehouse Management(EWM):「ピッキング開始」アクティビティは
I_WarehouseTaskCDSビューに基づいています。このビューにデータが入るのは、SAP Extended Warehouse Managementを使用している場合に限られます。旧来のWarehouse Management(WM)モジュール、またはInventory Management(IM)のみを使用している場合、このアクティビティは抽出されません。
クエリの例 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行とし、
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か月分を指定します。MATDOCで利用できる品目伝票の転記日付と時刻に基づいてEventTimeを設定します。増分ロードでは、遅れて転記されたデータを取り込めるよう、管理された重複期間を設けたうえで、設定済みの伝票識別子と明細識別子を使って重複を除去してください。
- 必須フィルター:プロセスの対象範囲に応じて、会社コード、プラント、品目伝票タイプ、移動タイプ、ロットの有無、転記日付を設定します。クエリに会社コードや伝票タイプのフィールドを追加する前に、導入済みのリリースで利用できることを確認してください。
- アクティビティの対応付け:移動タイプの意味は設定によって異なります。承認済みの対応表を管理するか、クエリ内の移動タイプ一覧を業務で使用している値に置き換えてください。例示された一覧を、SAP全般に共通する意味として扱わないでください。
- ロットの対象範囲:ケース識別子に
InventoryBatchLotを使用するため、ロット値のない行はクエリから除外されます。別のソースからロットを導出する必要がある場合は、抽出前にそのソースを明示的に設定してください。 - イベントの粒度:条件に合致するMATDOC明細ごとに、イベント行を1行出力します。後続のレコードからピッキング、品質判定、ロットステータスの変更、その他のアクティビティを推測することはありません。
- ロットマスターの変更:ロットステータスの変更は、MATDOCだけでは確実に把握できません。「ロットステータス変更」アクティビティには、変更文書またはロット履歴のソースを設定してください。クエリにはプレースホルダーの分岐が含まれています。実行前に、検証済みのソースに接続する必要があります。
- ピッキング:ピッキング開始は通常、MATDOCへの転記ではなく、倉庫実行データに記録されます。検証済みの倉庫タスクまたは転送指図のソースを設定し、実行前にプレースホルダーの分岐を置き換えてください。
- パフォーマンス:転記タイムスタンプまたは転記日付、プラント、会社コード、関連する移動タイプで絞り込みます。必要な列だけを選択し、過去の全データを無制限に検索しないでください。承認された負荷時間帯に実行します。MATDOCのデータ量が多い場合は、分割抽出または増分抽出を推奨します。
- 権限と前提条件:承認済みのデータベース接続、スキーマへのアクセス権、読み取り権限、SAP S/4HANAの在庫データへのアクセス権、およびMATDOC以外の2つのアクティビティに使用する倉庫実行データや変更履歴のソースへのアクセス権を取得してください。データベースへの直接アクセスが、組織のSAP運用モデルとサポートポリシーに準拠していることを確認します。
- タイムゾーン:データベースとアプリケーションのタイムゾーンを確認します。ProcessMindへのアップロード前に、EventTimeを一貫した方法で変換してください。
- データ保護:ユーザーID、品目データ、顧客関連データ、データベース認証情報について、組織の管理策を適用してください。クエリ本文に認証情報を記載しないでください。
クエリの例 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エディターを開きます。 - 新しいプログラムを作成する:「プログラム」フィールドに新しいプログラム名を入力します。例:
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)に必要な権限が必要です。
クエリの例 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%短縮して、コストを削減します。
クレジットカード不要・数分で設定完了