受注から入金まで:受注処理のデータテンプレート
受注から入金まで:受注処理のデータテンプレート
- 収集を推奨する属性
- 追跡すべき主要なアクティビティ
- SAP ECCからの抽出方法
受注から入金まで:受注処理の属性
| 名前 | 説明 | ||
|---|---|---|---|
| 受注 SalesOrder | 受注伝票を一意に識別する番号であり、受注から入金までのプロセス全体を追跡するための主要なケースIDです。 | ||
| 説明 受注は販売プロセスの中心となる伝票で、顧客が商品またはサービスを依頼したことを示します。顧客の依頼を最初から最後まで処理するために必要な情報がすべて含まれています。 プロセスマイニングでは、この属性をケースIDとして使用します。一意の受注番号が、エンドツーエンドのプロセスインスタンスを1件表します。受注単位でプロセスを分析すると、ライフサイクル全体を追跡し、サイクルタイムを測定し、顧客ごとの受注のばらつきを特定できます。 重要な理由 関連するすべてのアクティビティとイベントを結び付けるための基本キーであり、顧客の各受注について、エンドツーエンドの経過を完全に分析できます。 入手先 販売伝票ヘッダデータテーブル(VBAK)の項目VBELNにあります。 例 900001234590000123469000012347 | |||
| アクティビティ Activity | 受注プロセス内で発生した特定の業務ステップまたはイベントの名称です。 | ||
| 説明 この属性は、受注から入金までのプロセスにおける1つのステップを示します。たとえば、「受注を作成」、「納品を作成」、「入金を受領」などです。これらのアクティビティを組み合わせて、受注ごとのプロセスフローを再構成します。 これらのアクティビティの順序とタイミングを分析することが、プロセスマイニングの中心です。プロセスマップの可視化、ボトルネックの特定、プロセスバリアントの発見、標準モデルに対するコンプライアンスの確認に役立ちます。アクティビティは通常、システムに記録された伝票作成イベント、ステータス変更、特定のトランザクションコードを組み合わせて生成されます。 重要な理由 アクティビティはプロセスマップの基盤となり、プロセスフロー、逸脱、ボトルネックの可視化と分析を可能にします。 入手先 派生属性です。通常、データ抽出時に、SAPのトランザクションコード(T-Code)、伝票ステータスの変更(例: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 | |||
| 再作業フラグ IsRework | 販売注文が初回作成後に大幅な変更または再作業を受けたかどうかを示すブール型フラグです。 | ||
| 説明 「販売注文変更」アクティビティが1回以上発生した場合など、再作業が発生したプロセスインスタンスを特定する計算属性です。価格、数量、納入日など、再作業とみなす具体的な条件は、プロジェクト設定時に定義します。 「販売注文の再作業と変更頻度」ダッシュボードおよび販売注文再作業率KPIに欠かせない属性です。直接フィルタリングして、変更なしで処理された注文と手動変更が必要だった注文を比較できます。これにより、再作業がサイクルタイムとコストに与える影響を定量化できます。 重要な理由 再作業の頻度を直接定量化し、その原因とプロセス全体の効率およびサイクルタイムへの影響を分析できます。 入手先 イベントログから導出する計算属性です。「販売注文変更」アクティビティ、またはCDHDR/CDPOSテーブルの特定の変更イベントの有無を確認します。 例 truefalse | |||
| 出荷条件 ShippingConditions | 顧客への商品の納入に関する基本的な出荷方針を定義します。 | ||
| 説明 出荷条件は、注文の出荷方法を定めるものです。たとえば、「標準」、「特急」、「引き取り」などがあります。出荷条件は顧客と合意され、物流計画に影響します。 「出荷方法の効率とコスト」分析で使用する属性です。出荷条件ごとにプロセスを分けることで、特定の方法で遅延が発生しやすいか、サイクルタイムが長くなりやすいかを分析できます。このデータは、物流の改善と納入時間に関する顧客の期待値管理に役立ちます。 重要な理由 物流実績を分析し、特定の出荷方法が遅延や高い効率と関連しているかを判断できます。 入手先 販売伝票ヘッダーデータテーブル(VBAK)のVSBEDフィールドに格納されています。 例 011020 | |||
| 確定納入日 ConfirmedDeliveryDate | 商品またはサービスの納入日として、顧客に確定通知された日付です。 | ||
| 説明 資材の可用性とスケジュールに基づき、顧客に提示した納入確約日です。納入実績を測定する際の基準になります。 この属性は、「納入遵守実績」ダッシュボードと納入遵守率KPIの基盤です。確定納入日と実際の「出庫」日を比較することで、注文が予定どおり、予定より早く、または遅れて納入されたかを分析できます。サプライチェーンの信頼性と顧客満足度を測る主要な指標です。 重要な理由 納入遵守実績を測定する基準であり、顧客満足度とサプライチェーンの効率を測る重要なKPIです。 入手先 販売伝票スケジュール行テーブル(VBEP)のEDATUフィールドに格納されています。 例 2023-05-102023-06-202023-07-01 | |||
| 納入遵守フラグ IsOnTimeDelivery | 商品が確定納入日以前、または確定納入日に出荷されたかどうかを示すブール型フラグです。 | ||
| 説明 販売注文の実際の出庫日と「ConfirmedDeliveryDate」を比較する計算属性です。出庫日が確定納入日以前であればtrue、それ以外はfalseとして記録されます。 「納入遵守実績」ダッシュボードの作成と納入遵守率KPIの計算を簡単にします。分析やチャートごとに日付を都度比較する必要がなく、実績を集計して可視化できます。納入の信頼性をひと目で把握できる指標です。 重要な理由 納入実績を明確かつ簡単に測定でき、納入遵守率KPIを容易に計算できます。 入手先 計算属性です。「出庫」アクティビティのタイムスタンプと「ConfirmedDeliveryDate」属性の値を比較します。 例 truefalse | |||
受注から入金まで:受注処理のアクティビティ
| アクティビティ | 説明 | ||
|---|---|---|---|
| 入金を受領 | 顧客からの支払いを受領し、請求書に充当して未消込の売掛金明細を消し込んだことを示します。財務伝票の消込から推定される会計イベントです。 | ||
| 重要な理由 販売代金を現金化する最後のステップです。「請求から支払いまでのサイクルタイム」と、全体の「受注履行サイクルタイム」を測定する終点になります。 入手先 顧客明細のBSEGテーブルにある消込伝票情報から推定します。BSEG-AUGBL(消込伝票)とBSEG-AUGDT(消込日)に値が入力されると、入金済みと判断します。 取得 売掛金明細に対するBSEGテーブルの消込日(AUGDT)に値が入力されたことから推定します。 イベントタイプ inferred | |||
| 出庫を計上 | 商品の所有権が移転し、正式に倉庫を出たことを示す重要なイベントです。資材伝票を作成して在庫を更新する、明示的な財務計上です。 | ||
| 重要な理由 「出荷」にあたるイベントであり、納期遵守と履行リードタイムを測定するための重要なマイルストーンです。財務情報の更新を開始し、物理的な履行プロセスにおける後戻りできない時点となります。 入手先 出庫移動タイプ(例:601)を持つ資材伝票(MKPF/MSEG)が作成され、納品伝票に関連付けられます。 取得 出庫移動タイプを持つ資材伝票(MKPF/MSEG)が作成され、納品に関連付けられます。 イベントタイプ explicit | |||
| 受注を作成 | 新しい受注伝票が作成されたことを示します。通常、SAPのトランザクションVA01でユーザーが新しい受注を保存した際に記録される明示的なイベントです。 | ||
| 重要な理由 受注から入金までのプロセスにおける主要な開始イベントです。この時刻を分析することは、全体のサイクルタイムと受注率を測定するうえで重要です。 入手先 VBAKテーブル(販売伝票ヘッダデータ)に、作成日(ERDAT)と作成時刻(ERZET)を使って記録されます。トランザクションコードはVBAK-TCODEに保存されます。 取得 VBAKテーブルの作成タイムスタンプ(ERDAT、ERZET)に基づくイベントです。 イベントタイプ explicit | |||
| 受注を確認 | 受注が初期チェックをすべて通過し、履行対象として確認されたことを示します。通常、受注がブロックされておらず、納入日程行に確認済み数量がある場合に推定します。 | ||
| 重要な理由 受注入力と履行を分ける主要なマイルストーンです。履行リードタイムと納期遵守実績の測定開始点になります。 入手先 VBEPの納入日程行に確認済み数量(BMENG > 0)があり、受注が納品ブロックされていない場合(例:VBUK-LIFSKが空)に推定できます。 取得 納入日程行の確認(VBEP-BMENG > 0)とヘッダレベルのブロック解除から推定します。 イベントタイプ inferred | |||
| 受注明細をクローズ | 受注明細の最終的なクローズを示します。完全に納品・請求され、処理完了とみなされた状態です。明細全体のステータスから推定します。 | ||
| 重要な理由 プロセスが正常に終了したことを示すイベントです。明細がクローズされた時点を分析すると、エンドツーエンドの処理期間を把握し、不要にオープンのまま残る受注を特定できます。 入手先 明細のVBUPテーブル(販売伝票:明細ステータス)にある全体ステータス項目から推定します。VBUP-GBSTAが「C」(完全処理済み)になると、明細はクローズされたと判断します。 取得 明細ステータス(VBUP-GBSTA)が「C」(完全処理済み)に変わったことから推定します。 イベントタイプ inferred | |||
| 請求書を作成 | 顧客請求書または請求伝票が作成されたことを示します。システム内に新しい伝票を生成し、プロセスの支払い段階を開始する明示的なイベントです。 | ||
| 重要な理由 「請求から支払いまでのサイクルタイム」の計測開始点となる重要なマイルストーンです。請求の遅延はキャッシュフローに直接影響します。 入手先 VBRKテーブル(請求伝票:ヘッダデータ)に、作成日(ERDAT)に基づいて記録されます。受注または納品とのリンクはVBFAテーブルにあります。 取得 VBRKテーブルの作成タイムスタンプ(ERDAT)に基づくイベントです。 イベントタイプ explicit | |||
| ピッキングを完了 | 納品に含まれるすべての品目が倉庫から物理的にピッキングされたことを示します。Warehouse Management(WM)を使用している場合は、Transfer Orderのステータスから推定できます。 | ||
| 重要な理由 ピッキング時間を分析すると、倉庫業務を最適化できます。この段階の遅延は、出荷全体のスケジュールと履行サイクルに直接影響します。 入手先 LIPSテーブルの納品明細にあるピッキングステータスLIPS-KOSTAが「C」(完全ピッキング)に変わったことから推定します。WMが有効な場合は、Transfer Orderの確認(LTAK/LTAPテーブル)から推定できます。 取得 ピッキングステータス(LIPS-KOSTA)の変更、またはWM Transfer Orderの確認から推定します。 イベントタイプ inferred | |||
| 与信チェックを実施 | 受注に対する顧客の自動または手動の与信チェックが完了したことを示します。通常、伝票全体の与信ステータスの変更から推定します。 | ||
| 重要な理由 与信チェックは、しばしば重要なボトルネックになります。このステップにかかった時間を測定することは、「与信チェック処理時間分析」と受注処理の迅速化に欠かせません。 入手先 VBUKテーブル(販売伝票:ヘッダステータス)の与信ステータス項目から推定します。VBUK-CMGSTがブロックからリリース済みに変わると、このアクティビティが記録されます。 取得 全体の与信ステータス項目(VBUK-CMGST)の変更から推定します。 イベントタイプ inferred | |||
| 受注を取り消し | 履行前に受注が取り消されたことを示します。通常、受注の対象となるすべての明細に「拒否理由」を設定することで取得されます。 | ||
| 重要な理由 「受注取消率」KPIに直接関係する、重大な失敗の終点です。受注がいつ、なぜ取り消されたかを把握すると、販売プロセスの問題を明らかにできます。 入手先 受注のすべての有効な明細でVBAP-ABGRU(拒否理由)項目に値が入力されたことから推定します。変更日はCDHDR/CDPOSで確認できます。 取得 すべての明細に「拒否理由」項目(VBAP-ABGRU)が入力されたことから推定します。 イベントタイプ inferred | |||
| 受注を変更 | 初回作成後に既存の受注へ加えられた変更を示します。数量、価格、日付などの項目が変更された際に、専用の変更ログテーブル(CDHDR、CDPOS)へ記録されます。 | ||
| 重要な理由 変更を追跡すると、手戻り、プロセスの不安定さ、データ品質の問題を特定できます。変更頻度が高い場合、受注入力の初期段階に問題があり、遅延につながっている可能性があります。 入手先 OBJECTCLAS = 'VERKBELEG'の変更文書テーブルCDHDR(ヘッダ)およびCDPOS(明細)から取得します。タイムスタンプと変更された項目を特定できます。 取得 販売伝票オブジェクトの変更文書テーブル(CDHDR、CDPOS)から取得されるイベントです。 イベントタイプ explicit | |||
| 納品ブロックを設定 | 受注に納品ブロックを設定し、納品伝票の作成を防ぐ操作を示します。変更ログから明示的に取得するか、ステータステーブルから推定できます。 | ||
| 重要な理由 このアクティビティは「受注ブロック率」KPIに直接関係します。ブロックが設定された理由と頻度を特定すると、履行遅延の原因を明らかにできます。 入手先 項目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 | |||
抽出ガイド
ステップ
- プログラムを開発:トランザクションSE38またはSE80を使い、新しい実行可能ABAPプログラムを作成します。このプログラムに抽出処理全体を実装します。
- 選択画面を定義:プログラム内にデータを絞り込むための選択画面を作成します。販売伝票作成日(VBAK-ERDAT)、販売組織(VBAK-VKORG)、販売伝票タイプ(VBAK-AUART)のパラメーターを含めます。これにより、抽出を繰り返し実行しやすくなります。
- データを宣言:SAPの各種テーブル(VBAK、VBAP、VBFA、CDHDR、CDPOS、VBRK、BSADなど)のデータを保持する内部テーブルと構造を定義します。必要な属性に一致する最終出力用のイベントログ構造も定義します。
- 基礎となる受注を選択:選択画面で指定された条件に基づき、受注ヘッダー(VBAK)と明細(VBAP)を取得する初期SELECT文を記述します。これが分析対象ケースの基礎データになります。
- 「作成」イベントを抽出:選択したVBAKレコードをループ処理します。各レコードについて、VBAK-ERDATとVBAK-ERZETをStartTimeに設定し、イベントログ構造に「Sales Order Created」アクティビティを登録します。
- 変更履歴イベントを抽出:選択した受注について、OBJECTCLASが「VERKBELEG」であるCDHDRおよびCDPOSのレコードを選択します。結果をループ処理し、特定のフィールド変更を特定します。たとえば、VBAK-LIFSKの変更は「Delivery Block Set」、VBUK-CMGSTの変更は「Credit Check Performed」として記録します。その他の関連する変更は「Sales Order Changed」として記録できます。
- 伝票フローデータを抽出:選択した受注について、伝票フローテーブル(VBFA)を照会します。このテーブルは、受注と納品、出庫、請求などの後続伝票を関連付けます。関連するすべての伝票を選択し、後続処理に使用します。
- 納品・履行イベントを抽出:VBFAから取得した納品伝票番号を使い、LIKPとLIPSを照会して「Delivery Created」イベントを取得します。出庫伝票(移動タイプ「601」)を取得するためにMKPFとMSEGを照会し、「Goods Issued」イベントを記録します。Warehouse Managementが有効な場合は、LTAKとLTAPを照会し、最後の転送指図明細の確認時刻を取得して「Picking Completed」を判定します。納品ヘッダーステータスVBUK-PODATを確認し、「Proof of Delivery Confirmed」を記録します。
- 請求・支払いイベントを抽出:VBFAから取得した請求伝票番号を使い、VBRKとVBRPを照会して「Invoice Created」および「Invoice Cancelled」(VBRK-FKSTO =「X」の場合)イベントを取得します。「Payment Received」を特定するには、VBRKの請求伝票をBKPFの会計伝票に関連付け、BSADから消込伝票と消込日を取得します。
- ステータスに基づくイベントを抽出:明細ステータスのVBUPとヘッダーステータスのVBUKを使い、業務イベントを推定します。たとえば、VBUP-GBSTAが「C」の場合、明細は「Order Item Closed」とみなします。関連するすべての明細に「Reason for Rejection」(VBAP-ABGRU)が設定されている場合、受注は「Order Cancelled」とみなします。
- 統合して整形:取得したすべてのイベントを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)で変更ログが有効になっていることを確認してください。トランザクションSCDOでオブジェクトVERKBELEGを確認できます。
a サンプルクエリ 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スクリプトの取得:このドキュメントの「query」セクションに記載された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など、すべてのテーブルへのアクセス権限が必要です。
a サンプルクエリ 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%短縮して、キャッシュフローを迅速に改善します。
クレジットカードは不要です。数分でセットアップできます。