サプライチェーン管理向けデータテンプレート
サプライチェーン管理向けデータテンプレート
- 収集を推奨する属性
- 追跡すべき主要アクティビティ
- 抽出ガイド
サプライチェーン管理の属性
| 名前 | 説明 | ||
|---|---|---|---|
| アクティビティ名 ActivityName | サプライチェーンプロセスの特定の時点で発生した業務アクティビティまたはイベントの名称です。 | ||
| 説明 物流注文のライフサイクルにおける特定のステップまたはマイルストーンを示す属性です。例として、「購買発注発行」や「出庫転記」があります。これらのアクティビティが、プロセスを構成する一連のイベントになります。 アクティビティの順序を分析することは、プロセスマイニングの中心です。実際のプロセスフローの発見、標準業務手順との比較、遅延や手戻りの原因となるプロセスステップの特定に役立ちます。 重要な理由 プロセスのステップを定義するものであり、プロセスマップの発見、バリアントの分析、アクティビティ間のサイクルタイムの測定に欠かせません。 入手先 データ変換時に、さまざまなSAPテーブル(例:EKKO、LIKP、VBUK)のトランザクションコードやステータス変更を、わかりやすいアクティビティ名にマッピングして生成します。 例 購買発注を発行購買発注の入庫を転記出荷伝票作成納品証明確認済み | |||
| イベント時刻 EventTime | 日付と時刻を含む、アクティビティが発生した時点を示すタイムスタンプです。 | ||
| 説明 プロセス内の各アクティビティについて、正確な日付と時刻を提供する属性です。イベントログの時系列を支え、実際に発生した順序でプロセスステップを並べます。 イベント時刻は、時間に基づくすべての分析に欠かせません。アクティビティ間のサイクルタイムやプロセス全体のリードタイムの計算、時間経過に伴うパフォーマンス傾向の測定、ボトルネックが発生しやすい時点の特定に使われます。 重要な理由 すべての所要時間とパフォーマンス指標を計算するために必要なタイムスタンプであり、プロセスのボトルネックとリードタイムの分析を可能にします。 入手先 CDHDR/CDPOSなどの変更文書用テーブルにある伝票作成やステータス変更のタイムスタンプフィールド、またはヘッダーテーブルのERDAT/ERZETなど、特定の日付・時刻フィールドから抽出します。 例 2023-04-15T10:25:00Z2023-04-18T14:00:00Z2023-04-22T08:15:00Z | |||
| 物流注文 LogisticsOrder | 需要の発生から最終的な納品確認まで、サプライチェーン全体にわたる単一プロセスを識別する一意の識別子です。 | ||
| 説明 物流注文は、サプライチェーン内の特定の需要または履行依頼に関連するすべてのアクティビティを結び付ける、主要なケース識別子です。この方法により、計画、調達、生産、配送に至る製品のライフサイクル全体を追跡し、プロセスを一貫して把握できます。 プロセスマイニングで物流注文単位に分析すると、需要を満たすまでにたどった経路全体を確認できます。調達や販売などのプロセスを個別に見るのではなく、サプライチェーン全体における一般的なバリアント、ボトルネック、逸脱を特定できます。 重要な理由 関連するすべてのイベントを単一のプロセスインスタンスに結び付け、サプライチェーンをエンドツーエンドで分析するための基本的なキーです。 入手先 概念上の識別子であり、販売注文番号と後続の購買発注番号や出荷伝票番号など、複数の伝票番号を結び付けて作成する必要がある場合があります。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の組織単位です。プロセスアクティビティに地理的または機能的な背景を与えます。 プラント別にプロセスパフォーマンスを分析することは、一般的な要件です。異なる拠点間で効率、処理能力、コンプライアンスを比較し、ベストプラクティスや改善が必要な拠点を特定できます。 重要な理由 分析に地理的または組織的な切り口を提供し、異なる拠点間でパフォーマンスを比較できます。 入手先 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 | |||
| 手直しフラグ IsRework | アクティビティまたは一連のアクティビティが手直しを表すかどうかを示すフラグです。 | ||
| 説明 プロセス内の以前のステップを繰り返しているアクティビティを示すブール型属性で、手直しや修正の発生を表します。たとえば、「品質検査」の後に「製造指図作成」が続き、その後に再び「品質検査」が行われた場合、2回目の検査を手直しとして記録できます。 手直しの特定は、プロセスの非効率性と見えにくいコストを把握するうえで重要です。このフラグにより、手直しループの頻度と影響を定量化し、注文処理エラー率KPIの計算や改善領域の特定に役立てられます。 重要な理由 手直しループに含まれるアクティビティを明示的に特定して数えることで、プロセスの非効率性を定量化できます。 入手先 通常は、同じケース内でアクティビティの繰り返しパターンを特定し、プロセスマイニングツール内で計算します。 例 truefalse | |||
| 注文数量 OrderQuantity | 注文明細に含まれる品目の数量です。 | ||
| 説明 販売注文または購買発注の明細で依頼された品目の数量を示す属性です。各取引の規模を表します。 数量別に分析すると、事業への影響が大きい大量注文を優先して調査できます。単位当たりコストなど、他の指標の正規化や、注文量が処理時間に与える影響の把握にも使えます。 重要な理由 取引の規模を把握するための情報を提供し、影響度の分析やケースの規模別分類を可能にします。 入手先 EKPO(購買発注)のMENGEやVBAP(販売注文)のKWMENGなど、明細レベルのテーブルにあります。 例 100500025 | |||
| 納期遅延フラグ 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 | |||
| 販売注文番号 SalesOrderNumber | 販売注文(SO)伝票を一意に識別する番号です。 | ||
| 説明 販売注文番号は、顧客への販売を確定する正式な伝票番号です。サプライチェーンの受注から入金までのプロセスにおける主要な識別子です。 この属性は、特定の顧客注文の履行状況を追跡するために欠かせません。最初の顧客依頼を、納品や請求など後続のすべてのアクティビティに結び付け、受注履行リードタイム分析を支援します。 重要な理由 受注履行サブプロセスの主要な識別子として、顧客需要を物流および財務決済に結び付けます。 入手先 販売注文ヘッダーテーブルVBAKと明細テーブルVBAPにあります。フィールド名はVBELNです。 例 100023451000234610002347 | |||
| 購買発注番号 PurchaseOrderNumber | 購買発注(PO)伝票を一意に識別する番号です。 | ||
| 説明 購買発注番号は、仕入先に品目を発注するために使用する正式な伝票番号です。サプライチェーンの調達部分における主要な識別子です。 この属性により、調達プロセスを詳細に分析できます。調達エンドツーエンドサイクルタイムダッシュボードや仕入先納期遵守率KPIの計算に使用し、購買依頼、発注、入庫、支払いのアクティビティを結び付けます。 重要な理由 調達サブプロセスを詳細に確認し、関連する調達イベントを結び付けるための主要な識別子です。 入手先 購買発注ヘッダーテーブルEKKOと明細テーブルEKPOにあります。フィールド名はEBELNです。 例 450007819245000781934500078194 | |||
| 運送会社名 CarrierName | 出荷を担当する輸送会社またはフォワーダーの名称です。 | ||
| 説明 運送会社名は、拠点間、たとえば倉庫から顧客まで商品を輸送する物流サービス提供者を識別します。 この属性は、輸送サイクルタイム分析ダッシュボードに欠かせません。運送会社ごとの輸送時間、コスト、信頼性を比較し、物流計画と運送会社の選定を改善できます。 重要な理由 輸送サービス提供者別のパフォーマンス分析を可能にし、物流コストと納期の最適化に役立ちます。 入手先 運送会社ID(フォワーディングエージェント)は、VTTK(出荷ヘッダー)などの出荷伝票に保存されます。名称はLFA1などのマスターデータテーブルから取得します。 例 DHLFedExMaersk Logistics | |||
サプライチェーン管理のアクティビティ
| アクティビティ | 説明 | ||
|---|---|---|---|
| 出庫転記 | 商品の倉庫からの法的および物理的な出庫を示します。在庫を減少させ、売上原価を転記することで、受注に対する正式な出荷を記録します。 | ||
| 重要な理由 輸送中の期間の開始を示す重要なマイルストーンです。商品が配送のために会社の管理下を離れたことを確定する時点です。 入手先 品目伝票を作成する明示的なイベントです。時刻は品目伝票ヘッダー(MKPF、BUDATフィールド)に記録され、出荷伝票(LIKP、WBSTKフィールド)の在庫移動ステータスが更新されます。 取得 出荷伝票に関連付けられた出庫品目伝票の転記日(MKPF-BUDAT)を使用します。 イベントタイプ explicit | |||
| 商品を生産 | このアクティビティは、商品の製造が完了したことの確認を示します。通常は、製造指図からの入庫として記録され、完成品が在庫に移されます。 | ||
| 重要な理由 これは生産サイクルの終了を示します。製造指図の作成からこのイベントまでの時間が製造リードタイムとなり、生産効率を測る重要な指標です。 入手先 在庫伝票の転記(製造指図からの入庫)によって明示的に取得できます。また、製造指図の最終確認(AFRUテーブル)や「納入済み」へのステータス変更から推定することもできます。 取得 製造指図に対する最終入庫の在庫伝票の転記日、またはステータス変更から推定します。 イベントタイプ inferred | |||
| 納品証明確認済み | 指定どおりに商品を受領したことを顧客または運送会社が正式に確認したことを示します。通常は、納品証明情報で出荷伝票を更新することで記録されます。 | ||
| 重要な理由 履行プロセスの最終地点となるアクティビティです。正確な請求、紛争解決、配送サイクルの最終区間の測定に欠かせません。 入手先 明示的なイベントです。納品証明日は出荷伝票ヘッダーテーブル(LIKP、PODATフィールド)または関連するPODテーブル(VLPOD)に記録されます。 取得 出荷伝票の納品証明日(LIKP-PODAT)を使用します。 イベントタイプ explicit | |||
| 販売注文を作成 | このアクティビティは、新しい販売注文の作成を示します。顧客からの商品依頼を正式に記録するものです。ユーザーがシステムで新しい販売注文伝票を保存した時点で、明示的なイベントとして記録されます。 | ||
| 重要な理由 これは受注から入金までのプロセスにおける主な開始点です。このイベントから他のイベントまでの時間を分析すると、注文充足の全体的なリードタイムを把握し、初期処理の遅延を特定できます。 入手先 このイベントは明示的に記録されます。販売注文テーブルの変更伝票(CDHDR/CDPOS)で確認できるほか、販売注文ヘッダーテーブル(VBAK)の作成タイムスタンプ(項目ERDAT)からも確認できます。 取得 販売注文伝票の作成日(VBAK-ERDAT)と作成時刻(VBAK-ERZET)を使用します。 イベントタイプ explicit | |||
| 購買発注の入庫を転記 | 購買発注に基づき、仕入先から原材料や商品を実際に受け取ったことを示します。倉庫または工場で商品を受け取った時点で記録されます。 | ||
| 重要な理由 このアクティビティにより、調達サイクルにおける仕入先からの納入部分が完了します。仕入先の納期遵守率を計算し、入荷物流のパフォーマンスを把握するうえで重要です。 入手先 これは、在庫伝票の転記によって取得される明示的なイベントです。イベントのタイムスタンプは、在庫伝票ヘッダーテーブル(MKPF、項目BUDAT)にあります。購買発注との関連付けは項目テーブル(MSEG)に記録されます。 取得 購買発注に関連付けられた在庫伝票の転記日(MKPF-BUDAT)を使用します。 イベントタイプ explicit | |||
| 購買発注を発行 | 必要な資材について、外部の仕入先に購買発注を正式に作成して発行することを示します。このアクティビティにより、購買依頼が仕入先との法的拘束力のある契約に変わります。 | ||
| 重要な理由 重要なマイルストーンであるこのアクティビティは、仕入先のリードタイムと調達サイクルを測定するうえで欠かせません。仕入先の納期遵守パフォーマンスを評価する基準点にもなります。 入手先 購買発注の作成時に記録される明示的なイベントです。作成タイムスタンプは、購買発注ヘッダーテーブル(EKKO、項目AEDAT)に保存されます。 取得 購買発注の伝票作成日(EKKO-AEDAT)を使用します。 イベントタイプ explicit | |||
| ピッキング完了 | 出荷伝票に含まれる商品を倉庫から集める物理的な作業の完了を示します。多くのシステムでは、出荷伝票のピッキングステータスが更新された時点で確認されます。 | ||
| 重要な理由 効率的なピッキングは、倉庫の処理能力を左右します。このアクティビティを追跡すると、倉庫業務のボトルネックを特定し、ピッキングのパフォーマンスを測定できます。 入手先 単一の明示的なイベントではなく、ステータスの変更から推定される場合があります。出荷明細テーブル(LIPS)のピッキングステータス(KOSTAフィールド)が「C」(完全処理済み)に設定された時点で記録されます。 取得 ピッキングステータス(LIPS-KOSTA)が完全ピッキング済みに更新された変更文書から推定します。 イベントタイプ inferred | |||
| 仕向地での荷下ろし完了 | 顧客拠点で商品を物理的に荷下ろししたことを示します。このイベントはSAPで明示的に追跡されない場合があり、運送会社のデータや後続イベントから推定する必要があります。 | ||
| 重要な理由 輸送行程の終了を示します。出庫からこの時点までの時間が輸送時間となり、物流の最適化に欠かせない指標です。 入手先 基幹ERPで明示的に記録されることはほとんどありません。運送会社のEDIメッセージ、Transportation Management(TM)モジュールのデータ、または利用可能な場合は納品証明書のタイムスタンプから推定できます。 取得 運送会社のステータス更新(例:EDI 214)から推定するか、近似値として納品証明書のタイムスタンプを使用します。 イベントタイプ inferred | |||
| 出荷伝票作成 | 商品のピッキングと顧客への出荷を許可する出荷伝票の作成を示します。このアクティビティによって、プロセスは受注管理から物流実行へ移行します。 | ||
| 重要な理由 物理的な履行プロセスを開始する重要なステップです。受注作成から出荷伝票作成までの遅延は、計画または在庫可用性の問題を示している可能性があります。 入手先 明示的なイベントです。作成時刻は出荷伝票ヘッダーテーブル(LIKP、ERDATフィールド)に記録されます。 取得 出荷伝票ヘッダーの作成日(LIKP-ERDAT)と作成時刻(LIKP-ERZET)を使用します。 イベントタイプ explicit | |||
| 出荷作成 | 輸送計画のために1件以上の出荷伝票をまとめる出荷伝票の作成を示します。この伝票には、運送会社、経路、輸送手段に関する詳細が含まれます。 | ||
| 重要な理由 正式な輸送計画の開始となるアクティビティです。出庫から出荷完了までの時間を分析すると、輸送プロセスの効率を把握できます。 入手先 出荷ヘッダーテーブル(VTTK、ERDATフィールド)に記録される明示的なイベントです。LE-TRAモジュールの一部であり、すべての組織で使用されているとは限りません。 取得 出荷伝票ヘッダーの作成日(VTTK-ERDAT)を使用します。 イベントタイプ explicit | |||
| 品質検査を実施 | 製造品に対する品質管理検査の完了を示します。この検査結果は合格または不合格として、使用決定に記録されます。 | ||
| 重要な理由 このアクティビティは、製品品質の監視と生産上の問題の特定に欠かせません。不合格率が高い場合や検査に時間がかかる場合は、重大なボトルネックになっている可能性があります。 入手先 品質検査ロットの使用決定が行われた際に記録される明示的なイベントです。決定日は、QALSテーブルのPASTRTERMフィールドまたはQAVEテーブルに記録されます。 取得 検査ロットの使用決定が記録された時刻(QALS/QAVEテーブル)を使用します。 イベントタイプ explicit | |||
| 在庫の可用性を確認 | 販売注文を充足するために、依頼された商品が在庫にあるかどうかを判定するシステムまたは手動の確認を示します。販売注文の作成時に自動で実行されることが多い一方、独立したイベントとして記録されない場合があります。 | ||
| 重要な理由 注文からこの確認までの時間と確認結果を把握すると、在庫水準が充足時間に与える影響を分析できます。ここで遅延すると、調達や生産のアクティビティにつながることがよくあります。 入手先 通常、これは明示的なイベントではありません。販売注文項目テーブル(VBEP)で最初に確定したスケジュール行が作成された時点や、注文項目のステータス変更から推定できます。 取得 販売注文のスケジュール行(VBEPテーブル)における確認ステータスの更新から推定します。 イベントタイプ inferred | |||
| 製造指図を作成 | 販売注文に必要な完成品を製造するため、製造指図が作成されたことを示します。社内製造プロセスの正式な開始点です。 | ||
| 重要な理由 製造指図の作成は、製造リードタイムの開始を示します。これを分析すると、需要シグナルの発生から生産開始までの遅延を特定できます。 入手先 これは明示的なイベントです。作成日は、製造指図ヘッダーテーブル(AUFK、項目ERDAT)に記録されます。 取得 指図ヘッダーテーブルの作成日(AUFK-ERDAT)を使用します。 イベントタイプ explicit | |||
| 購買依頼を作成 | このアクティビティは、必要な商品や原材料を調達するための社内依頼の作成を示します。販売注文を充足するための在庫が不足している場合や、在庫が発注点を下回った場合に開始されることがよくあります。 | ||
| 重要な理由 これは調達サイクルの最初のステップです。作成時点を追跡すると、調達開始の遅延を特定し、購買プロセスをエンドツーエンドで分析できます。 入手先 これは明示的なイベントです。作成タイムスタンプは、購買依頼ヘッダーテーブル(EBAN、項目BADAT)に記録されます。 取得 購買依頼伝票の作成日(EBAN-BADAT)を使用します。 イベントタイプ explicit | |||
| 顧客請求書作成 | 納品した商品またはサービスに基づく顧客向け請求伝票の作成を示します。プロセスの最終的な財務決済を開始します。 | ||
| 重要な理由 請求サイクルの所要時間を分析するうえで重要なアクティビティです。納品確認から請求までの遅延は、キャッシュフローに悪影響を及ぼす可能性があります。 入手先 明示的なイベントです。作成時刻は請求伝票ヘッダーテーブル(VBRK、ERDATフィールド)に記録されます。 取得 請求伝票ヘッダーの作成日(VBRK-ERDAT)を使用します。 イベントタイプ explicit | |||
抽出ガイド
ステップ
- 前提条件:必要なSAP S/4HANA Core Data Services(CDS)Viewにアクセスできる、十分な権限を持つユーザーを用意してください。通常は、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 Viewに対する
SELECT権限が必要です。対象には、I_SalesOrderItem、I_PurchaseOrderItem、I_OutboundDeliveryItem、I_MaterialDocumentItem、I_ProductionOrder、I_QualityInspection、I_Shipment、I_BillingDocumentItemなどが含まれますが、これらに限りません。 - 日付範囲のフィルタリング:提供されているクエリには、通常は作成日フィールド(
CreationDateまたはDocumentDate)に適用する日付範囲フィルターのプレースホルダーが含まれています。初期分析では、システム負荷を過度に高めず、代表性のあるデータセットを確保できる3~6か月の期間をおすすめします。 - 主要な業務フィルター:分析対象に合った結果にするには、特定の組織単位でデータを絞り込むことが重要です。クエリには
CompanyCodeのプレースホルダーがあらかじめ設定されています。分析範囲に応じて、SalesOrganization、DistributionChannel、Plantのフィルターを追加することもできます。 - パフォーマンスに関する考慮事項:複数の大規模なCDS Viewを結合する複雑なクエリです。実行時にシステムリソースを大きく消費する可能性があります。抽出は業務時間外にスケジュールしてください。非常に大規模なデータセットでは、月単位で小分けにして順番に実行することをおすすめします。
a サンプルクエリ 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クエリを実行する前に、各アクティビティ分岐を個別にテストしてください。実行計画を確認し、初期テストでは短い日付範囲に絞り込んでください。
- 伝票の関係、タイムスタンプ、ユーザー識別子、仕入先と顧客の値、品目とプラントの値、品質結果を検証します。明細レベルの結合によって生じる重複行を調査し、1伝票につき1イベント、または1伝票明細につき1イベントなど、設定したイベント粒度のルールを適用してください。
- 結果をUTF-8のCSV、またはProcessMindが対応する別の表形式でエクスポートします。出力列名LogisticsOrder、ActivityName、EventTime、SourceSystem、LastDataUpdate、ExecutingUser、SupplierName、CustomerName、MaterialNumber、Plant、RequestedDeliveryDate、QualityInspectionResultは正確に保持してください。EventTimeがタイムスタンプであり、LastDataUpdateに一貫して値が入っていることを確認します。
- ファイルをProcessMindにアップロードし、LogisticsOrderをケース識別子、ActivityNameをアクティビティ、EventTimeをイベントタイムスタンプとしてマッピングします。15個すべてのアクティビティラベルが明示的なイベントとして扱われることを確認し、増分抽出の動作を検証したうえで、管理された更新をスケジュールしてください。
設定
- 日付範囲:まずは3~6か月分のデータから始めてください。初期テストでは短い期間を使い、パフォーマンスと伝票関係を検証してから対象期間を広げます。
- ソーススキーマ:[SAP HANA schema name]には、確認済みのS/4HANAテーブルまたはViewを含むスキーマを指定します。すべての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に割り当てられるようにします。相関が欠落または曖昧な場合は、黙って割り当てずに報告してください。
- イベント粒度:伝票単位、伝票明細単位、または業務上意味のあるステータス変更単位から1つを選択します。すべての分岐で同じルールを適用し、技術的に重複した行だけを削除してください。
- タイムスタンプの優先順位:各アクティビティについて、確認済みの転記、作成、確認、ステータス変更、検査、納品、荷下ろし、POD、請求のタイムスタンプを使用します。業務イベントの時刻を抽出時刻で置き換えないでください。
- ソースラベル:[Source system label]には、承認済みのSAP S/4HANAシステム識別子など、安定した値を設定します。
- 更新タイムスタンプ:[Last data update expression]には、承認済みの抽出タイムスタンプまたはソースの更新タイムスタンプを設定します。
- パフォーマンス:日付と組織のフィルターを早い段階で適用し、必要な列だけを選択し、制限のない明細レベルの結合を避け、実行計画を確認してください。定期的な読み込みには、永続化した抽出Viewまたはステージングテーブルの利用も検討してください。
- 権限:必要なアクセスには、関連するSAP HANAスキーマオブジェクトへの読み取り権限とSQL実行権限が含まれます。業務検証には、該当する販売、調達、在庫、生産、品質、物流実行、輸送、請求データへのアクセスが必要です。
- 機能範囲:導入済みシステムに、要求されたアクティビティに対応する業務プロセスが含まれていることを確認します。出荷、荷下ろし、POD、品質、生産、請求のデータは、別のアプリケーションや拡張機能に保存されている場合があります。
- セキュリティ:顧客、仕入先、品目、財務、ユーザーデータについて、組織のルールを適用します。必要に応じて機密項目をマスキングまたは制限してください。
a サンプルクエリ 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など、基盤となるすべてのテーブルへの読み取り権限が必要です。
a サンプルクエリ 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日間無料でお試しいただけます。クレジットカードは必要ありません。