您的采购到付款请购流程数据模板
您的采购到付款请购流程数据模板
- 用于深入分析的建议收集属性
- 用于流程发现的关键跟踪活动
- 从SAP S/4HANA提取数据的指南
采购到付款请购流程属性
| 名称 | 说明 | ||
|---|---|---|---|
| 事件时间 EventTime | 特定活动发生的准确日期和时间。 | ||
| 说明 事件时间是记录活动发生时点的时间戳。它对于确定案例中事件的先后顺序至关重要,也是流程挖掘中所有时长和绩效计算的依据。例如,“提交申请”与“申请已批准”事件之间的时间差,就是审批周期时间。 准确的时间戳是分析流程绩效、发现延误和监控服务级别协议执行情况的基础。借助此属性,仪表板可以呈现周期时间、跟踪停滞的申请,并比较不同时段的绩效。 重要性 此时间戳对于排列事件顺序、计算周期时间以及分析流程绩效和瓶颈至关重要。 获取途径 时间戳通常取自更改凭证表头(CDHDR-UDATE、CDHDR-UTIME)或工作流事件日志。 示例 2023-04-15T10:05:30Z2023-04-15T14:22:01Z2023-04-16T09:00:15Z | |||
| 活动名称 ActivityName | 申请流程中特定时点发生的业务活动名称。 | ||
| 说明 活动名称用于描述采购申请生命周期中发生的特定事件或任务。这些活动根据更改凭证、工作流历史记录等系统日志生成,代表“创建申请”“审批步骤开始”或“创建采购订单”等关键流程里程碑。 分析这些活动有助于呈现流程顺序、识别瓶颈并衡量各阶段耗时。了解“修改申请”或“申请已拒绝”等活动的顺序和频率,对于发现流程低效环节和改进机会至关重要。 重要性 它定义流程中的各个步骤,构成流程图的基础,并支持分析流程顺序、变体和瓶颈。 获取途径 这是一个派生属性,通常通过解读更改凭证表(CDHDR、CDPOS)和工作流日志(如SWWLOGHIST)中的数据构建。 示例 创建申请审批步骤完成申请已批准创建采购订单 | |||
| 采购申请ID PurchaseRequisitionId | 用于唯一标识采购申请单的编号。 | ||
| 说明 采购申请ID是主键,用于唯一标识SAP S/4HANA中的每项商品或服务申请。它是核心案例标识符,将特定申请从创建到最终状态(如批准、拒绝或转为采购订单)的所有活动和更改关联起来。 在流程挖掘中,此属性是重建每份申请端到端生命周期的基础。将所有相关事件归入同一采购申请ID后,分析人员便可准确衡量周期时间、跟踪状态变化,并分析申请在审批流程中的不同路径。 重要性 这是关键的案例标识符,可关联所有相关流程步骤,帮助您完整、一致地了解申请生命周期。 获取途径 此属性为采购申请编号,位于EBAN表的BANFN字段。 示例 100178901001789110017892 | |||
| 审批人ID ApproverId | 执行审批或拒绝步骤的用户标识符。 | ||
| 说明 审批人ID专门用于标识完成审批或拒绝操作的用户。与通用用户ID不同,它只关注审批工作流中的决策人员。记录此信息对于详细分析审批流程至关重要。 借助此属性,您可以分析审批行为,例如找出审批耗时较长的经理,或经常拒绝申请的人员。它是分析审批步骤周期时间和工作流瓶颈的仪表板的基础,有助于定位可能造成延误的具体人员或角色。 重要性 定位审批步骤中的具体决策人员,支持按个人或角色详细分析审批周期时间和瓶颈。 获取途径 此信息通常从SAP Business Workflow表(如SWW_WI2OBJ和SWWLOGHIST)中提取,这些表将工作项与完成任务的用户关联起来。 示例 MJOHNSONCWILLIAMSLBLACK | |||
| 用户ID UserId | 创建申请或执行特定活动的用户标识符。 | ||
| 说明 用户ID用于标识在申请生命周期中负责特定事件的员工或系统用户,例如创建申请的人员、批准申请的经理或修改申请的经办人。对于自动执行的步骤,该ID可能属于系统用户或批处理用户。 按用户ID分析有助于了解用户行为、工作负荷分配和绩效。它对于识别培训需求、发现表现出色的员工以及确保流程责任落实至关重要。结合用户主数据,还可用于分析部门绩效。 重要性 支持分析用户绩效、工作负荷分配和流程执行情况。它对于发现培训机会和资源瓶颈至关重要。 获取途径 创建人信息位于EBAN-ERNAM。后续更改的用户信息位于CDHDR-USERNAME。审批人信息则记录在工作流日志中。 示例 JSMITHRROEWF-BATCH | |||
| 申请状态 RequisitionStatus | 采购申请当前的处理或审批状态。 | ||
| 说明 申请状态表示申请在生命周期中的当前状态。在SAP中,这通常由发布标识表示,用于说明申请是已冻结、审批中、部分批准还是全部批准。申请在工作流中流转时,此状态也会随之变化。 持续跟踪状态是了解流程顺序的基础,有助于发现申请卡在哪个环节以及停滞时长。分析状态之间的转换,可以详细了解审批流程及其不同变体。 重要性 表示申请的当前状态,对于跟踪进度、发现瓶颈和分析流程顺序至关重要。 获取途径 发布状态通常由发布标识确定,该字段位于EBAN表的FRGZU字段。 示例 B1S | |||
| 申请类型 RequisitionType | 用于对采购申请进行分类的代码,例如标准物料、服务或资本支出。 | ||
| 说明 申请类型在SAP中也称为单据类型,是采购申请的关键配置字段。不同类型可能触发不同的审批工作流、采用不同的字段设置,并用于不同业务场景,例如标准库存物料、外部服务或资产采购。 按申请类型分析流程,有助于组织了解不同类型的申请如何处理。您可以比较各类别的绩效、周期时间和审批路径,从而发现哪些申请类型的处理效率较高或较低,并据此制定有针对性的流程改进措施。 重要性 对申请进行分类以支持对比分析,帮助了解不同类型的申请是否存在不同的流程顺序、瓶颈或周期时间。 获取途径 这是单据类型字段,位于EBAN表的BSART字段。 示例 NBFORV | |||
| 申请金额 RequisitionAmount | 采购申请的货币总金额。 | ||
| 说明 申请金额表示所申请商品或服务的预估总成本。此金额通常会影响审批工作流的复杂程度和时长,金额较高的申请通常需要经过更多层级的审批。 按金额分析此属性有助于对流程进行分组。例如,您可以了解高金额申请是否需要更长时间才能获批,或经常被拒绝的申请金额是多少。它是了解流程低效所造成财务影响的重要分析维度。 重要性 按财务影响对流程进行分组,通常可反映审批复杂程度和周期时间,是按金额分析流程的重要依据。 获取途径 总金额位于EBAN表的GFWERT字段。项目级金额位于EBAN-PREIS。 示例 1500.0075000.50250.75 | |||
| 部门 Department | 承担申请费用的部门或成本中心。 | ||
| 说明 部门属性通常由SAP中的成本中心表示,用于标识负责所申请采购的业务单元。它是申请项目级别的重要财务和组织信息。 在流程挖掘中,此属性对于部门绩效分析至关重要。借助仪表板,您可以比较不同部门的周期时间、修改率和拒绝率等关键指标。这有助于发现可供其他部门借鉴的优秀做法,以及可能需要额外培训或流程支持的部门。 重要性 支持比较不同业务单元的绩效,突出显示周期时间或拒绝率的差异,以便发现最佳实践和改进机会。 获取途径 这是成本中心,通常位于科目分配表EBKN的KOSTL字段。 示例 FIN-1001IT-2005MKT-3010 | |||
| 上次数据更新 LastDataUpdate | 表示此记录的数据上次从源系统刷新时间的时间戳。 | ||
| 说明 此属性记录最近一次从源系统提取或更新数据的日期和时间。它是了解分析数据新鲜度的重要元数据。分析人员和业务用户可通过此时间戳判断流程数据是否反映了运营的最新状态。 在流程分析中,了解数据的时效性是有把握地决策的基础。此属性有助于管理用户预期,并确保结论基于符合具体分析时效要求的数据。 重要性 此属性反映数据的新鲜度,这对于信任分析结果并及时作出业务决策至关重要。 获取途径 此时间戳在数据提取、转换和加载(ETL)过程中生成并添加。 示例 2023-10-27T02:00:00Z2023-10-28T02:00:00Z | |||
| 审批步骤名称 ApprovalStepName | 工作流中某个审批步骤的具体名称或说明。 | ||
| 说明 审批步骤名称以易于理解的文字描述审批工作流中的特定阶段,例如“经理审批”或“财务副总裁审批”。与通用的“审批步骤已完成”活动相比,此属性提供了更具体的信息。 此属性对于“审批步骤周期时间”和“工作流瓶颈分析”仪表板至关重要。它可以细致呈现审批流程,准确定位造成显著延误、工作积压最严重的审批阶段,为有针对性的改进提供依据,帮助简化审批链。 重要性 详细呈现各审批阶段,帮助准确识别多级审批工作流中的瓶颈。 获取途径 此信息取自工作流任务说明,可将工作流日志与T528T等任务定义表关联后获取。 示例 经理审批总监审批财务副总裁审批 | |||
| 币种 Currency | 申请金额所用的币种代码。 | ||
| 说明 此属性用于指定申请金额的币种,例如USD、EUR或JPY。它为申请金额属性提供必要背景信息,对于使用多种币种的跨国组织尤为重要。 要准确开展财务分析和报告,必须考虑币种因素。汇总或比较申请金额时,应将所有金额换算为统一币种,才能确保结果有意义。此属性是进行币种换算的前提。 重要性 为申请金额提供必要背景信息,支持在多币种环境中准确开展财务分析和比较。 获取途径 此信息位于EBAN表的WAERS字段。 示例 USDEURGBP | |||
| 拒绝原因 RejectionReason | 采购申请被拒绝时提供的原因。 | ||
| 说明 拒绝原因用于说明审批人拒绝采购申请的理由,例如超出预算、信息有误、不符合政策或与其他申请重复。此信息对于了解流程失败的背景至关重要。 分析拒绝原因有助于找出流程低效和返工的根本原因。例如,如果“成本中心错误”是常见原因,就说明需要加强用户培训或完善系统校验。此属性是申请拒绝分析仪表板的关键,也是开展有针对性流程改进的重要依据。 重要性 揭示流程失败的根本原因,支持有针对性地改进流程、减少返工并提高申请一次通过率。 获取途径 这通常不是标准字段,可能记录在工作流容器元素、与申请关联的长文本或自定义字段中。 示例 超出预算供应商错误重复申请 | |||
| 是否自动化 IsAutomated | 用于标记某项活动由系统用户而非人工执行的标志。 | ||
| 说明 “是否自动化”属性是一个布尔标记。如果某项活动由系统用户或批处理用户执行,则值为true,例如工作流操作中的“WF-BATCH”。该属性有助于区分流程中的人工步骤和自动化步骤。 此属性对于衡量请购流程的自动化程度以及计算“自动审批率”KPI至关重要。通过筛选自动化或人工步骤,分析人员可以比较其效率,并发现进一步自动化的机会,从而缩短处理时间、减少人工投入。 重要性 区分人工活动和系统驱动的活动,这对于衡量自动化率和发现自动化人工任务的机会至关重要。 获取途径 这是一个衍生属性,通常依据一条规则计算:检查事件的用户ID是否属于已知系统用户或批处理用户列表。 示例 truefalse | |||
| 是否返工 IsRework | 用于标记某项活动是否属于返工,例如提交后进行修改。 | ||
| 说明 “是否返工”是一个计算得出的布尔标记,用于识别不增值或重复的活动。在此流程中,常见的例子是请购单提交审批后又发生“请购单已修改”活动,导致审批流程重新开始。 此属性对于量化流程中的返工及其对整体周期时间的影响至关重要。“请购单修改与返工率”仪表板依靠此标记揭示流程低效之处。减少返工往往是流程改进的首要目标,因为这能直接节省时间和精力。 重要性 标记造成浪费或重复的活动,便于直接衡量返工及其对流程效率的影响。 获取途径 这是一个计算属性。通常会将首次“请购单已提交审批”之后发生的任何“请购单已修改”活动标记为返工。 示例 truefalse | |||
| 源系统 SourceSystem | 标识提取数据的SAP S/4HANA实例。 | ||
| 说明 源系统属性用于标识生成流程数据的系统。对于拥有多个SAP实例的组织,例如分别用于开发、质量保证和生产的系统,或不同地区使用的独立系统,此字段对于数据治理和理解数据背景至关重要。 它可以区分不同来源的数据,避免错误汇总,并支持按系统分析。此属性为必填项,有助于维护数据沿袭并确保流程数据可追溯。 重要性 此属性提供数据来源和治理所需的重要背景信息,尤其适用于拥有多个系统的环境,并确保数据可追溯。 获取途径 通常为SAP系统ID(SID),可从系统变量或配置表中获取。 示例 S4PECCS4H_PROD_01 | |||
| 紧急程度 UrgencyLevel | 对请购单紧急程度的分类,可能会影响其处理优先级。 | ||
| 说明 紧急程度表示采购申请的优先级。虽然没有专门的标准字段,但一些组织会使用“需求跟踪编号”等字段记录此信息,方便申请人标记需要加急处理的紧急需求。 分析紧急程度的影响,有助于评估流程是否有效地优先处理紧急申请。“紧急程度影响分析”仪表板使用此属性,对比紧急请购单与普通请购单的周期时间和审批率,帮助判断优先处理是否达到预期效果。 重要性 分析高优先级申请的流程表现差异,帮助验证紧急事项是否确实得到了加急处理。 获取途径 没有标准的紧急程度字段。一些公司会使用“需求跟踪编号”(EBAN-BEDAR)记录此信息,也可能使用自定义字段。 示例 高中低 | |||
| 结束时间 EndTime | 某项活动完成的具体日期和时间。 | ||
| 说明 EndTime是记录活动结束时间的时间戳。许多系统生成的事件是瞬时发生的(即StartTime等于EndTime),而审批等人工任务可能有不同的开始和结束时间。此时间戳标记工作的完成时刻。 单独记录EndTime有助于更准确地衡量实际处理时间与空闲等待时间。它与StartTime配合使用,可计算ProcessingTime指标。这样的细节有助于深入分析人工任务的资源利用情况和效率。 重要性 标记活动完成时间,以便计算实际处理时间,并更详细地了解任务耗时。 获取途径 此信息取自工作流日志,其中可能同时记录工作项的创建时间(StartTime)和完成时间(EndTime)。 示例 2023-04-15T10:20:30Z2023-04-15T14:25:01Z2023-04-16T11:00:45Z | |||
| 要求日期 RequiredByDate | 申请人需要收到所申请商品或服务的日期。 | ||
| 说明 要求日期在SAP中也称为交货日期,用于指定申请项目中的商品或服务所需日期。此日期由申请人设定,是整个采购流程的目标日期。 此属性对于计算“按时完成申请率”KPI至关重要。通过比较要求日期与最终审批日期或采购订单创建日期,组织可以衡量其满足内部服务级别和业务需求的能力。分析未能按期完成的申请,有助于发现采购流程中的系统性延误。 重要性 定义申请的目标完成日期,以便衡量是否按时交付以及是否达到内部服务级别。 获取途径 这是交货日期,位于EBAN表项目级别的LFDAT字段。 示例 2023-11-152023-12-012024-01-20 | |||
| 采购订单编号 PurchaseOrderNumber | 根据申请创建的采购订单编号。 | ||
| 说明 采购订单编号是根据已批准申请创建的正式采购单据的标识符。创建采购订单通常是申请流程的最终成功结果,表示申请已转为与供应商签订的正式订单。 此属性对于衡量申请转采购订单周期时间KPI和整体转化率至关重要。它将申请流程与后续采购流程关联起来,支持从端到端了解整个采购到付款周期。 重要性 将申请与后续采购单据关联起来,支持衡量申请转采购订单的转化率和周期时间。 获取途径 采购订单由申请项目创建后,其编号会记录在EBAN表的EBELN字段中。 示例 450001789045000178914500017892 | |||
采购到付款请购流程活动
| 活动 | 说明 | ||
|---|---|---|---|
| 创建申请 | 表示系统中首次创建采购申请单。用户首次保存新申请时,系统会明确记录此事件及其创建时间。 | ||
| 重要性 此活动是分析申请生命周期的主要起点。它对于衡量端到端周期时间至关重要,涵盖从识别需求到最终批准或转为采购订单的全过程。 获取途径 这是从EBAN表中明确捕获的事件,使用创建日期(ERDAT)和创建时间(ERZEIT)字段,并关联具体的采购申请编号(BANFN)。 采集 使用EBAN表中每份申请(BANFN)的创建时间戳字段(ERDAT、ERZEIT)。 事件类型 explicit | |||
| 创建采购订单 | 表示已创建引用该申请项目的采购订单。这是一个明确的系统事件,用于将申请关联到后续采购单据。 | ||
| 重要性 这是申请流程的重要里程碑和成功结果。从申请获批到创建采购订单所用的时间,是衡量采购效率的关键KPI。 获取途径 创建采购订单项目时会明确记录此事件。关联信息存储在EKPO表(采购订单项目)中,其中包含来源申请编号(BANFN)和项目编号(BNFPO)。 采集 根据申请编号和项目编号,将EKPO表与EBAN表关联。采购订单项目的创建日期即为此事件的发生时间。 事件类型 explicit | |||
| 审批步骤完成 | 审批人对申请作出批准决定,完成多级审批工作流中的一个步骤时发生。可根据申请发布状态的变化推断。 | ||
| 重要性 此活动支持详细分析审批工作流,并衡量每个步骤所用的时间。它有助于区分审批高效的人员和流程中的瓶颈。 获取途径 根据EBAN表的更改凭证(CDHDR/CDPOS)推断。特定发布代码的状态(如FRGZU字段)从未发布变为已发布,即表示此事件发生。 采集 跟踪EBAN表中策略所定义的各个发布代码对应的发布状态字段变化。 事件类型 inferred | |||
| 申请已关闭 | 表示申请项目已处理完毕,不能再据此创建采购订单。通常在采购订单数量达到申请数量后,系统会自动设置此状态。 | ||
| 重要性 此活动表示申请项目生命周期已成功完成。它确认业务需求已全部转化为采购订单。 获取途径 根据EBAN表推断。当“Closed”标识(EBAKZ)被设置时,即表示此事件发生;通常这是因为采购订单数量已达到申请数量。 采集 通过更改凭证查找EBAN表中“Closed”标识(EBAKZ)被设置的事件。 事件类型 inferred | |||
| 申请已批准 | 表示采购申请已完成最终审批,可以转为采购订单。通常可根据整体发布状态达到最终批准状态来推断。 | ||
| 重要性 这是一个关键的成功里程碑,也是周期时间分析中常用的终点。它表明申请已通过所有检查,可以交由采购部门处理。 获取途径 根据EBAN表中的状态变化推断,具体表现为整体发布标识(FRGZU)或处理状态(PROCSTAT)更新为最终的“Approved”值。 采集 确定最终发布代码生效,或申请整体状态变为“Approved”的时间戳。 事件类型 inferred | |||
| 申请已拒绝 | 表示审批人最终拒绝采购申请,流程随之终止。系统会通过特定状态更新记录此事件。 | ||
| 重要性 这是流程失败的关键终点。分析拒绝频率、原因及发生环节,有助于发现政策合规、预算或申请质量方面的问题。 获取途径 根据EBAN表中的状态变化推断。处理状态(PROCSTAT)或发布标识会被设置为明确表示“Rejected”的值。 采集 通过更改凭证确定EBAN表整体状态更新为“Rejected”的时间戳。 事件类型 inferred | |||
| 修改申请 | 用户在申请创建后修改数量、价格或物料等关键字段时发生。此操作会明确记录在SAP的更改凭证系统中。 | ||
| 重要性 跟踪修改对于识别返工循环及其对周期时间的影响至关重要。频繁修改通常表明数据质量存在问题或需求发生变化,这些都是流程改进的重点。 获取途径 对EBAN表所做的更改会明确记录在SAP更改凭证表(CDHDR和CDPOS)中。每次更改受跟踪字段都会生成一条记录。 采集 从CDHDR/CDPOS中提取更改事件,其中采购申请的对象类为BANF。 事件类型 explicit | |||
| 审批步骤开始 | 表示申请正等待特定审批人或审批组处理。可根据申请状态显示其正在等待特定发布代码来推断。 | ||
| 重要性 此活动对于定位审批链中的瓶颈至关重要。分析申请处于此状态的时长,有助于发现停滞的申请和工作负荷过重的审批人。 获取途径 根据EBAN表的发布状态字段(如FRGZU)及底层发布策略配置推断。当某个特定发布代码成为下一项待处理代码时,此事件开始。 采集 根据工作流日志或状态字段,确定申请何时进入等待特定发布代码审批的状态。 事件类型 inferred | |||
| 已分配货源 | 表示采购员为已批准的申请项目指定供应商、合同或信息记录。这是为创建采购订单做准备的关键步骤。 | ||
| 重要性 此活动衔接审批与下单环节。衡量货源分配所需时间,有助于发现采购员工作负荷和寻源效率方面的延误。 获取途径 根据EBAN表中货源相关字段是否已填写来推断,例如固定供应商(LIFNR)、信息记录(INFNR)或合同(KONNR)。 采集 通过更改凭证跟踪EBAN表中LIFNR、INFNR或KONNR等字段的填充情况。 事件类型 inferred | |||
| 提交申请以供审批 | 表示申请人正式提交申请并触发审批工作流的时点。通常可根据申请的发布策略已确定且状态变为“In Approval”来推断。 | ||
| 重要性 这是一个关键里程碑,也是审批周期时间KPI的起点。分析从创建到提交所用的时间,有助于发现申请准备阶段的延误。 获取途径 根据EBAN表的更改凭证(CDHDR/CDPOS)推断,具体依据是发布策略字段(如FRGST)已填充,或整体状态(PROCSTAT)变为审批中。 采集 查找表明审批工作流已启动或状态变为“In Approval”的首条更改凭证记录。 事件类型 inferred | |||
| 申请已撤回 | 原申请人在申请处理完成前取消或删除申请时发生。通常这是一个明确操作,会为申请项目设置删除标识。 | ||
| 重要性 跟踪撤回情况有助于了解需求波动及取消原因。撤回会使申请进入终止状态,后续处理无法继续。 获取途径 当EBAN表中申请项目的删除标识(LOEKZ)字段被设置时,系统会明确记录此事件。相关更改会记入CDHDR/CDPOS。 采集 查找EBAN表中删除标识(LOEKZ)被设置为“L”的事件。 事件类型 explicit | |||
| 重置审批 | 表示整个审批工作流被重置,通常是因为申请发生重大修改。审批流程因此必须从第一个层级重新开始。 | ||
| 重要性 此活动反映了会严重影响周期时间的大量返工。找出审批重置的原因,是简化流程、减少延误的关键。 获取途径 根据EBAN表的更改凭证(CDHDR/CDPOS)推断。当发布状态字段(如FRGKZ或FRGZU)在部分或全部设置后被清空时,即可识别此事件。 采集 在更改日志中查找发布状态从已发布恢复为未发布的记录。 事件类型 inferred | |||
数据提取指南
步骤
- 准备工作:确保您拥有SAP S/4HANA用户账号及相应授权,可以访问所需的CDS视图。这通常需要S_TABU_NAM等对象的权限,以及数据查看工具的访问权限。
- 确定系统访问方式:确定如何连接SAP S/4HANA数据库并执行SQL查询。常用工具包括SAP HANA Studio、带有ADT(ABAP开发工具)的Eclipse IDE,或可通过SAP HANA数据库客户端连接的DBeaver等第三方SQL客户端。
- 检查SQL查询:熟悉提供的SQL脚本。脚本使用公用表表达式(CTE)收集不同活动的数据,并将其合并为统一的事件日志。
- 替换占位符:找到并替换查询中的占位符。您需要设置提取时间范围(格式为
[YYYY-MM-DD]),并指定组织适用的公司代码([Your Company Code])。 - 执行查询:在SAP S/4HANA数据库中运行完整且已自定义的SQL查询。执行时间可能因数据量和所选日期范围而异。
- 初步检查数据:查询完成后,检查输出的前几行。确认PurchaseRequisitionId、ActivityName和EventTime等列均按预期填充,且数据格式正确。
- 处理数据转换:提供的查询会输出适用于流程挖掘的数据格式。查询使用
CAST和CONCAT函数确保数据类型一致,通常无需在执行后进行大规模转换。 - 导出事件日志:通过SQL客户端将完整结果集导出为CSV文件。请将文件编码设为UTF-8,以免出现字符显示问题。
- 准备上传:上传至流程挖掘工具前,请确认CSV文件包含正确的表头(
PurchaseRequisitionId、ActivityName、EventTime等),且EventTime的日期和时间格式一致并受目标平台支持。 - 上传至ProcessMind:将最终CSV文件上传到ProcessMind项目,并配置字段映射:将
PurchaseRequisitionId映射为案例ID,ActivityName映射为活动,EventTime映射为时间戳。
配置
- 核心CDS视图:提取主要使用
I_PurchaseRequisitionAPI01获取请购单核心数据,使用I_ChangeDocument和I_ChangeDocumentItem跟踪变更和状态更新,并使用I_PurchaseOrderItemAPI01关联采购订单。 - 授权:执行查询的用户需要拥有上述CDS视图的读取权限。请咨询SAP安全团队,了解所需角色和授权。
- 日期范围筛选:必须按请购单创建日期(
CreationDate)筛选日期范围,以控制数据量。建议初次分析使用3到6个月的数据。 - 组织筛选:按
CompanyCode筛选数据,确保分析的是正确业务实体的流程。您也可以按PurchaseRequisitionType筛选,聚焦特定采购流程,例如标准商品或服务采购。 - 变更单配置:记录“请购单已修改”和各审批步骤等活动,取决于SAP系统是否已为相关字段启用变更单日志记录。如果缺少这些事件,请检查表EBAN的系统配置。
- 性能:对于包含数百万张请购单的大型系统,长时间范围的查询可能影响系统性能。建议在非高峰时段执行,或在数据近期已刷新的非生产环境中运行。
查询示例 sql
WITH REQUISITIONS AS (
SELECT
PurchaseRequisition,
PurchaseRequisitionType,
PurReqnDescription,
CreatedByUser,
CreationDate,
CAST(CONCAT(CreationDate, 'T', LPAD(CreationTime, 6, '0')) AS TIMESTAMP) AS CreationTimestamp,
SourceOfSupplyIsAssigned
FROM I_PurchaseRequisitionAPI01
WHERE CreationDate BETWEEN '[YYYY-MM-DD]' AND '[YYYY-MM-DD]'
AND CompanyCode IN ('[Your Company Code]')
),
CHANGE_DOCS AS (
SELECT
ObjectValue AS PurchaseRequisition,
UserName,
CAST(CONCAT(CreationDate, 'T', LPAD(CreationTime, 6, '0')) AS TIMESTAMP) AS ChangeTimestamp,
FieldName,
ValueNew,
ValueOld
FROM I_ChangeDocument AS H
JOIN I_ChangeDocumentItem AS I
ON H.ChangeDocument = I.ChangeDocument
WHERE H.Objectclass = 'EINKBELEG'
AND H.CreationDate BETWEEN '[YYYY-MM-DD]' AND '[YYYY-MM-DD]'
)
-- 1. Requisition Created
SELECT
R.PurchaseRequisition AS "PurchaseRequisitionId",
'Requisition Created' AS "ActivityName",
R.CreationTimestamp AS "EventTime",
R.CreatedByUser AS "UserId",
NULL AS "ApproverId",
R.PurchaseRequisitionType AS "RequisitionType",
I.CostCenter AS "Department",
I.RequisitionPrice * I.RequestedQuantity AS "RequisitionAmount",
I.PurReqnProcessingStatus AS "RequisitionStatus"
FROM REQUISITIONS AS R
JOIN I_PurchaseRequisitionItemAPI01 AS I
ON R.PurchaseRequisition = I.PurchaseRequisition
UNION ALL
-- 2. Requisition Submitted For Approval & 5. Approval Step Started
SELECT
C.PurchaseRequisition AS "PurchaseRequisitionId",
CASE
WHEN C.ValueOld = ''
THEN 'Requisition Submitted For Approval'
ELSE 'Approval Step Started'
END AS "ActivityName",
C.ChangeTimestamp AS "EventTime",
R.CreatedByUser AS "UserId",
NULL AS "ApproverId",
R.PurchaseRequisitionType AS "RequisitionType",
I.CostCenter AS "Department",
I.RequisitionPrice * I.RequestedQuantity AS "RequisitionAmount",
I.PurReqnProcessingStatus AS "RequisitionStatus"
FROM CHANGE_DOCS AS C
JOIN REQUISITIONS AS R
ON C.PurchaseRequisition = R.PurchaseRequisition
JOIN I_PurchaseRequisitionItemAPI01 AS I
ON C.PurchaseRequisition = I.PurchaseRequisition
WHERE C.FieldName = 'FRGZU' AND C.ValueNew != ''
UNION ALL
-- 3. Requisition Amended
SELECT DISTINCT
C.PurchaseRequisition AS "PurchaseRequisitionId",
'Requisition Amended' AS "ActivityName",
C.ChangeTimestamp AS "EventTime",
C.UserName AS "UserId",
NULL AS "ApproverId",
R.PurchaseRequisitionType AS "RequisitionType",
I.CostCenter AS "Department",
I.RequisitionPrice * I.RequestedQuantity AS "RequisitionAmount",
I.PurReqnProcessingStatus AS "RequisitionStatus"
FROM CHANGE_DOCS AS C
JOIN REQUISITIONS AS R ON C.PurchaseRequisition = R.PurchaseRequisition
JOIN I_PurchaseRequisitionItemAPI01 AS I ON C.PurchaseRequisition = I.PurchaseRequisition
WHERE C.FieldName IN ('MENGE', 'PREIS', 'MATNR', 'LIFNR', 'INFNR')
AND C.ChangeTimestamp > R.CreationTimestamp
UNION ALL
-- 4. Approval Reset
SELECT
C.PurchaseRequisition AS "PurchaseRequisitionId",
'Approval Reset' AS "ActivityName",
C.ChangeTimestamp AS "EventTime",
C.UserName AS "UserId",
NULL AS "ApproverId",
R.PurchaseRequisitionType AS "RequisitionType",
I.CostCenter AS "Department",
I.RequisitionPrice * I.RequestedQuantity AS "RequisitionAmount",
I.PurReqnProcessingStatus AS "RequisitionStatus"
FROM CHANGE_DOCS AS C
JOIN REQUISITIONS AS R ON C.PurchaseRequisition = R.PurchaseRequisition
JOIN I_PurchaseRequisitionItemAPI01 AS I ON C.PurchaseRequisition = I.PurchaseRequisition
WHERE C.FieldName = 'FRGZU' AND C.ValueOld != '' AND C.ValueNew = ''
UNION ALL
-- 6. Approval Step Completed
SELECT
C.PurchaseRequisition AS "PurchaseRequisitionId",
'Approval Step Completed' AS "ActivityName",
C.ChangeTimestamp AS "EventTime",
NULL AS "UserId",
C.UserName AS "ApproverId",
R.PurchaseRequisitionType AS "RequisitionType",
I.CostCenter AS "Department",
I.RequisitionPrice * I.RequestedQuantity AS "RequisitionAmount",
I.PurReqnProcessingStatus AS "RequisitionStatus"
FROM CHANGE_DOCS AS C
JOIN REQUISITIONS AS R ON C.PurchaseRequisition = R.PurchaseRequisition
JOIN I_PurchaseRequisitionItemAPI01 AS I ON C.PurchaseRequisition = I.PurchaseRequisition
WHERE C.FieldName = 'FRGZU' AND C.ValueNew IN ('1', '2', '3', '4', '5', '6', '7') -- Adjust release codes as per your config
UNION ALL
-- 7. Requisition Approved
SELECT
C.PurchaseRequisition AS "PurchaseRequisitionId",
'Requisition Approved' AS "ActivityName",
C.ChangeTimestamp AS "EventTime",
NULL AS "UserId",
C.UserName AS "ApproverId",
R.PurchaseRequisitionType AS "RequisitionType",
I.CostCenter AS "Department",
I.RequisitionPrice * I.RequestedQuantity AS "RequisitionAmount",
I.PurReqnProcessingStatus AS "RequisitionStatus"
FROM CHANGE_DOCS AS C
JOIN REQUISITIONS AS R ON C.PurchaseRequisition = R.PurchaseRequisition
JOIN I_PurchaseRequisitionItemAPI01 AS I ON C.PurchaseRequisition = I.PurchaseRequisition
WHERE C.FieldName = 'FRGKE' AND C.ValueNew = '2' -- Final release indicator '2' is common for approved
UNION ALL
-- 8. Requisition Rejected
SELECT
C.PurchaseRequisition AS "PurchaseRequisitionId",
'Requisition Rejected' AS "ActivityName",
C.ChangeTimestamp AS "EventTime",
NULL AS "UserId",
C.UserName AS "ApproverId",
R.PurchaseRequisitionType AS "RequisitionType",
I.CostCenter AS "Department",
I.RequisitionPrice * I.RequestedQuantity AS "RequisitionAmount",
I.PurReqnProcessingStatus AS "RequisitionStatus"
FROM CHANGE_DOCS AS C
JOIN REQUISITIONS AS R ON C.PurchaseRequisition = R.PurchaseRequisition
JOIN I_PurchaseRequisitionItemAPI01 AS I ON C.PurchaseRequisition = I.PurchaseRequisition
WHERE C.FieldName = 'FRGZU' AND C.ValueNew = 'B' -- 'B' for Blocked/Rejected is a common setting
UNION ALL
-- 9. Requisition Withdrawn
SELECT
C.PurchaseRequisition AS "PurchaseRequisitionId",
'Requisition Withdrawn' AS "ActivityName",
C.ChangeTimestamp AS "EventTime",
C.UserName AS "UserId",
NULL AS "ApproverId",
R.PurchaseRequisitionType AS "RequisitionType",
I.CostCenter AS "Department",
I.RequisitionPrice * I.RequestedQuantity AS "RequisitionAmount",
I.PurReqnProcessingStatus AS "RequisitionStatus"
FROM CHANGE_DOCS AS C
JOIN REQUISITIONS AS R ON C.PurchaseRequisition = R.PurchaseRequisition
JOIN I_PurchaseRequisitionItemAPI01 AS I ON C.PurchaseRequisition = I.PurchaseRequisition
WHERE C.FieldName = 'LOEKZ' AND C.ValueNew = 'X'
UNION ALL
-- 10. Source of Supply Assigned
SELECT DISTINCT
C.PurchaseRequisition AS "PurchaseRequisitionId",
'Source of Supply Assigned' AS "ActivityName",
C.ChangeTimestamp AS "EventTime",
C.UserName AS "UserId",
NULL AS "ApproverId",
R.PurchaseRequisitionType AS "RequisitionType",
I.CostCenter AS "Department",
I.RequisitionPrice * I.RequestedQuantity AS "RequisitionAmount",
I.PurReqnProcessingStatus AS "RequisitionStatus"
FROM CHANGE_DOCS AS C
JOIN REQUISITIONS AS R ON C.PurchaseRequisition = R.PurchaseRequisition
JOIN I_PurchaseRequisitionItemAPI01 AS I ON C.PurchaseRequisition = I.PurchaseRequisition
WHERE C.FieldName IN ('LIFNR', 'INFNR') AND C.ValueNew != ''
AND C.ChangeTimestamp > R.CreationTimestamp
UNION ALL
-- 11. Purchase Order Created
SELECT DISTINCT
I.PurchaseRequisition AS "PurchaseRequisitionId",
'Purchase Order Created' AS "ActivityName",
CAST(CONCAT(H.PurchaseOrderDate, 'T', LPAD(H.CreationTime, 6, '0')) AS TIMESTAMP) AS "EventTime",
H.CreatedByUser AS "UserId",
NULL AS "ApproverId",
R.PurchaseRequisitionType AS "RequisitionType",
I.CostCenter AS "Department",
I.OrderPriceUnit * I.OrderQuantity AS "RequisitionAmount",
'PO Created' AS "RequisitionStatus"
FROM I_PurchaseOrderItemAPI01 AS I
JOIN I_PurchaseOrderAPI01 AS H
ON I.PurchaseOrder = H.PurchaseOrder
JOIN REQUISITIONS AS R
ON I.PurchaseRequisition = R.PurchaseRequisition
WHERE I.PurchaseRequisition IS NOT NULL AND I.PurchaseRequisition != ''
UNION ALL
-- 12. Requisition Closed
SELECT
C.PurchaseRequisition AS "PurchaseRequisitionId",
'Requisition Closed' AS "ActivityName",
C.ChangeTimestamp AS "EventTime",
C.UserName AS "UserId",
NULL AS "ApproverId",
R.PurchaseRequisitionType AS "RequisitionType",
I.CostCenter AS "Department",
I.RequisitionPrice * I.RequestedQuantity AS "RequisitionAmount",
I.PurReqnProcessingStatus AS "RequisitionStatus"
FROM CHANGE_DOCS AS C
JOIN REQUISITIONS AS R ON C.PurchaseRequisition = R.PurchaseRequisition
JOIN I_PurchaseRequisitionItemAPI01 AS I ON C.PurchaseRequisition = I.PurchaseRequisition
WHERE C.FieldName = 'EBAKZ' AND C.ValueNew = 'X' 步骤
- 确认您可以直接读取包含EBAN和EBKN的SAP HANA架构,并找出系统中用于请购单修改、审批处理、来源分配、采购订单引用和关闭的变更单及采购单据对象。由于这些对象和字段可能因版本和配置而异,请将查询中方括号内的每个占位符替换为系统中对应的对象或字段。
- 在SAP GUI中使用事务码SE16H或经批准的数据库管理工具检查EBAN和EBKN,核实请购单关键字段,并确认可用的日期、时间、用户、状态、删除、审批、科目分配和采购单据引用字段。使用SE11或SAP数据字典核实字段定义。测试时请勿暴露生产数据。
- 找出系统中用于记录请购单修改和审批变更的变更单来源。查询要求使用名为[Your requisition change document source]的标准化变更来源,其中包含请购单号、行项目号、变更字段、旧值、新值、变更日期、变更时间和用户字段。执行前,请将此来源映射到系统中相关的SAP变更单表或CDS视图。
- 找出用于记录提交、审批重置、审批步骤开始、审批步骤完成、最终审批和拒绝的工作流或审批来源。查询要求使用[Your requisition approval event source],每行对应一次状态或审批转换,并包含请购单号、行项目号、事件类型、审批代码或审批组、审批人、事件日期、事件时间和状态字段。请将其映射到S/4HANA配置所使用的审批或工作流持久化数据源。
- 找出来源分配、采购订单引用和关闭数据源。查询要求使用[Your requisition source assignment source]、[Your requisition purchase order reference source]和[Your requisition closure source]。请将这些占位符映射到系统中经批准的表或视图。采购订单创建必须通过采购订单行项目对请购单行项目的明确引用来表示,不能根据无关采购活动推断。
- 使用[Start date]和[End date]设置提取时间范围。建议初次运行时使用3到6个月的数据。确认数据库性能和事件量后,再考虑扩大范围。查询会筛选创建日期和事件日期,并保留请购单标识符作为案例标识符。
- 在连接SAP HANA的经批准SQL客户端中执行查询。仅替换查询之外的连接信息、日期参数、公司特定筛选条件,以及明确注明的来源和字段占位符。请准确保留输出列名:PurchaseRequisitionId、ActivityName、EventTime、UserId、ApproverId、RequisitionType、Department、RequisitionAmount和RequisitionStatus。
- 检查重复事件、时间戳精度、时区处理,以及行项目级与单据级粒度。查询会输出单据级案例标识符,并在内部保留行项目信息。如果多个行项目产生相同活动和时间戳,请保留独立记录,除非您的ProcessMind设计明确要求去重。
- 验证每项必需活动都作为ActivityName值出现,EventTime已填充且时间顺序合理,并且必需的案例标识符不为空。请将统计结果与相同日期范围内的SAP报表或经批准的运营数据提取结果进行核对。
- 将结果导出为UTF-8编码的CSV文件或其他ProcessMind支持的表格格式。请包含表头,保留兼容ISO标准的时间戳,并将空值保留为空。上传文件时,将PurchaseRequisitionId设为案例标识符,ActivityName设为活动列,EventTime设为时间戳列。
配置
- **案例标识符:**使用EBAN中的采购申请单据编号,并将其表示为PurchaseRequisitionId。如果流程按行项目配置,则改用有文档说明的复合键,例如请购单号与行项目号,并确保所有事件使用相同的键。
- **主要数据源:**使用EBAN获取请购单行项目数据,使用EBKN获取科目分配以及部门或成本中心信息。执行前,请在SAP数据字典中确认准确的字段名称和数据类型。
- **事件来源:**查询使用通用占位符表示变更、审批、来源分配、采购订单引用和关闭数据源。这些来源取决于S/4HANA版本、工作流设计、审批流程、已激活的业务功能和客户扩展。
- **日期范围:**初次提取建议使用3到6个月的数据。可用时,请使用有界日期范围筛选带索引或可用于分区裁剪的日期字段。增量加载时,提取时间窗口应适当重叠,以捕获延迟到达的变更;随后使用案例、活动、时间戳、行项目和来源事件键去重。
- **业务筛选条件:**仅当字段可用且其业务含义已确认时,才配置[Company code filter]、[Document type filter]、[Purchasing group filter]和[Plant filter]。如果目标是捕获完整生命周期,请避免按状态筛选。
- **状态映射:**根据目标系统中的审批策略或工作流配置,设置审批中、最终批准、已拒绝、已重置、待审批代码和已关闭等状态值。不要假设所有SAP客户端都使用相同的状态代码。
- **修改映射:**纳入数量、价格、物料、交货日期、科目分配以及流程定义为关键字段的其他字段变更。查询已为列出的关键字段设置明确谓词,并要求数据源提供变更字段名称。
- **时间戳处理:**在数据库时区中合并事件日期和时间,并记录任何转换为UTC的操作。如果数据源只存储日期,则仅在没有更精确时间戳时使用午夜时间,并记录此限制。
- **性能:**初次提取时按日期和业务范围限制数据,只选择必需列,避免不受限地关联大型变更历史或工作流历史,并检查HANA执行计划。如需重复提取,可将标准化事件来源实体化或暂存。
- **授权和前提条件:**获取读取EBAN、EBKN、已配置的变更和工作流来源、来源分配数据、采购订单引用数据及关闭数据的授权。确认直接数据库访问已获批准,相关采购和工作流功能已启用,并且具备所需的SAP HANA数据库许可证或管理工具。
- **安全:**遵循最小权限原则,保护用户和审批人标识符,并遵守组织对采购及财务信息提取的规定。
查询示例 sql
WITH
base_items AS (
SELECT
eban.[Purchase requisition number field] AS PurchaseRequisitionId,
eban.[Purchase requisition item field] AS RequisitionItem,
eban.[Creation date field] AS CreationDate,
eban.[Creation time field] AS CreationTime,
eban.[Created by field] AS CreatedBy,
eban.[Requisition type field] AS RequisitionType,
eban.[Company code field] AS CompanyCode,
eban.[Plant field] AS Plant,
eban.[Purchasing group field] AS PurchasingGroup,
eban.[Quantity field] AS Quantity,
eban.[Net price field] AS NetPrice,
eban.[Currency field] AS Currency,
eban.[Material field] AS Material,
eban.[Deletion indicator field] AS DeletionIndicator,
eban.[Overall release status field] AS OverallReleaseStatus,
eban.[Item processing status field] AS ItemProcessingStatus,
ebkn.[Cost center field] AS CostCenter,
ebkn.[Department field] AS Department,
CAST(eban.[Quantity field] * eban.[Net price field] AS DECIMAL(19,4)) AS RequisitionAmount
FROM [Your SAP schema].EBAN eban
LEFT JOIN [Your SAP schema].EBKN ebkn
ON ebkn.[Purchase requisition number field] = eban.[Purchase requisition number field]
AND ebkn.[Purchase requisition item field] = eban.[Purchase requisition item field]
WHERE eban.[Creation date field] BETWEEN '[Start date]' AND '[End date]'
AND ('[Company code filter]' = '' OR eban.[Company code field] = '[Company code filter]')
AND ('[Document type filter]' = '' OR eban.[Requisition type field] = '[Document type filter]')
AND ('[Purchasing group filter]' = '' OR eban.[Purchasing group field] = '[Purchasing group filter]')
AND ('[Plant filter]' = '' OR eban.[Plant field] = '[Plant filter]')
),
created_events AS (
SELECT
PurchaseRequisitionId,
'Requisition Created' AS ActivityName,
TO_TIMESTAMP(CAST(CreationDate AS NVARCHAR(8)) || LPAD(COALESCE(CAST(CreationTime AS NVARCHAR(6)), '000000'), 6, '0'), 'YYYYMMDDHH24MISS') AS EventTime,
CreatedBy AS UserId,
CAST(NULL AS NVARCHAR(80)) AS ApproverId,
RequisitionType,
Department,
RequisitionAmount,
'Created' AS RequisitionStatus
FROM base_items
),
submitted_events AS (
SELECT
b.PurchaseRequisitionId,
'Requisition Submitted For Approval' AS ActivityName,
TO_TIMESTAMP(CAST(a.[Event date field] AS NVARCHAR(8)) || LPAD(CAST(a.[Event time field] AS NVARCHAR(6)), 6, '0'), 'YYYYMMDDHH24MISS') AS EventTime,
a.[Requester or submitter field] AS UserId,
CAST(NULL AS NVARCHAR(80)) AS ApproverId,
b.RequisitionType,
b.Department,
b.RequisitionAmount,
a.[Status field] AS RequisitionStatus
FROM base_items b
INNER JOIN [Your requisition approval event source] a
ON a.[Purchase requisition number field] = b.PurchaseRequisitionId
AND a.[Purchase requisition item field] = b.RequisitionItem
WHERE a.[Event type field] = 'SUBMITTED'
OR a.[Status field] = 'In Approval'
),
amended_events AS (
SELECT
b.PurchaseRequisitionId,
'Requisition Amended' AS ActivityName,
TO_TIMESTAMP(CAST(c.[Change date field] AS NVARCHAR(8)) || LPAD(CAST(c.[Change time field] AS NVARCHAR(6)), 6, '0'), 'YYYYMMDDHH24MISS') AS EventTime,
c.[Change user field] AS UserId,
CAST(NULL AS NVARCHAR(80)) AS ApproverId,
b.RequisitionType,
b.Department,
b.RequisitionAmount,
'Amended' AS RequisitionStatus
FROM base_items b
INNER JOIN [Your requisition change document source] c
ON c.[Purchase requisition number field] = b.PurchaseRequisitionId
AND c.[Purchase requisition item field] = b.RequisitionItem
WHERE c.[Changed field field] IN ('QUANTITY', 'PRICE', 'MATERIAL', 'DELIVERY_DATE', 'ACCOUNT_ASSIGNMENT')
),
reset_events AS (
SELECT
b.PurchaseRequisitionId,
'Approval Reset' AS ActivityName,
TO_TIMESTAMP(CAST(a.[Event date field] AS NVARCHAR(8)) || LPAD(CAST(a.[Event time field] AS NVARCHAR(6)), 6, '0'), 'YYYYMMDDHH24MISS') AS EventTime,
a.[Event user field] AS UserId,
CAST(NULL AS NVARCHAR(80)) AS ApproverId,
b.RequisitionType,
b.Department,
b.RequisitionAmount,
a.[Status field] AS RequisitionStatus
FROM base_items b
INNER JOIN [Your requisition approval event source] a
ON a.[Purchase requisition number field] = b.PurchaseRequisitionId
AND a.[Purchase requisition item field] = b.RequisitionItem
WHERE a.[Event type field] = 'RESET'
OR a.[Status field] = 'Approval Reset'
),
step_started_events AS (
SELECT
b.PurchaseRequisitionId,
'Approval Step Started' AS ActivityName,
TO_TIMESTAMP(CAST(a.[Event date field] AS NVARCHAR(8)) || LPAD(CAST(a.[Event time field] AS NVARCHAR(6)), 6, '0'), 'YYYYMMDDHH24MISS') AS EventTime,
CAST(NULL AS NVARCHAR(80)) AS UserId,
a.[Approver or approval group field] AS ApproverId,
b.RequisitionType,
b.Department,
b.RequisitionAmount,
a.[Status field] AS RequisitionStatus
FROM base_items b
INNER JOIN [Your requisition approval event source] a
ON a.[Purchase requisition number field] = b.PurchaseRequisitionId
AND a.[Purchase requisition item field] = b.RequisitionItem
WHERE a.[Event type field] = 'STEP_STARTED'
OR a.[Status field] = 'Pending Release'
),
step_completed_events AS (
SELECT
b.PurchaseRequisitionId,
'Approval Step Completed' AS ActivityName,
TO_TIMESTAMP(CAST(a.[Event date field] AS NVARCHAR(8)) || LPAD(CAST(a.[Event time field] AS NVARCHAR(6)), 6, '0'), 'YYYYMMDDHH24MISS') AS EventTime,
CAST(NULL AS NVARCHAR(80)) AS UserId,
a.[Approver or approval group field] AS ApproverId,
b.RequisitionType,
b.Department,
b.RequisitionAmount,
a.[Status field] AS RequisitionStatus
FROM base_items b
INNER JOIN [Your requisition approval event source] a
ON a.[Purchase requisition number field] = b.PurchaseRequisitionId
AND a.[Purchase requisition item field] = b.RequisitionItem
WHERE a.[Event type field] = 'STEP_COMPLETED'
OR a.[Status field] = 'Step Approved'
),
approved_events AS (
SELECT
b.PurchaseRequisitionId,
'Requisition Approved' AS ActivityName,
TO_TIMESTAMP(CAST(a.[Event date field] AS NVARCHAR(8)) || LPAD(CAST(a.[Event time field] AS NVARCHAR(6)), 6, '0'), 'YYYYMMDDHH24MISS') AS EventTime,
CAST(NULL AS NVARCHAR(80)) AS UserId,
a.[Approver or approval group field] AS ApproverId,
b.RequisitionType,
b.Department,
b.RequisitionAmount,
a.[Status field] AS RequisitionStatus
FROM base_items b
INNER JOIN [Your requisition approval event source] a
ON a.[Purchase requisition number field] = b.PurchaseRequisitionId
AND a.[Purchase requisition item field] = b.RequisitionItem
WHERE a.[Event type field] = 'FINAL_APPROVED'
OR a.[Status field] = 'Approved'
),
rejected_events AS (
SELECT
b.PurchaseRequisitionId,
'Requisition Rejected' AS ActivityName,
TO_TIMESTAMP(CAST(a.[Event date field] AS NVARCHAR(8)) || LPAD(CAST(a.[Event time field] AS NVARCHAR(6)), 6, '0'), 'YYYYMMDDHH24MISS') AS EventTime,
CAST(NULL AS NVARCHAR(80)) AS UserId,
a.[Approver or approval group field] AS ApproverId,
b.RequisitionType,
b.Department,
b.RequisitionAmount,
a.[Status field] AS RequisitionStatus
FROM base_items b
INNER JOIN [Your requisition approval event source] a
ON a.[Purchase requisition number field] = b.PurchaseRequisitionId
AND a.[Purchase requisition item field] = b.RequisitionItem
WHERE a.[Event type field] = 'REJECTED'
OR a.[Status field] = 'Rejected'
),
withdrawn_events AS (
SELECT
b.PurchaseRequisitionId,
'Requisition Withdrawn' AS ActivityName,
TO_TIMESTAMP(CAST(c.[Change date field] AS NVARCHAR(8)) || LPAD(CAST(c.[Change time field] AS NVARCHAR(6)), 6, '0'), 'YYYYMMDDHH24MISS') AS EventTime,
c.[Change user field] AS UserId,
CAST(NULL AS NVARCHAR(80)) AS ApproverId,
b.RequisitionType,
b.Department,
b.RequisitionAmount,
'Withdrawn' AS RequisitionStatus
FROM base_items b
INNER JOIN [Your requisition change document source] c
ON c.[Purchase requisition number field] = b.PurchaseRequisitionId
AND c.[Purchase requisition item field] = b.RequisitionItem
WHERE c.[Changed field field] = 'DELETION_INDICATOR'
AND c.[New value field] IS NOT NULL
AND c.[New value field] <> ''
),
source_assigned_events AS (
SELECT
b.PurchaseRequisitionId,
'Source of Supply Assigned' AS ActivityName,
TO_TIMESTAMP(CAST(s.[Event date field] AS NVARCHAR(8)) || LPAD(CAST(s.[Event time field] AS NVARCHAR(6)), 6, '0'), 'YYYYMMDDHH24MISS') AS EventTime,
s.[Event user field] AS UserId,
CAST(NULL AS NVARCHAR(80)) AS ApproverId,
b.RequisitionType,
b.Department,
b.RequisitionAmount,
'Source Assigned' AS RequisitionStatus
FROM base_items b
INNER JOIN [Your requisition source assignment source] s
ON s.[Purchase requisition number field] = b.PurchaseRequisitionId
AND s.[Purchase requisition item field] = b.RequisitionItem
WHERE s.[Source identifier field] IS NOT NULL
AND s.[Source identifier field] <> ''
),
purchase_order_events AS (
SELECT
b.PurchaseRequisitionId,
'Purchase Order Created' AS ActivityName,
TO_TIMESTAMP(CAST(p.[Purchase order creation date field] AS NVARCHAR(8)) || LPAD(CAST(p.[Purchase order creation time field] AS NVARCHAR(6)), 6, '0'), 'YYYYMMDDHH24MISS') AS EventTime,
p.[Purchase order creator field] AS UserId,
CAST(NULL AS NVARCHAR(80)) AS ApproverId,
b.RequisitionType,
b.Department,
b.RequisitionAmount,
'Purchase Order Created' AS RequisitionStatus
FROM base_items b
INNER JOIN [Your requisition purchase order reference source] p
ON p.[Purchase requisition number field] = b.PurchaseRequisitionId
AND p.[Purchase requisition item field] = b.RequisitionItem
WHERE p.[Purchase order number field] IS NOT NULL
AND p.[Purchase order number field] <> ''
),
closed_events AS (
SELECT
b.PurchaseRequisitionId,
'Requisition Closed' AS ActivityName,
TO_TIMESTAMP(CAST(cl.[Event date field] AS NVARCHAR(8)) || LPAD(CAST(cl.[Event time field] AS NVARCHAR(6)), 6, '0'), 'YYYYMMDDHH24MISS') AS EventTime,
cl.[Event user field] AS UserId,
CAST(NULL AS NVARCHAR(80)) AS ApproverId,
b.RequisitionType,
b.Department,
b.RequisitionAmount,
cl.[Status field] AS RequisitionStatus
FROM base_items b
INNER JOIN [Your requisition closure source] cl
ON cl.[Purchase requisition number field] = b.PurchaseRequisitionId
AND cl.[Purchase requisition item field] = b.RequisitionItem
WHERE cl.[Event type field] = 'CLOSED'
OR cl.[Status field] = 'Closed'
)
SELECT PurchaseRequisitionId, ActivityName, EventTime, UserId, ApproverId, RequisitionType, Department, RequisitionAmount, RequisitionStatus FROM created_events
UNION ALL
SELECT PurchaseRequisitionId, ActivityName, EventTime, UserId, ApproverId, RequisitionType, Department, RequisitionAmount, RequisitionStatus FROM submitted_events
UNION ALL
SELECT PurchaseRequisitionId, ActivityName, EventTime, UserId, ApproverId, RequisitionType, Department, RequisitionAmount, RequisitionStatus FROM amended_events
UNION ALL
SELECT PurchaseRequisitionId, ActivityName, EventTime, UserId, ApproverId, RequisitionType, Department, RequisitionAmount, RequisitionStatus FROM reset_events
UNION ALL
SELECT PurchaseRequisitionId, ActivityName, EventTime, UserId, ApproverId, RequisitionType, Department, RequisitionAmount, RequisitionStatus FROM step_started_events
UNION ALL
SELECT PurchaseRequisitionId, ActivityName, EventTime, UserId, ApproverId, RequisitionType, Department, RequisitionAmount, RequisitionStatus FROM step_completed_events
UNION ALL
SELECT PurchaseRequisitionId, ActivityName, EventTime, UserId, ApproverId, RequisitionType, Department, RequisitionAmount, RequisitionStatus FROM approved_events
UNION ALL
SELECT PurchaseRequisitionId, ActivityName, EventTime, UserId, ApproverId, RequisitionType, Department, RequisitionAmount, RequisitionStatus FROM rejected_events
UNION ALL
SELECT PurchaseRequisitionId, ActivityName, EventTime, UserId, ApproverId, RequisitionType, Department, RequisitionAmount, RequisitionStatus FROM withdrawn_events
UNION ALL
SELECT PurchaseRequisitionId, ActivityName, EventTime, UserId, ApproverId, RequisitionType, Department, RequisitionAmount, RequisitionStatus FROM source_assigned_events
UNION ALL
SELECT PurchaseRequisitionId, ActivityName, EventTime, UserId, ApproverId, RequisitionType, Department, RequisitionAmount, RequisitionStatus FROM purchase_order_events
UNION ALL
SELECT PurchaseRequisitionId, ActivityName, EventTime, UserId, ApproverId, RequisitionType, Department, RequisitionAmount, RequisitionStatus FROM closed_events
ORDER BY PurchaseRequisitionId, EventTime, ActivityName; 告别采购到付款请购延误:立即优化工作流!
简化流程、缩短交付周期,并将周期时间缩短30%。
无需信用卡,5分钟即可完成设置。