SAPからP2Pデータ抽出方法とプロセスマイニング
購買から支払い(P2P)プロセス向けSAPデータ抽出ガイド
Process Miningで購買から支払い(P2P)プロセスを分析するには、SAPから高品質なイベントログを抽出する必要があります。以下は一般的な手順とデータ構造です。
1. P2Pプロセスのスコープ定義
データ抽出前に、対象となるプロセスステップを明確にしましょう。標準的なP2Pプロセスは以下で構成されます:
- Purchase Requisition(購買依頼)
- Purchase Order(購買発注)
- Goods Receipt(入荷受付)
- Invoice Receipt(請求書受領)
- Payment(支払い)
2. 主要なSAPテーブルの特定
通常は下記のテーブルからデータを抽出します:
| プロセスステップ | SAPテーブル | 説明 |
|---|---|---|
| Purchase Requisition | EBAN | 購買依頼ヘッダー |
| Purchase Order | EKKO / EKPO | 発注書ヘッダー(EKKO)&明細(EKPO) |
| Goods Receipt | MKPF / MSEG | 物品移動ヘッダー&明細 |
| Invoice Receipt | BKPF / BSEG | 会計伝票ヘッダー&明細 |
| Payment | PAYR / REGUH | 支払伝票 |
3. イベントログに必要なフィールドの特定
Process Mining用のイベントログには以下のフィールドが必要です。用途に応じて調整してください。
| Case ID | PO番号 / ドキュメント番号 | 1つのプロセス内のイベントをグループ化 |
|---|---|---|
| Activity | 派生値(例: “PO Created”) | プロセスステップ名 |
| Timestamp | AEDAT, BUDAT, CPUDT | ステップ実施日時 |
| User/Agent | ERNAM, USNAM など | 実行者 |
| Amount | WRBTR, DMBTR | ステップに関連した金額 |
| Vendor / Material | LIFNR, MATNR | 取引先または品目情報 |
4. 生データの抽出
SAP ECC(ABAPスタック)
- 関連テーブルからABAPレポートで直接データを抽出
- またはカスタムABAPプログラムでイベントデータを結合・フィルタ・エクスポート
- 結果はCSVやフラットファイルで出力可能
SAP S/4HANA(HANAスタック)
- CDS View(Core Data Services)で論理モデルを定義しデータ抽出
- SAP FioriアプリやHANA StudioでSQLスクリプトを実行
- ODATA API、SAP Datasphere、SAP Data Intelligenceと連携し自動化も可能
5. イベントログの作成
Process Miningに必須な最小カラム:
| カラム名 | 説明 | 例 |
|---|---|---|
| Case ID | プロセスインスタンスの一意識別子 | Purchase Order ID |
| Activity | プロセスステップ名 | ”Create PO”, “Post Invoice” |
| Timestamp | イベント発生日時 | 2025-04-17 10:22:12 |
ログを拡張するオプションカラム例:
| カラム名 | 説明 |
|---|---|
| User | アクションを実行したユーザー |
| Amount | 金額などの数値 |
| Vendor / Material | イベント対象の取引先または品目 |
| Company Code | 会社コード |
| Currency | 通貨 |
| Document Type | ドキュメント種別 (PO, GR, Invoiceなど) |
| Other Fields | Amount, Vendor, Currency など |
tip
必要に応じて、複数の日付フィールドを1アクティビティ1行にUnpivot(列→行変換)しましょう。
6. データの変換とクレンジング
生データを取得したら、Process Mining用の形式に整形します。主な作業は:
- timestampの正規化(例:UTC変換)
- 活動名の分かりやすいラベル付け(例:MIGOコード→“PO Created”)
- 1イベント1行(ロング形式)での整形
- NULL値や重複データをクレンジング
- Case IDの一貫性(インスタンスごとに一意)
活用できる主なツール:
- SQLスクリプト
- ExcelやPower Query
- Python(Pandas)
- KNIME、AlteryxなどETLツール
データ分析プロセスにおいて、データクレンジングと準備は重要なステップです。データ品質と信頼性を高めるために、エラーや不整合、誤りを特定し修正します。
データ抽出用ABAPコード例
" 購買から支払いイベントログ抽出のABAPサンプルコード
REPORT z_p2p_event_log_export.
TABLES: ekko, ekpo, mseg, mkpf, rbkp, rseg.
DATA: BEGIN OF event_log OCCURS 0,
case_id TYPE ekko-ebeln,
activity TYPE char40,
timestamp TYPE sy-datum,
username TYPE sy-uname,
amount TYPE ekpo-netwr,
END OF event_log.
START-OF-SELECTION.
" 1. 発注書作成の抽出
SELECT ebeln aedat ernam netwr
INTO (event_log-case_id, event_log-timestamp, event_log-username, event_log-amount)
FROM ekko
WHERE aedat >= '20240101'.
event_log-activity = 'Create Purchase Order'.
APPEND event_log.
ENDSELECT.
" 2. 入荷受付(MIGO)の抽出
SELECT mblnr budat usnam ebeln
INTO (event_log-case_id, event_log-timestamp, event_log-username, event_log-amount)
FROM mseg
INNER JOIN mkpf ON mseg~mblnr = mkpf~mblnr
WHERE bwart = '101' AND budat >= '20240101'. " GRドキュメントタイプ
event_log-activity = 'Goods Receipt'.
APPEND event_log.
ENDSELECT.
" 3. 請求書計上(MIRO)の抽出
SELECT ebeln bldat usnam wrbtr
INTO (event_log-case_id, event_log-timestamp, event_log-username, event_log-amount)
FROM rseg
INNER JOIN rbkp ON rseg~belnr = rbkp~belnr
WHERE bldat >= '20240101'.
event_log-activity = 'Invoice Posted'.
APPEND event_log.
ENDSELECT.
" 4. 結果ファイル出力(権限があれば実施)
DATA: filename TYPE string VALUE '/usr/sap/tmp/p2p_event_log.csv',
file TYPE string,
rc TYPE i.
OPEN DATASET filename FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
LOOP AT event_log.
CONCATENATE event_log-case_id
event_log-activity
event_log-timestamp
event_log-username
event_log-amount
INTO file SEPARATED BY ';'.
TRANSFER file TO filename.
ENDLOOP.
CLOSE DATASET filename.
WRITE: / 'イベントログのエクスポートが完了しました。'.
ABAPコードの補足
| セクション | 目的 |
|---|---|
| ekko | 発注書作成ヘッダテーブル |
| mseg + mkpf | 入荷受付(GR)の明細・ヘッダー |
| rseg + rbkp | 請求書受領(IR)の明細・ヘッダー |
| OPEN DATASET | イベントログをサーバのCSVファイルとして出力(要権限) |
| bwart = ‘101’ | 入荷受付用ムーブメントタイプのフィルタ |
データ抽出用SQLクエリ例
各P2Pプロセスステップごとに、下記のSQLサンプルクエリでデータを抽出できます。要件やSAPバージョンにあわせて調整してください。
シンプルなサンプル:
-- 発注書作成
SELECT
EKKO.EBELN AS CaseID,
'PO Created' AS Activity,
EKKO.AEDAT AS Timestamp,
EKKO.ERNAM AS User,
EKKO.LIFNR AS Vendor,
EKKO.WAERS AS Currency,
EKKO.BUKRS AS CompanyCode
FROM EKKO
WHERE EKKO.BSART = 'NB'; -- 標準発注タイプ
-- 入荷受付
SELECT
MSEG.EBELN AS CaseID,
'Goods Receipt' AS Activity,
MKPF.BUDAT AS Timestamp,
MKPF.USNAM AS User,
MSEG.MATNR AS Material,
MSEG.MENGE AS Quantity
FROM MSEG
JOIN MKPF ON MSEG.MBLNR = MKPF.MBLNR
WHERE MSEG.BEWTP = 'R'; -- 入庫タイプ
-- 請求書受領
SELECT
BSEG.BELNR AS CaseID,
'Invoice Posted' AS Activity,
BKPF.BUDAT AS Timestamp,
BKPF.USNAM AS User,
BSEG.WRBTR AS Amount
FROM BSEG
JOIN BKPF ON BSEG.BELNR = BKPF.BELNR
WHERE BKPF.BLART = 'RE'; -- 請求書タイプ
これらのログを1つのイベントログテーブルに統合してProcess Miningに活用できます:
-- 各イベントログの結合(UNIONの単純例)
SELECT * FROM (
SELECT 'PO Created' AS Activity, EBELN AS CaseID, AEDAT AS Timestamp FROM EKKO
UNION
SELECT 'Goods Receipt', EBELN, BUDAT FROM MSEG JOIN MKPF ON MSEG.MBLNR = MKPF.MBLNR
UNION
SELECT 'Invoice Posted', BELNR, BUDAT FROM BKPF
) AS EventLog
ORDER BY CaseID, Timestamp;
7. イベントログとしてエクスポート
最低限、以下を含む統一データ構造が準備できたら: • Case ID • Activity • Timestamp
プロのヒント
• timestamp を同一タイムゾーンに正規化しましょう。 • すべての event で Case ID に一貫性があるか確認します。 • テストやキャンセル済みドキュメントはクリーンアップします。 • 会社コード・ドキュメントタイプ・会計年度などでフィルタできます。