您的薪资处理数据模板
您的薪资处理数据模板
- 用于薪资分析的战略数据字段
- 用于流程发现的关键里程碑
- 系统专属提取指南
薪资处理属性
| 名称 | 说明 | ||
|---|---|---|---|
| 事件时间戳 EventTimestamp | 活动发生的准确日期和时间。 | ||
| 说明 此属性记录事件发生的准确时刻,同时保存日期和时间。它是计算所有基于时间的指标的基础,包括不同流程阶段之间的周期时间、交付周期和吞吐率。 在SAP ECP中,数据来源包括变更文档中的 为什么重要 它支持计算事件之间的持续时间,对于识别性能瓶颈和SLA违约至关重要。 获取位置 CDHDR-UDATE/UTIME、SWWLOGHIST-WI_CD/WI_CT或特定审计日志时间戳。 示例 2023-10-25T08:30:00Z2023-10-26T14:15:22Z2023-11-01T09:00:00Z | |||
| 工资记录 PayrollRecord | 由员工和工资期间组合而成的唯一标识符。 | ||
| 说明 Payroll Record充当流程挖掘分析的中心案例标识符。它代表特定员工在指定工资期间内的一次工资处理,连接从初始工时表提交到最终税务申报的所有活动。 在SAP SuccessFactors Employee Central Payroll中,通常将Personnel Number(PERNR)、Payroll Year(PABRJ)和Payroll Period(PABRP)拼接而成,也可能加入用于区分多次运行的序列号(SEQNR)。这种粒度可确保将每个付款周期作为独立实例进行分析,从而准确衡量周期时间并跟踪错误。 为什么重要 它作为Case ID,将相关事件归入同一案例,以重建每笔工资发放的端到端流程路径。 获取位置 由SAP Cluster B2(Time Evaluation Results)或PC_PAYRESULT表(PERNR、PABRJ、PABRP、SEQNR)构建。 示例 10023499-2023-1088291022-2024-01-SEQ01US-10293-2023-52 | |||
| 活动 Activity | 工资流程中发生的具体任务或事件。 | ||
| 说明 此属性记录正在执行的流程步骤名称,例如“工时表已提交”“工资模拟已执行”或“付款已执行”。它构成流程图的基础,使分析人员能够直观查看工资周期中的操作顺序。 此属性的数据来自多个日志,包括Workflow日志(SWWLOGHIST)、Infotype变更日志(CDHDR/CDPOS)以及特定的工资状态表。提取过程中采用统一命名规范,确保技术事件代码转换为业务可读的活动名称。 为什么重要 它定义流程图中的节点,从而实现流程顺序、循环和流程变体的可视化。 获取位置 来源于SWWLOGHIST(Workflow)、CDHDR(Change Documents)或PA03(Control Record)的状态变更。 示例 工时表已提交应发工资已计算审计例外已标记付款已执行 | |||
| 最后数据更新时间 LastDataUpdate | 最近一次数据提取的时间戳。 | ||
| 说明 此属性表示数据记录在流程挖掘数据模型中最近一次刷新的时间。它有助于分析人员了解数据的新鲜度,并确保分析结果基于当前信息。 虽然该属性不直接用于流程分析,但对于数据治理和验证至关重要,可用于确认仪表板反映的是薪资系统的最新状态。 为什么重要 它确保用户了解数据延迟,并帮助验证报告指标是否为最新。 获取位置 由ETL/提取脚本在运行时生成。 示例 2023-11-05T00:00:00Z2023-11-05T12:00:00Z | |||
| 源系统 SourceSystem | 事件数据产生的系统。 | ||
| 说明 此属性标识提取数据的SAP SuccessFactors Employee Central Payroll实例或连接的子系统。在包含多个工资系统或采用混合架构的复杂环境中,该字段可确保数据沿袭和可追溯性。 在分析不同区域部署的数据,或比较旧系统与迁移后系统的性能时,该属性尤其有用。通常,它是在数据提取设置期间配置的静态字符串。 为什么重要 它支持多系统环境中的数据分段,并可通过定位数据来源帮助排查数据质量问题。 获取位置 SAP安装或提取配置中的系统ID(SID)。 示例 SAP_ECP_NASAP_ECP_EMEASuccessFactors_Core | |||
| 员工类型 EmployeeType | 员工分类(例如正式员工、合同工)。 | ||
| 说明 此属性根据员工的雇佣关系对其进行分类,例如在职员工、退休员工或承包商。薪资处理复杂度的差异通常与员工类型相关,某些群体可能需要更多人工干预或特定的一致性检查。 该属性在SAP中取自Employee Group( 为什么重要 它帮助识别流程变体或延迟是否仅出现在某些雇佣类别中。 获取位置 PA0001表,字段PERSG(组)和PERSK(子组)。 示例 在职员工实习生退休人员小时工承包商 | |||
| 工资专员 PayrollSpecialist | 处理该记录人员的用户ID或姓名。 | ||
| 说明 此属性记录负责执行人工步骤或审批的工资管理员或专员身份。它是“专员吞吐量与工作负载”仪表板的核心属性,可用于分析工作量分配和个人生产率。 数据来源于系统日志中的 为什么重要 它对于平衡工作负载和识别流程中的人工瓶颈至关重要。 获取位置 CDHDR中记录的系统字段(SY-UNAME)或Workflow Actor ID。 示例 JSMITHKMILLERSYSTEM | |||
| 工资周期频率 PayCycleFrequency | 表示本次运行是常规运行还是非周期运行。 | ||
| 说明 此属性区分按计划执行的标准工资运行与用于更正或即时付款的临时“非周期”运行。非周期运行量较高是流程效率低下的重要指标,“非周期付款量分析”仪表板会对其进行跟踪。 该属性来源于工资集群目录中的Off-Cycle Reason( 为什么重要 它对于衡量“非周期付款比例”KPI以及减少非标准处理至关重要。 获取位置 RGDIR表(集群目录),字段OCRSN或PAYTY。 示例 常规更正A奖金支付离职 | |||
| 工资总额 GrossPayAmount | 该记录计算出的工资总额。 | ||
| 说明 此属性表示扣除前的工资总金额。它是财务验证的基础指标,也用于分析高额付款是否会带来更严格的审计或更长的审批周期。 数据提取自工资结果表(RT),通常对应代表工资总额的特定工资类型(例如/101)。它为“福利与税费计算准确性”分析提供计算基础。 为什么重要 它支持按付款金额分析流程行为,例如金额较大的付款是否需要更长审批时间。 获取位置 工资结果表(RT),工资类型/101或类似类型。 示例 5000.002500.5010500.00 | |||
| 工资期间 PayPeriod | 财年内的具体期间编号。 | ||
| 说明 此属性表示工资期间的顺序编号(例如01表示一月或第一个双周周期)。它帮助分析人员跟踪一段时间内的性能趋势,并识别处理工作量的季节性变化。 该属性来源于 为什么重要 它支持趋势分析,并帮助识别一年中特定时段的季节性瓶颈。 获取位置 PA0001表或工资结果集群(RGDIR),字段PABRP。 示例 01122652 | |||
| 工资范围 PayrollArea | 定义员工所属的具体工资组。 | ||
| 说明 Payroll Area将同一工资运行中一并处理的员工归为一组,通常依据发薪频率(例如按月或每两周)或组织结构划分。该属性对于按不同员工群体细分流程分析、比较处理性能至关重要。 在SAP中,它对应技术字段 为什么重要 它支持比较不同群体(例如计时工与薪资制员工)的工资周期性能。 获取位置 PA0001表(组织分配),字段ABKRS。 示例 美国双周薪资德国月度薪资高管工资 | |||
| 成本中心 CostCenter | 与员工关联的成本中心。 | ||
| 说明 Cost Center表示分摊员工成本的财务部门或单位。在“工时表审批瓶颈”仪表板中,它可作为部门的代理维度,帮助定位导致工资周期延迟的组织单位。 该字段位于组织分配信息类型(PA0001)中,字段为 为什么重要 它支持按组织逐级下钻,识别导致延迟或返工的具体部门。 获取位置 PA0001表,字段KOSTL。 示例 CC-1000 财务CC-2000 ITCC-3000 销售 | |||
| 是否自动化 IsAutomated | 表示活动是否由系统用户执行的标记。 | ||
| 说明 此布尔属性用于识别某个流程步骤是由后台作业或系统用户执行,还是由人工执行。它对于“银行转账自动化监控”至关重要,可用于计算无人工触碰处理的比例。 通常通过将用户ID与已知系统账户列表进行比对来推导,例如“BATCH”“SAP_WORKFLOW”。 为什么重要 它帮助衡量自动化率,并识别减少人工投入的机会。 获取位置 由用户ID推导,例如User IN ['BATCH', 'SYSTEM']时为true。 示例 truefalse | |||
| SLA处理截止时间 SLAProcessingDeadline | 完成工资运行的目标时间戳。 | ||
| 说明 此属性表示完成工资处理、确保按时发薪所需遵守的内部或外部截止时间。通过与实际“付款已执行”时间戳比较,可计算“SLA合规率”KPI。 它并不总是SAP表中的标准字段,通常维护在自定义控制表中,或根据工资日历进行概念定义(例如发薪日前2天)。在此数据模型中,通常由发薪日减去预设缓冲时间推导得出。 为什么重要 它为评估及时性和SLA遵循情况提供基准。 获取位置 由发薪日(T549S)减去配置的处理天数推导。 示例 2023-10-28T17:00:00Z2023-11-28T17:00:00Z | |||
| 审计例外标记 AuditExceptionFlag | 表示是否发生审计例外的标记。 | ||
| 说明 此属性标记工资模拟或计算期间验证规则触发例外或警告的案例。它是“审计例外频率”KPI的主要输入。 数据通常来源于工资日志或特定错误消息表(FEHLER)。值为true表示流程路径包含例外处理。 为什么重要 它突出显示数据质量问题以及人工干预需求。 获取位置 根据工资日志中是否存在错误消息或特定状态代码推导。 示例 truefalse | |||
| 法人实体 LegalEntity | 员工所属的公司代码或法人实体。 | ||
| 说明 此属性标识与工资记录关联的法人实体(公司代码)。它支持跨不同子公司或企业实体进行财务报告和工资性能分析。 数据来源于组织分配信息类型(PA0001)中的 为什么重要 它支持跨公司基准比较和财务分摊分析。 获取位置 PA0001表,字段BUKRS。 示例 US01DE011000 | |||
| 税务管辖区 TaxJurisdiction | 适用于该员工的税务区域或税务机关。 | ||
| 说明 此属性标识管理该工资记录的具体税务机关或区域(例如州、省或州属)。它对于“审计例外与合规风险”仪表板按地理位置定位合规问题至关重要。 在SAP美国工资系统中,它对应 为什么重要 它支持按监管区域细分合规风险和审计例外。 获取位置 PA0001或PA0207/PA0208表,字段TXJCD。 示例 CANYTXNRW | |||
| 返工次数 ReworkCount | 执行更正的次数。 | ||
| 说明 此计算指标统计案例历史中“已执行数据更正”活动出现的次数。它直接衡量流程效率低下程度,并支持“人工更正与返工率”仪表板。 返工次数较高通常表示存在持续的数据质量问题,或案例较复杂,无法通过首次验证。 为什么重要 它量化错误更正所耗费的工作量,并帮助论证数据质量改进工作的必要性。 获取位置 通过统计每个CaseId的“已执行数据更正”活动计算。 示例 013 | |||
薪资处理活动
| 活动 | 说明 | ||
|---|---|---|---|
| 付款已执行 | 付款流程完成,通常由银行确认或F110付款运行完成确认。 | ||
| 为什么重要 作为SLA Compliance Rate的主要结束时间戳,用于判断员工是否按时收到工资。 获取位置 付款运行表(REGUH)中的运行日期和时间,或根据Value Date推断。 采集 付款运行状态设为Posted或Complete时记录 事件类型 explicit | |||
| 工时表已审批 | 管理者或管理员对工时数据进行正式审批。该状态变化确认数据可以传输至工资引擎。 | ||
| 为什么重要 用于计算Time Sheet Approval Lead Time KPI。此处的瓶颈通常表示管理者延迟或审批层级复杂。 获取位置 Employee Central工作流请求表(WfRequest),筛选状态为COMPLETED或APPROVED的记录。 采集 工作流状态变为APPROVED时记录 事件类型 explicit | |||
| 工时表已提交 | 员工或管理者为工资周期提交工时数据的事件。该事件从与ECP关联的Employee Central模块工作流请求日志中采集。 | ||
| 为什么重要 标志着数据汇总阶段开始。此处的延迟会向下游传导,压缩工资处理窗口。 获取位置 Employee Central工作流请求表(WfRequest),筛选Time Sheet或Time Off类别。 采集 工作流状态变为SUBMITTED时记录 事件类型 explicit | |||
| 工资模拟已执行 | 运行工资驱动程序进行测试,在不将结果写入数据库的情况下识别错误。这是PCC验证阶段的关键步骤。 | ||
| 为什么重要 用于计算First-Pass Calculation Rate。重复模拟通常表示数据质量问题。 获取位置 Payroll Control Center步骤实例日志(PYC_D_STEP_INST),其中步骤类型对应Simulation。 采集 PCC Simulation Step状态变为COMPLETED时记录 事件类型 explicit | |||
| 工资流程已初始化 | 在Payroll Control Center(PCC)中创建工资流程实例。这标志着特定工资区域工资周期正式开始。 | ||
| 为什么重要 为整体End to End Payroll Cycle Duration设定基准,并确定待处理员工范围。 获取位置 Payroll Control Center表(例如PYC_D_PY_PROC_INST),用于跟踪新流程ID的创建。 采集 PCC流程实例创建时记录 事件类型 explicit | |||
| 工资记录已审批 | 对员工或工资组工资结果的正式签字确认。该操作发生在PCC的“Monitoring”或“Sign Off”步骤。 | ||
| 为什么重要 标志着计算和验证阶段结束,并获准付款。对Specialist Throughput分析至关重要。 获取位置 Payroll Control Center步骤实例日志(PYC_D_STEP_INST)中的Approval或Confirmation步骤。 采集 PCC Approval Step状态变为COMPLETED时记录 事件类型 explicit | |||
| 应发工资已计算 | 成功执行工资总额计算方案。在标准处理中,这通常发生在工资驱动程序写入PCL2集群时。 | ||
| 为什么重要 这是一个重要里程碑,表示工时和费率数据已成功合并。此处的延迟会影响Gross to Net Processing Efficiency。 获取位置 PCL2集群(Payroll Results),具体为目录表(RGDIR)中“For-Period”的时间戳。 采集 向工资集群写入新序列号时记录 事件类型 explicit | |||
| 税务申报已完成 | 生成税务申报文件(例如美国的PU19),或将文件传输至第三方税务申报服务商。 | ||
| 为什么重要 确保监管合规,并跟踪流程中的最终合规步骤。 获取位置 Tax Reporter Log Manager或B2A(Business to Administration)Manager日志,显示文件已成功生成。 采集 Tax Reporter运行成功完成时记录 事件类型 explicit | |||
| 银行转账文件已生成 | 创建初步数据交换介质(pre-DME)或最终DME文件,为银行生成付款指令。 | ||
| 为什么重要 用于跟踪Bank Transfer Automation Monitor。文件生成失败属于关键流程中断。 获取位置 DME或Payment Medium Workbench(PMW)执行日志,通常存储在TemSe或特定付款运行表(ReguH/ReguP)中。 采集 付款运行(F110/RPCIPE)生成输出时记录 事件类型 explicit | |||
| 审计例外已标记 | Payroll Control Center策略检查生成验证提醒。这些提醒用于识别数据不一致或合规风险。 | ||
| 为什么重要 直接支持Audit Exception Frequency和Compliance Risk仪表板。数量较多通常说明上游数据质量存在问题。 获取位置 Payroll Control Center提醒表(PYC_D_ALERT),将具体错误代码与员工记录关联。 采集 PCC提醒表中创建新条目时记录 事件类型 explicit | |||
| 工资单已发布 | 通过Self-Service(ESS)向员工提供薪酬明细单。 | ||
| 为什么重要 用于衡量Pay Slip Delivery SLA Performance。此处的延迟会产生服务台工单。 获取位置 根据Pay Slip mashup服务日志中的“Print Date”或可用日期配置推断。 采集 根据Pay Date加系统配置延迟计算 事件类型 inferred | |||
| 已执行数据更正 | 针对审计例外对主数据或时间数据进行的修改。这代表为清除工资提醒而执行的返工。 | ||
| 为什么重要 用于跟踪Manual Correction和Rework Rate。这是导致流程低效的主要活动。 获取位置 通过将PCC提醒时间戳与提醒关闭前同一员工后续的审计日志变更(PCL4)关联推断得出。 采集 识别PCC提醒处于活动状态期间发生的主数据更新 事件类型 inferred | |||
| 激励薪酬数据已导入 | 将奖金或佣金等非标准薪酬数据导入工资系统。通常包括将数据加载到Infotype 0015或2010。 | ||
| 为什么重要 延迟导入会妨碍应发工资的准确计算。分析该环节有助于优化Incentive Data Integration Lead Time。 获取位置 审计日志(PCL4或同等日志),显示Infotype 0015(Additional Payments)或2010(Employee Remuneration Info)中记录的创建情况。 采集 将Infotype创建时间戳与导入作业日志进行比较 事件类型 inferred | |||
| 福利扣除已应用 | 计算方案中处理福利逻辑的具体步骤。虽然该步骤属于主运行流程,但单独分析有助于定位配置错误。 | ||
| 为什么重要 支持Benefit and Tax Calculation Accuracy分析,有助于调试复杂的扣除逻辑差异。 获取位置 根据工资结果中的V0拆分是否存在,或在启用详细日志时根据特定日志条目推断得出。生产环境中很少启用详细日志。 采集 与应发工资已计算同时发生,但在分析概念上有所区别 事件类型 inferred | |||
提取指南
步骤
- 确定提取所需的目标薪资范围和周期参数。数据主要来自Payroll Control Center(PCC)表(PYC_*)和薪资集群目录(HRPY_RGDIR)。
- 打开SQL客户端或SAP HANA Studio,并连接至SAP SuccessFactors Employee Central Payroll(ECP)后端架构。
- 执行Query部分提供的数据提取脚本。该脚本汇总主数据表、薪资结果和PCC审计日志中的数据。
- 映射“Time Sheet Submitted”和“Time Sheet Approved”活动。由于ECP通常从Employee Central接收这些数据,请使用PA2001表中的创建时间戳和最后修改时间戳;如果可用,也可使用PTREQ_HEADER等专用时间接口表。
- 查询Infotype 0015(Additional Payments)和2010(Employee Remuneration Info),提取目标薪资周期内创建的“Incentive Data Imported”记录。
- 从PYC_D_PYP(Process Instances)和PYC_D_BINST(Step Instances)表中获取PCC流程步骤,以捕获“Payroll Process Initialized”、“Payroll Simulation Executed”、“Payroll Record Approved”和“Pay Slip Published”。
- 查询PYC_D_ALERT表,识别“Audit Exception Flagged”事件。这些记录将特定员工与PCC检查步骤中发现的验证错误关联起来。
- 将SAP Change Document Header表(CDHDR)与薪资相关Infotype,例如0008、0015和2001,在有效薪资窗口内进行关联,生成“Data Correction Performed”事件。
- 使用HRPY_RGDIR表确定“Gross Pay Calculated”的准确时间。使用相同时间戳生成“Benefit Deductions Applied”派生事件,因为这两个事件会在架构运行期间同时发生。
- 关联REGUH(Settlement Data)和REGUT(DME Administration)表中的财务数据,以捕获“Bank Transfer File Generated”和“Payment Executed”。
- 将“PayrollRecord”列严格转换为[EmployeeID]-[Period]-[Year]格式,确保Case ID唯一。
- 将最终数据集导出为CSV文件,确保表头与契约中定义的属性一致,然后上传至ProcessMind。
配置
- 时间范围:将提取范围设置为最近6至12个月的滚动窗口。薪资流程具有周期性,该范围可覆盖常规和非周期运行中的充分变化。
- 薪资区域(ABKRS):按具体薪资区域筛选,例如US Monthly、DE Weekly,确保分析比较相似的流程周期。
- 语言:确保以系统主要语言提取Activities和Process Steps的描述,例如SPRAS='E'。
- PCC流程ID:确定PCC配置中用于“Monitoring”“Production”和“Off-Cycle”的具体流程定义ID(PYP_ID),以筛选相关步骤。
- 货币:如果提取全球薪资运营数据,请将财务金额(GrossPayAmount)统一为单一货币。
- 授权:数据库用户需要具备Human Resources(PA/PY)表的读取权限,尤其是Cluster Directory(HRPY_RGDIR)和PCC表(PYC_*)的读取权限。
a 示例查询 sql
/* Activity 1: Time Sheet Submitted */
SELECT
CONCAT(T.PERNR, CONCAT('-', T.PABRJ, T.PABRP)) AS PayrollRecord,
'Time Sheet Submitted' AS Activity,
T.BEGDA AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
T.ABKRS AS PayrollArea,
'Permanent' AS EmployeeType,
T.PABRP AS PayPeriod,
CASE WHEN T.PABRP LIKE '9%' THEN 'Off-Cycle' ELSE 'Regular' END AS PayCycleFrequency,
0.00 AS GrossPayAmount,
T.UNAME AS PayrollSpecialist,
O.KOSTL AS CostCenter,
'True' AS IsAutomated
FROM PA2001 AS T
LEFT JOIN PA0001 AS O ON T.PERNR = O.PERNR AND O.ENDDA = '99991231'
WHERE T.AEDTM BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 2: Time Sheet Approved */
SELECT
CONCAT(T.PERNR, CONCAT('-', T.PABRJ, T.PABRP)) AS PayrollRecord,
'Time Sheet Approved' AS Activity,
T.AEDTM AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
T.ABKRS AS PayrollArea,
'Permanent' AS EmployeeType,
T.PABRP AS PayPeriod,
CASE WHEN T.PABRP LIKE '9%' THEN 'Off-Cycle' ELSE 'Regular' END AS PayCycleFrequency,
0.00 AS GrossPayAmount,
T.UNAME AS PayrollSpecialist,
O.KOSTL AS CostCenter,
'False' AS IsAutomated
FROM PA2001 AS T
LEFT JOIN PA0001 AS O ON T.PERNR = O.PERNR AND O.ENDDA = '99991231'
WHERE T.AEDTM BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 3: Incentive Data Imported */
SELECT
CONCAT(I.PERNR, CONCAT('-', I.PABRJ, I.PABRP)) AS PayrollRecord,
'Incentive Data Imported' AS Activity,
I.AEDTM AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
I.ABKRS AS PayrollArea,
'Permanent' AS EmployeeType,
I.PABRP AS PayPeriod,
'Regular' AS PayCycleFrequency,
I.BETRG AS GrossPayAmount,
I.UNAME AS PayrollSpecialist,
O.KOSTL AS CostCenter,
'True' AS IsAutomated
FROM PA0015 AS I
LEFT JOIN PA0001 AS O ON I.PERNR = O.PERNR AND O.ENDDA = '99991231'
WHERE I.AEDTM BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 4: Payroll Process Initialized */
SELECT
CONCAT('N/A', CONCAT('-', P.PABRJ, P.PABRP)) AS PayrollRecord,
'Payroll Process Initialized' AS Activity,
P.CREATED_TS AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
'ALL' AS PayrollArea,
NULL AS EmployeeType,
P.PABRP AS PayPeriod,
'Regular' AS PayCycleFrequency,
0.00 AS GrossPayAmount,
P.CREATED_BY AS PayrollSpecialist,
NULL AS CostCenter,
'False' AS IsAutomated
FROM PYC_D_PYP AS P
WHERE P.CREATED_TS BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 5: Payroll Simulation Executed */
SELECT
CONCAT('N/A', CONCAT('-', S.PABRJ, S.PABRP)) AS PayrollRecord,
'Payroll Simulation Executed' AS Activity,
S.END_TS AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
'ALL' AS PayrollArea,
NULL AS EmployeeType,
S.PABRP AS PayPeriod,
'Regular' AS PayCycleFrequency,
0.00 AS GrossPayAmount,
S.EXEC_USER AS PayrollSpecialist,
NULL AS CostCenter,
'True' AS IsAutomated
FROM PYC_D_BINST AS S
JOIN PYC_D_STEP AS D ON S.STEP_ID = D.ID
WHERE D.NAME LIKE '%Simulate%' AND S.END_TS BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 6: Audit Exception Flagged */
SELECT
CONCAT(A.RO_ID, CONCAT('-', P.PABRJ, P.PABRP)) AS PayrollRecord,
'Audit Exception Flagged' AS Activity,
A.CREATED_TS AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
P.ABKRS AS PayrollArea,
'Permanent' AS EmployeeType,
P.PABRP AS PayPeriod,
'Regular' AS PayCycleFrequency,
0.00 AS GrossPayAmount,
'SYSTEM' AS PayrollSpecialist,
NULL AS CostCenter,
'True' AS IsAutomated
FROM PYC_D_ALERT AS A
JOIN PYC_D_PYP AS P ON A.PYP_ID = P.ID
WHERE A.CREATED_TS BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 7: Data Correction Performed */
SELECT
CONCAT(C.OBJECTID, CONCAT('-', P.PABRJ, P.PABRP)) AS PayrollRecord,
'Data Correction Performed' AS Activity,
TO_TIMESTAMP(CONCAT(C.UDATE, C.UTIME)) AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
P.ABKRS AS PayrollArea,
'Permanent' AS EmployeeType,
P.PABRP AS PayPeriod,
'Regular' AS PayCycleFrequency,
0.00 AS GrossPayAmount,
C.USERNAME AS PayrollSpecialist,
NULL AS CostCenter,
'False' AS IsAutomated
FROM CDHDR AS C
JOIN HRPY_RGDIR AS P ON C.OBJECTID = P.PERNR
WHERE C.TCODE IN ('PA30', 'PA40') AND C.UDATE BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 8: Gross Pay Calculated */
SELECT
CONCAT(R.PERNR, CONCAT('-', R.PABRJ, R.PABRP)) AS PayrollRecord,
'Gross Pay Calculated' AS Activity,
TO_TIMESTAMP(CONCAT(R.RUNDT, R.RUNTM)) AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
R.ABKRS AS PayrollArea,
'Permanent' AS EmployeeType,
R.PABRP AS PayPeriod,
CASE WHEN R.PABRP LIKE '9%' THEN 'Off-Cycle' ELSE 'Regular' END AS PayCycleFrequency,
0.00 AS GrossPayAmount,
R.UNAME AS PayrollSpecialist,
O.KOSTL AS CostCenter,
'True' AS IsAutomated
FROM HRPY_RGDIR AS R
LEFT JOIN PA0001 AS O ON R.PERNR = O.PERNR AND O.ENDDA = '99991231'
WHERE R.RUNDT BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 9: Benefit Deductions Applied */
SELECT
CONCAT(R.PERNR, CONCAT('-', R.PABRJ, R.PABRP)) AS PayrollRecord,
'Benefit Deductions Applied' AS Activity,
ADD_SECONDS(TO_TIMESTAMP(CONCAT(R.RUNDT, R.RUNTM)), 1) AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
R.ABKRS AS PayrollArea,
'Permanent' AS EmployeeType,
R.PABRP AS PayPeriod,
CASE WHEN R.PABRP LIKE '9%' THEN 'Off-Cycle' ELSE 'Regular' END AS PayCycleFrequency,
0.00 AS GrossPayAmount,
R.UNAME AS PayrollSpecialist,
O.KOSTL AS CostCenter,
'True' AS IsAutomated
FROM HRPY_RGDIR AS R
LEFT JOIN PA0001 AS O ON R.PERNR = O.PERNR AND O.ENDDA = '99991231'
WHERE R.RUNDT BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 10: Payroll Record Approved */
SELECT
CONCAT('N/A', CONCAT('-', S.PABRJ, S.PABRP)) AS PayrollRecord,
'Payroll Record Approved' AS Activity,
S.END_TS AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
'ALL' AS PayrollArea,
NULL AS EmployeeType,
S.PABRP AS PayPeriod,
'Regular' AS PayCycleFrequency,
0.00 AS GrossPayAmount,
S.EXEC_USER AS PayrollSpecialist,
NULL AS CostCenter,
'False' AS IsAutomated
FROM PYC_D_BINST AS S
JOIN PYC_D_STEP AS D ON S.STEP_ID = D.ID
WHERE D.NAME LIKE '%Check%' AND S.STATUS = 'OK' AND S.END_TS BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 11: Bank Transfer File Generated */
SELECT
CONCAT(P.PERNR, CONCAT('-', P.PABRJ, P.PABRP)) AS PayrollRecord,
'Bank Transfer File Generated' AS Activity,
TO_TIMESTAMP(CONCAT(T.TSDAT, T.TSTIM)) AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
P.ABKRS AS PayrollArea,
'Permanent' AS EmployeeType,
P.PABRP AS PayPeriod,
'Regular' AS PayCycleFrequency,
0.00 AS GrossPayAmount,
T.USRID AS PayrollSpecialist,
O.KOSTL AS CostCenter,
'True' AS IsAutomated
FROM REGUT AS T
JOIN REGUH AS H ON T.LAUFD = H.LAUFD AND T.LAUFI = H.LAUFI
JOIN HRPY_RGDIR AS P ON H.PERNR = P.PERNR
LEFT JOIN PA0001 AS O ON P.PERNR = O.PERNR AND O.ENDDA = '99991231'
WHERE T.TSDAT BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 12: Payment Executed */
SELECT
CONCAT(P.PERNR, CONCAT('-', P.PABRJ, P.PABRP)) AS PayrollRecord,
'Payment Executed' AS Activity,
TO_TIMESTAMP(CONCAT(H.LAUFD, '120000')) AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
P.ABKRS AS PayrollArea,
'Permanent' AS EmployeeType,
P.PABRP AS PayPeriod,
'Regular' AS PayCycleFrequency,
H.RBETR AS GrossPayAmount,
H.ZNME1 AS PayrollSpecialist,
O.KOSTL AS CostCenter,
'True' AS IsAutomated
FROM REGUH AS H
JOIN HRPY_RGDIR AS P ON H.PERNR = P.PERNR
LEFT JOIN PA0001 AS O ON P.PERNR = O.PERNR AND O.ENDDA = '99991231'
WHERE H.LAUFD BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 13: Pay Slip Published */
SELECT
CONCAT('N/A', CONCAT('-', S.PABRJ, S.PABRP)) AS PayrollRecord,
'Pay Slip Published' AS Activity,
S.END_TS AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
'ALL' AS PayrollArea,
NULL AS EmployeeType,
S.PABRP AS PayPeriod,
'Regular' AS PayCycleFrequency,
0.00 AS GrossPayAmount,
S.EXEC_USER AS PayrollSpecialist,
NULL AS CostCenter,
'True' AS IsAutomated
FROM PYC_D_BINST AS S
JOIN PYC_D_STEP AS D ON S.STEP_ID = D.ID
WHERE D.NAME LIKE '%Remuneration%' AND S.END_TS BETWEEN '[START_DATE]' AND '[END_DATE]'
UNION ALL
/* Activity 14: Tax Filing Completed */
SELECT
CONCAT('N/A', CONCAT('-', S.PABRJ, S.PABRP)) AS PayrollRecord,
'Tax Filing Completed' AS Activity,
S.END_TS AS EventTimestamp,
'SAP_ECP' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
'ALL' AS PayrollArea,
NULL AS EmployeeType,
S.PABRP AS PayPeriod,
'Regular' AS PayCycleFrequency,
0.00 AS GrossPayAmount,
S.EXEC_USER AS PayrollSpecialist,
NULL AS CostCenter,
'True' AS IsAutomated
FROM PYC_D_BINST AS S
JOIN PYC_D_STEP AS D ON S.STEP_ID = D.ID
WHERE D.NAME LIKE '%Tax%' AND S.END_TS BETWEEN '[START_DATE]' AND '[END_DATE]' 步骤
- 访问ABAP编辑器:通过SAP GUI登录SAP SuccessFactors Employee Central Payroll(ECP)系统。导航至事务代码SE38(ABAP编辑器)。
- 创建程序:输入新程序名称,例如
Z_PROCESSMINING_PAYROLL_EXT,然后点击创建。将类型选择为可执行程序,并以本地对象(程序包$TMP)保存,以便测试。 - 编写代码:复制下方“查询”部分提供的完整ABAP代码,并粘贴到编辑器中,替换现有默认代码。
- 检查并激活:点击检查按钮(Ctrl+F2)验证语法。确认状态无错误后,点击激活(Ctrl+F3)。
- 执行提取:按直接处理(F8)运行报表。
- 配置选择条件:在选择屏幕中输入
Payroll Area(例如US、99)、有效的Date Range(例如最近3个月),并可选择按特定Personnel Numbers(PERNR)进行测试筛选。 - 运行提取:执行报表。系统将处理HRPY_RGDIR、CATSDB、PA0015和REGUH表,以构建事件日志。
- 查看输出:报表使用
cl_demo_output直接在屏幕的网格视图中显示结果,便于立即验证。 - 导出数据:右键点击结果网格,选择Spreadsheet,并将文件保存为CSV或Excel格式。
- 为ProcessMind设置格式:打开导出文件。确保
EventTimestamp列采用YYYY-MM-DD HH:MM:SS格式。确认PayrollRecord列能够唯一标识案例(通常为PERNR-SEQNR)。 - 上传:将清理后的CSV文件导入ProcessMind,并将列分别映射到案例ID、活动、时间戳和属性。
配置
- 日期范围:建议按3至6个月的区间提取数据,避免ABAP运行环境发生内存超时。
- 薪资区域:这是关键筛选条件(表T549A)。请始终一次提取一个薪资区域,例如Monthly或Bi-Weekly,以确保流程一致性。
- 配置表:脚本以
HRPY_RGDIR(Payroll Directory)作为主要驱动表。请确保用户拥有该表的S_TABU_DIS授权。 - 时间数据源:脚本假定Time Sheet数据存储在
CATSDB中。如果您使用直接连接到IT2001或IT2010、不经过CATS的第三方考勤系统,Time Sheet活动可能为空,需要调整脚本。 - 支付数据:脚本通过
REGUH(Settlement Data)将薪资运行与支付运行关联。请确保已针对所选期间执行F110支付运行,才能查看支付事件。 - 性能:对于高数据量系统(员工超过10万),请将
SELECT *逻辑替换为基于游标的提取,或在后台模式(F9)运行。
a 示例查询 abap
REPORT Z_PROCESSMINING_PAYROLL_EXT.
TABLES: pernr, hrpy_rgdir, catsdb, pa0015, reguh.
TYPES: BEGIN OF ty_event_log,
payroll_record TYPE string,
activity TYPE string,
event_timestamp TYPE string,
source_system TYPE string,
last_data_update TYPE string,
payroll_area TYPE abkrs,
employee_type TYPE persg,
pay_period TYPE pabrj,
pay_cycle_freq TYPE string,
gross_pay_amount TYPE string,
payroll_specialist TYPE usnam,
cost_center TYPE kostl,
is_automated TYPE string,
END OF ty_event_log.
DATA: gt_output TYPE TABLE OF ty_event_log,
gs_output TYPE ty_event_log,
gt_rgdir TYPE TABLE OF hrpy_rgdir,
gs_rgdir TYPE hrpy_rgdir,
gt_cats TYPE TABLE OF catsdb,
gs_cats TYPE catsdb,
gt_p0015 TYPE TABLE OF pa0015,
gs_p0015 TYPE pa0015,
gt_reguh TYPE TABLE OF reguh,
gs_reguh TYPE reguh,
gv_tstamp TYPE timestamp,
gv_date TYPE d,
gv_time TYPE t,
gv_pernr TYPE pernr_d.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_pernr FOR pernr-pernr,
s_date FOR sy-datum OBLIGATORY.
PARAMETERS: p_abkrs TYPE abkrs OBLIGATORY DEFAULT '99'.
SELECTION-SCREEN END OF BLOCK b1.
START-OF-SELECTION.
" 1. Fetch Payroll Directory (The Core Process Driver)
SELECT * FROM hrpy_rgdir INTO TABLE gt_rgdir
WHERE pernr IN s_pernr
AND fpper LIKE '%'
AND cdate IN s_date.
IF gt_rgdir IS INITIAL.
WRITE: / 'No payroll results found for selection.'.
EXIT.
ENDIF.
SORT gt_rgdir BY pernr seqnr.
" Loop through Payroll Directory to build events
LOOP AT gt_rgdir INTO gs_rgdir.
CLEAR gs_output.
CONCATENATE gs_rgdir-pernr '-' gs_rgdir-seqnr INTO gs_output-payroll_record.
gs_output-source_system = 'SAP_ECP'.
gs_output-last_data_update = sy-datum.
gs_output-payroll_area = p_abkrs.
gs_output-pay_period = gs_rgdir-fpper.
gs_output-payroll_specialist = gs_rgdir-uname.
" --- Activity: Payroll Process Initialized ---
" Derived from the run date start
gs_output-activity = 'Payroll Process Initialized'.
CONCATENATE gs_rgdir-cdate gs_rgdir-ctime INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'TRUE'.
APPEND gs_output TO gt_output.
" --- Activity: Payroll Simulation Executed ---
IF gs_rgdir-srtza = 'S'. " S = Simulation
gs_output-activity = 'Payroll Simulation Executed'.
CONCATENATE gs_rgdir-cdate gs_rgdir-ctime INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'TRUE'.
APPEND gs_output TO gt_output.
ENDIF.
" --- Activity: Audit Exception Flagged ---
IF gs_rgdir-void IS NOT INITIAL. " Void indicator means rejected/exception
gs_output-activity = 'Audit Exception Flagged'.
CONCATENATE gs_rgdir-cdate gs_rgdir-ctime INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'TRUE'.
APPEND gs_output TO gt_output.
" --- Activity: Data Correction Performed ---
" Inferred: If voided, a correction usually follows immediately
gs_output-activity = 'Data Correction Performed'.
" Add 1 hour to simulate reaction time
DATA: lv_corr_time TYPE t.
lv_corr_time = gs_rgdir-ctime + 3600.
CONCATENATE gs_rgdir-cdate lv_corr_time INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'FALSE'.
APPEND gs_output TO gt_output.
ENDIF.
" --- Activity: Gross Pay Calculated ---
IF gs_rgdir-srtza = 'A'. " A = Actual Result
gs_output-activity = 'Gross Pay Calculated'.
CONCATENATE gs_rgdir-cdate gs_rgdir-ctime INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-gross_pay_amount = '1000.00'. " Placeholder: Cluster read required for actual amount
gs_output-is_automated = 'TRUE'.
APPEND gs_output TO gt_output.
" --- Activity: Benefit Deductions Applied ---
" Logically occurs immediately after gross calc
gs_output-activity = 'Benefit Deductions Applied'.
gs_output-is_automated = 'TRUE'.
APPEND gs_output TO gt_output.
" --- Activity: Payroll Record Approved ---
" Inferred from successful write of 'A' record
gs_output-activity = 'Payroll Record Approved'.
DATA: lv_appr_time TYPE t.
lv_appr_time = gs_rgdir-ctime + 60. " +1 minute
CONCATENATE gs_rgdir-cdate lv_appr_time INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'FALSE'.
APPEND gs_output TO gt_output.
" --- Activity: Pay Slip Published ---
" Available via ESS usually next day
gs_output-activity = 'Pay Slip Published'.
DATA: lv_slip_date TYPE d.
lv_slip_date = gs_rgdir-cdate + 1.
CONCATENATE lv_slip_date '080000' INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'TRUE'.
APPEND gs_output TO gt_output.
" --- Activity: Tax Filing Completed ---
" End of period logic
gs_output-activity = 'Tax Filing Completed'.
DATA: lv_tax_date TYPE d.
lv_tax_date = gs_rgdir-paydt.
CONCATENATE lv_tax_date '235959' INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'TRUE'.
APPEND gs_output TO gt_output.
ENDIF.
ENDLOOP.
" 2. Fetch Time Sheet Data (CATSDB)
" Linking to Payroll Record loosely via Period/Date
SELECT * FROM catsdb INTO TABLE gt_cats
WHERE pernr IN s_pernr
AND workdate IN s_date.
LOOP AT gt_cats INTO gs_cats.
CLEAR gs_output.
CONCATENATE gs_cats-pernr '-00000' INTO gs_output-payroll_record. " Generic mapping
gs_output-payroll_area = p_abkrs.
gs_output-source_system = 'SAP_ECP'.
" --- Activity: Time Sheet Submitted ---
IF gs_cats-status = '20' OR gs_cats-status = '30'.
gs_output-activity = 'Time Sheet Submitted'.
CONCATENATE gs_cats-laudate gs_cats-lautime INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'FALSE'.
APPEND gs_output TO gt_output.
ENDIF.
" --- Activity: Time Sheet Approved ---
IF gs_cats-status = '30'. " 30 = Approved
gs_output-activity = 'Time Sheet Approved'.
CONCATENATE gs_cats-apdat gs_cats-aptime INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'FALSE'.
APPEND gs_output TO gt_output.
ENDIF.
ENDLOOP.
" 3. Fetch Incentive Data (Infotype 0015)
SELECT * FROM pa0015 INTO TABLE gt_p0015
WHERE pernr IN s_pernr
AND begda IN s_date.
LOOP AT gt_p0015 INTO gs_p0015.
CLEAR gs_output.
CONCATENATE gs_p0015-pernr '-00000' INTO gs_output-payroll_record.
gs_output-source_system = 'SAP_ECP'.
gs_output-payroll_area = p_abkrs.
" --- Activity: Incentive Data Imported ---
gs_output-activity = 'Incentive Data Imported'.
CONCATENATE gs_p0015-aedtm '120000' INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'FALSE'.
APPEND gs_output TO gt_output.
ENDLOOP.
" 4. Fetch Payment Data (REGUH)
SELECT * FROM reguh INTO TABLE gt_reguh
WHERE zaldt IN s_date.
LOOP AT gt_reguh INTO gs_reguh.
" Filter for our PERNRs roughly (REGUH does not always have PERNR directly indexable easily in all views)
" For simulation, we map broadly or require join logic. Here assuming simple extraction.
CLEAR gs_output.
CONCATENATE gs_reguh-pernr '-99999' INTO gs_output-payroll_record.
gs_output-source_system = 'SAP_ECP'.
gs_output-payroll_area = p_abkrs.
" --- Activity: Bank Transfer File Generated ---
gs_output-activity = 'Bank Transfer File Generated'.
CONCATENATE gs_reguh-laufd gs_reguh-cpzut INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'TRUE'.
APPEND gs_output TO gt_output.
" --- Activity: Payment Executed ---
gs_output-activity = 'Payment Executed'.
CONCATENATE gs_reguh-zaldt '100000' INTO gs_output-event_timestamp SEPARATED BY space.
gs_output-is_automated = 'TRUE'.
APPEND gs_output TO gt_output.
ENDLOOP.
" Output Display
cl_demo_output=>display( gt_output ). 立即优化薪资处理表现
立即加入将薪资周期时间缩短30%的企业。
无需信用卡,几分钟即可完成设置。