受注から入金までの受注処理データテンプレート
受注から入金までの受注処理データテンプレート
- 収集を推奨する属性
- 追跡する主要なアクティビティ
- SAP ECCからのデータ抽出手順
受注から入金までの受注処理の属性
| 名前 | 説明 | ||
|---|---|---|---|
| 受注 SalesOrder | 受注伝票を一意に識別する番号です。受注から入金までのプロセス全体を追跡する際の主要なケースIDとして使われます。 | ||
| 説明 受注は販売プロセスの中心となる伝票で、顧客からの商品やサービスの依頼を表します。依頼を最初から最後まで処理するために必要な情報がすべて含まれています。 プロセスマイニングでは、この属性をケースIDとして使います。一意の受注番号が、プロセスの一連の処理を表します。受注ごとに分析することで、ライフサイクル全体を追跡し、サイクルタイムを測定して、個々の受注における違いを特定できます。 重要な理由 関連するすべてのアクティビティとイベントを結び付けるための基本となるキーです。顧客の各受注がたどるプロセス全体を分析できます。 入手先 販売伝票ヘッダデータテーブル(VBAK)のVBELNフィールドにあります。 例 900001234590000123469000012347 | |||
| アクティビティ Activity | 受注プロセスで発生した特定の業務ステップまたはイベントの名称です。 | ||
| 説明 この属性は、受注から入金までのプロセスにおける個々のステップを表します。たとえば、「受注作成」「納品作成」「支払い受領」などです。これらのアクティビティを組み合わせて、受注ごとのプロセスフローを再構成します。 アクティビティの順序や発生時点の分析は、プロセスマイニングの中核です。プロセスマップを可視化し、ボトルネックやプロセスのバリアントを特定し、標準モデルへの適合性を確認できます。アクティビティは通常、伝票の作成イベント、ステータス変更、システムに記録された特定のトランザクションコードを組み合わせて特定します。 重要な理由 アクティビティはプロセスマップの基盤となり、プロセスフローや逸脱、ボトルネックの可視化と分析を可能にします。 入手先 データ抽出時に生成される派生属性です。SAPのトランザクションコード(Tコード)、伝票ステータスの変更(VBUK、VBUPなどのテーブル)、変更伝票ログ(CDHDR、CDPOSテーブル)を、わかりやすいアクティビティ名に対応付けて作成します。 例 販売受注を作成納品を作成出庫を計上請求書作成支払い受領 | |||
| ソースシステム SourceSystem | データの抽出元となるソースシステムを識別します。 | ||
| 説明 この属性は、データの発生元となるシステムを指定します。たとえば、特定のSAP ECCインスタンス名やクライアント番号です。複数の本番システムやレガシーシステムのデータが混在する環境で、データの背景を把握するのに役立ちます。 分析では、発生元に基づくデータの絞り込みや分類に使います。異なるシステム間のプロセス比較やシステム移行プロジェクトで、データの完全性と一貫性を確認する際に便利です。 重要な理由 複数のシステムがある環境でデータの背景を把握し、プロセスを比較するとともに、データの来歴を明確にするために役立ちます。 入手先 通常、データ抽出時に追加される値です。SAPシステムID(SAPSID)またはクライアント(MANDT)を表す固定値が使われます。 例 ECC_PROD_800SAP_ERP_EU1ECC_QAS_300 | |||
| 最終データ更新 LastDataUpdate | このレコードのデータがソースシステムから最後に更新された時点を示すタイムスタンプです。 | ||
| 説明 この属性は、イベントまたはケースのデータが最後に抽出または更新された日時を記録します。分析対象データの鮮度を把握できます。 ダッシュボードやレポートでは、インサイトがどの時点のデータに基づいているかを理解するうえで重要な情報です。分析が業務の最新状況を反映しているか、古いデータに基づいているかを確認でき、データの新しさに関する認識をそろえられます。 重要な理由 データの鮮度を把握できるため、プロセスマイニングの分析に基づいて適切なタイミングで判断するうえで役立ちます。 入手先 データ取り込み時にデータ抽出ツールまたはプロセスによって設定されるメタデータ属性です。ソースのSAPテーブルには保存されません。 例 2024-06-10T05:00:00Z2024-06-11T05:00:00Z2024-06-12T05:00:00Z | |||
| 開始時刻 StartTime | アクティビティまたはイベントの開始時点を示すタイムスタンプです。 | ||
| 説明 開始時刻はイベントタイムスタンプとも呼ばれ、特定のアクティビティが発生した正確な日時を記録します。たとえば、受注の作成、商品の出庫、請求書の転記が行われた時点を記録します。 このタイムスタンプは、プロセスマイニングにおける時間ベースの分析の基礎です。アクティビティ間のサイクルタイムやケース全体の所要時間の計算、遅延やボトルネックの特定に使います。納期遵守や履行リードタイムを監視するダッシュボードなど、パフォーマンス分析には正確なタイムスタンプが欠かせません。 重要な理由 サイクルタイムや所要時間など、ボトルネックの特定に欠かせないパフォーマンス指標の計算に必要な属性です。 入手先 複合属性です。通常、VBAK(受注)、LIKP(納品)、VBRK(請求書)などのSAPテーブルから、日付フィールド(ERDATなど)と時刻フィールド(ERZETなど)を組み合わせて作成します。 例 2023-04-15T09:00:12Z2023-04-16T14:30:00Z2023-04-20T11:22:45Z | |||
| ユーザー User | 伝票を作成または最後に変更した従業員、あるいはアクティビティを実行した従業員のユーザーIDです。 | ||
| 説明 この属性には、プロセス内の特定のイベントを担当したSAPユーザーIDが記録されます。たとえば、受注を作成した営業担当者や出庫を転記した倉庫スタッフを特定できます。 ユーザー別にプロセスを分析すると、作業負荷の分布やトレーニングの必要性を把握し、同じタスクの実行方法に見られるユーザーごとの違いを特定できます。リソースパフォーマンスやコンプライアンス、手作業による介入を確認するダッシュボードにも欠かせない属性です。 重要な理由 リソースのパフォーマンスと作業負荷を把握し、ユーザーごとのプロセス逸脱を特定できます。コンプライアンスや自動化分析にも役立ちます。 入手先 VBAK、LIKP、VBRKなど、多くのSAPヘッダテーブルにある「作成者」フィールド(ERNAM)または「変更者」フィールド(AENAM)に記録されています。 例 CBURKEJSMITHRWILLIAMS | |||
| 品目番号 MaterialNumber | 販売する製品またはサービスを一意に識別する番号です。 | ||
| 説明 品目番号は、受注明細の個々の商品を識別します。1つの受注に複数の品目が含まれる場合があるため、通常は明細レベルで分析します。 品目番号ごとにプロセスを分析すると、製品固有の問題を見つけられます。特定の製品で履行に時間がかかる、納品ブロックが多い、請求書の不一致が頻発するといった傾向を把握できます。製品ラインごとにプロセスを改善するうえで、サプライチェーン管理や製品管理に役立ちます。 重要な理由 製品別にプロセスを分析し、遅延、ブロック、手戻りなどの非効率がどの製品に関連しているかを特定できます。 入手先 販売伝票明細データテーブル(VBAP)のMATNRフィールドにあります。 例 FG-1001-ARAW-205BSERV-INSTALL | |||
| 拒否理由 RejectionReason | 受注明細が拒否または取り消された理由を示すコードです。 | ||
| 説明 拒否理由から、受注または特定の明細が履行されなかった背景を把握できます。顧客による取消、製品の在庫切れ、その他の業務上の理由などが考えられます。 この属性は、受注取消傾向のダッシュボードに欠かせません。よくある拒否理由を分析すると、販売機会の損失につながる根本原因を特定できます。その結果を在庫管理、価格戦略、顧客とのコミュニケーションの改善に役立て、受注取消率の低減につなげられます。 重要な理由 受注が取り消された理由を把握し、根本原因の分析を通じて販売機会の損失を減らし、予測精度を高められます。 入手先 販売伝票明細データテーブル(VBAP)のABGRUフィールドにあります。 例 0215Z5 | |||
| 正味金額 NetAmount | ヘッダレベルで税金と割引を除いた受注の合計金額です。 | ||
| 説明 正味金額は受注の金銭的価値を表し、各プロセスの処理に関連する主要な財務指標です。 金額に基づくプロセスマイニングに欠かせない属性です。高額の受注に焦点を当てて、プロセス改善の優先順位を決められます。遅延や手戻りなどの問題と財務への影響を関連付けることで、変更の必要性を説明しやすくなります。たとえば、高額の受注が低額の受注より効率的に処理されているかを分析できます。 重要な理由 金額に基づく分析が可能になり、会社への財務的影響が大きい受注を優先して改善に取り組めます。 入手先 販売伝票ヘッダデータテーブル(VBAK)のNETWRフィールドにあります。 例 1500.0012550.75850.50 | |||
| 納品ブロック DeliveryBlock | 受注が納品ブロックされているかどうかを示すコードです。ブロック中は納品伝票を作成できません。 | ||
| 説明 納品ブロックは、納品段階に進む前にプロセスを一時停止するため、受注のヘッダまたは明細に設定するステータスです。ユーザーが手動で設定する場合と、与信限度額の超過やデータの不足などを理由にシステムが自動で設定する場合があります。 この属性は、受注ブロックと手戻り分析のダッシュボードに欠かせません。納品ブロックの頻度、継続時間、理由を分析すると、履行プロセスの主なボトルネックを特定できます。ブロックを減らすことは、納期遵守と全体のサイクルタイムの改善につながります。 重要な理由 履行プロセスのボトルネックを直接特定できます。受注がブロックされる理由や頻度を分析することは、プロセスフローの効率改善に欠かせません。 入手先 販売伝票ヘッダデータテーブル(VBAK)のLIFSKフィールドにあります。 例 0102Z1 | |||
| 販売組織 SalesOrganization | 製品やサービスの販売を担当する組織単位です。 | ||
| 説明 販売組織は、販売要件に応じて会社を編成するSAPの主要な組織単位です。販売条件の交渉や商品・サービスの流通を担当します。 プロセスマイニングでは、分析に欠かせない切り口です。販売部門、地域、事業部門ごとにプロセスのパフォーマンス、効率、コンプライアンスを比較できます。パフォーマンスの高い組織の優れた取り組みを見つけ、ほかの組織で改善すべき点を特定するのに役立ちます。 重要な理由 組織間の比較が可能になり、事業部門や地域ごとのプロセス効率とコンプライアンスを評価できます。 入手先 販売伝票ヘッダデータテーブル(VBAK)のVKORGフィールドにあります。 例 100025003100 | |||
| 顧客番号 CustomerNumber | 受注した顧客を一意に識別する番号です。 | ||
| 説明 この属性は、受注に関連付けられた主要な顧客アカウントである「受注先」を表します。取引をマスターデータ内の特定の顧客に結び付けます。 顧客番号で分析すると、顧客ごとの傾向やパフォーマンスを把握できます。サイクルタイムが最も長い顧客、手戻り率が最も高い顧客、受注変更が最も多い顧客などを特定できます。顧客関係管理やサービスレベルの改善に役立つ情報です。 重要な理由 顧客ごとの分析が可能になり、特定の顧客に影響するプロセス上の問題を特定し、顧客別のパフォーマンスを測定できます。 入手先 販売伝票ヘッダデータテーブル(VBAK)のKUNNRフィールドにあります。 例 100234100567200112 | |||
| 与信チェックステータス CreditCheckStatus | 販売伝票の与信チェックの状態を示します。 | ||
| 説明 この属性は、受注に対して自動または手動で実施した与信チェックの結果を示します。一般的なステータスには「承認済み」「拒否」「ブロック」などがあります。 この属性は、与信チェック処理時間分析のダッシュボードに欠かせません。与信チェック段階での遅延やブロックは、受注履行の全体的なサイクルタイムに大きく影響する場合があります。ステータスを分析すると、与信管理プロセスの効率と販売の進捗への影響を把握できます。 重要な理由 受注処理の速度に直接影響します。このステータスを分析すると、受注の履行を遅らせる与信管理上のボトルネックを特定できます。 入手先 販売伝票ヘッダステータステーブル(VBUK)、またはVBAKの与信ステータスフィールド(CMGSTなど)にあります。 例 ABD | |||
| 出荷条件 ShippingConditions | 顧客への商品納品に関する基本的な出荷方針を定めます。 | ||
| 説明 出荷条件は、受注の出荷方法を定めます。たとえば、「通常」「速達」「引き取り」などがあります。顧客と合意した条件であり、物流計画にも影響します。 この属性は、出荷方法の効率とコストの分析に使います。出荷条件ごとにプロセスを分類すると、特定の方法で遅延が起きやすいか、サイクルタイムが長くなるかを分析できます。こうしたデータは、物流の改善や納品時期に関する顧客の期待値の調整に役立ちます。 重要な理由 物流パフォーマンスを分析し、特定の出荷方法が遅延や効率の向上と関連しているかを確認できます。 入手先 販売伝票ヘッダデータテーブル(VBAK)のVSBEDフィールドにあります。 例 011020 | |||
| 手戻りあり IsRework | 受注の作成後に大幅な変更または手戻りが発生したかどうかを示す真偽値です。 | ||
| 説明 この計算属性は、「受注変更」アクティビティが1回以上発生したなど、手戻りがあったプロセスを特定します。価格、数量、納品日の変更など、手戻りとみなす条件はプロジェクトの設定時に定義します。 この属性は、受注の手戻りと変更頻度のダッシュボード、および受注手戻り率のKPIに欠かせません。直接絞り込んで比較できるため、最初から最後まで変更なく進んだ受注と、手動変更が必要だった受注を簡単に分析できます。サイクルタイムやコストに対する手戻りの影響も定量化できます。 重要な理由 手戻りの頻度を定量化し、その原因やプロセス全体の効率、サイクルタイムへの影響を分析できます。 入手先 イベントログから算出する属性です。「受注変更」アクティビティ、またはCDHDR/CDPOSテーブルに記録された特定の変更イベントの有無を確認します。 例 truefalse | |||
| 確定納品日 ConfirmedDeliveryDate | 商品またはサービスの納品日として顧客に確約した日付です。 | ||
| 説明 商品在庫とスケジュールに基づいて顧客に約束した納品日です。納品パフォーマンスを測定する際のベースラインとなります。 この属性は、納期遵守パフォーマンスのダッシュボードと納期遵守率のKPIの基礎です。確定納品日と実際の「出庫」日を比較し、受注が予定どおり、予定より早く、または遅れて納品されたかを判定できます。サプライチェーンの信頼性と顧客満足度を測る主要な指標です。 重要な理由 納期遵守パフォーマンスを測る基準です。顧客満足度とサプライチェーンの効率を評価する重要業績評価指標(KPI)です。 入手先 販売伝票納入日程行テーブル(VBEP)のEDATUフィールドにあります。 例 2023-05-102023-06-202023-07-01 | |||
| 納期遵守 IsOnTimeDelivery | 確定納品日までに商品が出荷されたかどうかを示す真偽値です。 | ||
| 説明 この計算属性は、実際の出庫日と受注の「ConfirmedDeliveryDate」を比較します。出庫日が確定納品日と同日またはそれ以前であればtrue、そうでなければfalseになります。 この属性を使うと、納期遵守パフォーマンスのダッシュボードを簡単に作成し、納期遵守率のKPIを計算できます。分析やグラフごとに日付を比較する必要がなく、パフォーマンスを集計して可視化できます。納品の信頼性をひと目で把握できます。 重要な理由 納品パフォーマンスをわかりやすく測定でき、全体の納期遵守率のKPIを簡単に計算できます。 入手先 計算属性です。「出庫」アクティビティのタイムスタンプと「ConfirmedDeliveryDate」属性の値を比較します。 例 truefalse | |||
受注から入金までの受注処理のアクティビティ
| アクティビティ | 説明 | ||
|---|---|---|---|
| 出庫を計上 | 商品の所有権が移転し、正式に倉庫から出荷されたことを示す重要なイベントです。資材伝票を作成して在庫を更新する、明示的な財務計上です。 | ||
| 重要な理由 出荷を示すイベントであり、納期遵守や納品リードタイムを測定する重要な節目です。財務データを更新し、物理的な納品プロセスでは後戻りできない段階となります。 入手先 出庫移動タイプ(例:601)を指定した資材伝票(MKPF/MSEG)の作成です。納品伝票に関連付けられます。 記録 出庫移動タイプを指定した資材伝票(MKPF/MSEG)の作成です。納品に関連付けられます。 イベントタイプ explicit | |||
| 受注を確定 | 販売受注が初期チェックをすべて通過し、納品に向けて確定したことを示します。通常、受注のブロックが解除され、納入日程行の数量が確定した時点から推定します。 | ||
| 重要な理由 受注入力から納品までを分ける重要な節目です。納品までのリードタイムや納期遵守パフォーマンスを測定する起点になります。 入手先 VBEPの納入日程行に確定数量(BMENG > 0)があり、納品ブロックが設定されていない場合(例:VBUK-LIFSKが空欄)に推定できます。 記録 納入日程行の確定(VBEP-BMENG > 0)とヘッダレベルのブロック解除から推定します。 イベントタイプ inferred | |||
| 受注明細クローズ | 受注明細が最終的にクローズされたことを示します。納品と請求が完了し、処理済みと判断された状態です。明細の全体ステータスから推定します。 | ||
| 重要な理由 プロセスの正常終了を示します。明細がクローズした時点を分析すると、プロセス全体の所要時間を把握し、不要に未処理のまま残っている受注を特定できます。 入手先 VBUPテーブル(販売伝票:明細ステータス)の明細全体ステータスから推定します。VBUP-GBSTAが「C」(処理完了)の場合、明細はクローズしています。 記録 明細ステータス(VBUP-GBSTA)が「C」(処理完了)に変わったことから推定します。 イベントタイプ inferred | |||
| 支払い受領 | 顧客からの支払いが受領され、請求書に充当されたことを示します。これにより、未決済の売掛金明細が消し込まれます。財務伝票の消し込みから推定される会計イベントです。 | ||
| 重要な理由 販売代金を回収する最後のステップです。請求書から支払いまでのサイクルタイムと、受注から入金までの全体のサイクルタイムを測定する終点となります。 入手先 顧客明細に関するBSEGテーブルの消込伝票情報から推定します。BSEG-AUGBL(消込伝票)とBSEG-AUGDT(消込日)が入力されている場合、支払いを受領したと判断します。 記録 売掛金明細について、BSEGテーブルの消込日(AUGDT)が入力されていることから推定します。 イベントタイプ inferred | |||
| 請求書作成 | 顧客向け請求書または請求伝票の作成を示します。システムに新しい伝票が作成される明示的なイベントであり、プロセスの支払い段階が始まります。 | ||
| 重要な理由 請求書から支払いまでのサイクルタイムの計測開始点となる重要な節目です。請求の遅れはキャッシュフローに直接影響します。 入手先 VBRKテーブル(請求伝票:ヘッダデータ)に、作成日(ERDAT)を基に記録されます。受注または納品との関連付けはVBFAテーブルで確認できます。 記録 VBRKテーブルの作成日時(ERDAT)に基づくイベントです。 イベントタイプ explicit | |||
| 販売受注を作成 | 新しい販売伝票が作成されたことを示します。通常、SAPのトランザクションVA01で新規受注を保存した際に記録される明示的なイベントです。 | ||
| 重要な理由 受注から入金までのプロセスにおける主な開始イベントです。発生時刻を分析することで、サイクルタイム全体や受注件数を正確に測定できます。 入手先 VBAKテーブル(販売伝票ヘッダデータ)の作成日(ERDAT)と作成時刻(ERZET)に記録されます。トランザクションコードはVBAK-TCODEに保存されます。 記録 VBAKテーブルの作成タイムスタンプ(ERDAT、ERZET)に基づくイベントです。 イベントタイプ explicit | |||
| ピッキングを完了 | 納品対象のすべての商品が倉庫から物理的にピッキングされたことを示します。倉庫管理(WM)を使用している場合は、移送オーダーのステータスから推定できます。 | ||
| 重要な理由 ピッキング時間を分析すると、倉庫業務の改善に役立ちます。この工程の遅れは、出荷スケジュールと納品サイクル全体に直接影響します。 入手先 LIPSテーブルの納品明細ピッキングステータスLIPS-KOSTAが「C」(ピッキング完了)に変わった時点から推定します。WMが有効な場合は、移送オーダーの確認(LTAK/LTAPテーブル)から推定できます。 記録 ピッキングステータス(LIPS-KOSTA)の変更、またはWMの移送オーダー確認から推定します。 イベントタイプ inferred | |||
| 与信審査を実施 | 販売受注の顧客に対する自動または手動の与信審査が完了したことを示します。通常、伝票全体の与信ステータスの変化から推定します。 | ||
| 重要な理由 与信審査は、ボトルネックになりやすい工程です。この工程の所要時間を測定することは、「与信審査の処理時間分析」や受注処理の迅速化に欠かせません。 入手先 VBUKテーブル(販売伝票:ヘッダステータス)の与信ステータス項目から推定します。VBUK-CMGSTがブロックから解除に変わった時点を、このアクティビティとして記録します。 記録 全体の与信ステータス項目(VBUK-CMGST)の変更から推定します。 イベントタイプ inferred | |||
| 受注取消 | 履行前に受注が取り消されたことを示します。通常、受注の対象となるすべての明細に拒否理由を設定することで記録されます。 | ||
| 重要な理由 受注取消率のKPIに直結する、重大なプロセス終了を示します。受注がいつ、なぜ取り消されたかを把握することで、販売プロセスの問題を特定できます。 入手先 受注のすべての有効な明細でVBAP-ABGRU(拒否理由)に値が入力されていることから推定します。変更日はCDHDR/CDPOSで確認できます。 記録 すべての明細の拒否理由フィールド(VBAP-ABGRU)に値が入力されていることから推定します。 イベントタイプ inferred | |||
| 納品ブロックを設定 | 販売受注に納品ブロックが設定され、納品伝票を作成できなくなったことを示します。変更ログから明示的に取得するか、ステータステーブルから推定できます。 | ||
| 重要な理由 このアクティビティは「販売受注のブロック率」指標に直接関係します。ブロックが設定された理由と頻度を特定することで、納品遅延の原因を明らかにできます。 入手先 VBAK-LIFSK項目の変更ログ(CDHDR/CDPOS)から確認できます。または、VBAK-LIFSK項目に値が設定された時点から推定します。 記録 VBAK-LIFSKまたはVBAP-LIFSP項目の変更文書から取得するイベントです。 イベントタイプ explicit | |||
| 納品を作成 | 出荷伝票が作成されたことを示すイベントです。倉庫にピッキングと出荷の開始を指示するもので、伝票フローから明示的に取得できます。 | ||
| 重要な理由 物理的な納品プロセスの最初の手順です。受注確定から納品作成までの時間を測ることで、物流プロセスがどれだけ早く始まるかを把握できます。 入手先 LIKPテーブル(SD伝票:納品ヘッダデータ)へのレコード作成です。販売受注との関連は伝票フローテーブルVBFAで管理されます。 記録 LIKPテーブルの作成タイムスタンプに基づき、VBFAテーブルを介して関連付けるイベントです。 イベントタイプ explicit | |||
| 納品証明を確認 | このアクティビティは、顧客が商品を受け取ったことの確認を表します。納品証明がシステムに記録されると取得され、多くの場合、納品伝票のステータスも更新されます。 | ||
| 重要な理由 このイベントには実際の納品日が記録されます。約束した納品日と比較して納期遵守率を正確に測定するうえで欠かせない情報です。 入手先 納品証明のステータス(VBUK-PODAT)が「C」(確認済み)に設定されたことから推定します。確認日はVLPOD-PODATに保存されます。この設定が実装されていない場合もあります。 記録 納品のPODステータス(VBUK-PODAT)の更新、またはVLPODテーブルのレコードから推定します。 イベントタイプ inferred | |||
| 請求書取消 | 作成済みの請求伝票を取り消す処理を表します。元の伝票を相殺する取消伝票を新たに作成する、明示的なトランザクションです。 | ||
| 重要な理由 請求書の取消を追跡すると、価格設定、出荷内容の不一致、データエラーなどの問題を特定できます。請求書不一致率のKPIの把握にも役立ちます。 入手先 取消請求伝票(VBRK-VBTYP = 'N'または'O')の作成によって記録される明示的なイベントです。元の請求書はVBRK-SFAKNで参照されます。 記録 VBRKに元の請求書を参照する取消伝票が作成されたことを示します。 イベントタイプ explicit | |||
| 販売受注を変更 | 作成後の販売受注に変更が加えられたことを示します。数量、価格、日付などの項目が変更されると、専用の変更ログテーブル(CDHDR、CDPOS)に記録されます。 | ||
| 重要な理由 変更を追跡すると、手戻り、プロセスの不安定さ、データ品質の問題を特定できます。変更頻度が高い場合、受注入力時の問題が原因で遅延が発生している可能性があります。 入手先 変更文書テーブルCDHDR(ヘッダ)とCDPOS(明細)から、OBJECTCLAS = 'VERKBELEG'のデータを取得します。タイムスタンプと変更された項目を特定できます。 記録 販売伝票オブジェクトに関する変更文書テーブル(CDHDR、CDPOS)から取得するイベントです。 イベントタイプ explicit | |||
データ抽出ガイド
ステップ
- プログラムの開発:トランザクションSE38またはSE80を使って、新しい実行可能ABAPプログラムを作成します。このプログラムに抽出ロジック全体を実装します。
- 選択画面の定義:データを絞り込む選択画面を作成します。販売伝票の作成日(VBAK-ERDAT)、販売組織(VBAK-VKORG)、販売伝票タイプ(VBAK-AUART)のパラメーターを含めます。これにより、抽出を繰り返し利用しやすくなります。
- データの宣言:VBAK、VBAP、VBFA、CDHDR、CDPOS、VBRK、BSADなど、各種SAPテーブルのデータを格納する内部テーブルと構造を定義します。また、必要な属性に対応するイベントログの最終出力構造も定義します。
- 基準となる受注の選択:選択画面で指定された条件に基づき、受注ヘッダ(VBAK)と明細(VBAP)を取得するSELECT文を記述します。これが分析対象となるケースの基礎データになります。
- 「受注作成」イベントの抽出:選択したVBAKレコードを順に処理します。各レコードについて、「受注作成」アクティビティをイベントログの構造に設定し、VBAK-ERDATとVBAK-ERZETをStartTimeに使用します。
- 変更履歴イベントの抽出:選択した受注について、OBJECTCLASが「VERKBELEG」のCDHDRおよびCDPOSレコードを選択します。結果を確認し、特定のフィールドの変更を特定します。たとえば、VBAK-LIFSKの変更は「出荷ブロック設定」、VBUK-CMGSTの変更は「与信チェック実施」を示します。その他の関連する変更は「受注変更」として記録できます。
- 伝票フローデータの抽出:選択した受注について、伝票フローテーブル(VBFA)を照会します。このテーブルでは、受注と納品、出庫、請求書などの後続伝票が関連付けられています。関連する伝票をすべて選択し、後続の処理に使用します。
- 納品と出荷イベントの抽出:VBFAから取得した納品伝票番号を使い、LIKPとLIPSを照会して「納品作成」イベントを取得します。MKPFとMSEGから移動タイプ「601」の出庫伝票を照会し、「出庫」イベントを記録します。倉庫管理が有効な場合は、LTAKとLTAPを照会し、最後の転送指図明細の確認時刻から「ピッキング完了」を特定します。納品ヘッダステータスVBUK-PODATを確認し、「納品証明確認済み」を記録します。
- 請求と支払いイベントの抽出:VBFAから取得した請求伝票番号を使い、VBRKとVBRPを照会して「請求書作成」と「請求書取消」(VBRK-FKSTO =「X」)のイベントを取得します。「支払い受領」を特定するには、VBRKの請求書をBKPFの会計伝票に関連付け、BSADから消込伝票と消込日を取得します。
- ステータスに基づくイベントの抽出:ステータステーブルVBUP(明細ステータス)とVBUK(ヘッダステータス)を使って、業務イベントを判定します。たとえば、VBUP-GBSTAが「C」の場合、明細は「受注明細クローズ」とみなします。関連するすべての明細に「拒否理由」(VBAP-ABGRU)が設定されている場合、受注は「受注取消」とみなします。
- 統合と形式の調整:取得したすべてのイベントを1つの最終内部テーブルにまとめます。各イベントレコードの属性(SalesOrder、Activity、StartTime、Userなど)が正しく設定されていることを確認します。SourceSystemとLastDataUpdateのタイムスタンプも追加します。
- 出力ファイルの作成:GUI_DOWNLOAD関数モジュールまたはcl_gui_frontend_services=>gui_downloadメソッドを使い、最終内部テーブルをユーザーのローカルマシンにCSVファイルとしてエクスポートします。ファイルはUTF-8エンコーディングで保存してください。
設定
- 前提条件:ABAP開発者権限(例:トランザクションSE38へのアクセス)と、VBAK、VBAP、CDHDR、CDPOS、VBFA、LIKP、LIPS、VBRK、VBRP、MKPF、MSEG、BSADなど、必要なSAPテーブルすべてへの読み取り権限が必要です。
- 選択パラメーター:絞り込み用の選択画面に、次の主要パラメーターを含めます。
- 日付範囲:受注作成日(VBAK-ERDAT)の指定は必須です。データ量を抑えるため、まずは直近3~6か月を対象にします。
- 販売組織:VBAK-VKORGで絞り込み、特定の事業部門を分析対象にします。
- 販売伝票タイプ:VBAK-AUARTで絞り込み、標準受注など必要なタイプのみを含め、見積もりや返品などは除外します。
- 処理性能に関する注意点:変更履歴テーブル(CDHDR、CDPOS)や伝票フロー(VBFA)から大量のデータを抽出すると、時間がかかる場合があります。WHERE句でインデックスフィールドを使うよう、プログラムを最適化してください。非常に大規模な抽出では、トランザクションSM36を使い、負荷の低い時間帯にバックグラウンドジョブとして実行するようスケジュールします。
- 変更履歴の有効化:この方法では、SAPの変更文書機能を使用します。LIFSK、CMGST、ABGRUなど、主要なデータ要素の変更履歴が有効になっていることを確認してください。オブジェクトVERKBELEGについては、トランザクションSCDOで確認できます。
クエリの例 abap
REPORT Z_O2C_PM_EXTRACTOR.
*&---------------------------------------------------------------------*
*& Data Declarations
*&---------------------------------------------------------------------*
TABLES: vbak.
TYPES: BEGIN OF ty_event_log,
salesorder TYPE vbeln_va,
activity TYPE string,
starttime TYPE string,
sourcesystem TYPE logsys,
lastdataupdate TYPE string,
user TYPE ernam,
customernumber TYPE kunnr,
salesorganization TYPE vkorg,
netamount TYPE netwr,
materialnumber TYPE matnr,
deliveryblock TYPE lifsk,
rejectionreason TYPE abgru,
salesordercycletime TYPE string, " Placeholder for calculation
END OF ty_event_log.
DATA: gt_event_log TYPE TABLE OF ty_event_log.
DATA: gs_event_log TYPE ty_event_log.
DATA: gv_sysid TYPE logsys.
DATA: gv_last_update TYPE string.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: s_erdat FOR vbak-erdat OBLIGATORY,
s_vkorg FOR vbak-vkorg,
s_auart FOR vbak-auart.
PARAMETERS: p_file TYPE rlgrap-filename OBLIGATORY DEFAULT 'C:\temp\o2c_event_log.csv'.
*&---------------------------------------------------------------------*
*& Main Processing Block
*&---------------------------------------------------------------------*
START-OF-SELECTION.
CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
IMPORTING
own_logical_system = gv_sysid.
CONCATENATE sy-datum sy-uzeit INTO gv_last_update.
PERFORM get_base_data.
PERFORM write_output_file.
*&---------------------------------------------------------------------*
*& Form get_base_data
*&---------------------------------------------------------------------*
FORM get_base_data.
TYPES: BEGIN OF ty_order_item,
vbeln TYPE vbeln_va,
posnr TYPE posnr_va,
erdat TYPE erdat,
erzet TYPE erzet,
ernam TYPE ernam,
kunnr TYPE kunnr,
vkorg TYPE vkorg,
netwr TYPE netwr_ak,
matnr TYPE matnr,
lifsk TYPE lifsk,
abgru TYPE abgru,
END OF ty_order_item.
DATA: lt_order_items TYPE TABLE OF ty_order_item.
SELECT h~vbeln i~posnr h~erdat h~erzet h~ernam h~kunnr h~vkorg h~netwr i~matnr h~lifsk i~abgru
INTO TABLE lt_order_items
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~auart IN s_auart.
CHECK sy-subrc = 0.
DATA(lt_vbeln_range) = VALUE rsdsselopt_t(
FOR <fs_item> IN lt_order_items WHERE ( vbeln = <fs_item>-vbeln )
( sign = 'I' option = 'EQ' low = <fs_item>-vbeln ) ).
SORT lt_vbeln_range BY low.
DELETE ADJACENT DUPLICATES FROM lt_vbeln_range COMPARING low.
PERFORM extract_order_created USING lt_order_items.
PERFORM extract_changes USING lt_vbeln_range lt_order_items.
PERFORM extract_doc_flow_events USING lt_vbeln_range lt_order_items.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form extract_order_created
*&---------------------------------------------------------------------*
FORM extract_order_created USING it_order_items TYPE ANY TABLE.
FIELD-SYMBOLS: <fs_item> TYPE any.
DATA: lt_unique_orders TYPE HASHED TABLE OF vbeln_va WITH UNIQUE KEY table_line.
lt_unique_orders = VALUE #( FOR <order> IN it_order_items ( CONV vbeln_va( <order>-vbeln ) ) ).
LOOP AT it_order_items ASSIGNING <fs_item> WHERE table_line IN lt_unique_orders.
CLEAR gs_event_log.
gs_event_log-salesorder = <fs_item>-vbeln.
gs_event_log-activity = 'Sales Order Created'.
CONCATENATE <fs_item>-erdat <fs_item>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_item>-ernam.
gs_event_log-customernumber = <fs_item>-kunnr.
gs_event_log-salesorganization = <fs_item>-vkorg.
gs_event_log-netamount = <fs_item>-netwr.
APPEND gs_event_log TO gt_event_log.
DELETE lt_unique_orders WHERE table_line = <fs_item>-vbeln.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form extract_changes
*&---------------------------------------------------------------------*
FORM extract_changes USING it_vbeln_range TYPE rsdsselopt_t it_order_items TYPE ANY TABLE.
DATA: lt_cdhdr TYPE TABLE OF cdhdr,
lt_cdpos TYPE TABLE OF cdpos.
SELECT * INTO TABLE lt_cdhdr FROM cdhdr
WHERE objectclas = 'VERKBELEG'
AND objectid IN it_vbeln_range
AND tcode = 'VA02'.
IF sy-subrc = 0.
SELECT * INTO TABLE lt_cdpos FROM cdpos
FOR ALL ENTRIES IN lt_cdhdr
WHERE objectclas = lt_cdhdr-objectclas
AND objectid = lt_cdhdr-objectid
AND changenr = lt_cdhdr-changenr.
ENDIF.
LOOP AT lt_cdhdr ASSIGNING FIELD-SYMBOL(<fs_cdhdr>).
DATA(lv_order_info) = REF #( it_order_items[ vbeln = <fs_cdhdr>-objectid ] ).
IF lv_order_info IS NOT BOUND. CONTINUE. ENDIF.
CLEAR gs_event_log.
gs_event_log-salesorder = <fs_cdhdr>-objectid.
gs_event_log-user = <fs_cdhdr>-username.
CONCATENATE <fs_cdhdr>-udate <fs_cdhdr>-utime INTO gs_event_log-starttime.
gs_event_log-customernumber = lv_order_info->kunnr.
gs_event_log-salesorganization = lv_order_info->vkorg.
gs_event_log-netamount = lv_order_info->netwr.
" Generic Change Event
gs_event_log-activity = 'Sales Order Changed'.
APPEND gs_event_log TO gt_event_log.
LOOP AT lt_cdpos ASSIGNING FIELD-SYMBOL(<fs_cdpos>)
WHERE objectclas = <fs_cdhdr>-objectclas
AND objectid = <fs_cdhdr>-objectid
AND changenr = <fs_cdhdr>-changenr.
CASE <fs_cdpos>-fname.
WHEN 'LIFSK'. " Delivery Block
gs_event_log-activity = 'Delivery Block Set'.
gs_event_log-deliveryblock = <fs_cdpos>-value_new.
APPEND gs_event_log TO gt_event_log.
WHEN 'CMGST'. " Credit Status
IF <fs_cdpos>-value_new = 'B'. " B = Credit Check OK
gs_event_log-activity = 'Credit Check Performed'.
APPEND gs_event_log TO gt_event_log.
ENDIF.
WHEN 'ABGRU'. " Rejection Reason
IF <fs_cdpos>-value_new IS NOT INITIAL.
gs_event_log-activity = 'Order Cancelled'.
gs_event_log-rejectionreason = <fs_cdpos>-value_new.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDCASE.
ENDLOOP.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form extract_doc_flow_events
*&---------------------------------------------------------------------*
FORM extract_doc_flow_events USING it_vbeln_range TYPE rsdsselopt_t it_order_items TYPE ANY TABLE.
DATA: lt_vbfa TYPE TABLE OF vbfa,
lt_vbrk TYPE TABLE OF vbrk,
lt_likp TYPE TABLE OF likp,
lt_mseg TYPE TABLE OF mseg,
lt_bsad TYPE TABLE OF bsad,
lt_vbup TYPE TABLE OF vbup.
SELECT * INTO TABLE lt_vbfa FROM vbfa
WHERE vbelv IN it_vbeln_range
AND ( vbtyp_n = 'J' " Delivery
OR vbtyp_n = 'M' " Invoice
OR vbtyp_n = 'N' " Invoice Cancellation
OR vbtyp_n = 'R' ). " Goods Movement
IF lt_vbfa IS INITIAL. RETURN. ENDIF.
SELECT vbeln, erdat, erzet, ernam, fksto, belnr FROM vbrk INTO TABLE lt_vbrk
FOR ALL ENTRIES IN lt_vbfa
WHERE vbeln = lt_vbfa-vbeln
AND ( lt_vbfa-vbtyp_n = 'M' OR lt_vbfa-vbtyp_n = 'N' ).
SELECT vbeln, erdat, erzet, ernam, podat FROM likp INTO TABLE lt_likp
FOR ALL ENTRIES IN lt_vbfa
WHERE vbeln = lt_vbfa-vbeln AND lt_vbfa-vbtyp_n = 'J'.
SELECT mblnr, mjahr, zeile, bwart, budat, cpuzt, usnam FROM mseg INTO TABLE lt_mseg
FOR ALL ENTRIES IN lt_vbfa
WHERE mblnr = lt_vbfa-vbeln AND mjahr = lt_vbfa-mjahr AND zeile = lt_vbfa-posnn AND lt_vbfa-vbtyp_n = 'R' AND bwart = '601'.
SELECT augdt, belnr, gjahr, kunnr FROM bsad INTO TABLE lt_bsad
FOR ALL ENTRIES IN lt_vbrk
WHERE belnr = lt_vbrk-belnr AND gjahr = SUBSTRING( val = lt_vbrk-erdat len = 4 ).
SELECT vbeln, posnr, gbsta FROM vbup INTO TABLE lt_vbup
FOR ALL ENTRIES IN lt_vbfa
WHERE vbeln = lt_vbfa-vbelv AND posnr = lt_vbfa-posnv.
LOOP AT lt_vbfa ASSIGNING FIELD-SYMBOL(<fs_vbfa>).
DATA(lv_order_info) = REF #( it_order_items[ vbeln = <fs_vbfa>-vbelv ] ).
IF lv_order_info IS NOT BOUND. CONTINUE. ENDIF.
CLEAR gs_event_log.
gs_event_log-salesorder = <fs_vbfa>-vbelv.
gs_event_log-customernumber = lv_order_info->kunnr.
gs_event_log-salesorganization = lv_order_info->vkorg.
gs_event_log-netamount = lv_order_info->netwr.
gs_event_log-materialnumber = lv_order_info->matnr.
CASE <fs_vbfa>-vbtyp_n.
WHEN 'J'. " Delivery
READ TABLE lt_likp ASSIGNING FIELD-SYMBOL(<fs_likp>) WITH KEY vbeln = <fs_vbfa>-vbeln.
IF sy-subrc = 0.
gs_event_log-activity = 'Delivery Created'.
CONCATENATE <fs_likp>-erdat <fs_likp>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_likp>-ernam.
APPEND gs_event_log TO gt_event_log.
" Picking Completed - simplified logic, check status
gs_event_log-activity = 'Picking Completed'. APPEND gs_event_log TO gt_event_log.
" POD Confirmed
IF <fs_likp>-podat IS NOT INITIAL.
gs_event_log-activity = 'Proof Of Delivery Confirmed'.
gs_event_log-starttime = <fs_likp>-podat.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDIF.
WHEN 'R'. " Goods Issue
READ TABLE lt_mseg ASSIGNING FIELD-SYMBOL(<fs_mseg>) WITH KEY mblnr = <fs_vbfa>-vbeln mjahr = <fs_vbfa>-mjahr zeile = <fs_vbfa>-posnn.
IF sy-subrc = 0.
gs_event_log-activity = 'Goods Issued'.
CONCATENATE <fs_mseg>-budat <fs_mseg>-cpuzt INTO gs_event_log-starttime.
gs_event_log-user = <fs_mseg>-usnam.
APPEND gs_event_log TO gt_event_log.
ENDIF.
WHEN 'M'. " Invoice
READ TABLE lt_vbrk ASSIGNING FIELD-SYMBOL(<fs_vbrk>) WITH KEY vbeln = <fs_vbfa>-vbeln.
IF sy-subrc = 0.
gs_event_log-activity = 'Invoice Created'.
CONCATENATE <fs_vbrk>-erdat <fs_vbrk>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_vbrk>-ernam.
APPEND gs_event_log TO gt_event_log.
" Payment Received
READ TABLE lt_bsad ASSIGNING FIELD-SYMBOL(<fs_bsad>) WITH KEY belnr = <fs_vbrk>-belnr.
IF sy-subrc = 0 AND <fs_bsad>-augdt IS NOT INITIAL.
gs_event_log-activity = 'Payment Received'.
gs_event_log-starttime = <fs_bsad>-augdt.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDIF.
WHEN 'N'. " Invoice Cancellation
READ TABLE lt_vbrk ASSIGNING <fs_vbrk> WITH KEY vbeln = <fs_vbfa>-vbeln.
IF sy-subrc = 0 AND <fs_vbrk>-fksto = 'X'.
gs_event_log-activity = 'Invoice Cancelled'.
CONCATENATE <fs_vbrk>-erdat <fs_vbrk>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_vbrk>-ernam.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDCASE.
ENDLOOP.
" Infer other events from status
LOOP AT lt_vbup ASSIGNING FIELD-SYMBOL(<fs_vbup>).
IF <fs_vbup>-gbsta = 'C'.
DATA(lv_order_info_stat) = REF #( it_order_items[ vbeln = <fs_vbup>-vbeln ] ).
IF lv_order_info_stat IS NOT BOUND. CONTINUE. ENDIF.
gs_event_log-salesorder = <fs_vbup>-vbeln.
gs_event_log-activity = 'Order Item Closed'.
" Timestamp for closed is harder, using current time as placeholder
CONCATENATE sy-datum sy-uzeit INTO gs_event_log-starttime.
gs_event_log-user = sy-uname.
gs_event_log-customernumber = lv_order_info_stat->kunnr.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
" Order Confirmed (Simplified - assumes if not blocked it's confirmed)
LOOP AT it_order_items ASSIGNING FIELD-SYMBOL(<fs_item>).
IF <fs_item>-lifsk IS INITIAL.
gs_event_log-salesorder = <fs_item>-vbeln.
gs_event_log-activity = 'Order Confirmed'.
CONCATENATE <fs_item>-erdat <fs_item>-erzet INTO gs_event_log-starttime.
gs_event_log-user = <fs_item>-ernam.
gs_event_log-customernumber = <fs_item>-kunnr.
APPEND gs_event_log TO gt_event_log.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form write_output_file
*&---------------------------------------------------------------------*
FORM write_output_file.
DATA: lt_final_output TYPE TABLE OF ty_event_log.
" Add common fields
LOOP AT gt_event_log ASSIGNING FIELD-SYMBOL(<fs_event>).
<fs_event>-sourcesystem = gv_sysid.
<fs_event>-lastdataupdate = gv_last_update.
ENDLOOP.
SORT gt_event_log BY salesorder starttime.
DELETE ADJACENT DUPLICATES FROM gt_event_log COMPARING ALL FIELDS.
lt_final_output = gt_event_log.
DATA: lt_fieldnames TYPE TABLE OF string.
APPEND 'SalesOrder' TO lt_fieldnames.
APPEND 'Activity' TO lt_fieldnames.
APPEND 'StartTime' TO lt_fieldnames.
APPEND 'SourceSystem' TO lt_fieldnames.
APPEND 'LastDataUpdate' TO lt_fieldnames.
APPEND 'User' TO lt_fieldnames.
APPEND 'CustomerNumber' TO lt_fieldnames.
APPEND 'SalesOrganization' TO lt_fieldnames.
APPEND 'NetAmount' TO lt_fieldnames.
APPEND 'MaterialNumber' TO lt_fieldnames.
APPEND 'DeliveryBlock' TO lt_fieldnames.
APPEND 'RejectionReason' TO lt_fieldnames.
APPEND 'SalesOrderCycleTime' TO lt_fieldnames.
DATA(lv_header) = REDUCE string(
INIT s = ''
FOR field IN lt_fieldnames
NEXT s = s && COND #( WHEN s = '' THEN field ELSE |,{ field }| ) ).
DATA: lt_file_content TYPE TABLE OF string.
APPEND lv_header TO lt_file_content.
LOOP AT lt_final_output INTO DATA(ls_output).
DATA(lv_line) = |"{ ls_output-salesorder }","{ ls_output-activity }","{ ls_output-starttime }","{ ls_output-sourcesystem }","{ ls_output-lastdataupdate }","{ ls_output-user }","{ ls_output-customernumber }","{ ls_output-salesorganization }",{ ls_output-netamount },"{ ls_output-materialnumber }","{ ls_output-deliveryblock }","{ ls_output-rejectionreason }","{ ls_output-salesordercycletime }"|.
APPEND lv_line TO lt_file_content.
ENDLOOP.
cl_gui_frontend_services=>gui_download(
EXPORTING
filename = p_file
filetype = 'ASC'
CHANGING
data_tab = lt_file_content ).
ENDFORM. ステップ
- 前提条件:SAP ECCの基盤データベースに対する読み取り専用の直接アクセス権があることを確認します。接続してクエリを実行するには、DBeaver、SQL Server Management Studio、Oracle SQL Developerなどのデータベースクライアントが必要です。
- SQLスクリプトの取得:この文書の「クエリ」セクションに記載されているSQLクエリ全体をコピーします。
- データベースへの接続:データベースクライアントを開き、SAP ECCデータベースのインスタンスに接続します。サーバーアドレス、ポート、データベース名、適切なログイン認証情報が必要です。
- クエリの設定:新しいクエリエディターにSQLスクリプトを貼り付けます。SalesOrdersという名前のメイン共通テーブル式(CTE)内にある設定箇所を探します。開始日(「{StartDate}」)、終了日(「{EndDate}」)、販売組織(「{SalesOrgs}」)、伝票タイプ(「{DocTypes}」)のプレースホルダーを、分析に使う実際の値に置き換えます。
- クエリの実行:設定したSQLスクリプトを実行します。日付範囲やSAPデータベースのサイズによっては、完了まで数分かかる場合があります。
- 結果の確認:クエリが完了すると、結果セットが表示されます。SalesOrder、Activity、StartTimeなど、想定した列が含まれていることと、各種アクティビティの行が返されていることを確認します。
- データのエクスポート:データベースクライアントのエクスポート機能を使い、結果セットをCSVファイルとして保存します。ファイル名はSAP_O2C_Event_Log.csvのように、内容が分かるものにします。
- ProcessMind用の形式に調整:CSVファイルを表計算ソフトで開き、列見出しが必要な属性(SalesOrder、Activity、StartTimeなど)と完全に一致することを確認します。StartTimeとLastDataUpdateの日付・時刻形式が、YYYY-MM-DD HH:MI:SSなどProcessMindでサポートされている形式で統一されていることも確認します。
- ProcessMindへのアップロード:形式を整えた最終CSVファイルをProcessMindのプロジェクトにアップロードして分析します。
設定
- 日付範囲:クエリでは、「{StartDate}」と「{EndDate}」のプレースホルダーを使い、受注作成日(VBAK.ERDAT)で絞り込みます。データベースへの負荷を抑えながら代表性のあるサンプルを得るには、通常3~6か月分のデータを分析します。
- 販売組織フィルター:「{SalesOrgs}」のプレースホルダーを使い、特定の販売組織(例:「1000」、「2000」)に抽出対象を絞ります。分析対象を明確にし、クエリの処理性能を高めるうえで重要です。
- 伝票タイプフィルター:「{DocTypes}」のプレースホルダーを使い、特定の受注タイプ(例:標準受注を示す「OR」)を選択します。無償納品や返品など、主要なプロセスフローに関係しない伝票を除外できます。
- ソースシステム識別子:「{SourceSystemName}」という固定プレースホルダーを使い、各レコードにシステムの識別情報を付与します。SAP ECCのインスタンスを表す名前(例:SAP_ECC_PRD)を設定してください。
- データベースとの互換性:日付と時刻の結合に使う「[Your DB-specific timestamp function]」はプレースホルダーです。使用するデータベースに合った関数に置き換えてください(例:SAP HANAではTO_TIMESTAMP(CONCAT(CDHDR.UDATE, CDHDR.UZEIT), 'YYYYMMDDHH24MISS')、SQL ServerではCAST(CDHDR.UDATE AS DATETIME) + CAST(CDHDR.UZEIT AS DATETIME))。
- 前提条件:データベースへの読み取り専用の直接接続情報が必要です。データベースユーザーには、VBAK、VBAP、VBFA、CDHDR、CDPOS、LIKP、VBRK、BSADなど、クエリで参照するすべてのテーブルへのアクセス権が必要です。
クエリの例 sql
WITH SalesOrders AS (
SELECT VBELN
FROM VBAK
WHERE ERDAT BETWEEN '{StartDate}' AND '{EndDate}' -- Filter by creation date
AND VKORG IN ('{SalesOrgs}') -- Filter by Sales Organization(s)
AND AUART IN ('{DocTypes}') -- Filter by Sales Document Type(s)
)
-- 1. Sales Order Created
SELECT
vbak.VBELN AS "SalesOrder",
'Sales Order Created' AS "Activity",
[Your DB-specific timestamp function](vbak.ERDAT, vbak.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
vbak.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBAK vbak
JOIN SalesOrders so ON vbak.VBELN = so.VBELN
UNION ALL
-- 2. Sales Order Changed
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Sales Order Changed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG' AND cdhdr.TCODE IN ('VA02')
UNION ALL
-- 3. Credit Check Performed (Release)
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Credit Check Performed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBUK'
AND cdpos.FNAME = 'CMGST'
AND cdpos.VALUE_NEW = 'B' -- Credit status 'Released'
UNION ALL
-- 4. Order Confirmed (Overall status not blocked)
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Order Confirmed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBUK'
AND cdpos.FNAME = 'GBSTK'
AND cdpos.VALUE_OLD <> 'A' AND cdpos.VALUE_NEW = 'A' -- Status changes to 'Not yet processed'
UNION ALL
-- 5. Delivery Block Set
SELECT
cdhdr.OBJECTID AS "SalesOrder",
'Delivery Block Set' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
cdpos.VALUE_NEW AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBAK'
AND cdpos.FNAME = 'LIFSK'
AND cdpos.VALUE_NEW IS NOT NULL AND cdpos.VALUE_NEW <> ''
UNION ALL
-- 6. Delivery Created
SELECT
vbfa.VBELV AS "SalesOrder",
'Delivery Created' AS "Activity",
[Your DB-specific timestamp function](likp.ERDAT, likp.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
likp.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
vbak.LIFSK AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN LIKP likp ON vbfa.VBELN = likp.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'J'
UNION ALL
-- 7. Picking Completed
SELECT
vbfa.VBELV AS "SalesOrder",
'Picking Completed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN CDHDR cdhdr ON vbfa.VBELN = cdhdr.OBJECTID
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'J'
AND cdhdr.OBJECTCLASS = 'LIEFERUNG'
AND cdpos.TABNAME = 'VBUK'
AND cdpos.FNAME = 'PKSTK'
AND cdpos.VALUE_NEW = 'C'
UNION ALL
-- 8. Goods Issued
SELECT
vbfa_gi.VBELV AS "SalesOrder",
'Goods Issued' AS "Activity",
[Your DB-specific timestamp function](mkpf.BUDAT, mkpf.CPUTM) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
mkpf.USNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa_gi
JOIN SalesOrders so ON vbfa_gi.VBELV = so.VBELN
JOIN MKPF mkpf ON vbfa_gi.VBELN = mkpf.XBLNR -- XBLNR is Reference Document Number
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa_gi.VBTYP_V = 'J' AND vbfa_gi.VBTYP_N = 'R'
UNION ALL
-- 9. Proof Of Delivery Confirmed
SELECT
vbfa.VBELV AS "SalesOrder",
'Proof Of Delivery Confirmed' AS "Activity",
[Your DB-specific timestamp function](likp.PODAT, '000000') AS "StartTime", -- PODAT is only a date
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
likp.AENAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN LIKP likp ON vbfa.VBELN = likp.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'J' AND likp.PODAT IS NOT NULL AND likp.PODAT <> '00000000'
UNION ALL
-- 10. Invoice Created
SELECT
vbfa.VBELV AS "SalesOrder",
'Invoice Created' AS "Activity",
[Your DB-specific timestamp function](vbrk.ERDAT, vbrk.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
vbrk.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN VBRK vbrk ON vbfa.VBELN = vbrk.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'M'
UNION ALL
-- 11. Invoice Cancelled
SELECT
vbfa.VBELV AS "SalesOrder",
'Invoice Cancelled' AS "Activity",
[Your DB-specific timestamp function](vbrk.ERDAT, vbrk.ERZET) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
vbrk.ERNAM AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN VBRK vbrk ON vbfa.VBELN = vbrk.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'M' AND vbfa.VBTYP_N = 'N'
UNION ALL
-- 12. Payment Received
SELECT
vbfa.VBELV AS "SalesOrder",
'Payment Received' AS "Activity",
[Your DB-specific timestamp function](bsad.AUGDT, '000000') AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
NULL AS "User", -- Clearing user not readily available here
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
NULL AS "MaterialNumber",
NULL AS "DeliveryBlock",
NULL AS "RejectionReason"
FROM VBFA vbfa
JOIN SalesOrders so ON vbfa.VBELV = so.VBELN
JOIN VBRK vbrk ON vbfa.VBELN = vbrk.VBELN
JOIN BSAD bsad ON vbrk.VBELN = bsad.VBLNR
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE vbfa.VBTYP_V = 'C' AND vbfa.VBTYP_N = 'M'
AND bsad.AUGDT IS NOT NULL AND bsad.AUGDT <> '00000000'
UNION ALL
-- 13. Order Item Closed
SELECT DISTINCT
cdhdr.OBJECTID AS "SalesOrder",
'Order Item Closed' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
vbap.MATNR AS "MaterialNumber",
NULL AS "DeliveryBlock",
vbap.ABGRU AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN VBAP vbap ON cdhdr.OBJECTID = vbap.VBELN AND SUBSTRING(cdpos.TABKEY, 4, 6) = vbap.POSNR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBUP'
AND cdpos.FNAME = 'GBSTA'
AND cdpos.VALUE_NEW = 'C' -- Item is completely processed
UNION ALL
-- 14. Order Cancelled
SELECT DISTINCT
cdhdr.OBJECTID AS "SalesOrder",
'Order Cancelled' AS "Activity",
[Your DB-specific timestamp function](cdhdr.UDATE, cdhdr.UZEIT) AS "StartTime",
'{SourceSystemName}' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
cdhdr.USERNAME AS "User",
vbak.KUNNR AS "CustomerNumber",
vbak.VKORG AS "SalesOrganization",
vbak.NETWR AS "NetAmount",
vbap.MATNR AS "MaterialNumber",
NULL AS "DeliveryBlock",
cdpos.VALUE_NEW AS "RejectionReason"
FROM CDHDR cdhdr
JOIN CDPOS cdpos ON cdhdr.CHANGENR = cdpos.CHANGENR
JOIN VBAP vbap ON cdhdr.OBJECTID = vbap.VBELN AND SUBSTRING(cdpos.TABKEY, 4, 6) = vbap.POSNR
JOIN SalesOrders so ON cdhdr.OBJECTID = so.VBELN
JOIN VBAK vbak ON so.VBELN = vbak.VBELN
WHERE cdhdr.OBJECTCLASS = 'VERKBELEG'
AND cdpos.TABNAME = 'VBAP'
AND cdpos.FNAME = 'ABGRU'
AND cdpos.VALUE_NEW IS NOT NULL AND cdpos.VALUE_NEW <> ''; 始める準備はできましたか?
このデータテンプレートを使って、受注から入金までの受注処理を詳しく把握しましょう。業務効率の向上とキャッシュフローの改善に向けて、今すぐ始められます。
受注から入金までの受注処理を今すぐ最適化
ボトルネックを解消し、サイクルタイムを30%短縮して、キャッシュフローをすばやく改善しましょう。
クレジットカードは不要です。数分で設定できます。