サプライチェーンマネジメントデータテンプレート
サプライチェーンマネジメントデータテンプレート
- 収集を推奨する項目
- 追跡すべき主要アクティビティ
- 抽出の手引き
サプライチェーンマネジメント属性
| 名前 | 説明 | ||
|---|---|---|---|
| アクティビティ名 ActivityName | サプライチェーンプロセスのある特定の時点で発生したビジネス活動またはイベントの名称です。 | ||
| 説明 この属性は、「発注書発行済み」や「出庫転記済み」など、ロジスティクスオーダーのライフサイクル内の特定のステップまたはマイルストーンを記述します。これらの活動は、プロセスを構成するイベントのシーケンスを形成します。 活動のシーケンスを分析することは、プロセスマイニングの核です。これにより、実際のプロセスフローの発見、標準作業手順との比較、および遅延や手戻りを引き起こすプロセスステップの特定が可能になります。 その重要性 プロセスのステップを定義し、プロセスマップの発見、バリアントの分析、アクティビティ間のサイクルタイムの測定に不可欠です。 取得元 データ変換中に、さまざまなSAPテーブル(EKKO、LIKP、VBUKなど)からのトランザクションコードまたはステータス変更を、ユーザーフレンドリーな活動名にマッピングすることで生成されます。 例 発注書発行済み購買発注に対する入庫転記済み出荷伝票登録済み納品確認済み | |||
| イベント日時 EventTime | アクティビティが発生した日時を示すタイムスタンプです。 | ||
| 説明 この属性は、プロセス内の各アクティビティの正確な日時を提供します。これは、イベントログの時系列的な骨格として機能し、現実で発生した順序でプロセスステップを並べます。 イベントタイムは、すべての時間ベースの分析にとって不可欠です。これは、活動間のサイクルタイムを計算し、プロセスの総リードタイムを測定し、時間の経過に伴うパフォーマンス傾向を特定し、ボトルネックが最も発生しやすい時期を特定するために使用されます。 その重要性 このタイムスタンプは、すべての期間とパフォーマンスメトリクスを計算するために不可欠であり、プロセスボトルネックとリードタイムの分析を可能にします。 取得元 主要なSAPテーブルにおける伝票作成またはステータス変更に関連するタイムスタンプフィールド(変更伝票のCDHDR/CDPOSなど)、またはヘッダーテーブルのERDAT/ERZETのような特定の日付/時刻フィールドから抽出されます。 例 2023-04-15T10:25:00Z2023-04-18T14:00:00Z2023-04-22T08:15:00Z | |||
| ロジスティクスオーダー LogisticsOrder | 初期需要から最終納品確認までの、単一のエンドツーエンドサプライチェーンプロセスの一意の識別子です。 | ||
| 説明 ロジスティクスオーダーは、サプライチェーンにおける特定の需要または履行要求に関連するすべての活動をリンクする主要なケース識別子として機能します。このアプローチにより、計画から調達、生産、流通に至るまで、製品のライフサイクル全体を追跡でき、プロセスの包括的なビューを保証します。 プロセスマイニングにおいて、ロジスティクスオーダーで分析することで、需要を満たすためにたどられた完全な経路が明らかになります。これにより、調達や販売といったサイロ化されたプロセスを個別にではなく、サプライチェーン全体にわたる一般的なバリアント、ボトルネック、および逸脱を特定するのに役立ちます。 その重要性 これは、すべての関連イベントを単一のプロセスインスタンスに接続するための不可欠なキーであり、サプライチェーンのエンドツーエンド分析を可能にします。 取得元 これは概念的な識別子であり、販売オーダー番号とその後の発注書および納品番号など、さまざまな伝票番号をリンクして構築する必要がある場合があります。SAP S/4HANAサプライチェーンのドキュメントまたは専門家にご相談ください。 例 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 | |||
| `品目コード` MaterialNumber | 処理されている製品または品目の一意の識別子です。 | ||
| 説明 品目コード(SKUと呼ばれることもあります)は、SAPにおける特定の製品の一意のコードです。これは、プロセス活動を製造、調達、または出荷される物理的またはデジタルな商品にリンクさせます。 この属性は製品中心の分析に不可欠です。特定の製品が品質問題、生産遅延、または欠品に陥りやすいかどうかを特定するのに役立ちます。ダッシュボードは品目ごとにフィルタリングでき、特定の製品ラインのパフォーマンスを調査できます。 その重要性 プロセス上の問題(遅延や品質不良など)が特定の材料に集中しているかどうかを特定するための製品レベル分析を可能にします。 取得元 ほとんどの伝票の品目レベルテーブル(販売伝票のVBAP、購買発注のEKPO、出荷のLIPSなど)にあります。フィールド名は通常MATNRです。 例 FG-100-ARM-2034-BSA-5500 | |||
| 仕入先名 SupplierName | 調達活動に関連するサプライヤーまたはベンダーの名称です。 | ||
| 説明 この属性は、商品またはサービスが調達されるサプライヤーを識別します。通常、「購買依頼作成済み」や「発注書発行済み」のような活動に関連付けられます。 サプライヤー名は、「サプライヤー納期遵守パフォーマンス」ダッシュボードにとって不可欠です。これにより、データをフィルタリングおよびセグメント化して、異なるサプライヤー間の納期遵守率、リードタイム、および品質レベルを比較でき、戦略的調達およびサプライヤー関係管理にとって重要です。 その重要性 サプライヤーごとのパフォーマンス分析を可能にし、調達プロセスの最適化とサプライヤーの信頼性評価に不可欠です。 取得元 サプライヤー番号(LIFNR)は、購買伝票(例:EKKN、EBANテーブル)に保存されます。名称は、中央のベンダーマスタテーブルLFA1から取得されます。 例 グローバルコンポーネンツ株式会社アドバンストマテリアルズLLC精密部品株式会社 | |||
| 品質検査結果 QualityInspectionResult | 品質検査の結果、「合格」または「不合格」などです。 | ||
| 説明 この属性は、生産された商品または受領された商品に対して実行された品質チェックの結果を記録します。その結果は、商品が次のステップに進めるか、手直し、返品、または廃棄が必要かを決定します。 これは「品質管理不合格率」ダッシュボードおよびKPIにとって重要な属性です。失敗の頻度と理由を分析することで、特定の製品、サプライヤー、または生産ラインにおける体系的な品質問題を特定するのに役立ちます。 その重要性 品質関連KPIの計算を直接サポートし、サプライチェーンにおける低品質の原因を特定するのに役立ちます。 取得元 この情報は通常、品質管理(QM)モジュールに保存されます。データはQALSのような検査ロットテーブルやQAVEの使用決定コードから取得される場合があります。 例 合格不合格手戻りが必要逸脱ありで合格 | |||
| 実行ユーザー ExecutingUser | `アクティビティ`を実行した担当者の`ユーザーID`です。 | ||
| 説明 この属性は、発注書の作成や入庫の転記など、特定のアクティビティを実行した従業員のSAPユーザー名またはIDを捕捉します。これはプロセスステップを関与する人的資源にリンクさせます。 ユーザー別に分析することで、ワークロードの配分を理解し、トレーニングの必要性を特定し、個人間またはチーム間のパフォーマンスの差を発見するのに役立ちます。また、誰が重要なプロセスステップを実行したかを確認するためのコンプライアンス分析にも有用です。 その重要性 特定のユーザーにアクティビティを関連付け、ワークロード分析、パフォーマンス比較、および非準拠行動の調査を可能にします。 取得元 多くのSAPテーブルの「登録者」または「変更者」フィールド(EKKO(購買発注ヘッダー)のERNAM、LIKP(出荷ヘッダー)、VBRK(請求書ヘッダー)など)にあります。 例 CBROWNJSMITHASINGH | |||
| 工場 Plant | アクティビティが行われた製造または流通施設です。 | ||
| 説明 プラントとは、商品の生産、保管、または流通が行われる場所を表すSAPの組織単位です。これはプロセス活動に対する地理的または機能的なコンテキストを提供します。 プラント別にプロセスパフォーマンスを分析することは一般的な要件です。これにより、異なる運用サイト間での効率性、スループット、およびコンプライアンスのベンチマーキングと比較が可能になり、ベストプラクティスや改善が必要な場所を特定するのに役立ちます。 その重要性 分析のための地理的または組織的な次元を提供し、異なる施設間でのパフォーマンス比較を可能にします。 取得元 多くの伝票品目テーブル(VBAP(販売)、EKPO(購買)、LIPS(出荷)など)にあります。フィールド名は通常WERKSです。 例 100021003500 | |||
| 希望納期 RequestedDeliveryDate | サプライヤーに商品の納品を依頼した日付です。 | ||
| 説明 これは発注書に指定された納期で、サプライヤーへの目標を表します。これは実際の配送パフォーマンスが測定される基準となります。 この日付は、「サプライヤー納期遵守率KPI」を計算するために不可欠です。実際の入庫日とこの要求日を比較することで、企業はサプライヤーがコミットメントを満たしているかどうかを客観的に測定できます。 その重要性 これは「サプライヤー納期遵守率」KPIを計算するために使用される基準日で、サプライヤーパフォーマンス管理にとって不可欠です。 取得元 購買発注品目テーブルEKPOにあり、フィールド名はEINDT(納入日付)です。 例 2023-05-20T00:00:00Z2023-06-15T00:00:00Z2023-07-01T00:00:00Z | |||
| 顧客名 CustomerName | オーダーが履行されている顧客の名称です。 | ||
| 説明 この属性は、販売オーダーおよびその後の履行活動に関連するエンドカスタマーを識別します。これはサプライチェーンプロセスの需要側にコンテキストを提供します。 プロセスマイニングにおいて、顧客別に分析することで、主要顧客の異なる履行パターンやパフォーマンスレベルを特定するのに役立ちます。これは「納品確認遅延分析」のようなダッシュボードで使用され、特定の顧客が継続的に確認を遅らせるかどうかを確認できます。 その重要性 顧客ごとの分析セグメンテーションを可能にし、顧客固有の行動、ボトルネック、またはサービスレベル合意のパフォーマンスを明らかにします。 取得元 顧客番号(KUNNR)は、販売伝票(例:VBAKテーブル)に保存されます。名称は、中央の顧客マスタテーブルKNA1から取得されます。 例 小売株式会社革新的な解決策製造パートナー | |||
| Is Late Delivery IsLateDelivery | 依頼された納期後にサプライヤーからの配送が行われたかどうかを示すブール値フラグ。 | ||
| 説明 この計算されたフラグは、配送が時間通りに行われたかどうかの単純な真偽インジケータを提供します。これは、「発注書入庫転記済み」活動のタイムスタンプと「要求納期」属性を比較することによって導き出されます。 この属性は、サプライヤーパフォーマンスに関連するダッシュボードとKPIの作成を簡素化します。これにより、迅速なフィルタリングと集計が可能になり、サプライヤー納期遵守率を計算し、どのサプライヤー、品目、または地域で最も頻繁な遅延が発生しているかを特定できます。 その重要性 各配送について明確な二値の結果を提供することで、サプライヤーパフォーマンス分析を簡素化します。これは納期遵守KPIにとって不可欠です。 取得元 これは計算フィールドです。ロジックは次のとおりです。IF ('Goods Receipt For PO Posted'.EventTime > PurchaseOrder.RequestedDeliveryDate) THEN True ELSE False. 例 truefalse | |||
| 処理時間 ProcessingTime | アクティビティに実作業として費やした時間。 | ||
| 説明 処理時間とは、アクティビティの開始時刻から終了時刻までの計算された期間です。これは、各ステップ間の待機時間とは異なり、プロセスステップにおける実際の作業、つまり「実作業時間」を表します。 このメトリクスは、非効率性を特定するための基礎となります。処理時間を待機時間から切り離すことで、アナリストは遅延がタスクの実行の遅さによるものか、部門間やシステム間の長いキューや引き渡し遅延によるものかを判断できます。 その重要性 アクティブな作業時間とアイドル待機時間を区別するのに役立ち、プロセスの遅延の真の原因を特定するために不可欠です。 取得元 アクティビティのEndTimeからStartTimeを減算して計算されます (EndTime - StartTime)。 例 PT1H30MPT8HP2D | |||
| 受注数量 OrderQuantity | オーダー明細項目における品目の数量です。 | ||
| 説明 この属性は、販売オーダーまたは発注書明細項目で要求された品目の数量を指定します。これは各トランザクションの数量の測定値を提供します。 数量別に分析することで、ビジネスへの影響が大きい高ボリュームオーダーの分析を優先するのに役立ちます。また、単位あたりのコスト計算などの他のメトリクスを正規化したり、オーダーサイズが処理時間にどのように影響するかを理解したりするためにも使用できます。 その重要性 トランザクションにボリューム(量)のコンテキストを提供し、影響分析やケースを規模別にセグメント化することを可能にします。 取得元 品目レベルテーブル(EKPO(購買発注)のMENGEやVBAP(販売伝票)のKWMENGなど)にあります。 例 100500025 | |||
| 手戻り IsRework | アクティビティまたはアクティビティのシーケンスが手戻りを表すかどうかを示すフラグ。 | ||
| 説明 このブール属性は、プロセス内の以前のステップの繰り返しである活動にフラグを立て、何らかの手戻りまたは修正を示します。例えば、「品質検査」の後に「生産オーダー作成済み」ステップがあり、さらに別の「品質検査」が行われる場合、2回目の検査は手戻りとしてフラグが立てられます。 手戻りを特定することは、プロセス非効率性と潜在的なコストを理解する上で重要です。このフラグは、手戻りループの頻度と影響を定量化するのに役立ち、「オーダー処理エラー率KPI」の計算をサポートし、プロセス改善の領域を強調します。 その重要性 手戻りループの一部であるアクティビティを明示的に特定し、数を数えることで、プロセスの非効率性を定量化するのに役立ちます。 取得元 これは通常、プロセスマイニングツール内で、同じケース内の活動の繰り返しシーケンスを特定することで計算されます。 例 truefalse | |||
| 発注書番号 PurchaseOrderNumber | 発注書(PO)伝票の一意の識別子です。 | ||
| 説明 発注書番号は、サプライヤーに資材を注文するために使用される公式の伝票番号です。これはサプライチェーンの調達部分における主要な識別子です。 この属性により、調達プロセスへの詳細な掘り下げが可能になります。これは「調達エンドツーエンドサイクルタイム」ダッシュボードで使用され、購買依頼、発注、受領、支払い活動をリンクさせることで、「サプライヤー納期遵守率KPI」を計算するために使用されます。 その重要性 調達サブプロセスへのドリルダウンおよび関連する調達イベントのリンクのための主要な識別子として機能します。 取得元 購買発注ヘッダーテーブルEKKOと品目テーブルEKPOにあります。フィールド名はEBELNです。 例 450007819245000781934500078194 | |||
| 終了日時 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 | |||
| 運送業者名 CarrierName | 出荷を処理する運送会社または貨物輸送業者の名称です。 | ||
| 説明 運送業者名とは、倉庫から顧客へといった、場所間で商品を輸送する責任を負うロジスティクスサービスプロバイダーを識別するものです。 この属性は、「輸送サイクルタイム分析」ダッシュボードにとって不可欠です。これにより、異なる運送業者間の輸送時間、コスト、信頼性を比較でき、より良いロジスティクス計画と運送業者選定を可能にします。 その重要性 輸送業者ごとのパフォーマンス分析を可能にし、ロジスティクスコストと配送時間の最適化に不可欠です。 取得元 運送業者ID(フォワーディングエージェント)は、VTTKテーブル(出荷ヘッダー)などの出荷伝票に保存されます。名称はLFA1などのマスタデータテーブルから取得されます。 例 DHLFedExマースク ロジスティクス | |||
サプライチェーンマネジメント活動
| アクティビティ | 説明 | ||
|---|---|---|---|
| `商品出荷`登録済み | この活動は、倉庫からの商品の法的および物理的な出荷を表します。これは在庫を減らし、売上原価を計上することで、オーダーの正式な出荷を示します。 | ||
| その重要性 これは「輸送中」期間の開始を示す重要なマイルストーンです。これは、商品が配送のために会社の手を離れた決定的な時点です。 取得元 これは、品目伝票を作成する明示的なイベントです。タイムスタンプは品目伝票ヘッダー(MKPF、項目BUDAT)に記録され、納品伝票の品目移動ステータス(LIKP、項目WBSTK)を更新します。 取得 出荷伝票に関連する出庫品目伝票から転記日付(MKPF-BUDAT)を使用します。 イベントタイプ explicit | |||
| 生産完了品 | この活動は、商品の製造が完了したことを確認するものです。これは通常、生産オーダーからの入庫として記録され、完成品を在庫に移動させます。 | ||
| その重要性 これは生産サイクルの終了を示します。生産オーダー作成からこのイベントまでの時間は製造リードタイムを表し、生産効率にとって重要な指標です。 取得元 これは、品目伝票転記(生産オーダーからの入庫)を介して明示的に捕捉するか、生産オーダーの最終確認(AFRUテーブル)または「納品済み」へのステータス変更から推測できます。 取得 製造指図の最終入庫伝票の転記日付またはステータス変更から推測します。 イベントタイプ inferred | |||
| 発注書発行済み | 必要な材料について、外部サプライヤーに対する購買発注の正式な作成と発行を示します。この活動は、購買依頼をベンダーとの法的拘束力のあるコミットメントに変換します。 | ||
| その重要性 主要なマイルストーンとして、この活動はサプライヤーのリードタイムと調達サイクルタイムを測定するために不可欠です。サプライヤーのオンタイム配送パフォーマンスを評価するための基準を提供します。 取得元 これは、発注書の作成時にログに記録される明示的なイベントです。作成タイムスタンプは、発注書ヘッダーテーブル(EKKO、項目AEDAT)に保存されます。 取得 発注書の伝票作成日付(EKKO-AEDAT)を使用します。 イベントタイプ explicit | |||
| 納品確認済み | 顧客または運送業者からの、指定通りに商品が受領されたという正式な確認を表します。これは多くの場合、POD情報で出荷伝票を更新することによって記録されます。 | ||
| その重要性 この活動は、履行プロセスの決定的な終了を意味します。これは、正確な請求、紛争解決、および配送サイクルの最終段階の測定にとって不可欠です。 取得元 これは明示的なイベントです。納品確認日は、納品ヘッダーテーブル(LIKP、項目PODAT)または関連するPODテーブル(VLPOD)に記録されます。 取得 納品伝票から納品確認日(LIKP-PODAT)を使用します。 イベントタイプ explicit | |||
| 販売注文作成済み | この活動は、顧客の商品要求を正式に捕捉する新しい販売オーダーの作成を示します。これは、ユーザーがシステムに新しい販売オーダー伝票を保存したときに記録される明示的なイベントです。 | ||
| その重要性 これは、受注から入金までのプロセスの主要な開始点です。このイベントから他のイベントまでの時間を分析することで、全体的なオーダー履行リードタイムが明らかになり、初期処理の遅延が特定されます。 取得元 このイベントは明示的にログに記録されます。販売オーダーテーブルの変更伝票(CDHDR/CDPOS)または販売オーダーヘッダーテーブル(VBAK、項目ERDAT)の作成タイムスタンプを使用して見つけることができます。 取得 販売オーダー伝票の作成日付(VBAK-ERDAT)と時刻(VBAK-ERZET)を使用します。 イベントタイプ explicit | |||
| 購買発注に対する入庫転記済み | 発注書に基づき、サプライヤーから原材料または商品が物理的に受領されたことを表します。このイベントは、商品が倉庫または工場で受領されたときに記録されます。 | ||
| その重要性 この活動は、調達サイクルのサプライヤー配送部分を完了させます。これは、サプライヤーの納期遵守率を計算し、インバウンドロジスティクスのパフォーマンスを理解するために不可欠です。 取得元 これは、品目伝票転記を介して捕捉される明示的なイベントです。イベントタイムスタンプは、品目伝票ヘッダーテーブル(MKPF、項目BUDAT)にあります。POへのリンクは、明細テーブル(MSEG)にあります。 取得 発注書に関連する品目伝票から転記日付(MKPF-BUDAT)を使用します。 イベントタイプ explicit | |||
| ピッキング完了 | この活動は、出荷納品のために倉庫から品目を集める物理的プロセスの完了を示します。多くのシステムでは、納品伝票のピッキングステータスが更新されたときにこれが確認されます。 | ||
| その重要性 効率的なピッキングは倉庫のスループットにとって不可欠です。この活動を追跡することで、倉庫業務におけるボトルネックを特定し、ピッキングパフォーマンスを測定するのに役立ちます。 取得元 これは多くの場合、単一の離散的なイベントではなく、ステータス変更から推測できます。納品明細テーブル(LIPS、項目KOSTA)のピッキングステータスが「C」(完全に処理済み)に設定されたときに記録されます。 取得 ピッキングステータス(LIPS-KOSTA)が完全にピッキング済みに更新された際の変更伝票から推測します。 イベントタイプ 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 | |||
| 目的地で商品荷降ろし済み | この活動は、顧客の所在地での商品の物理的な荷下ろしを意味します。このイベントはSAPで明示的に追跡されない場合があり、多くの場合、運送業者データまたは後続イベントから推測する必要があります。 | ||
| その重要性 これは、輸送中の旅程の終了を示します。出庫からこの時点までの期間が輸送時間であり、ロジスティクス最適化にとって重要です。 取得元 これはコアERPでは明示的なイベントとなることは稀です。運送業者のEDIメッセージ、輸送管理(TM)モジュールからのデータ、または利用可能な場合は納品確認伝票のタイムスタンプから推測される場合があります。 取得 運送業者のステータス更新(例:EDI 214)から推測するか、配達証明のタイムスタンプを近似値として使用します。 イベントタイプ inferred | |||
| 購買依頼書作成済み | この活動は、必要な商品または原材料を調達するための内部依頼の作成を意味します。これは通常、受注を履行するのに十分な在庫がない場合や、再発注点以下に在庫が減少した場合にトリガーされます。 | ||
| その重要性 これは調達サイクルの最初のステップです。その作成を追跡することで、調達開始時の遅延を特定し、エンドツーエンドの購買プロセス分析をサポートします。 取得元 これは明示的なイベントです。作成タイムスタンプは、購買依頼ヘッダーテーブル(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データベースへのアクセスが必要です。データベースユーザーは、I_SalesOrderItem、I_PurchaseOrderItem、I_OutboundDeliveryItem、I_MaterialDocumentItem、I_ProductionOrder、I_QualityInspection、I_Shipment、I_BillingDocumentItemを含む(ただしこれらに限定されない)クエリで参照されるすべてのCDSビューに対する
SELECT権限を持っている必要があります。 - 日付範囲フィルター: 提供されるクエリには、通常、作成日フィールド (
CreationDateまたはDocumentDate) に対する日付範囲フィルターのプレースホルダーが含まれています。最初の分析には、過剰なシステム負荷をかけずに代表的なデータセットを確保するため、3〜6ヶ月の期間を推奨します。 - 主要ビジネスフィルター: 関連性を確保するために、特定の組織単位でデータをフィルター処理することが重要です。クエリは
CompanyCodeのプレースホルダーであらかじめ設定されています。分析範囲に応じて、SalesOrganization、DistributionChannel、またはPlantのフィルターを追加することもできます。 - パフォーマンスに関する考慮事項: これは、複数の大規模なCDSビューを結合する複雑なクエリです。実行にはかなりのシステムリソースを消費する可能性があります。抽出は非営業時間中にスケジュールしてください。非常に大規模なデータセットの場合、クエリを月ごとに小さく分割して順次実行することを検討してください。
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 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データベースへのアクセスが必要です。データベースユーザーは、I_SalesOrderItem、I_PurchaseOrderItem、I_OutboundDeliveryItem、I_MaterialDocumentItem、I_ProductionOrder、I_QualityInspection、I_Shipment、I_BillingDocumentItemを含む(ただしこれらに限定されない)クエリで参照されるすべてのCDSビューに対する
SELECT権限を持っている必要があります。 - 日付範囲フィルター: 提供されるクエリには、通常、作成日フィールド (
CreationDateまたはDocumentDate) に対する日付範囲フィルターのプレースホルダーが含まれています。最初の分析には、過剰なシステム負荷をかけずに代表的なデータセットを確保するため、3〜6ヶ月の期間を推奨します。 - 主要ビジネスフィルター: 関連性を確保するために、特定の組織単位でデータをフィルター処理することが重要です。クエリは
CompanyCodeのプレースホルダーであらかじめ設定されています。分析範囲に応じて、SalesOrganization、DistributionChannel、またはPlantのフィルターを追加することもできます。 - パフォーマンスに関する考慮事項: これは、複数の大規模なCDSビューを結合する複雑なクエリです。実行にはかなりのシステムリソースを消費する可能性があります。抽出は非営業時間中にスケジュールしてください。非常に大規模なデータセットの場合、クエリを月ごとに小さく分割して順次実行することを検討してください。
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 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.