本页内容
SAP采购到付款(P2P)数据提取操作指南
从SAP提取采购到付款(P2P)流程的 Process Mining 数据
为了通过 Process Mining 分析采购到付款流程(P2P),你需要从SAP系统中导出高质量的 event log。以下是常见的数据提取步骤和结构说明。
1. 明确P2P流程范围
在导出数据前,先明确你需要分析的流程步骤。标准的P2P流程通常包括:
- 采购申请(Purchase Requisition)
- 采购订单(Purchase Order)
- 收货(Goods Receipt)
- 发票入账(Invoice Receipt)
- 付款(Payment)
2. 确认核心SAP表
你通常需要从以下SAP数据表中获取数据:
| 流程步骤 | SAP表 | 描述 |
|---|---|---|
| 采购申请 | EBAN | 采购申请头表 |
| 采购订单 | EKKO / EKPO | 订单头表(EKKO)与明细表(EKPO) |
| 收货 | MKPF / MSEG | 物料凭证头表与明细行 |
| 发票入账 | BKPF / BSEG | 会计凭证头表与明细行 |
| 付款 | PAYR / REGUH | 付款凭证数据表 |
3. 确定Event Log所需字段
Process Mining 需要以下基本字段,实际可根据业务需要调整:
| Case ID | PO号/单据号 | 流程内所有event的分组依据 |
|---|---|---|
| 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视图(Core Data Services)定义逻辑模型并提取数据
- 或用SAP Fiori应用或HANA Studio执行SQL脚本
- 利用ODATA API、SAP Datasphere或SAP Data Intelligence实现更高自动化
5. 构建Event Log
Process Mining最小必备字段
| 列名 | 示例 | 示例 |
|---|---|---|
| Case ID | 流程实例唯一标识 | 采购订单号 |
| Activity | 流程步骤名称 | ”Create PO”, “Post Invoice” |
| Timestamp | 事件的日期和时间 | 2025-04-17 10:22:12 |
可选字段,让Event Log更丰富
| 字段名称 | 描述 |
|---|---|
| User | 执行操作的用户 |
| Amount | 事件对应的金额 |
| Vendor / Material | 涉及的供应商或物料 |
| Company Code | 相关公司代码 |
| Currency | 交易币种 |
| Document Type | 单据类型(如PO、GR、Invoice) |
| Other Fields | 金额、供应商、币种等其他信息 |
tip
如有需要,可将多日期字段“unpivot”为每个activity一行。
6. 数据转换与清洗
获取原始数据后,通常需将其转为适合 Process Mining 的格式。常用处理包括:
- 标准化timestamp(比如统一为UTC)
- Activity语义标签化(如将MIGO代码转为“PO Created”)
- 一行代表一个event(长格式)
- 清理NULL值与重复
- 保证Case ID全流程唯一
推荐工具:
- SQL脚本做数据处理清洗
- Excel或Power Query
- Python(Pandas库)
- KNIME、Alteryx、ETL工具等
数据清洗与准备
数据清洗与准备是数据分析流程中关键环节,需识别和纠正数据中的错误、不一致与不准确,确保数据质量与可靠性。
ABAP数据提取示例代码模板
" 用于提取P2P流程Event Log的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'. " 收货类型
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: / 'Event log exported successfully.'.
ABAP代码说明
| 部分 | 说明 |
|---|---|
| ekko | 采购订单创建头表 |
| mseg + mkpf | 用于收货(GR)数据 |
| rseg + rbkp | 用于发票入账(IR)数据 |
| OPEN DATASET | 将事件日志导出并写入服务器端CSV文件(需有权限) |
| bwart = ‘101’ | 过滤GR移动类型 |
数据提取SQL查询示例
你可以用SQL语句从相关SAP表里提取数据。以下是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'; -- 发票类型
你可将多个log union为统一的事件日志表以便于 Process Mining:
-- 合并event日志(简化版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. 导出为 Event Log
当你的结构已经统一,至少包含: • Case ID • Activity • Timestamp
专业提示
• 将所有 timestamp 规范为同一时区。 • 确保你的 Case ID 在所有 event 中一致。 • 清理测试或已取消的文档数据。 • 可用公司代码、文档类型、财年等 filter 缩小数据范围。