文档列表
本页内容

SAP采购到付款(P2P)数据提取操作指南

从SAP提取采购到付款(P2P)流程的 Process Mining 数据

为了通过 Process Mining 分析采购到付款流程(P2P),你需要从SAP系统中导出高质量的 event log。以下是常见的数据提取步骤和结构说明。

1. 明确P2P流程范围

在导出数据前,先明确你需要分析的流程步骤。标准的P2P流程通常包括:

  1. 采购申请(Purchase Requisition)
  2. 采购订单(Purchase Order)
  3. 收货(Goods Receipt)
  4. 发票入账(Invoice Receipt)
  5. 付款(Payment)

2. 确认核心SAP表

你通常需要从以下SAP数据表中获取数据:

流程步骤SAP表描述
采购申请EBAN采购申请头表
采购订单EKKO / EKPO订单头表(EKKO)与明细表(EKPO)
收货MKPF / MSEG物料凭证头表与明细行
发票入账BKPF / BSEG会计凭证头表与明细行
付款PAYR / REGUH付款凭证数据表

3. 确定Event Log所需字段

Process Mining 需要以下基本字段,实际可根据业务需要调整:

Case IDPO号/单据号流程内所有event的分组依据
Activity衍生,例如“PO Created”流程步骤名称
TimestampAEDAT, BUDAT, CPUDT步骤发生时间
User/AgentERNAM, USNAM等执行操作的用户
AmountWRBTR, DMBTR金额/数值
Vendor / MaterialLIFNR, 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 缩小数据范围。