サプライチェーンマネジメントのデータテンプレート
サプライチェーンマネジメントのデータテンプレート
- 収集を推奨する属性
- 追跡すべき主なアクティビティ
- データ抽出ガイド
サプライチェーンマネジメントの属性
| 名前 | 説明 | ||
|---|---|---|---|
| アクティビティ名 ActivityName | サプライチェーンプロセスの特定の時点で発生した業務アクティビティまたはイベントの名前です。 | ||
| 説明 この属性は、物流注文のライフサイクルにおける特定のステップや節目を示します。例として、発注書発行や出庫転記があります。これらのアクティビティが、プロセスを構成する一連のイベントとなります。 アクティビティの順序を分析することは、プロセスマイニングの中核です。実際のプロセスフローを明らかにし、標準業務手順と比較できるほか、遅延や手戻りの原因となるステップを特定できます。 重要な理由 プロセスの各ステップを定義する情報であり、プロセスマップの作成、バリアントの分析、アクティビティ間のサイクルタイムの測定に欠かせません。 入手先 データ変換時に、さまざまなSAPテーブル(例:EKKO、LIKP、VBUK)のトランザクションコードやステータス変更を、分かりやすいアクティビティ名に対応付けて作成します。 例 購買発注を発行購買発注の入庫を転記出荷納品を作成納品証明確認 | |||
| イベント時刻 EventTime | アクティビティが発生した日時を示すタイムスタンプです。 | ||
| 説明 この属性には、プロセス内の各アクティビティの正確な日時が記録されます。イベントログの時系列を構成し、実際に発生した順にプロセスのステップを並べるために使われます。 イベント時刻は、時間に基づく分析に欠かせません。アクティビティ間のサイクルタイムやプロセス全体のリードタイムの計算、時間の経過に伴うパフォーマンス傾向の把握、ボトルネックが発生しやすい時点の特定に使用されます。 重要な理由 あらゆる所要時間やパフォーマンス指標の計算に必要なタイムスタンプです。プロセスのボトルネックやリードタイムを分析できます。 入手先 変更文書のCDHDR/CDPOSや、ヘッダーテーブルのERDAT/ERZETなど、SAPの主要テーブルにある伝票作成またはステータス変更に関連するタイムスタンプフィールドから抽出します。 例 2023-04-15T10:25:00Z2023-04-18T14:00:00Z2023-04-22T08:15:00Z | |||
| 物流注文 LogisticsOrder | 需要の発生から最終的な納品確認まで、サプライチェーンの一連のプロセスを識別する一意のIDです。 | ||
| 説明 物流注文は主要なケース識別子として機能し、サプライチェーンにおける特定の需要やフルフィルメント依頼に関連するすべてのアクティビティを結び付けます。この方法により、計画や調達から生産、配送まで、製品のライフサイクル全体を追跡し、プロセスを一貫して把握できます。 プロセスマイニングで物流注文ごとに分析すると、需要を満たすまでの全経路を確認できます。調達や販売などの個別プロセスを切り離して見るのではなく、サプライチェーン全体にわたる一般的なバリアント、ボトルネック、逸脱を特定できます。 重要な理由 関連するすべてのイベントを1つのプロセスインスタンスに結び付けるための重要なキーであり、サプライチェーンをエンドツーエンドで分析できます。 入手先 これは概念上の識別子であり、受注番号と後続の発注書番号や納品番号など、複数の伝票番号を関連付けて作成する必要がある場合があります。SAP S/4HANA Supply Chainの文書を参照するか、担当分野の専門家にご相談ください。 例 LO-4500078192LO-4500078193LO-4500078194 | |||
| ソースシステム SourceSystem | データの取得元となるシステムです。 | ||
| 説明 イベントデータが生成された特定のソースシステムのインスタンスを識別します。複雑なシステム環境では、地域や事業部門ごとに複数のSAP S/4HANAインスタンスを運用している場合があります。 この属性は、データガバナンスや分析対象の区分に役立ちます。システム間でプロセスのパフォーマンスを比較したり、信頼できる単一のデータソースに対象を絞ったりできます。 重要な理由 データの取得元を把握するための重要なコンテキストを提供します。データの検証や、異なるシステム環境間でのプロセス比較に役立ちます。 入手先 通常はデータ抽出時に追加する固定値で、SAPシステムID(SAPSID)などを使ってデータの取得元を識別します。 例 S4H_PROD_EUS4H_PROD_NAS4H_DEV | |||
| 最終データ更新 LastDataUpdate | ソースシステムからデータを最後に更新または抽出した日時です。 | ||
| 説明 この属性は、イベントログのデータが最後に更新された日時を示します。分析対象データの鮮度を確認できるため、データがいつ時点のものかを把握できます。 分析において、データの新しさを理解することは、十分な情報に基づいて判断するうえで欠かせません。このタイムスタンプにより、データへの信頼性が高まり、ダッシュボードや重要業績評価指標(KPI)が対象とする期間も確認できます。 重要な理由 データの鮮度を明示し、プロセス分析がどの時点までのデータに基づいているかを確認できます。 入手先 通常はメタデータフィールドで、データ更新が正常に完了した際に、データ抽出ツールまたはETLツールが生成して入力します。 例 2023-10-27T02:00:00Z2023-10-28T02:00:00Z2023-10-29T02:00:00Z | |||
| プラント Plant | アクティビティが発生した製造施設または配送施設です。 | ||
| 説明 プラントは、商品を生産、保管、または配送する場所を表すSAPの組織単位です。プロセスのアクティビティに地理的または機能的なコンテキストを与えます。 プラント別のプロセスパフォーマンス分析は、一般的な要件の1つです。拠点間で効率、処理量、コンプライアンスを比較し、ベストプラクティスや改善が必要な拠点を特定できます。 重要な理由 分析に地理的または組織的な切り口を加え、施設間のパフォーマンスを比較できます。 入手先 販売のVBAP、購買のEKPO、出荷のLIPSなど、多くの伝票明細テーブルにあります。通常、フィールド名はWERKSです。 例 100021003500 | |||
| 仕入先名 SupplierName | 調達活動に関連する仕入先またはベンダーの名前です。 | ||
| 説明 この属性は、商品やサービスの調達先となる仕入先を識別します。通常、購買依頼の作成や発注書の発行などのアクティビティに関連付けられます。 仕入先名は、仕入先納品パフォーマンスのダッシュボードに欠かせません。データを絞り込み、区分することで、仕入先ごとの納期遵守率、リードタイム、品質水準を比較できます。戦略的な調達や仕入先との関係管理に役立ちます。 重要な理由 仕入先別のパフォーマンス分析を可能にし、調達プロセスの最適化や仕入先の信頼性評価に役立ちます。 入手先 仕入先番号(LIFNR)は購買伝票(例:テーブルEKKN、EBAN)に保存されます。仕入先名は、仕入先マスターテーブルLFA1から取得します。 例 Global Components Inc.Advanced Materials LLCPrecision Parts Co. | |||
| 品目番号 MaterialNumber | 処理対象となる製品または品目を一意に識別する番号です。 | ||
| 説明 品目番号はSKUとも呼ばれ、SAPで特定の製品を識別する一意のコードです。製造、調達、出荷される物理的またはデジタルな商品と、プロセスのアクティビティを結び付けます。 この属性は、製品単位の分析に欠かせません。特定の製品で品質問題、生産遅延、在庫切れが起きやすいかを特定できます。ダッシュボードを品目で絞り込み、製品ラインごとのパフォーマンスを調べることもできます。 重要な理由 製品単位で分析し、遅延や品質不良などのプロセス上の問題が特定の品目に集中しているかを特定できます。 入手先 販売伝票のVBAP、発注書のEKPO、出荷伝票のLIPSなど、多くの伝票の明細テーブルにあります。通常、フィールド名はMATNRです。 例 FG-100-ARM-2034-BSA-5500 | |||
| 品質検査結果 QualityInspectionResult | 合格または不合格など、品質検査の結果です。 | ||
| 説明 この属性には、製造品または受領品に対して実施した品質検査の結果が記録されます。結果に応じて、商品を次の工程に進めるか、手直し、返品、廃棄が必要かが決まります。 この属性は、品質管理の不合格率に関するダッシュボードと重要業績評価指標(KPI)に欠かせません。不合格の頻度や理由を分析すると、特定の製品、仕入先、生産ラインにおける品質問題を特定できます。 重要な理由 品質関連の重要業績評価指標(KPI)の計算に直接役立ち、サプライチェーンにおける品質低下の原因を特定できます。 入手先 通常、この情報は品質管理(QM)モジュールに保存されます。検査ロットテーブルQALSや、使用決定コードを含むQAVEなどからデータを取得できます。 例 合格不合格手直しが必要条件付き合格 | |||
| 実行ユーザー ExecutingUser | アクティビティを実行した担当者のユーザーIDです。 | ||
| 説明 この属性には、発注書の作成や入庫転記などのアクティビティを実行した従業員のSAPユーザー名またはIDが記録されます。プロセスの各ステップと、それに関わった担当者を結び付けます。 ユーザーごとに分析すると、業務負荷の分布や研修の必要性を把握し、個人やチーム間のパフォーマンスの違いを確認できます。また、コンプライアンス分析で、重要なプロセスのステップを誰が実行したかを確認する際にも役立ちます。 重要な理由 アクティビティを特定のユーザーに関連付け、業務負荷の分析、パフォーマンスの比較、コンプライアンス違反の調査を可能にします。 入手先 多くのSAPテーブルにある「作成者」または「変更者」フィールドから取得します。例として、EKKO(発注書ヘッダー)のERNAM、LIKP(出荷ヘッダー)、VBRK(請求書ヘッダー)があります。 例 CBROWNJSMITHASINGH | |||
| 希望納期 RequestedDeliveryDate | 仕入先に商品の納品を依頼した日付です。 | ||
| 説明 発注書に指定された納品日で、仕入先に求める納期を示します。実際の納品パフォーマンスを測る際のベースラインとなります。 この日付は、仕入先納期遵守率の重要業績評価指標(KPI)の計算に欠かせません。実際の入庫日と希望納期を比較することで、仕入先が約束を守っているかを客観的に測定できます。 重要な理由 仕入先納期遵守率の重要業績評価指標(KPI)を計算する際のベースラインとなる日付であり、仕入先のパフォーマンス管理に欠かせません。 入手先 発注書明細テーブルEKPOにあります。フィールド名はEINDT(納品日)です。 例 2023-05-20T00:00:00Z2023-06-15T00:00:00Z2023-07-01T00:00:00Z | |||
| 顧客名 CustomerName | 注文品の納品先となる顧客の名前です。 | ||
| 説明 この属性は、受注とその後のフルフィルメント活動に関連する最終顧客を識別します。サプライチェーンプロセスにおける需要側のコンテキストを示します。 プロセスマイニングで顧客ごとに分析すると、主要顧客ごとのフルフィルメントのパターンやパフォーマンスの違いを特定できます。納品証明の遅延分析などのダッシュボードでは、特定の顧客による確認の遅れが常態化していないかを確認できます。 重要な理由 顧客ごとに分析対象を区分し、顧客固有の行動、ボトルネック、サービスレベル合意の達成状況を明らかにします。 入手先 顧客番号(KUNNR)は販売伝票(例:テーブルVBAK)に保存されます。顧客名は、顧客マスターテーブルKNA1から取得します。 例 Retail CorpInnovate SolutionsManufacturing Partners | |||
| 受注伝票番号 SalesOrderNumber | 受注伝票(SO)を一意に識別する番号です。 | ||
| 説明 受注伝票番号は、顧客への販売を確定する正式な伝票番号です。サプライチェーンの受注から入金までのプロセスを識別する重要な情報です。 この属性は、特定の顧客注文のフルフィルメントを追跡するうえで欠かせません。最初の顧客依頼を、その後の納品や請求などのアクティビティに結び付け、受注フルフィルメントのリードタイム分析を支えます。 重要な理由 受注フルフィルメントのサブプロセスを識別し、顧客需要を物流や金銭の精算に結び付ける重要な情報です。 入手先 受注ヘッダーテーブルVBAKと明細テーブルVBAPにあります。フィールド名はVBELNです。 例 100023451000234610002347 | |||
| 手直しの有無 IsRework | アクティビティまたは一連のアクティビティが手直しに該当するかどうかを示すフラグです。 | ||
| 説明 この真偽値属性は、プロセス内で前のステップが繰り返されたことを示し、手直しや修正の発生を表します。たとえば、「品質検査」の後に「製造指図作成」が続き、再度「品質検査」が行われた場合、2回目の検査を手直しとして記録できます。 手直しの特定は、プロセスの非効率や見えにくいコストを把握するうえで重要です。このフラグを使って手直しループの頻度や影響を定量化し、注文処理エラー率の重要業績評価指標(KPI)の計算や、プロセス改善が必要な領域の特定に役立てます。 重要な理由 手直しループに含まれるアクティビティを明示的に特定して数えることで、プロセスの非効率を定量化できます。 入手先 通常は、同じケース内でアクティビティの順序が繰り返されている箇所を特定し、プロセスマイニングツールで計算します。 例 truefalse | |||
| 注文数量 OrderQuantity | 注文の明細に記載された品目の数量です。 | ||
| 説明 この属性は、受注または発注書の明細で依頼された品目の数量を示します。各取引の規模を把握できます。 数量ごとに分析すると、業務への影響が大きい可能性のある大量注文を優先して調べられます。また、単位あたりのコストなど、ほかの指標の基準として使ったり、注文量が処理時間に与える影響を把握したりできます。 重要な理由 取引の規模を把握し、影響度の分析や案件規模ごとの区分に役立ちます。 入手先 発注書のEKPOにあるMENGEや、受注のVBAPにあるKWMENGなど、明細テーブルにあります。 例 100500025 | |||
| 発注書番号 PurchaseOrderNumber | 発注書(PO)伝票を一意に識別する番号です。 | ||
| 説明 発注書番号は、仕入先に資材を注文する際に使用する正式な伝票番号です。サプライチェーンの調達プロセスを識別する重要な情報です。 この属性を使うと、調達プロセスを詳しく分析できます。調達のエンドツーエンドサイクルタイムのダッシュボードや、仕入先納期遵守率の重要業績評価指標(KPI)の計算に使用し、購買依頼、発注、入庫、支払いの各アクティビティを結び付けます。 重要な理由 調達サブプロセスをドリルダウンして分析し、関連する調達イベントを結び付けるための重要な識別子です。 入手先 発注書ヘッダーテーブルEKKOと明細テーブルEKPOにあります。フィールド名はEBELNです。 例 450007819245000781934500078194 | |||
| 納期遅延の有無 IsLateDelivery | 仕入先からの納品が希望納期より遅れたかどうかを示す真偽値です。 | ||
| 説明 この計算フラグは、納品が期限内だったかどうかを真偽値で示します。「発注書入庫転記」アクティビティのタイムスタンプと「希望納期」属性を比較して算出します。 この属性により、仕入先のパフォーマンスに関するダッシュボードや重要業績評価指標(KPI)を簡単に作成できます。すばやく絞り込みや集計を行い、仕入先納期遵守率を計算したり、遅延が多い仕入先、品目、地域を特定したりできます。 重要な理由 納品ごとの結果を明確な二値で示し、仕入先のパフォーマンス分析を簡単にします。納期遵守率の重要業績評価指標(KPI)の算出に欠かせません。 入手先 計算フィールドです。ロジックは次のとおりです:IF('Goods Receipt For PO Posted'.EventTime > PurchaseOrder.RequestedDeliveryDate)THEN True ELSE False。 例 truefalse | |||
| 終了時刻 EndTime | アクティビティの完了時刻を示すタイムスタンプです。処理時間の計算に使用します。 | ||
| 説明 終了時刻は、特定のアクティビティが完了した時点を示します。開始時刻(EventTime)がアクティビティの開始時点を示すのに対し、終了時刻は、特に即時に完了しないアクティビティの実行時間を把握するために必要です。 開始時刻と終了時刻の両方があれば、処理時間と待ち時間を正確に測定できます。タスクに実際に取り組んでいる時間と、次のステップを待っている時間を区別できるため、効率化の機会を特定できます。 重要な理由 アクティビティの処理時間を正確に計算し、付加価値のある作業と待ち時間を区別できます。 入手先 SAPのステータス変更から算出できます。たとえば、JEST/JCDSなどのテーブルで「処理中」への更新を開始、「完了」への更新を終了とします。即時に完了するイベントでは、EndTimeとStartTimeが同じ場合があります。 例 2023-04-15T11:30:00Z2023-04-18T14:05:00Z2023-04-22T09:00:00Z | |||
| 運送業者名 CarrierName | 出荷を担当する輸送会社または貨物運送業者の名前です。 | ||
| 説明 運送業者名は、倉庫から顧客への輸送など、拠点間で商品を運ぶ物流サービス事業者を識別します。 この属性は、輸送サイクルタイム分析のダッシュボードに欠かせません。運送業者ごとの輸送時間、コスト、信頼性を比較し、物流計画や運送業者の選定に役立てることができます。 重要な理由 輸送事業者ごとのパフォーマンス分析を可能にし、物流コストや納品時間の最適化に役立ちます。 入手先 運送業者ID(フォワーディングエージェント)は、VTTK(出荷ヘッダー)などの出荷伝票に保存されます。名前はLFA1などのマスターデータテーブルから取得します。 例 DHLFedExMaersk Logistics | |||
サプライチェーンマネジメントのアクティビティ
| アクティビティ | 説明 | ||
|---|---|---|---|
| 出庫転記 | このアクティビティは、倉庫から商品が法的・物理的に出庫されたことを示します。在庫が減少し、売上原価が計上されることで、注文品の正式な出荷が記録されます。 | ||
| 重要な理由 これは、輸送中の期間の開始を示す重要な節目です。納品に向けて商品が会社の管理下を離れたことを示す確定時点です。 入手先 これは、マテリアル文書を作成する明示的なイベントです。タイムスタンプはマテリアル文書ヘッダー(MKPF、フィールドBUDAT)に記録され、出荷伝票(LIKP、フィールドWBSTK)の在庫移動ステータスが更新されます。 記録 出荷伝票に関連付けられた出庫マテリアル文書から、転記日付(MKPF-BUDAT)を使用します。 イベントタイプ explicit | |||
| 受注を作成 | このアクティビティは、新しい受注の作成を示します。受注には、商品を求める顧客の依頼が正式に記録されます。ユーザーがシステムで新しい受注文書を保存したときに記録される、明示的なイベントです。 | ||
| 重要な理由 これは受注から入金までのプロセスの主な開始点です。このイベントからほかのイベントまでの時間を分析すると、受注充足にかかる全体のリードタイムを把握し、初期処理の遅延を特定できます。 入手先 このイベントは明示的に記録されます。受注テーブルの変更文書(CDHDR/CDPOS)、または受注ヘッダーテーブル(VBAK)の作成タイムスタンプ(項目ERDAT)で確認できます。 記録 受注文書の作成日(VBAK-ERDAT)と作成時刻(VBAK-ERZET)を使用します。 イベントタイプ explicit | |||
| 商品の生産を完了 | 商品の製造が完了したことを確認するアクティビティです。通常は製造指図からの入庫として記録され、完成品が在庫に計上されます。 | ||
| 重要な理由 生産サイクルの終了を示します。製造指図の作成からこのイベントまでの時間が製造リードタイムとなり、生産効率を測る重要な指標です。 入手先 マテリアル伝票の転記(製造指図からの入庫)で明示的に記録するか、製造指図の最終確認(AFRUテーブル)またはステータスの「納品済み」への変更から推定できます。 記録 製造指図に対する最終入庫のマテリアル伝票の転記日、またはステータス変更から推定します。 イベントタイプ inferred | |||
| 納品証明確認 | 商品が指定どおりに届いたことを、顧客または運送業者が正式に確認したことを示します。多くの場合、納品証明(POD)の情報を出荷伝票に更新して記録します。 | ||
| 重要な理由 このアクティビティは、フルフィルメントプロセスの確定的な終了点です。正確な請求、紛争解決、納品サイクルの最終区間の測定に欠かせません。 入手先 これは明示的なイベントです。納品証明の日付は、出荷ヘッダーテーブル(LIKP、フィールドPODAT)または関連するPODテーブル(VLPOD)に記録されます。 記録 出荷伝票から納品証明日付(LIKP-PODAT)を使用します。 イベントタイプ explicit | |||
| 購買発注の入庫を転記 | 購買発注に基づいて、仕入先から原材料や商品を物理的に受領することを示します。倉庫または工場で商品を受領した時点で記録されます。 | ||
| 重要な理由 このアクティビティにより、調達サイクルにおける仕入先からの納品が完了します。仕入先の納期遵守率を算出し、入荷物流のパフォーマンスを把握するうえで重要です。 入手先 入庫のマテリアル伝票の転記時に記録される明示的なイベントです。イベントのタイムスタンプはマテリアル伝票ヘッダーテーブル(MKPF)の項目BUDATにあります。購買発注との関連付けには明細テーブル(MSEG)を使用します。 記録 購買発注に関連付けられたマテリアル伝票の転記日(MKPF-BUDAT)を使用します。 イベントタイプ explicit | |||
| 購買発注を発行 | 必要な資材を調達するため、外部の仕入先に購買発注を正式に作成して発行することを示します。このアクティビティにより、購買依頼が仕入先との法的拘束力を持つ契約に変わります。 | ||
| 重要な理由 重要な節目となるこのアクティビティは、仕入先のリードタイムや調達サイクルタイムの測定に欠かせません。仕入先の納期遵守パフォーマンスを評価するためのベースラインになります。 入手先 購買発注の作成時に記録される明示的なイベントです。作成タイムスタンプは購買発注ヘッダーテーブル(EKKO)の項目AEDATに保存されます。 記録 購買発注の文書作成日(EKKO-AEDAT)を使用します。 イベントタイプ explicit | |||
| ピッキングを完了 | 出荷納品に必要な商品を倉庫から集める作業の完了を示します。多くのシステムでは、納品文書のピッキングステータスが更新された時点で確認されます。 | ||
| 重要な理由 倉庫の処理能力を高めるには、効率的なピッキングが欠かせません。このアクティビティを追跡すると、倉庫業務のボトルネックを特定し、ピッキングのパフォーマンスを測定できます。 入手先 これは単独の明示的なイベントではなく、ステータスの変化から推定する場合があります。出荷明細テーブル(LIPS、フィールドKOSTA)のピッキングステータスが「C」(処理完了)に設定された時点で記録されます。 記録 変更文書を参照し、ピッキングステータス(LIPS-KOSTA)が全数ピッキング済みに更新された時点を推定します。 イベントタイプ inferred | |||
| 出荷伝票作成 | 輸送計画のために1件以上の納品をまとめる出荷伝票の作成を示します。この伝票には、運送業者、経路、輸送手段の詳細が記録されます。 | ||
| 重要な理由 このアクティビティは、正式な輸送計画の開始を示します。出庫から出荷完了までの時間を分析すると、輸送プロセスの効率を把握できます。 入手先 これは、出荷ヘッダーテーブル(VTTK、フィールドERDAT)に記録される明示的なイベントです。LE-TRAモジュールの一部であり、すべての組織で使用されているとは限りません。 記録 出荷伝票ヘッダーから作成日付(VTTK-ERDAT)を使用します。 イベントタイプ explicit | |||
| 出荷納品を作成 | 商品のピッキングと顧客への出荷を許可する納品文書の作成を示します。このアクティビティを境に、プロセスは受注管理から物流の実行段階に移ります。 | ||
| 重要な理由 出荷を実際に進めるための重要な段階です。受注作成から納品作成までの遅れは、計画や在庫の確保に問題があることを示す場合があります。 入手先 明示的なイベントです。作成タイムスタンプは納品ヘッダーテーブル(LIKP)の項目ERDATに記録されます。 記録 納品文書ヘッダーの作成日(LIKP-ERDAT)と作成時刻(LIKP-ERZET)を使用します。 イベントタイプ explicit | |||
| 品質検査を実施 | 生産した商品の品質検査が完了したことを示します。合格または不合格の検査結果は、使用決定に記録されます。 | ||
| 重要な理由 このアクティビティは、製品品質の監視と生産上の問題の特定に欠かせません。不合格率の高さや検査時間の長さが、重大なボトルネックになることがあります。 入手先 品質検査ロットの使用決定時に記録される明示的なイベントです。決定日はQALSテーブルの項目PASTRTERMまたはQAVEテーブルに記録されます。 記録 検査ロットの使用決定が記録されたタイムスタンプ(QALS/QAVEテーブル)を使用します。 イベントタイプ explicit | |||
| 在庫の引当可能数を確認 | 受注を充足するために、依頼された商品が在庫にあるかをシステムまたは担当者が確認することを示します。多くの場合、受注作成時に自動で行われますが、個別のイベントとして記録されないこともあります。 | ||
| 重要な理由 受注からこの確認までの時間と確認結果を把握すると、在庫水準が受注充足の所要時間に与える影響を分析できます。この段階で遅延が生じると、調達や生産が必要になることがよくあります。 入手先 通常、明示的なイベントとしては記録されません。受注明細テーブル(VBEP)で最初に確定した納入日程行が作成された時点、または受注明細のステータス変更から推定できます。 記録 受注の納入日程行(VBEPテーブル)の確認ステータス更新から推定します。 イベントタイプ inferred | |||
| 納品先での荷下ろし | このアクティビティは、顧客の所在地で商品を物理的に荷下ろししたことを示します。このイベントはSAPで明示的に記録されない場合があり、運送業者のデータや後続イベントから推定することがよくあります。 | ||
| 重要な理由 これは、輸送区間の終了を示します。出庫からこの時点までの時間が輸送時間となり、物流の最適化に欠かせない指標です。 入手先 コアERPで明示的なイベントとして記録されることはほとんどありません。運送業者からのEDIメッセージ、Transportation Management(TM)モジュールのデータ、または利用可能な場合は納品証明書のタイムスタンプから推定できます。 記録 運送業者のステータス更新(例:EDI 214)から推定するか、近似値として納品証明のタイムスタンプを使用します。 イベントタイプ inferred | |||
| 製造指図を作成 | 受注に必要な完成品を製造するため、製造指図が作成されたことを示します。社内製造プロセスの正式な開始点です。 | ||
| 重要な理由 製造指図の作成は、製造リードタイムの開始を示します。この時点を分析すると、需要シグナルから生産開始までの遅れを特定できます。 入手先 明示的なイベントです。作成日は製造指図ヘッダーテーブル(AUFK)の項目ERDATに記録されます。 記録 指図ヘッダーテーブルの作成日(AUFK-ERDAT)を使用します。 イベントタイプ explicit | |||
| 購買依頼を作成 | 必要な商品や原材料を調達するための社内依頼の作成を示します。受注を充足するのに在庫が不足している場合や、在庫が再発注点を下回った場合に作成されることがよくあります。 | ||
| 重要な理由 調達サイクルの最初の段階です。作成時点を追跡すると、調達開始の遅れを特定し、購買プロセス全体を分析できます。 入手先 明示的なイベントです。作成タイムスタンプは購買依頼ヘッダーテーブル(EBAN)の項目BADATに記録されます。 記録 購買依頼文書の作成日(EBAN-BADAT)を使用します。 イベントタイプ explicit | |||
| 顧客請求書作成 | このアクティビティは、納品した商品またはサービスに基づいて顧客向けの請求伝票を作成したことを示します。プロセスの最終段階である金銭の精算が始まります。 | ||
| 重要な理由 このアクティビティは、請求サイクルタイムの分析に役立ちます。納品確認から請求までの遅れは、キャッシュフローに悪影響を及ぼす可能性があります。 入手先 これは明示的なイベントです。作成時刻は請求伝票ヘッダーテーブル(VBRK、フィールドERDAT)に記録されます。 記録 請求伝票ヘッダーから作成日付(VBRK-ERDAT)を使用します。 イベントタイプ explicit | |||
データ抽出ガイド
ステップ
- 前提条件:必要なSAP S/4HANA Core Data Services(CDS)ビューにアクセスできる、十分な権限を持つユーザーをご用意ください。通常、SAPセキュリティチームによる特定のロール割り当てが必要です。また、SAP HANAデータベースに接続できるDBeaverやSAP HANA StudioなどのSQLクライアントも必要です。
- データベース接続の設定:SQLクライアントからSAP S/4HANAデータベースに接続できるよう設定します。データベースサーバーのホスト名、ポート(例:3xx15。xxはインスタンス番号)、データベースのユーザー名とパスワードが必要です。
- SQLクエリの準備:この文書のクエリセクションにあるSQLクエリ全体をコピーし、SQLクライアントのエディターに貼り付けます。このクエリは、物流および販売の各モジュールから指定されたすべてのアクティビティを抽出するよう設計されています。
- 抽出パラメーターの設定:クエリを実行する前に、各サブクエリの
WHERE句にある条件のプレースホルダーを確認します。'YourCompanyCode'を分析対象の実際の会社コードに置き換え、'YYYY-MM-DD'などの日付範囲のプレースホルダーを希望する抽出期間に合わせて設定してください。 - クエリの実行:SQLスクリプト全体を実行します。実行時間は、選択した日付範囲とシステム内のデータ量によって異なります。システム負荷を抑えるため、利用の少ない時間帯に実行することをお勧めします。
- 初回結果の確認:クエリの実行後、SQLクライアントに表示された結果を簡単に確認します。行数が妥当であること、LogisticsOrder、ActivityName、EventTimeなどの列に値が入っていること、複数のアクティビティ名が表示されていることを確認してください。
- データをCSVにエクスポート:SQLクライアントから結果全体をCSVファイルにエクスポートします。特殊文字の問題を防ぐため、UTF-8エンコーディングを選択してください。
- アップロード用の形式に整える:最終的なCSVファイルの列見出しが、取り込みに必要な属性名(例:
LogisticsOrder、ActivityName、EventTime)と完全に一致していることを確認します。提示されたSQLクエリをそのまま使った場合、追加のデータ変換は不要です。
設定
- 前提条件:基盤となるSAP HANAデータベースへのアクセスが必要です。データベースユーザーには、クエリで参照するすべてのCDSビュー(I_SalesOrderItem、I_PurchaseOrderItem、I_OutboundDeliveryItem、I_MaterialDocumentItem、I_ProductionOrder、I_QualityInspection、I_Shipment、I_BillingDocumentItemなど)に対する
SELECT権限が必要です。 - 日付範囲による絞り込み:提示されたクエリには、通常は作成日フィールド(
CreationDateまたはDocumentDate)を使って日付範囲を絞り込むためのプレースホルダーがあります。初回の分析では、システム負荷を過度に高めず、代表性のあるデータを得るため、3~6か月の期間をお勧めします。 - 主な業務フィルター:分析に関係するデータを抽出するには、特定の組織単位で絞り込むことが重要です。クエリには
CompanyCodeのプレースホルダーが設定されています。分析範囲に応じて、SalesOrganization、DistributionChannel、Plantのフィルターも追加できます。 - パフォーマンスに関する注意点:このクエリは、複数の大規模なCDSビューを結合する複雑なクエリです。実行時にシステムリソースを大きく消費する場合があります。営業時間外に抽出を実行してください。データ量が非常に多い場合は、月ごとに分けて順次実行することを検討してください。
クエリの例 sql
WITH SalesOrderLink AS (
SELECT DISTINCT
sd.SalesDocument AS SalesOrder,
pr.PurchaseRequisition AS PurchaseRequisition,
po.PurchaseOrder AS PurchaseOrder,
od.DeliveryDocument AS OutboundDelivery,
bd.BillingDocument AS BillingDocument
FROM I_SalesDocItemProcessFlow AS pf
LEFT JOIN I_SalesDocumentItem AS sd ON pf.PrecedingDocument = sd.SalesDocument AND pf.PrecedingDocumentItem = sd.SalesDocumentItem
LEFT JOIN I_PurchaseRequisitionItem AS pr ON pf.SubsequentDocument = pr.PurchaseRequisition AND pf.SubsequentDocumentItem = pr.PurchaseRequisitionItem
LEFT JOIN I_PurchaseOrderItem AS po ON pf.SubsequentDocument = po.PurchaseOrder AND pf.SubsequentDocumentItem = po.PurchaseOrderItem
LEFT JOIN I_OutboundDeliveryItem AS od ON pf.SubsequentDocument = od.DeliveryDocument AND pf.SubsequentDocumentItem = od.DeliveryDocumentItem
LEFT JOIN I_BillingDocumentItem AS bd ON pf.SubsequentDocument = bd.BillingDocument AND pf.SubsequentDocumentItem = bd.BillingDocumentItem
WHERE sd.SalesDocument IS NOT NULL
)
SELECT
so.SalesOrder AS "LogisticsOrder",
'Sales Order Created' AS "ActivityName",
so.CreationDate || ' ' || so.CreationTime AS "EventTime",
so.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
soi.Material AS "MaterialNumber",
soi.Plant AS "Plant",
soi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_SalesOrder AS so
JOIN I_SalesOrderItem AS soi ON so.SalesOrder = soi.SalesOrder
LEFT JOIN I_Customer AS cust ON so.SoldToParty = cust.Customer
WHERE so.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
so.SalesOrder AS "LogisticsOrder",
'Inventory Availability Checked' AS "ActivityName",
so.CreationDate || ' ' || so.CreationTime AS "EventTime",
so.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
soi.Material AS "MaterialNumber",
soi.Plant AS "Plant",
soi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_SalesOrder AS so
JOIN I_SalesOrderItem AS soi ON so.SalesOrder = soi.SalesOrder
LEFT JOIN I_Customer AS cust ON so.SoldToParty = cust.Customer
WHERE so.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Purchase Requisition Created' AS "ActivityName",
pr.CreationDate || ' ' || '00:00:00' AS "EventTime",
pr.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
pri.Material AS "MaterialNumber",
pri.Plant AS "Plant",
pri.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_PurchaseRequisition AS pr
JOIN I_PurchaseRequisitionItem AS pri ON pr.PurchaseRequisition = pri.PurchaseRequisition
JOIN SalesOrderLink sl ON pr.PurchaseRequisition = sl.PurchaseRequisition
WHERE pr.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND pr.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Purchase Order Issued' AS "ActivityName",
po.PurchaseOrderDate || ' ' || '00:00:00' AS "EventTime",
po.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
sup.SupplierName AS "SupplierName",
poi.Material AS "MaterialNumber",
poi.Plant AS "Plant",
poi.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_PurchaseOrder AS po
JOIN I_PurchaseOrderItem AS poi ON po.PurchaseOrder = poi.PurchaseOrder
LEFT JOIN I_Supplier AS sup ON po.Supplier = sup.Supplier
JOIN SalesOrderLink sl ON po.PurchaseOrder = sl.PurchaseOrder
WHERE po.PurchaseOrderDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND po.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Goods Receipt For PO Posted' AS "ActivityName",
md.DocumentDate || ' ' || md.CreationTime AS "EventTime",
md.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
sup.SupplierName AS "SupplierName",
mdi.Material AS "MaterialNumber",
mdi.Plant AS "Plant",
poi.DeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_MaterialDocumentHeader AS md
JOIN I_MaterialDocumentItem AS mdi ON md.MaterialDocument = mdi.MaterialDocument AND md.MaterialDocumentYear = mdi.MaterialDocumentYear
JOIN I_PurchaseOrderItem AS poi ON mdi.PurchaseOrder = poi.PurchaseOrder AND mdi.PurchaseOrderItem = poi.PurchaseOrderItem
LEFT JOIN I_Supplier AS sup ON poi.Supplier = sup.Supplier
JOIN SalesOrderLink sl ON poi.PurchaseOrder = sl.PurchaseOrder
WHERE md.DocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND mdi.GoodsMovementType = '101' AND mdi.CompanyCode = 'YourCompanyCode'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Production Order Created' AS "ActivityName",
po.CreationDate || ' ' || po.CreationTime AS "EventTime",
po.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
po.Material AS "MaterialNumber",
po.ProductionPlant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_ProductionOrder AS po
JOIN SalesOrderLink sl ON po.SalesOrder = sl.SalesOrder
WHERE po.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Goods Produced' AS "ActivityName",
md.DocumentDate || ' ' || md.CreationTime AS "EventTime",
md.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
mdi.Material AS "MaterialNumber",
mdi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_MaterialDocumentHeader AS md
JOIN I_MaterialDocumentItem AS mdi ON md.MaterialDocument = mdi.MaterialDocument AND md.MaterialDocumentYear = mdi.MaterialDocumentYear
JOIN I_ProductionOrder AS po ON mdi.ManufacturingOrder = po.ManufacturingOrder
JOIN SalesOrderLink sl ON po.SalesOrder = sl.SalesOrder
WHERE md.DocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND mdi.GoodsMovementType = '101'
UNION ALL
SELECT
qi.SalesOrder AS "LogisticsOrder",
'Quality Inspection Performed' AS "ActivityName",
qi.InspLotUsageDecisionDate || ' ' || qi.InspLotUsageDecisionTime AS "EventTime",
qi.InspLotUsageDecisionMadeByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
qi.Material AS "MaterialNumber",
qi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
qi.InspLotUsageDecisionCode AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_QualityInspection AS qi
WHERE qi.InspLotUsageDecisionDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND qi.SalesOrder IS NOT NULL
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Outbound Delivery Created' AS "ActivityName",
od.CreationDate || ' ' || od.CreationTime AS "EventTime",
od.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Picking Completed' AS "ActivityName",
od.PickingDate || ' ' || od.PickingTime AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.PickingDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallPickingStatus = 'C'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Goods Issue Posted' AS "ActivityName",
od.ActualGoodsMovementDate || ' ' || od.ActualGoodsMovementTime AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.ActualGoodsMovementDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallGoodsMovementStatus = 'C'
UNION ALL
SELECT
sl.SalesOrder AS "LogisticsOrder",
'Shipment Created' AS "ActivityName",
sh.CreationDate || ' ' || sh.CreationTime AS "EventTime",
sh.CreatedByUser AS "ExecutingUser",
NULL AS "CustomerName",
NULL AS "SupplierName",
NULL AS "MaterialNumber",
sh.ShippingPoint AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_Shipment AS sh
JOIN I_ShipmentDelivery AS sd ON sh.Shipment = sd.Shipment
JOIN SalesOrderLink sl ON sd.Delivery = sl.OutboundDelivery
WHERE sh.CreationDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'
UNION ALL
SELECT
odi.SalesOrder AS "LogisticsOrder",
'Proof Of Delivery Confirmed' AS "ActivityName",
od.PODActualDate || ' ' || '00:00:00' AS "EventTime",
od.LastChangedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
odi.Material AS "MaterialNumber",
odi.Plant AS "Plant",
odi.RequestedDeliveryDate AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_OutboundDelivery AS od
JOIN I_OutboundDeliveryItem AS odi ON od.OutboundDelivery = odi.OutboundDelivery
LEFT JOIN I_Customer AS cust ON od.SoldToParty = cust.Customer
WHERE od.PODActualDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND od.OverallPODStatus = 'C'
UNION ALL
SELECT
bdi.SalesDocument AS "LogisticsOrder",
'Customer Invoice Created' AS "ActivityName",
bd.BillingDocumentDate || ' ' || bd.CreationTime AS "EventTime",
bd.CreatedByUser AS "ExecutingUser",
cust.CustomerName AS "CustomerName",
NULL AS "SupplierName",
bdi.Material AS "MaterialNumber",
bdi.Plant AS "Plant",
NULL AS "RequestedDeliveryDate",
NULL AS "QualityInspectionResult",
'SAP S/4HANA' AS "SourceSystem",
CURRENT_UTCTIMESTAMP AS "LastDataUpdate"
FROM I_BillingDocument AS bd
JOIN I_BillingDocumentItem AS bdi ON bd.BillingDocument = bdi.BillingDocument
LEFT JOIN I_Customer AS cust ON bd.SoldToParty = cust.Customer
WHERE bd.BillingDocumentDate BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND bd.CompanyCode = 'YourCompanyCode' AND bdi.SalesDocument IS NOT NULL; ステップ
- 物流、販売、調達、在庫、生産、品質、納品、出荷、納品証明、請求の各データを含むSAP HANAスキーマへの直接読み取りアクセスが可能であることを確認します。スキーマ名、接続情報、権限については、SAP Basisチームまたはデータプラットフォームチームにお問い合わせください。ソースシステムへの書き込みは行わないでください。
- 対象システムのS/4HANAデータモデルを正確に確認します。発注にはEKKOとEKPO、出荷にはLIKPとLIPSを使用します。受注、購買依頼、品目伝票、生産指図、品質検査結果、出荷、納品証明、請求には、追加のオブジェクト設定が必要です。クエリ内の角括弧で囲まれたオブジェクトや列のプレースホルダーは、システムのデータディクショナリで確認したオブジェクトに置き換えてください。
- LogisticsOrderの関連付けルールを定義します。推奨する方法は、受注から後続の納品、品目伝票、生産または調達伝票、請求伝票までの伝票フローを確認して関連付けることです。直接関連付けられない場合は、文書化された関連付けテーブルまたは業務固有のマッピングを設定します。品目番号や日付だけでケースを関連付けないでください。
- [Start date parameter]と[End date parameter]を使って抽出期間を設定します。イベントのタイムスタンプには一貫して同じ期間を適用します。ただし、期間内のイベントを説明するために必要な場合は、期間より前に作成された伝票も含めてください。
- 指定されたフィルターセクションで、会社コード、販売組織、プラント、購買組織、伝票タイプなどの業務フィルターを設定します。対象システムで値を確認してからフィルターを適用してください。
- 各アクティビティの分岐にある角括弧付きのテーブル名と列名を、確認済みの名称に置き換えます。すべての分岐で、同じ列と互換性のあるデータ型を返す必要があります。ProcessMindは欠落したイベントを推測しないため、クエリでは必要な15種類のアクティビティごとに1行を明示的に作成します。
- SAP HANA Database Explorer、SAP HANA cockpit SQL Console、または承認済みのSQLクライアントでクエリを実行します。UNION ALLを含むクエリ全体を実行する前に、各アクティビティの分岐を個別にテストしてください。実行計画を確認し、初回のテストでは日付範囲を短く設定します。
- 伝票間の関連付け、タイムスタンプ、ユーザーID、仕入先と顧客の値、品目とプラントの値、品質結果を検証します。明細単位の結合で重複行が発生していないか調べ、伝票ごと、または伝票明細ごとなど、設定したイベント粒度のルールを適用します。
- 結果をUTF-8形式のCSV、またはProcessMindが対応する別の表形式でエクスポートします。出力列名は、LogisticsOrder、ActivityName、EventTime、SourceSystem、LastDataUpdate、ExecutingUser、SupplierName、CustomerName、MaterialNumber、Plant、RequestedDeliveryDate、QualityInspectionResultのとおり正確に保持してください。EventTimeがタイムスタンプであり、LastDataUpdateに一貫して値が入っていることを確認します。
- ファイルをProcessMindにアップロードし、LogisticsOrderをケースID、ActivityNameをアクティビティ、EventTimeをイベント日時としてマッピングします。15種類すべてのアクティビティラベルが明示的なイベントとして扱われることを確認し、増分抽出の動作を検証した後、管理された更新スケジュールを設定します。
設定
- 日付範囲:まず3~6か月分のデータを対象にします。初回テストでは期間を短くし、パフォーマンスと伝票間の関連付けを確認してから対象期間を広げてください。
- ソーススキーマ:[SAP HANA schema name]には、確認済みのS/4HANAテーブルまたはビューを含むスキーマを指定します。すべてのS/4HANA環境で、従来のERPテーブルが同じ名前で利用できるとは限りません。
- 伝票の対象範囲:プロセスの対象範囲に合わせて、[Company Code filter]、[Sales Organization filter]、[Plant filter]、[Purchasing Organization filter]、[Document Type filter]を設定します。
- 関連付け:[Your document flow or correlation object]を設定し、各イベントが1つのLogisticsOrderに割り当てられるようにします。関連付けができない場合や曖昧な場合は、割り当てを黙って行わず、問題として報告してください。
- イベント粒度:イベントを伝票単位、伝票明細単位、または業務上意味のあるステータス変更単位のいずれで記録するかを選択します。すべての分岐に同じルールを適用し、技術的な重複行のみを削除してください。
- タイムスタンプの優先順位:各アクティビティには、確認済みの転記、作成、確認、ステータス変更、検査、納品、荷下ろし、納品証明(POD)、または請求のタイムスタンプを使用します。業務イベントの時刻を抽出時刻で代用しないでください。
- ソースラベル:[Source system label]には、承認済みのSAP S/4HANAシステムIDなど、変更されない値を設定します。
- 更新タイムスタンプ:[Last data update expression]には、承認済みの抽出タイムスタンプまたはソースの更新タイムスタンプを設定します。
- パフォーマンス:日付と組織のフィルターを早い段階で適用し、必要な列だけを選択します。明細単位の無制限な結合を避け、実行計画を確認してください。定期的な読み込みには、永続化した抽出ビューまたはステージングテーブルの利用も検討します。
- 権限:関連するSAP HANAスキーマオブジェクトの読み取り権限と、SQLの実行権限が必要です。業務上の検証には、対象となる販売、調達、在庫、生産、品質、物流実行、輸送、請求の各データへのアクセスが必要です。
- 機能範囲:対象システムに、指定されたアクティビティに対応する業務プロセスが含まれていることを確認します。出荷、荷下ろし、POD、品質、生産、請求のデータは、別のアプリケーションや拡張機能に保存されている場合があります。
- セキュリティ:顧客、仕入先、品目、財務、ユーザーのデータに関する組織のルールを適用します。必要に応じて、機密性の高い項目をマスキングするか、アクセスを制限してください。
クエリの例 sql
WITH
parameters AS (
SELECT
CAST('[Start date parameter]' AS TIMESTAMP) AS start_ts,
CAST('[End date parameter]' AS TIMESTAMP) AS end_ts,
CAST('[Last data update expression]' AS TIMESTAMP) AS last_data_update,
CAST('[Source system label]' AS NVARCHAR(100)) AS source_system,
CAST('[Company Code filter]' AS NVARCHAR(20)) AS company_code_filter,
CAST('[Sales Organization filter]' AS NVARCHAR(20)) AS sales_org_filter,
CAST('[Plant filter]' AS NVARCHAR(20)) AS plant_filter,
CAST('[Purchasing Organization filter]' AS NVARCHAR(20)) AS purchasing_org_filter,
CAST('[Document Type filter]' AS NVARCHAR(20)) AS document_type_filter
FROM DUMMY
),
base_events AS (
SELECT
CAST('[Sales order correlation column]' AS NVARCHAR(100)) AS LogisticsOrder,
CAST('Sales Order Created' AS NVARCHAR(100)) AS ActivityName,
CAST('[Sales order creation timestamp]' AS TIMESTAMP) AS EventTime,
CAST('[Executing user column]' AS NVARCHAR(100)) AS ExecutingUser,
CAST('[Supplier name column]' AS NVARCHAR(255)) AS SupplierName,
CAST('[Customer name column]' AS NVARCHAR(255)) AS CustomerName,
CAST('[Material number column]' AS NVARCHAR(100)) AS MaterialNumber,
CAST('[Plant column]' AS NVARCHAR(100)) AS Plant,
CAST('[Requested delivery date column]' AS DATE) AS RequestedDeliveryDate,
CAST('[Quality inspection result column]' AS NVARCHAR(100)) AS QualityInspectionResult
FROM [Your sales order source object]
CROSS JOIN parameters p
WHERE CAST('[Sales order creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Sales order creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Sales order company code column]' AS NVARCHAR(20)) = p.company_code_filter
AND CAST('[Sales order sales organization column]' AS NVARCHAR(20)) = p.sales_org_filter
AND CAST('[Sales order document type column]' AS NVARCHAR(20)) = p.document_type_filter
UNION ALL
SELECT
CAST('[Inventory check correlation column]' AS NVARCHAR(100)),
CAST('Inventory Availability Checked' AS NVARCHAR(100)),
CAST('[Inventory check timestamp]' AS TIMESTAMP),
CAST('[Inventory check user column]' AS NVARCHAR(100)),
CAST('[Inventory supplier name column]' AS NVARCHAR(255)),
CAST('[Inventory customer name column]' AS NVARCHAR(255)),
CAST('[Inventory material number column]' AS NVARCHAR(100)),
CAST('[Inventory plant column]' AS NVARCHAR(100)),
CAST('[Inventory requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your inventory availability source object]
CROSS JOIN parameters p
WHERE CAST('[Inventory check timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Inventory check timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Inventory company code column]' AS NVARCHAR(20)) = p.company_code_filter
AND CAST('[Inventory sales organization column]' AS NVARCHAR(20)) = p.sales_org_filter
UNION ALL
SELECT
CAST('[Purchase requisition correlation column]' AS NVARCHAR(100)),
CAST('Purchase Requisition Created' AS NVARCHAR(100)),
CAST('[Purchase requisition creation timestamp]' AS TIMESTAMP),
CAST('[Purchase requisition user column]' AS NVARCHAR(100)),
CAST('[Purchase requisition supplier name column]' AS NVARCHAR(255)),
CAST('[Purchase requisition customer name column]' AS NVARCHAR(255)),
CAST('[Purchase requisition material number column]' AS NVARCHAR(100)),
CAST('[Purchase requisition plant column]' AS NVARCHAR(100)),
CAST('[Purchase requisition requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your purchase requisition source object]
CROSS JOIN parameters p
WHERE CAST('[Purchase requisition creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Purchase requisition creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Purchase requisition plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Purchase order correlation column]' AS NVARCHAR(100)),
CAST('Purchase Order Issued' AS NVARCHAR(100)),
CAST('[Purchase order issue timestamp]' AS TIMESTAMP),
CAST('[Purchase order user column]' AS NVARCHAR(100)),
CAST('[Purchase order supplier name column]' AS NVARCHAR(255)),
CAST('[Purchase order customer name column]' AS NVARCHAR(255)),
CAST('[Purchase order material number column]' AS NVARCHAR(100)),
CAST('[Purchase order plant column]' AS NVARCHAR(100)),
CAST('[Purchase order requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM EKKO po_header
INNER JOIN EKPO po_item
ON po_header.[Purchase order number column] = po_item.[Purchase order number column]
CROSS JOIN parameters p
WHERE CAST('[Purchase order issue timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Purchase order issue timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Purchase order company code column]' AS NVARCHAR(20)) = p.company_code_filter
AND CAST('[Purchase order purchasing organization column]' AS NVARCHAR(20)) = p.purchasing_org_filter
AND CAST('[Purchase order document type column]' AS NVARCHAR(20)) = p.document_type_filter
UNION ALL
SELECT
CAST('[Goods receipt correlation column]' AS NVARCHAR(100)),
CAST('Goods Receipt For PO Posted' AS NVARCHAR(100)),
CAST('[Goods receipt posting timestamp]' AS TIMESTAMP),
CAST('[Goods receipt user column]' AS NVARCHAR(100)),
CAST('[Goods receipt supplier name column]' AS NVARCHAR(255)),
CAST('[Goods receipt customer name column]' AS NVARCHAR(255)),
CAST('[Goods receipt material number column]' AS NVARCHAR(100)),
CAST('[Goods receipt plant column]' AS NVARCHAR(100)),
CAST('[Goods receipt requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your material document header source object] material_header
INNER JOIN [Your material document item source object] material_item
ON material_header.[Material document number column] = material_item.[Material document number column]
AND material_header.[Material document year column] = material_item.[Material document year column]
CROSS JOIN parameters p
WHERE CAST('[Goods receipt posting timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Goods receipt posting timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Goods receipt plant column]' AS NVARCHAR(20)) = p.plant_filter
AND CAST('[Goods receipt movement type column]' AS NVARCHAR(20)) = '[Goods receipt movement type value]'
UNION ALL
SELECT
CAST('[Production order correlation column]' AS NVARCHAR(100)),
CAST('Production Order Created' AS NVARCHAR(100)),
CAST('[Production order creation timestamp]' AS TIMESTAMP),
CAST('[Production order user column]' AS NVARCHAR(100)),
CAST('[Production order supplier name column]' AS NVARCHAR(255)),
CAST('[Production order customer name column]' AS NVARCHAR(255)),
CAST('[Production order material number column]' AS NVARCHAR(100)),
CAST('[Production order plant column]' AS NVARCHAR(100)),
CAST('[Production order requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your production order source object]
CROSS JOIN parameters p
WHERE CAST('[Production order creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Production order creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Production order plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Production receipt correlation column]' AS NVARCHAR(100)),
CAST('Goods Produced' AS NVARCHAR(100)),
CAST('[Production receipt timestamp]' AS TIMESTAMP),
CAST('[Production receipt user column]' AS NVARCHAR(100)),
CAST('[Production receipt supplier name column]' AS NVARCHAR(255)),
CAST('[Production receipt customer name column]' AS NVARCHAR(255)),
CAST('[Production receipt material number column]' AS NVARCHAR(100)),
CAST('[Production receipt plant column]' AS NVARCHAR(100)),
CAST('[Production receipt requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your production receipt source object]
CROSS JOIN parameters p
WHERE CAST('[Production receipt timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Production receipt timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Production receipt plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Quality inspection correlation column]' AS NVARCHAR(100)),
CAST('Quality Inspection Performed' AS NVARCHAR(100)),
CAST('[Quality inspection completion timestamp]' AS TIMESTAMP),
CAST('[Quality inspection user column]' AS NVARCHAR(100)),
CAST('[Quality supplier name column]' AS NVARCHAR(255)),
CAST('[Quality customer name column]' AS NVARCHAR(255)),
CAST('[Quality material number column]' AS NVARCHAR(100)),
CAST('[Quality plant column]' AS NVARCHAR(100)),
CAST('[Quality requested delivery date column]' AS DATE),
CAST('[Quality inspection result column]' AS NVARCHAR(100))
FROM [Your quality inspection source object]
CROSS JOIN parameters p
WHERE CAST('[Quality inspection completion timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Quality inspection completion timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Quality plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Outbound delivery correlation column]' AS NVARCHAR(100)),
CAST('Outbound Delivery Created' AS NVARCHAR(100)),
CAST('[Outbound delivery creation timestamp]' AS TIMESTAMP),
CAST('[Outbound delivery user column]' AS NVARCHAR(100)),
CAST('[Outbound delivery supplier name column]' AS NVARCHAR(255)),
CAST('[Outbound delivery customer name column]' AS NVARCHAR(255)),
CAST('[Outbound delivery material number column]' AS NVARCHAR(100)),
CAST('[Outbound delivery plant column]' AS NVARCHAR(100)),
CAST('[Outbound delivery requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM LIKP delivery_header
INNER JOIN LIPS delivery_item
ON delivery_header.[Delivery number column] = delivery_item.[Delivery number column]
CROSS JOIN parameters p
WHERE CAST('[Outbound delivery creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Outbound delivery creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Outbound delivery plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Picking correlation column]' AS NVARCHAR(100)),
CAST('Picking Completed' AS NVARCHAR(100)),
CAST('[Picking completion timestamp]' AS TIMESTAMP),
CAST('[Picking user column]' AS NVARCHAR(100)),
CAST('[Picking supplier name column]' AS NVARCHAR(255)),
CAST('[Picking customer name column]' AS NVARCHAR(255)),
CAST('[Picking material number column]' AS NVARCHAR(100)),
CAST('[Picking plant column]' AS NVARCHAR(100)),
CAST('[Picking requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your picking status source object]
CROSS JOIN parameters p
WHERE CAST('[Picking completion timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Picking completion timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Picking plant column]' AS NVARCHAR(20)) = p.plant_filter
AND CAST('[Picking completion status column]' AS NVARCHAR(50)) = '[Picking completed status value]'
UNION ALL
SELECT
CAST('[Goods issue correlation column]' AS NVARCHAR(100)),
CAST('Goods Issue Posted' AS NVARCHAR(100)),
CAST('[Goods issue posting timestamp]' AS TIMESTAMP),
CAST('[Goods issue user column]' AS NVARCHAR(100)),
CAST('[Goods issue supplier name column]' AS NVARCHAR(255)),
CAST('[Goods issue customer name column]' AS NVARCHAR(255)),
CAST('[Goods issue material number column]' AS NVARCHAR(100)),
CAST('[Goods issue plant column]' AS NVARCHAR(100)),
CAST('[Goods issue requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your goods issue source object]
CROSS JOIN parameters p
WHERE CAST('[Goods issue posting timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Goods issue posting timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Goods issue plant column]' AS NVARCHAR(20)) = p.plant_filter
AND CAST('[Goods issue movement type column]' AS NVARCHAR(20)) = '[Goods issue movement type value]'
UNION ALL
SELECT
CAST('[Shipment correlation column]' AS NVARCHAR(100)),
CAST('Shipment Created' AS NVARCHAR(100)),
CAST('[Shipment creation timestamp]' AS TIMESTAMP),
CAST('[Shipment user column]' AS NVARCHAR(100)),
CAST('[Shipment supplier name column]' AS NVARCHAR(255)),
CAST('[Shipment customer name column]' AS NVARCHAR(255)),
CAST('[Shipment material number column]' AS NVARCHAR(100)),
CAST('[Shipment plant column]' AS NVARCHAR(100)),
CAST('[Shipment requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your shipment source object]
CROSS JOIN parameters p
WHERE CAST('[Shipment creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Shipment creation timestamp]' AS TIMESTAMP) < p.end_ts
AND CAST('[Shipment plant column]' AS NVARCHAR(20)) = p.plant_filter
UNION ALL
SELECT
CAST('[Unloading correlation column]' AS NVARCHAR(100)),
CAST('Goods Unloaded at Destination' AS NVARCHAR(100)),
CAST('[Unloading timestamp]' AS TIMESTAMP),
CAST('[Unloading user column]' AS NVARCHAR(100)),
CAST('[Unloading supplier name column]' AS NVARCHAR(255)),
CAST('[Unloading customer name column]' AS NVARCHAR(255)),
CAST('[Unloading material number column]' AS NVARCHAR(100)),
CAST('[Unloading plant column]' AS NVARCHAR(100)),
CAST('[Unloading requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your unloading or carrier event source object]
CROSS JOIN parameters p
WHERE CAST('[Unloading timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Unloading timestamp]' AS TIMESTAMP) < p.end_ts
UNION ALL
SELECT
CAST('[POD correlation column]' AS NVARCHAR(100)),
CAST('Proof Of Delivery Confirmed' AS NVARCHAR(100)),
CAST('[POD confirmation timestamp]' AS TIMESTAMP),
CAST('[POD user column]' AS NVARCHAR(100)),
CAST('[POD supplier name column]' AS NVARCHAR(255)),
CAST('[POD customer name column]' AS NVARCHAR(255)),
CAST('[POD material number column]' AS NVARCHAR(100)),
CAST('[POD plant column]' AS NVARCHAR(100)),
CAST('[POD requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your proof of delivery source object]
CROSS JOIN parameters p
WHERE CAST('[POD confirmation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[POD confirmation timestamp]' AS TIMESTAMP) < p.end_ts
UNION ALL
SELECT
CAST('[Billing correlation column]' AS NVARCHAR(100)),
CAST('Customer Invoice Created' AS NVARCHAR(100)),
CAST('[Billing creation timestamp]' AS TIMESTAMP),
CAST('[Billing user column]' AS NVARCHAR(100)),
CAST('[Billing supplier name column]' AS NVARCHAR(255)),
CAST('[Billing customer name column]' AS NVARCHAR(255)),
CAST('[Billing material number column]' AS NVARCHAR(100)),
CAST('[Billing plant column]' AS NVARCHAR(100)),
CAST('[Billing requested delivery date column]' AS DATE),
CAST(NULL AS NVARCHAR(100))
FROM [Your billing document source object]
CROSS JOIN parameters p
WHERE CAST('[Billing creation timestamp]' AS TIMESTAMP) >= p.start_ts
AND CAST('[Billing creation timestamp]' AS TIMESTAMP) < p.end_ts
)
SELECT
LogisticsOrder,
ActivityName,
EventTime,
parameters.source_system AS SourceSystem,
parameters.last_data_update AS LastDataUpdate,
ExecutingUser,
SupplierName,
CustomerName,
MaterialNumber,
Plant,
RequestedDeliveryDate,
QualityInspectionResult
FROM base_events
CROSS JOIN parameters
WHERE LogisticsOrder IS NOT NULL
AND ActivityName IS NOT NULL
AND EventTime IS NOT NULL
ORDER BY LogisticsOrder, EventTime, ActivityName; ステップ
- 前提条件:SAP S/4HANAシステムでABAPプログラムを作成・実行するための開発者キーと必要な権限(トランザクションSE38へのアクセス)、およびVBAK、LIKP、EKKO、MKPFなどのサプライチェーンテーブルを読み取る権限をご用意ください。
- プログラムの作成:トランザクションコード
SE38でABAPエディターを開きます。新しいプログラム名(例:Z_PM_SCM_EXTRACTION)を入力し、「作成」をクリックします。内容がわかるタイトルを入力し、プログラムタイプに「実行可能プログラム」を指定してください。 - コードの挿入:下の「クエリ」セクションにあるABAPコード全体をコピーし、新しいプログラムのABAPエディターに貼り付けます。
- テキスト要素の定義:「ジャンプ」>「テキスト要素」>「選択テキスト」を開きます。ユーザーインターフェースがわかりやすくなるよう、提案された選択画面ラベルをすべて有効にしてください。
- プログラムの有効化:CTRL+Sを押して保存し、CTRL+F3を押して有効化します。ツールバーの有効化アイコンも使用できます。システム固有の設定に起因する構文エラーが発生した場合は修正してください。
- プログラムの実行:F8キーを押すか、「直接処理」ボタンを使ってプログラムを実行します。選択画面が表示され、抽出するデータを絞り込めます。
- 抽出パラメーターの設定:選択画面で、受注作成日の範囲を指定します。データ量を抑えるため、特定の会社コードまたは販売組織で絞り込むことを強くお勧めします。SAPアプリケーションサーバー上の出力ファイルのフルパスを入力してください。
- バックグラウンドでの実行:数か月分の大規模なデータを抽出する場合は、トランザクションのタイムアウトを防ぐため、プログラムをバックグラウンドで実行してください。メニューから「プログラム」>「バックグラウンドで実行」を選び、ジョブをスケジュールします。
- データファイルの取得:プログラムの実行が完了したら、トランザクションコード
AL11で指定したアプリケーションサーバー上のディレクトリを開きます。生成されたファイルを見つけ、トランザクションCG3Yを使ってローカルマシンにダウンロードしてください。 - アップロードの準備:ダウンロードしたファイルが、カンマまたはセミコロン区切りのCSVなどのプレーンテキスト形式で、UTF-8エンコーディングになっていることを確認します。これでプロセスマイニングツールにアップロードできます。
設定
- 選択日付範囲(S_ERDAT):最も重要なフィルターです。受注の初回抽出対象期間を、作成日(
VBAK-ERDAT)に基づいて指定します。データ量を運用しやすい範囲に抑えるため、まず直近3~6か月など、対象を絞った期間を設定してください。 - 販売組織(S_VKORG):特定の販売組織に抽出対象を限定する任意のフィルターです。特定の事業部門や地域に絞って分析する場合に便利です。
- 会社コード(S_BUKRS):特定の会社コードにデータを限定する任意のフィルターです。対象範囲を絞り、パフォーマンスを高めるため、設定を強くお勧めします。
- 出力ファイルパス(P_FILE):最終的なイベントログを保存するSAPアプリケーションサーバー上のフルパスです。プログラムを実行するユーザーには、このディレクトリへの書き込み権限が必要です。例:
/usr/sap/trans/tmp/scm_event_log.csv。 - 実行モード:少量のテストデータを抽出する場合は、フォアグラウンドで実行できます。データ量が多い場合は、タイムアウトを防ぎ、ピーク時間帯のシステム負荷を抑えるため、バックグラウンド処理が必須です。
- システム権限:レポートを実行するユーザーには、VBAK、VBAP、EKKO、EKPO、MSEG、MKPF、LIKP、LIPS、VBRK、AUFK、QAVE、KNA1、LFA1など、基盤となるすべてのテーブルへの読み取り権限が必要です。
クエリの例 abap
REPORT Z_PM_SCM_EXTRACTION.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
PARAMETERS: p_file TYPE string LOWER CASE DEFAULT '/usr/sap/trans/tmp/scm_event_log.csv'.
SELECT-OPTIONS: s_erdat FOR sy-datum OBLIGATORY,
s_vkorg FOR vbak-vkorg,
s_bukrs FOR vbak-bukrs.
*&---------------------------------------------------------------------*
*& Data Type Definitions
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_event_log,
LogisticsOrder TYPE vbeln_va,
ActivityName TYPE string,
EventTime TYPE string,
SourceSystem TYPE sysysid,
LastDataUpdate TYPE string,
ExecutingUser TYPE ernam,
SupplierName TYPE name1_gp,
CustomerName TYPE name1_gp,
MaterialNumber TYPE matnr,
Plant TYPE werks_d,
RequestedDeliveryDate TYPE vdatu,
QualityInspectionResult TYPE string,
END OF ty_event_log.
*&---------------------------------------------------------------------*
*& Data Declarations
*&---------------------------------------------------------------------*
DATA: lt_event_log TYPE TABLE OF ty_event_log,
ls_event_log TYPE ty_event_log,
lv_sysid TYPE sysysid,
lv_last_update TYPE string.
*&---------------------------------------------------------------------*
*& START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
lv_sysid = sy-sysid.
CONCATENATE sy-datum sy-uzeit INTO lv_last_update.
" Select base data: Sales Orders
SELECT h~vbeln, h~erdat, h~erzet, h~ernam, h~kunnr, h~bukrs, h~vdatu, i~posnr, i~matnr, i~werks
INTO TABLE @DATA(lt_so)
FROM vbak AS h
INNER JOIN vbap AS i ON h~vbeln = i~vbeln
WHERE h~erdat IN @s_erdat
AND h~vkorg IN @s_vkorg
AND h~bukrs IN @s_bukrs.
IF lt_so IS INITIAL.
MESSAGE 'No sales orders found for the given criteria.' TYPE 'I'.
RETURN.
ENDIF.
" Select related documents using Document Flow (VBFA)
SELECT *
INTO TABLE @DATA(lt_vbfa)
FROM vbfa
FOR ALL ENTRIES IN @lt_so
WHERE vbelv = @lt_so-vbeln
AND posnv = @lt_so-posnr.
" Collect all unique document numbers
DATA: lt_vbeln_pr TYPE RANGE OF banfn,
lt_vbeln_po TYPE RANGE OF ebeln,
lt_vbeln_dn TYPE RANGE OF vbeln_vl,
lt_vbeln_gi TYPE RANGE OF mblnr,
lt_vbeln_auf TYPE RANGE OF aufnr,
lt_vbeln_inv TYPE RANGE OF vbeln_vf,
lt_vbeln_shp TYPE RANGE OF tknum.
LOOP AT lt_vbfa INTO DATA(ls_vbfa).
CASE ls_vbfa-vbtyp_n.
WHEN 'H'. " Purchase Requisition
APPEND ls_vbfa-vbeln TO lt_vbeln_pr.
WHEN 'K'. " Purchase Order
APPEND ls_vbfa-vbeln TO lt_vbeln_po.
WHEN 'J'. " Delivery
APPEND ls_vbfa-vbeln TO lt_vbeln_dn.
WHEN 'R'. " Goods Movement (GI)
APPEND ls_vbfa-vbeln TO lt_vbeln_gi.
WHEN 'L'. " Production Order
APPEND ls_vbfa-vbeln TO lt_vbeln_auf.
WHEN 'M'. " Invoice
APPEND ls_vbfa-vbeln TO lt_vbeln_inv.
WHEN '8'. " Shipment
APPEND ls_vbfa-vbeln TO lt_vbeln_shp.
ENDCASE.
ENDLOOP.
SORT lt_vbeln_pr. DELETE ADJACENT DUPLICATES FROM lt_vbeln_pr.
SORT lt_vbeln_po. DELETE ADJACENT DUPLICATES FROM lt_vbeln_po.
SORT lt_vbeln_dn. DELETE ADJACENT DUPLICATES FROM lt_vbeln_dn.
SORT lt_vbeln_gi. DELETE ADJACENT DUPLICATES FROM lt_vbeln_gi.
SORT lt_vbeln_auf. DELETE ADJACENT DUPLICATES FROM lt_vbeln_auf.
SORT lt_vbeln_inv. DELETE ADJACENT DUPLICATES FROM lt_vbeln_inv.
SORT lt_vbeln_shp. DELETE ADJACENT DUPLICATES FROM lt_vbeln_shp.
" Select detailed data for each document type
SELECT banfn, badat, ernam FROM eban INTO TABLE @DATA(lt_eban) FOR ALL ENTRIES IN @lt_so WHERE bnfpo = @lt_so-posnr AND banfn IN @lt_vbeln_pr.
SELECT ebeln, aedat, ernam, lifnr FROM ekko INTO TABLE @DATA(lt_ekko) WHERE ebeln IN @lt_vbeln_po.
SELECT vbeln, erdat, erzet, ernam, kodat, wadat_ist, podat FROM likp INTO TABLE @DATA(lt_likp) WHERE vbeln IN @lt_vbeln_dn.
SELECT mblnr, mjahr, budat, usnam FROM mkpf INTO TABLE @DATA(lt_mkpf) WHERE mblnr IN @lt_vbeln_gi.
SELECT mblnr, mjahr, zeile, bwart, lfbnr, ebeln, aufnr FROM mseg INTO TABLE @DATA(lt_mseg) FOR ALL ENTRIES IN @lt_mkpf WHERE mblnr = @lt_mkpf-mblnr AND mjahr = @lt_mkpf-mjahr.
SELECT aufnr, erdat, ernam FROM aufk INTO TABLE @DATA(lt_aufk) WHERE aufnr IN @lt_vbeln_auf.
SELECT prueflos, vdatum, vcode FROM qave INTO TABLE @DATA(lt_qave) FOR ALL ENTRIES IN @lt_so WHERE aufnr IN @lt_vbeln_auf.
SELECT vbeln, erdat, erzet, ernam FROM vbrk INTO TABLE @DATA(lt_vbrk) WHERE vbeln IN @lt_vbeln_inv.
SELECT tknum, erdat, erzet FROM vttk INTO TABLE @DATA(lt_vttk) WHERE tknum IN @lt_vbeln_shp.
SELECT kunnr, name1 FROM kna1 INTO TABLE @DATA(lt_kna1) FOR ALL ENTRIES IN @lt_so WHERE kunnr = @lt_so-kunnr.
SELECT lifnr, name1 FROM lfa1 INTO TABLE @DATA(lt_lfa1) FOR ALL ENTRIES IN @lt_ekko WHERE lifnr = @lt_ekko-lifnr.
" Assemble Event Log
LOOP AT lt_so INTO DATA(ls_so).
CLEAR ls_event_log.
READ TABLE lt_kna1 INTO DATA(ls_kna1) WITH KEY kunnr = ls_so-kunnr BINARY SEARCH.
ls_event_log-LogisticsOrder = ls_so-vbeln.
ls_event_log-SourceSystem = lv_sysid.
ls_event_log-LastDataUpdate = lv_last_update.
ls_event_log-CustomerName = ls_kna1-name1.
ls_event_log-MaterialNumber = ls_so-matnr.
ls_event_log-Plant = ls_so-werks.
ls_event_log-RequestedDeliveryDate = ls_so-vdatu.
" 1. Sales Order Created
ls_event_log-ActivityName = 'Sales Order Created'.
CONCATENATE ls_so-erdat ls_so-erzet INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_so-ernam.
APPEND ls_event_log TO lt_event_log.
" 2. Inventory Availability Checked (proxy event)
ls_event_log-ActivityName = 'Inventory Availability Checked'.
CONCATENATE ls_so-erdat ls_so-erzet INTO ls_event_log-EventTime. " Using SO creation time as a proxy
ls_event_log-ExecutingUser = ls_so-ernam.
APPEND ls_event_log TO lt_event_log.
" Find related documents for this SO item
LOOP AT lt_vbfa INTO ls_vbfa WHERE vbelv = ls_so-vbeln AND posnv = ls_so-posnr.
CASE ls_vbfa-vbtyp_n.
WHEN 'H'. " 3. Purchase Requisition Created
READ TABLE lt_eban INTO DATA(ls_eban) WITH KEY banfn = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Purchase Requisition Created'.
CONCATENATE ls_eban-badat '000000' INTO ls_event_log-EventTime. " PR has no time field
ls_event_log-ExecutingUser = ls_eban-ernam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
WHEN 'K'. " 4. Purchase Order Issued
READ TABLE lt_ekko INTO DATA(ls_ekko) WITH KEY ebeln = ls_vbfa-vbeln.
IF sy-subrc = 0.
READ TABLE lt_lfa1 INTO DATA(ls_lfa1) WITH KEY lifnr = ls_ekko-lifnr BINARY SEARCH.
ls_event_log-ActivityName = 'Purchase Order Issued'.
CONCATENATE ls_ekko-aedat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_ekko-ernam.
ls_event_log-SupplierName = ls_lfa1-name1.
APPEND ls_event_log TO lt_event_log.
ENDIF.
WHEN 'L'. " 6. Production Order Created
READ TABLE lt_aufk INTO DATA(ls_aufk) WITH KEY aufnr = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Production Order Created'.
CONCATENATE ls_aufk-erdat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_aufk-ernam.
APPEND ls_event_log TO lt_event_log.
" 8. Quality Inspection Performed
READ TABLE lt_qave INTO DATA(ls_qave) WITH KEY prueflos = ls_vbfa-vbeln. " Approximation linking lot to order
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Quality Inspection Performed'.
CONCATENATE ls_qave-vdatum '000000' INTO ls_event_log-EventTime.
ls_event_log-QualityInspectionResult = ls_qave-vcode.
APPEND ls_event_log TO lt_event_log.
CLEAR ls_event_log-QualityInspectionResult.
ENDIF.
ENDIF.
WHEN 'J'. " 9. Outbound Delivery Created
READ TABLE lt_likp INTO DATA(ls_likp) WITH KEY vbeln = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Outbound Delivery Created'.
CONCATENATE ls_likp-erdat ls_likp-erzet INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_likp-ernam.
APPEND ls_event_log TO lt_event_log.
" 10. Picking Completed
IF ls_likp-kodat IS NOT INITIAL.
ls_event_log-ActivityName = 'Picking Completed'.
CONCATENATE ls_likp-kodat '120000' INTO ls_event_log-EventTime. " Using Picking Date as proxy
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 14. Proof Of Delivery Confirmed
IF ls_likp-podat IS NOT INITIAL.
ls_event_log-ActivityName = 'Proof Of Delivery Confirmed'.
CONCATENATE ls_likp-podat '000000' INTO ls_event_log-EventTime.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDIF.
WHEN 'M'. " 15. Customer Invoice Created
READ TABLE lt_vbrk INTO DATA(ls_vbrk) WITH KEY vbeln = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Customer Invoice Created'.
CONCATENATE ls_vbrk-erdat ls_vbrk-erzet INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_vbrk-ernam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
WHEN '8'. " 12. Shipment Created
READ TABLE lt_vttk INTO DATA(ls_vttk) WITH KEY tknum = ls_vbfa-vbeln.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Shipment Created'.
CONCATENATE ls_vttk-erdat ls_vttk-erzet INTO ls_event_log-EventTime.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDCASE.
ENDLOOP.
" Find material movements (MSEG) not directly in VBFA
" 5. Goods Receipt For PO Posted
LOOP AT lt_mseg INTO DATA(ls_mseg_po) WHERE ebeln IN (SELECT ebeln FROM ekpo WHERE banfn IN (SELECT banfn FROM eban WHERE vbeln = ls_so-vbeln) ) AND bwart = '101'.
READ TABLE lt_mkpf INTO DATA(ls_mkpf_po) WITH KEY mblnr = ls_mseg_po-mblnr mjahr = ls_mseg_po-mjahr.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Goods Receipt For PO Posted'.
CONCATENATE ls_mkpf_po-budat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_mkpf_po-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
" 7. Goods Produced
LOOP AT lt_mseg INTO DATA(ls_mseg_pp) WHERE aufnr IN (SELECT aufnr FROM afpo WHERE kdauf = ls_so-vbeln) AND bwart = '101'.
READ TABLE lt_mkpf INTO DATA(ls_mkpf_pp) WITH KEY mblnr = ls_mseg_pp-mblnr mjahr = ls_mseg_pp-mjahr.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Goods Produced'.
CONCATENATE ls_mkpf_pp-budat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_mkpf_pp-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
" 11. Goods Issue Posted
LOOP AT lt_mseg INTO DATA(ls_mseg_gi) WHERE lfbnr IN (SELECT vbeln FROM lips WHERE vgbel = ls_so-vbeln) AND bwart = '601'.
READ TABLE lt_mkpf INTO DATA(ls_mkpf_gi) WITH KEY mblnr = ls_mseg_gi-mblnr mjahr = ls_mseg_gi-mjahr.
IF sy-subrc = 0.
ls_event_log-ActivityName = 'Goods Issue Posted'.
CONCATENATE ls_mkpf_gi-budat '000000' INTO ls_event_log-EventTime.
ls_event_log-ExecutingUser = ls_mkpf_gi-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
ENDLOOP.
" Remove duplicate events for the same case
SORT lt_event_log BY LogisticsOrder ActivityName EventTime.
DELETE ADJACENT DUPLICATES FROM lt_event_log COMPARING LogisticsOrder ActivityName EventTime.
" Write data to file
DATA: lt_output TYPE TABLE OF string.
APPEND 'LogisticsOrder,ActivityName,EventTime,SourceSystem,LastDataUpdate,ExecutingUser,SupplierName,CustomerName,MaterialNumber,Plant,RequestedDeliveryDate,QualityInspectionResult' TO lt_output.
LOOP AT lt_event_log INTO ls_event_log.
DATA(lv_line) = |
{ ls_event_log-LogisticsOrder },
{ ls_event_log-ActivityName },
{ ls_event_log-EventTime },
{ ls_event_log-SourceSystem },
{ ls_event_log-LastDataUpdate },
{ ls_event_log-ExecutingUser },
{ ls_event_log-SupplierName },
{ ls_event_log-CustomerName },
{ ls_event_log-MaterialNumber },
{ ls_event_log-Plant },
{ ls_event_log-RequestedDeliveryDate },
{ ls_event_log-QualityInspectionResult }|
.
REPLACE ALL OCCURRENCES OF ',' IN lv_line WITH ' '.
REPLACE ALL OCCURRENCES OF REGEX '\s+' IN lv_line WITH '' LEADING.
CONDENSE lv_line.
APPEND lv_line TO lt_output.
ENDLOOP.
cl_gui_frontend_services=>gui_download(
EXPORTING
filename = p_file
filetype = 'ASC'
CHANGING
data_tab = lt_output
EXCEPTIONS
OTHERS = 24
).
IF sy-subrc <> 0.
MESSAGE 'Error downloading file.' TYPE 'E'.
ELSE.
MESSAGE |File downloaded successfully to { p_file }| TYPE 'S'.
ENDIF. 準備はできましたか?
このテンプレートを使ってデータを準備し、今日からサプライチェーンのパフォーマンス改善に取り組みましょう。各ステップでサポートいたします。
今すぐサプライチェーンマネジメントを改善
プロセス全体を可視化し、数日で予測精度を90%に高めます。
14日間無料でお試しいただけます。クレジットカードは不要です。