本页内容
从SAP提取采购到付款(P2P)数据方法指南
SAP采购到付款(P2P)流程数据提取方案
如需用Process Mining分析P2P流程,需从SAP导出高质量event log。以下为常见步骤和结构说明。
1. 明确P2P流程范围
在数据提取前,先明确要分析的流程节点。标准P2P流程包括:
- 采购申请(Purchase Requisition)
- 采购订单(Purchase Order)
- 收货(Goods Receipt)
- 发票接收(Invoice Receipt)
- 付款(Payment)
2. 确定主要SAP表
通常从以下SAP表提取数据:
流程步骤 | SAP表 | 说明 |
---|---|---|
Purchase Requisition | EBAN | 采购申请头 |
Purchase Order | EKKO / EKPO | 采购订单头(EKKO)、明细(EKPO) |
Goods Receipt | MKPF / MSEG | 物料凭证头及明细 |
Invoice Receipt | BKPF / BSEG | 会计凭证头及明细 |
Payment | PAYR / REGUH | 付款单相关表 |
3. 确定 Event Log 必须字段
以下字段通常为 Process Mining 所需。可根据实际需要调整。
Case ID | 采购单号 / 文档编号 | 将所有 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 程序做多表 join、筛选,导出相关 event 数据。
- 结果可导出为 CSV 或平面文件。
SAP S/4HANA(HANA 平台)
- 用 CDS View(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 | Event 日期和时间 | 2025-04-17 10:22:12 |
可选字段(丰富 Event Log):
字段名 | 说明 |
---|---|
User | 执行动作的用户 |
Amount | Event 关联金额 |
Vendor / Material | Event 相关供应商或物料 |
Company Code | Event 所属公司代码 |
Currency | 交易币种 |
Document Type | 文档类型(如 PO、GR、Invoice) |
Other Fields | 其他指标(Amount、Vendor、Currency 等) |
tip
如存在多个日期字段,可用 unpivot 转为每个 activity 一行,便于分析。
6. 转换与清洗数据
获取原始数据后,需转换为适合 process mining 的结构,通常包含:
- 统一时间戳(如转为 UTC)
- 步骤命名清晰(如用“PO Created”代替系统代码)
- 长格式,每个 event 一行
- 清理 NULL 值和重复数据
- Case ID 唯一
常用工具:
- SQL 脚本清洗与转换
- Excel 或 Power Query
- Python + Pandas
- KNIME、Alteryx、ETL 工具
数据清洗与准备
数据清洗与准备是数据分析流程的关键环节,主要包括识别并修正数据错误、不一致性和不准确性,确保数据可靠。
ABAP 数据提取代码模板示例
" ABAP 示例代码:用于提取 Purchase-to-Pay Event Log 数据
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. 提取采购订单(PO)创建
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 document type
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 | PO 创建表头数据 |
mseg + mkpf | 用于收货(GR)记录 |
rseg + rbkp | 用于发票(IR)记录 |
OPEN DATASET | 将 Event Log 以 CSV 格式写入服务器(需检查权限) |
bwart = ‘101’ | 过滤 GR 相关类型 |
SQL 查询示例:帮助理解数据提取过程
可通过 SQL 查询从相关表中提取。以下为 P2P 流程各步骤示例,可根据项目和 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'; -- 标准 PO 类型
-- 收货记录
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'; -- 发票类型
可将上述 logs 合并为统一 Event Log 表用于 process mining:
-- 合并 Event Log(简化 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 缩小数据范围。