您的生产计划数据模板
您的生产计划数据模板
- 建议收集的属性
- 需要跟踪的关键活动
- 实用的数据提取指南
生产计划属性
| 名称 | 说明 | ||
|---|---|---|---|
| 事件时间 EventTime | 表示活动发生时间的精确时间戳。 | ||
| 说明 事件时间记录具体活动执行或系统记录状态的日期和时间。该时间戳是所有基于时间的流程分析的基础,包括计算周期时间、等待时间和流程总时长。 准确的时间戳对于正确排列事件顺序和开展绩效分析至关重要。它可以帮助分析人员衡量活动之间的时长、识别延误,并根据计划或服务级别协议评估绩效。在生产计划场景中,这有助于了解计划和执行各阶段分别耗时多久。 为什么重要 该属性提供事件的时间顺序,是计算时长、分析绩效和识别瓶颈的基础。 获取位置 根据与交易和状态变更相关的各种日期和时间字段生成,例如物料凭证中的BUDAT(过账日期)或CDHDR中的变更时间戳。 示例 2023-04-15T10:05:30Z2023-04-15T14:22:00Z2023-04-18T08:59:11Z2023-04-20T16:45:00Z | |||
| 活动名称 ActivityName | 生产订单在特定时间点发生的业务事件或系统事件的名称。 | ||
| 说明 活动名称描述生产计划流程中的具体步骤或状态变更。这些事件从SAP ECC PP中的变更日志、状态更新和交易记录中提取,代表“生产订单已创建”“物料可用性已检查”或“收货已过账”等关键里程碑。 该属性构成流程图的基础,使分析人员能够可视化事件顺序、发现流程变体,并识别瓶颈或返工循环。活动名称的清晰度和粒度,对于构建准确且有洞察力的流程模型至关重要,能够真实反映运营情况。 为什么重要 它定义流程图中的各个步骤,使您能够可视化、分析并理解生产工作流。 获取位置 数据来源包括JEST/JSTO表中的状态变更、交易日志,以及CDHDR/CDPOS中的变更凭证。 示例 生产订单已释放发料已过账最终确认已记录订单已技术完成 | |||
| 生产订单 ProductionOrder | 生产订单的唯一标识符,也是生产计划与执行流程的主要案例标识。 | ||
| 说明 生产订单号是SAP ECC PP中分配给每个制造订单的唯一字母数字键。它是连接所有相关活动的核心对象,涵盖订单创建、计划、执行和最终结算。 在流程挖掘中,该属性对于汇总属于同一生产运行的所有事件至关重要。借助它,您可以端到端分析生产订单的完整生命周期,包括跟踪进度、衡量周期时间,以及识别与标准流程的偏差。按生产订单分析流程,可以清晰了解每项制造需求的完成情况。 为什么重要 这是连接所有相关流程事件的核心标识,可重建并分析每个生产旅程从开始到结束的全过程。 获取位置 该属性位于SAP表AUFK的字段AUFNR中。 示例 1000345100034610003471000348 | |||
| 最后数据更新时间 LastDataUpdate | 表示该事件数据最近一次刷新或提取时间的时间戳。 | ||
| 说明 该属性记录数据从源系统提取到流程挖掘工具的日期和时间。它不代表业务事件,而是用于数据管理的技术时间戳。 它主要用于确认数据的新鲜度,并帮助管理员和分析人员了解所分析数据的时效性。尤其在监控持续运营时,它对于验证流程分析是否基于最新信息至关重要。 为什么重要 它可以确认数据的新鲜度,确保分析基于当前可用的最新信息。 获取位置 该值通常由数据提取、转换和加载(ETL)工具或脚本在数据导入过程中生成并写入。 示例 2023-10-27T02:00:00Z2023-10-28T02:00:00Z2023-10-29T02:00:00Z | |||
| 源系统 SourceSystem | 标识数据提取自哪个具体系统。 | ||
| 说明 该属性指定记录的来源系统,例如具体SAP ECC实例的名称或ID。在拥有多个ERP系统,或同时使用旧平台和现代平台的企业中,该字段对于数据血缘和上下文分析至关重要。 在分析中,您可以根据来源系统筛选流程。这有助于比较不同系统中的流程绩效,或在多系统数据整合项目中隔离数据。 为什么重要 它提供了有关数据来源的重要上下文,尤其适用于包含多个SAP实例或集成系统的环境。 获取位置 通常在数据提取过程中添加,往往根据SAP系统ID(SY-SYSID)生成。 示例 ECC_PROD_100S4H_FIN_200ECC_DE | |||
| 交付数量 DeliveredQuantity | 已生产并入库的产品实际数量。 | ||
| 说明 交付数量也称收货数量,是指定生产订单中已确认生产完成的成品总量。发生“收货已过账”事件时,该值会更新。 该属性与“计划数量”相对应,是计算“计划数量与实际数量偏差”KPI的基础。它提供了生产产出的明确衡量标准,帮助分析人员识别由报废、产出损失或其他生产问题造成的差异。比较不同工厂、产品或时间段的交付数量,可以发现效率问题所在。 为什么重要 它衡量生产流程的实际产出,使您能够直接与计划目标比较并评估绩效。 获取位置 该值位于SAP表AFPO的字段WEMNG(收货数量)中。 示例 984950751255 | |||
| 产品代码 ProductCode | 所制造物料或产品的唯一标识符。 | ||
| 说明 产品代码或物料号用于标识生产订单计划制造的产品。这是连接生产计划、库存管理、销售和成本核算的核心主数据元素。 在流程挖掘中,按产品代码筛选或分段分析,对于了解特定产品的制造流程至关重要。它可以帮助回答“哪些产品的周期时间最长?”或“某些产品是否更容易出现质量问题或物料延误?”等问题。这类分析对于产品组合管理,以及针对特定物料类型寻找流程标准化或优化机会十分重要。 为什么重要 它支持针对具体产品开展流程分析,揭示哪些物料与流程低效、延误或高成本相关。 获取位置 该属性位于SAP表AFPO的字段MATNR中。 示例 FG-123RM-45AHALB-7890CHEM-22 | |||
| 实际开始日期 ActualStartDate | 第一条生产活动记录的时间戳,标志着实际执行的开始。 | ||
| 说明 实际开始日期是标志着实际生产工作开始的第一条事件的时间戳。通常根据第一条生产确认事件,或订单首次领用原材料的发料事件生成。 该派生属性对于计划执行率分析至关重要。它提供实际开始点,可与“计划开始日期”比较,从而精确计算开始时间偏差。了解计划开始日期与实际开始日期之间的差距,有助于定位物料备料、设备设置或资源可用性导致的生产前延误。 为什么重要 它提供生产执行的真实起点,使您能够准确计算启动延误和生产总交付周期。 获取位置 从事件日志中派生,针对每个生产订单,查找“首次确认已记录”或“发料已过账”等特定执行活动的最小时间戳。 示例 2023-05-11T08:30:00Z2023-06-22T14:00:00Z2023-07-02T09:15:00Z | |||
| 实际结束日期 ActualEndDate | 最后一条生产活动记录的时间戳,标志着订单实际完成。 | ||
| 说明 实际结束日期是标志订单全部生产活动完成的事件时间戳。通常根据“最终确认已记录”或最后一条“收货已过账”事件的时间戳生成。 该属性对于衡量生产总周期时间和计划执行率至关重要。将“实际结束日期”与“计划结束日期”比较,可以判断订单是否按时完成。分析“实际开始日期”到“实际结束日期”之间的时长,可以得到真实的生产吞吐时间。 为什么重要 它标志着生产完成,使您能够准确衡量按时交付绩效和总执行时间。 获取位置 通过查找“Final Confirmation Recorded”或“Goods Receipt Posted”等关键完成活动的最大时间戳,从事件日志中派生。 示例 2023-05-14T16:00:00Z2023-06-29T11:30:00Z2023-07-05T17:00:00Z | |||
| 生产工厂 ProductionPlant | 执行生产订单的制造设施或地点。 | ||
| 说明 生产工厂是SAP中的关键组织单位,代表一处制造设施。每个生产订单都会分配一个生产工厂,用于确定生产活动实际发生的地点。 按生产工厂分析流程,可以比较不同地点的绩效。这有助于识别哪些工厂效率更高,哪些工厂延误或物料短缺更多,以及哪些最佳实践可以推广。在与吞吐量和资源利用率相关的仪表板中,生产工厂是开展根因分析的基础维度。 为什么重要 它支持比较不同制造地点的绩效,帮助识别特定工厂的问题或最佳实践。 获取位置 该属性存储在SAP表AUFK的字段WERKS中。 示例 100017102000DE01 | |||
| 计划数量 PlannedQuantity | 订单计划生产的产品总数量。 | ||
| 说明 计划数量表示生产计划阶段为生产订单定义的目标产出,是衡量实际生产产出的基准。 该属性是生产绩效和计划执行率相关KPI的基础,例如“计划数量与实际数量偏差”。它有助于评估生产计划的准确性,并识别过量生产或产量不足等系统性问题。分析该值,是了解生产执行与初始计划匹配程度的关键。 为什么重要 该属性是衡量生产产出偏差和评估计划准确性的基准。 获取位置 该值位于SAP表AFKO的字段GAMNG(订单总数量)中。 示例 1005000751250 | |||
| 数量偏差 QuantityVariance | 计划生产数量与实际交付数量之间的差值。 | ||
| 说明 数量偏差是一个计算指标,用于衡量生产产出相对于初始计划的偏离程度。计算方式为“交付数量”减去“计划数量”。正偏差表示超产,负偏差表示产量不足或收率损失。 该属性是“计划与实际生产产出”仪表板及其对应KPI的重要基础。分析偏差有助于识别生产收率、报废率或数据录入错误等问题,并直接衡量生产流程达到产出目标的可靠性。 为什么重要 它量化生产产出与计划之间的准确程度,突出显示收率、报废或流程控制方面的潜在问题。 获取位置 计算字段:'DeliveredQuantity' - 'PlannedQuantity'。 示例 -2-5005 | |||
| 物料可用性 MaterialAvailabilityStatus | 表示生产订单所需的全部组件是否可用。 | ||
| 说明 物料可用性状态是衡量生产准备情况的关键指标。系统会检查订单所需的全部组件物料,并据此确定该状态。“Available”表示生产可以继续,不会因物料产生延误;“Shortage”则表示存在物料短缺问题。 该属性是“物料短缺影响分析”仪表板的重要基础。通过分析订单因物料短缺而等待的时间,企业可以量化供应链问题对生产计划的影响,并识别经常导致延误的不可靠供应商或问题组件。 为什么重要 它可以直接突出显示物料短缺造成的延误,而物料短缺是生产计划偏差的常见且重要的根因。 获取位置 这不是单独存储的字段,而是可用性检查(ATP检查)的结果。结果通常可在事务CO02或集中可用性检查COHV中查看。状态本身(例如MACM,即物料已承诺)可能会被记录。请查阅SAP ECC PP文档。 示例 可用短缺部分可用未检查 | |||
| 生产优先级 ProductionPriority | 用于表示生产订单紧急程度或优先级的分类。 | ||
| 说明 生产优先级用于表示生产订单的相对重要性。生产排程人员和车间人员可以据此安排工作,确保关键订单优先完成。 分析该属性有助于评估优先级管理机制的有效性。通过比较高优先级订单与低优先级订单的周期时间,企业可以判断紧急订单是否确实处理得更快。如果不是,可能说明沟通、资源分配或整体执行流程存在问题。 为什么重要 它有助于评估优先级管理机制是否有效,确保高紧急度订单比普通订单更快完成。 获取位置 这通常不是生产订单抬头中的标准字段。它可能是自定义字段、根据销售订单优先级派生的字段,或分类体系的一部分。请查阅SAP ECC PP文档或系统配置。 示例 高中低加急 | |||
| 生产订单状态 ProductionOrderStatus | 生产订单当前的处理状态,例如已创建、已下达或技术完成。 | ||
| 说明 生产订单状态表示订单在生命周期中的当前阶段。SAP使用状态代码管理订单进度,例如CRTD(已创建)、REL(已下达)、CNF(已确认)、DLV(已交付)和TECO(技术完成)。 分析订单在不同状态下所花费的时间,是生产流程挖掘的核心工作。通过分析,可以识别订单创建后等待下达的时长,或订单处于部分交付状态的持续时间。将状态变化作为活动进行跟踪,可以从较高层级了解流程顺序。 为什么重要 它可以展示订单进度快照,并帮助识别订单长时间停滞的瓶颈。 获取位置 状态信息存储在JEST和JSTO表中,并通过订单的对象编号(AUFK-OBJNR)关联。状态文本位于TJ02T中。读取状态通常通过STATUS_TEXT_EDIT等函数模块完成。 示例 CRTD(已创建)REL(已发布)DLV(已交付)TECO(技术完成) | |||
| 计划员组 PlannerGroup | 负责订单的MRP控制员或生产计划员组成的团队。 | ||
| 说明 计划员组是一个组织要素,代表负责规划和管理特定物料或生产订单的人员团队。将订单分配给计划员组,有助于分配工作量并明确责任归属。 在流程挖掘中,该属性可用于根据负责计划的团队分析绩效。它可以帮助回答以下问题:“哪个计划员组的计划偏差最多?”或“不同团队管理的订单,其周期时间是否存在差异?”这些分析结果有助于平衡工作量并识别培训需求。 为什么重要 它支持按负责团队细分绩效分析,帮助识别计划效率和工作量方面的差异。 获取位置 这是MRP控制员,位于SAP表AFKO的DISPO字段中。 示例 001002P01P02 | |||
| 计划开始日期 PlannedStartDate | 计划开始生产该订单的日期。 | ||
| 说明 计划开始日期是生产计划和排程阶段确定的关键排程参数,表示订单计划开始生产活动的目标日期。 该属性对于衡量计划执行率至关重要。将“计划开始日期”与生产实际开始时间进行比较,例如“首次确认已记录”活动的时间戳,可以识别生产启动延误。分析延误原因,是该领域流程挖掘的主要应用场景。 为什么重要 它是衡量计划执行率和识别生产执行启动延误的基准。 获取位置 这是基本开始日期,位于SAP表AFKO的字段GSTRP中。 示例 2023-05-102023-06-222023-07-01 | |||
| 计划结束日期 PlannedEndDate | 计划完成该订单生产的日期。 | ||
| 说明 计划结束日期是生产订单的目标完成日期,在排程过程中确定。它定义了完成所有生产活动的预期时间范围,包括最终确认和收货。 该日期是计算“计划执行率”KPI的基础。将“计划结束日期”与实际完成时间进行比较,例如“收货已过账”或“最终确认已记录”活动的时间戳,可以判断订单是否按时完成。这有助于评估生产计划的可靠性,并识别延迟交付的根本原因。 为什么重要 它是判断生产订单是否按时完成的基准,直接影响客户满意度和计划可靠性。 获取位置 这是基本结束日期,位于SAP表AFKO的字段GLTRP中。 示例 2023-05-152023-06-282023-07-05 | |||
| 计划遵循状态 ScheduleAdherenceStatus | 用于表示生产订单是否在计划完成日期前完成的标志。 | ||
| 说明 计划遵循状态是一个计算得出的布尔型或分类属性,可直观展示订单是否按时完成。它通过比较“实际结束日期”和“计划结束日期”得出。如果实际结束日期早于或等于计划结束日期,状态为“On-Time”;否则为“Late”。 该属性简化了仪表板中的分析和可视化。您可以据此筛选和汇总数据,计算“计划遵循率”KPI,并识别订单延迟的主要原因,例如特定产品、工厂或物料短缺。 为什么重要 它将订单归类为“On-Time”或“Late”,简化绩效分析,便于衡量和报告计划可靠性。 获取位置 计算字段:IF('ActualEndDate' <= 'PlannedEndDate', 'On-Time', 'Late')。 示例 按时延迟 | |||
| 责任用户 ResponsibleUser | 创建或最后修改生产订单的人员的用户ID。 | ||
| 说明 责任用户标识与生产订单生命周期中关键事件相关联的SAP用户账户,例如订单创建或下达。它为系统中的操作提供责任追踪和可审计性。 在流程挖掘中,该属性用于根据用户行为分析流程差异。它可以帮助识别可能需要额外培训,或未遵循标准流程的用户。同时,它还支持资源分析,展示工作如何分配给不同用户。 为什么重要 它将流程活动关联到具体人员,从而支持用户级绩效分析并强化责任追踪。 获取位置 创建订单的用户位于AUFK-ERNAM中,最后修改订单的用户位于AUFK-AENAM中。变更文档(CDHDR-USERNAME)可提供特定变更对应的用户历史记录。 示例 JSMITHPROD_PLANNER1BATCH_USERAMILLER | |||
生产计划活动
| 活动 | 说明 | ||
|---|---|---|---|
| 最终确认已记录 | 此活动表示从车间执行角度看,生产订单的所有工序均已完成。系统会通过最后一道工序的最终确认记录标记此状态。 | ||
| 为什么重要 此里程碑标志着实际生产活动的结束。从首次确认到最终确认的时长,代表实际生产执行时间。 获取位置 当系统设置“CNF”(I0009,已确认)状态时,系统会记录此事件。通常,AFRU表中的最终确认记录(AFRU-AUERU = “X”)会触发该状态。状态变更会记录在JCDS中。 采集 识别“CNF”状态设置的时间戳,或查找AFRU中的最后一条确认记录。 事件类型 explicit | |||
| 收货已过账 | 此事件记录生产订单完工产品入库,表示制造完成的产品现已可用于发运或进一步加工。 | ||
| 为什么重要 这是关键的完成里程碑,代表生产流程的最终产出。从订单释放到收货的时间,就是生产总交付周期。 获取位置 该事件以物料凭证形式记录在MKPF/MSEG表中,包含移动类型,通常为“101”,并引用生产订单。订单上还会设置系统状态“DLV”(I0012,已交付)。 采集 记录移动类型为“101”的物料凭证过账日期,或记录“DLV”状态变更的时间戳。 事件类型 explicit | |||
| 生产订单已创建 | 此事件表示创建了新的生产订单,通常由计划运行或手工录入发起。当系统保存新的订单记录并将其状态设为“CRTD”(已创建)时,系统会明确记录此事件。 | ||
| 为什么重要 这是每个生产订单案例的起点。分析从此事件到订单释放所需的时间,有助于识别生产前计划和行政准备环节中的延误。 获取位置 此事件取自生产订单的创建日期(AUFK-ERDAT)和时间(AUFK-ERZET)。系统状态“CRTD”(I0001)会被分配给订单,并记录在JEST和JCDS表中,通过订单对象编号(AUFK-OBJNR)关联。 采集 跟踪创建时间戳以及“CRTD”状态的分配。 事件类型 explicit | |||
| 生产订单已释放 | 此活动表示生产订单已获得正式批准并释放,可进入执行阶段。订单释放后,物料预留生效,发料和确认等生产活动即可开始。 | ||
| 为什么重要 这是从计划转入执行的关键里程碑。从创建到释放所需的时间,是衡量计划效率的重要指标。 获取位置 当系统为生产订单分配“REL”(I0002)状态时,系统会明确记录此事件。该变更的时间戳记录在JCDS表中,并通过订单对象编号(AUFK-OBJNR)关联。 采集 识别订单“REL”状态生效的时间戳。 事件类型 explicit | |||
| 订单已技术完成 | 这是从物流角度完成生产订单的行政收尾步骤。该步骤会阻止后续物料移动或确认,并支持财务结算。 | ||
| 为什么重要 这是订单在物流环节生命周期的最终结束点。分析此事件有助于了解包括生产后行政任务在内的流程总时长。 获取位置 当系统为订单分配“TECO”(I0045,技术完成)状态时,系统会明确记录此事件。该变更的时间戳记录在JCDS表中。 采集 在JCDS中识别订单“TECO”状态生效的时间戳。 事件类型 explicit | |||
| 首次确认已记录 | 此事件表示订单实际生产工作的开始。当系统录入生产订单中任一工序的首次时间确认时,系统会记录此事件。 | ||
| 为什么重要 此活动提供生产实际开始时间,对于衡量计划执行率,以及识别资源分配到实际开工之间的延误至关重要。 获取位置 在AFRU表中查找该订单所有确认记录中最早的过账日期(AFRU-BUDAT),即可推断此事件。第一条记录标志着实际生产的开始。 采集 根据AFRU表中的过账日期,识别订单的第一条确认记录。 事件类型 inferred | |||
| 中间确认已记录 | 表示通过对某道工序进行部分确认,更新生产订单进度。对于需要在最终完成前持续跟踪进度的长期订单,这种方式十分常见。 | ||
| 为什么重要 分析中间确认有助于监控较长生产周期的进度,并识别生产流程内部的瓶颈,而不仅是开头或结尾环节的问题。 获取位置 从AFRU表中提取未标记为工序最终确认的确认记录。每条记录都包含过账日期(AFRU-BUDAT)和时间。 采集 从AFRU中提取所有未标记为工序最终确认的确认记录。 事件类型 explicit | |||
| 发料已过账 | 此活动表示从库存中领出用于生产订单的组件物料,确认所需原材料或半成品已备料并可用于生产。 | ||
| 为什么重要 此事件标志着物料消耗的开始。订单释放到发料之间的延误,可以揭示仓储物流、物料备料或库存准确性方面的问题。 获取位置 该事件以物料凭证形式记录在MKPF(抬头)和MSEG(项目)表中,包含移动类型,通常为“261”,并引用生产订单号(MSEG-AUFNR)。 采集 记录与订单关联、移动类型为“261”的物料凭证过账日期(MKPF-BUDAT)。 事件类型 explicit | |||
| 已检查物料可用性 | 表示执行检查,以确定生产订单所需的全部组件是否可用。该检查可以在创建或释放订单时自动执行,也可以由用户手动触发。 | ||
| 为什么重要 此活动对于了解物料短缺导致的延误至关重要。频繁检查,或物料长时间未能可用,可能表明供应链或库存管理存在问题。 获取位置 系统会设置类似“MACM”(物料已承诺)或“MSPT”(物料短缺)的状态。可以根据JEST/JCDS表中该状态变更的时间戳推断执行时间。结果会显示在订单抬头中。 采集 根据与物料可用性相关的状态变更时间戳推断,例如“MACM”或“MSPT”。 事件类型 inferred | |||
| 订单已设置取消 | 此事件表示生产订单在完成前被取消。通常通过设置特定状态或删除标记来执行,从而阻止后续处理。 | ||
| 为什么重要 这是需要重点跟踪的负面结果。分析已取消订单,可以揭示需求预测、计划准确性或主数据管理方面的问题。 获取位置 可以根据分配“DLFL”(I0076,删除标记)状态,或在系统配置中设置的特定“Canceled”状态推断。该变更的时间戳记录在JCDS表中。 采集 识别订单设置删除标记(“DLFL”)或取消状态的时间戳。 事件类型 inferred | |||
| 订单数据已变更 | 此事件记录生产订单创建后发生的重要修改,例如计划数量、日期或BOM变更。系统会记录这些变更,以满足审计要求。 | ||
| 为什么重要 跟踪这些变更有助于识别流程不稳定和频繁重新计划的情况。变更频率过高,可能说明初始计划不准确、需求波动较大或数据存在错误。 获取位置 AFKO(订单抬头)和AFPO(订单项目)等表中关键字段的变更,会记录在变更凭证表CDHDR(抬头)和CDPOS(项目)中。每项相关变更都可以提取为一个活动。 采集 从CDHDR和CDPOS表中提取生产订单对象类别的变更日志条目。 事件类型 explicit | |||
| 订单结算已执行 | 表示生产订单的财务结算,即将归集的成本分配至相应的成本对象。这是从管理会计角度看订单生命周期的最后一步。 | ||
| 为什么重要 虽然这是财务活动,但结算延误可能表明成本报告或订单数据准确性存在问题。它标志着生产流程真正完成财务闭环。 获取位置 当订单余额变为零,或系统状态“SETC”(I0076,已创建结算规则)之后出现结算运行日志时,可以推断该事件。实际结算记录在COSP和COSS等管理会计表中。 采集 根据CO表中与订单关联的结算凭证,或根据“SETC”状态的激活情况推断。 事件类型 inferred | |||
提取指南
步骤
- 在SAP Query中创建InfoSet:使用事务代码
SQ02。创建新的InfoSet,例如ZPP_EVENTLOG。选择“使用基础表进行表连接”作为数据源选项。使用AUFK(订单主数据)作为初始基础表。 - 连接所需表:将以下表添加到InfoSet连接中。系统可能会建议连接关系,但请确认其正确性:
AUFK连接AFKO(PP订单抬头数据):AUFK-AUFNR = AFKO-AUFNRAUFK连接JEST(单个对象状态):AUFK-OBJNR = JEST-OBJNRJEST连接JCDS(系统状态和用户状态的变更文档):JEST-OBJNR = JCDS-OBJNR且JEST-STAT = JCDS-STAT。注意:此连接用于读取状态变更历史。AUFK连接AFRU(订单完成确认):AUFK-AUFNR = AFRU-AUFNRAUFK连接MSEG(凭证分段:物料):AUFK-AUFNR = MSEG-AUFNRMSEG连接MKPF(抬头:物料凭证):MSEG-MBLNR = MKPF-MBLNR且MSEG-MJAHR = MKPF-MJAHR
- 定义字段组:将源表中的必需字段拖入字段组。确保最终查询所需的全部字段都已包含,例如
AUFK-AUFNR、AUFK-WERKS、AFKO-GAMNG、AFKO-GASMG、JCDS-UDATE和MKPF-BUDAT。 - 添加自定义字段和代码:在InfoSet中进入“Extras”选项卡。您需要为
ActivityName、EventTime、SourceSystem和LastDataUpdate定义自定义字段,并根据查询部分定义的逻辑编写ABAP代码为其赋值。该逻辑需要遍历状态变更、确认和物料凭证,为每个业务事件生成一条独立记录。这一步最复杂,因为您需要在InfoSet代码区段中将表格数据转换为事件日志格式。 - 生成并保存InfoSet:完成所有连接、字段和自定义代码后,保存并生成InfoSet。
- 创建SAP Query:使用事务代码
SQ01。创建新查询,例如ZPP_EVENTS,并基于前面创建的InfoSet建立查询。 - 设计查询布局:在查询设计器中定义选择屏幕字段。建议选择生产订单
AUFNR、工厂WERKS、订单类型AUART以及订单创建日期范围AUFK-ERDAT。 - 定义输出列表:选择报告输出中要显示的字段。该列表应与事件日志所需的列完全一致,包括
ActivityName和EventTime等自定义字段。 - 执行查询:使用所需的选择条件运行查询,例如查询过去3至6个月创建的生产订单。
- 导出数据:查询显示结果后,导出列表。最常见且可靠的格式是“Spreadsheet”或“Local File”,并使用制表符分隔或CSV格式。
- 为ProcessMind设置格式:在电子表格程序中打开导出文件。确认列标题与所需属性一致(
ProductionOrder、ActivityName、EventTime等),并确保EventTime的日期和时间格式统一且符合要求(例如YYYY-MM-DD HH:MI:SS)。将文件保存为CSV后上传。
配置
- InfoSet连接:此方法的核心是将订单抬头、状态、确认和物料移动表进行复杂连接。主要连接包括
AUFK→AFKO、AUFK→JEST→JCDS、AUFK→AFRU以及AUFK→MSEG→MKPF。连接错误或效率低下可能导致性能不佳或数据不准确。 - 选择条件:必须定义可控的选择范围,以避免影响系统性能。查询启动屏幕应包含以下关键选择字段:
- 生产工厂(
AUFK-WERKS) - 生产订单类型(
AUFK-AUART) - 订单创建日期(
AUFK-ERDAT):建议提取连续3至6个月的数据,以控制数据集规模。
- 生产工厂(
- 系统状态:识别“Created”“Released”“Technically Completed”和“Cancelled”等事件的逻辑,取决于具体的系统状态代码(例如I0001、I0002、I0045、I0047)。这些代码通常在SAP系统中保持标准一致,但仍应进行确认。
- 移动类型:“Goods Issue”和“Goods Receipt”等事件通过特定移动类型(
MSEG-BWART)识别,通常分别为“261”和“101”。请确认这些值与您所在组织的配置一致。 - 授权:运行查询的用户需要有权访问
SQ01、SQ02和SQ03事务,并拥有底层所有表(AUFK、AFKO、JEST、JCDS、AFRU、MSEG、MKPF)的显示权限。
a 示例查询 abap
/*
The following ABAP-style SQL script represents the complete logic required to build the event log.
This logic must be implemented within the code sections of the SQ02 InfoSet, as a direct SQL query of this nature is not run.
Each SELECT block corresponds to a specific business activity.
*/
-- 1. Production Order Created
SELECT
AUFK.AUFNR AS ProductionOrder,
'Production Order Created' AS ActivityName,
CAST(JCDS.UDATE AS VARCHAR(8)) || ' ' || CAST(JCDS.UTIME AS VARCHAR(6)) AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
JOIN JCDS ON AUFK.OBJNR = JCDS.OBJNR
WHERE JCDS.STAT = 'I0001' AND JCDS.INACT = ''
UNION ALL
-- 2. Material Availability Checked (using 'Material shortage' status as an indicator)
SELECT
AUFK.AUFNR AS ProductionOrder,
'Material Availability Checked' AS ActivityName,
CAST(JCDS.UDATE AS VARCHAR(8)) || ' ' || CAST(JCDS.UTIME AS VARCHAR(6)) AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
JOIN JCDS ON AUFK.OBJNR = JCDS.OBJNR
WHERE JCDS.STAT = 'I0033' AND JCDS.INACT = '' -- I0033 is MSPT (Material Shortage)
UNION ALL
-- 3. Production Order Released
SELECT
AUFK.AUFNR AS ProductionOrder,
'Production Order Released' AS ActivityName,
CAST(JCDS.UDATE AS VARCHAR(8)) || ' ' || CAST(JCDS.UTIME AS VARCHAR(6)) AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
JOIN JCDS ON AUFK.OBJNR = JCDS.OBJNR
WHERE JCDS.STAT = 'I0002' AND JCDS.INACT = ''
UNION ALL
-- 4. Order Data Changed (using last change date as a proxy)
SELECT
AUFK.AUFNR AS ProductionOrder,
'Order Data Changed' AS ActivityName,
CAST(AUFK.AEDAT AS VARCHAR(8)) || ' 000000' AS EventTime, -- Time is not available in AUFK
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
WHERE AUFK.AEDAT IS NOT NULL AND AUFK.AEDAT > AUFK.ERDAT
UNION ALL
-- 5. Goods Issue Posted
SELECT
AUFK.AUFNR AS ProductionOrder,
'Goods Issue Posted' AS ActivityName,
CAST(MKPF.BUDAT AS VARCHAR(8)) || ' ' || CAST(MKPF.CPUTM AS VARCHAR(6)) AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
JOIN MSEG ON AUFK.AUFNR = MSEG.AUFNR
JOIN MKPF ON MSEG.MBLNR = MKPF.MBLNR AND MSEG.MJAHR = MKPF.MJAHR
WHERE MSEG.BWART = '261'
UNION ALL
-- 6. First Confirmation Recorded
SELECT
CONF.ProductionOrder,
'First Confirmation Recorded' AS ActivityName,
CONF.EventTime,
CONF.ProductionPlant,
CONF.ProductCode,
CONF.PlannedQuantity,
CONF.DeliveredQuantity,
CONF.ActualStartDate,
CONF.ActualEndDate,
CONF.SourceSystem,
CONF.LastDataUpdate
FROM (
SELECT
AUFK.AUFNR AS ProductionOrder,
CAST(AFRU.BUDAT AS VARCHAR(8)) || ' ' || CAST(AFRU.ERFZEIT AS VARCHAR(6)) AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
ROW_NUMBER() OVER(PARTITION BY AUFK.AUFNR ORDER BY AFRU.BUDAT, AFRU.ERFZEIT) as rn
FROM AUFK
JOIN AFRU ON AUFK.AUFNR = AFRU.AUFNR
) AS CONF
WHERE CONF.rn = 1
UNION ALL
-- 7. Intermediate Confirmation Recorded
SELECT
AUFK.AUFNR AS ProductionOrder,
'Intermediate Confirmation Recorded' AS ActivityName,
CAST(AFRU.BUDAT AS VARCHAR(8)) || ' ' || CAST(AFRU.ERFZEIT AS VARCHAR(6)) AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
JOIN AFRU ON AUFK.AUFNR = AFRU.AUFNR
WHERE AFRU.AUERU = 'T' -- T = Partial Confirmation
UNION ALL
-- 8. Final Confirmation Recorded
SELECT
AUFK.AUFNR AS ProductionOrder,
'Final Confirmation Recorded' AS ActivityName,
CAST(AFRU.BUDAT AS VARCHAR(8)) || ' ' || CAST(AFRU.ERFZEIT AS VARCHAR(6)) AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
JOIN AFRU ON AUFK.AUFNR = AFRU.AUFNR
WHERE AFRU.AUERU = 'E' -- E = Final Confirmation
UNION ALL
-- 9. Goods Receipt Posted
SELECT
AUFK.AUFNR AS ProductionOrder,
'Goods Receipt Posted' AS ActivityName,
CAST(MKPF.BUDAT AS VARCHAR(8)) || ' ' || CAST(MKPF.CPUTM AS VARCHAR(6)) AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
JOIN MSEG ON AUFK.AUFNR = MSEG.AUFNR
JOIN MKPF ON MSEG.MBLNR = MKPF.MBLNR AND MSEG.MJAHR = MKPF.MJAHR
WHERE MSEG.BWART = '101'
UNION ALL
-- 10. Order Technically Completed
SELECT
AUFK.AUFNR AS ProductionOrder,
'Order Technically Completed' AS ActivityName,
CAST(JCDS.UDATE AS VARCHAR(8)) || ' ' || CAST(JCDS.UTIME AS VARCHAR(6)) AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
JOIN JCDS ON AUFK.OBJNR = JCDS.OBJNR
WHERE JCDS.STAT = 'I0045' AND JCDS.INACT = ''
UNION ALL
-- 11. Order Settlement Ran (using 'Closed' status as proxy)
SELECT
AUFK.AUFNR AS ProductionOrder,
'Order Settlement Ran' AS ActivityName,
CAST(JCDS.UDATE AS VARCHAR(8)) || ' ' || CAST(JCDS.UTIME AS VARCHAR(6)) AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
JOIN JCDS ON AUFK.OBJNR = JCDS.OBJNR
WHERE JCDS.STAT = 'I0046' AND JCDS.INACT = '' -- I0046 is CLSD (Closed)
UNION ALL
-- 12. Order Cancellation Set
SELECT
AUFK.AUFNR AS ProductionOrder,
'Order Cancellation Set' AS ActivityName,
CAST(JCDS.UDATE AS VARCHAR(8)) || ' ' || CAST(JCDS.UTIME AS VARCHAR(6)) AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
JOIN JCDS ON AUFK.OBJNR = JCDS.OBJNR
WHERE JCDS.STAT = 'I0047' AND JCDS.INACT = '' -- I0047 is CNF (Confirmed), use I0076 for Canceled. Recorrecting. Use Deletion Flag instead.
-- Corrected Logic for Cancellation:
SELECT
AUFK.AUFNR AS ProductionOrder,
'Order Cancellation Set' AS ActivityName,
CAST(AUFK.AEDAT AS VARCHAR(8)) || ' 000000' AS EventTime,
AUFK.WERKS AS ProductionPlant,
AUFK.MATNR AS ProductCode,
AFKO.GAMNG AS PlannedQuantity,
AFKO.GASMG AS DeliveredQuantity,
AUFK.GSTRP AS ActualStartDate,
AUFK.GETRI AS ActualEndDate,
SY-SYSID AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate
FROM AUFK
WHERE AUFK.LOEKZ = 'X'; 步骤
- 建立数据库访问:获取底层SAP ECC数据库的只读凭据。您需要服务器地址、端口、数据库名称、用户名和密码。该访问必须与SAP Basis团队及数据库管理团队协调完成。
- 确定SAP架构:确定存储SAP表的正确数据库架构。通常为
SAPSR3或其他特定于系统的名称。您需要将查询中的[Your SAP Schema]占位符替换为该值。 - 准备SQL查询:复制
query部分提供的完整SQL查询。该查询用于将指定活动提取为统一的事件日志格式。 - 配置查询参数:执行前,必须修改查询中的占位符。设置
[Start Date]和[End Date]以定义提取时间范围。同时强烈建议按生产工厂(WERKS)或订单类型(AUART)筛选,以限制数据量。 - 连接并执行:使用DBeaver、SAP HANA Studio或自定义脚本(Python、Java)等标准SQL客户端,利用第1步中的凭据连接SAP数据库。
- 运行查询:将配置好的SQL查询粘贴到客户端并执行。根据日期范围和系统规模,查询可能需要几分钟才能完成。
- 检查初步结果:查询完成后,快速检查前几百行,确认
ProductionOrder、ActivityName和EventTime等列已正确填充且内容合理。 - 导出为CSV:通过SQL客户端将完整结果集导出为CSV文件。确保文件使用UTF-8编码,避免出现字符问题。
- 完成上传前的CSV准备:打开CSV文件,确认列标题与所需属性一致(
ProductionOrder、ActivityName、EventTime、SourceSystem、LastDataUpdate等)。确保EventTime列格式统一,例如YYYY-MM-DD HH:MI:SS。 - 上传到ProcessMind:准备好的CSV文件现在可以上传到ProcessMind平台进行分析。
配置
- 数据库架构:必须指定存储生产计划表的SAP架构。将查询中的
[Your SAP Schema]占位符替换为您所在环境的正确名称,例如SAPSR3。 - 日期范围:按指定日期范围筛选对性能至关重要。查询按订单创建日期(
AUFK.ERDAT)进行筛选。建议先从最近3至6个月的数据开始,以控制数据量。 - 生产订单类型:为聚焦分析,请按生产订单类型字段(
AUFK.AUART)筛选查询。这样可以纳入或排除标准生产订单、流程订单或返工订单等特定类型。 - 生产工厂:强烈建议按一个或多个生产工厂(
AFKO.WERKS)筛选。一次提取所有工厂的数据可能会大量占用系统资源。 - 数据库访问:此方法要求数据库用户至少拥有以下表的读取权限:
AUFK、AFKO、JCDS、JEST、AFRU、MSEG、MKPF。直接访问数据库并非所有SAP用户的标准权限,需要特殊授权。
a 示例查询 sql
WITH Orders AS (
SELECT
aufk.AUFNR AS ProductionOrder,
afko.WERKS AS ProductionPlant,
afko.PLNBEZ AS ProductCode,
afko.GAMNG AS PlannedQuantity,
afko.GMEIN AS PlannedUnit,
afko.GEMNG AS DeliveredQuantity,
CASE
WHEN afko.GSTRI = '00000000' THEN NULL
ELSE TO_TIMESTAMP(afko.GSTRI || afko.GSUZI, 'YYYYMMDDHH24MISS')
END AS ActualStartDate,
CASE
WHEN afko.GETRI = '00000000' THEN NULL
ELSE TO_TIMESTAMP(afko.GETRI || afko.GEUZI, 'YYYYMMDDHH24MISS')
END AS ActualEndDate,
aufk.OBJNR,
aufk.ERDAT AS CreationDate,
aufk.ERFAS AS CreationTime
FROM
"[Your SAP Schema]".AUFK aufk
JOIN
"[Your SAP Schema]".AFKO afko ON aufk.AUFNR = afko.AUFNR
WHERE
aufk.AUTYP = '10' -- Filter for Production Orders
AND aufk.ERDAT BETWEEN '[Start Date]' AND '[End Date]'
-- AND afko.WERKS IN ('[Your Plant]', '[Another Plant]') -- Optional: Filter by Plant
-- AND aufk.AUART IN ('[Your Order Type]') -- Optional: Filter by Order Type
),
Confirmations AS (
SELECT
o.ProductionOrder,
a.RUECK AS ConfirmationNumber,
a.RMZHL AS ConfirmationCounter,
TO_TIMESTAMP(a.BUDAT || a.UZEIT, 'YYYYMMDDHH24MISS') AS EventTime,
a.AUERU AS IsFinalConfirmation,
ROW_NUMBER() OVER(PARTITION BY o.ProductionOrder ORDER BY TO_TIMESTAMP(a.BUDAT || a.UZEIT, 'YYYYMMDDHH24MISS') ASC) as rn_asc,
ROW_NUMBER() OVER(PARTITION BY o.ProductionOrder ORDER BY TO_TIMESTAMP(a.BUDAT || a.UZEIT, 'YYYYMMDDHH24MISS') DESC) as rn_desc
FROM
Orders o
JOIN
"[Your SAP Schema]".AFRU a ON o.ProductionOrder = a.AUFNR
)
-- 1. Production Order Created
SELECT
o.ProductionOrder,
'Production Order Created' AS ActivityName,
TO_TIMESTAMP(o.CreationDate || o.CreationTime, 'YYYYMMDDHH24MISS') AS EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Orders o
UNION ALL
-- 2. Material Availability Checked (using 'Material Committed' status as proxy)
SELECT
o.ProductionOrder,
'Material Availability Checked' AS ActivityName,
TO_TIMESTAMP(jcds.UDATE || jcds.UTIME, 'YYYYMMDDHH24MISS') AS EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Orders o
JOIN "[Your SAP Schema]".JCDS jcds ON o.OBJNR = jcds.OBJNR
WHERE jcds.STAT = 'I0006' AND jcds.INACT != 'X'
UNION ALL
-- 3. Production Order Released
SELECT
o.ProductionOrder,
'Production Order Released' AS ActivityName,
TO_TIMESTAMP(jcds.UDATE || jcds.UTIME, 'YYYYMMDDHH24MISS') AS EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Orders o
JOIN "[Your SAP Schema]".JCDS jcds ON o.OBJNR = jcds.OBJNR
WHERE jcds.STAT = 'I0002' AND jcds.INACT != 'X'
UNION ALL
-- 4. Order Data Changed
SELECT
o.ProductionOrder,
'Order Data Changed' AS ActivityName,
TO_TIMESTAMP(aufk.AEDAT || aufk.AEZEIT, 'YYYYMMDDHH24MISS') AS EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Orders o
JOIN "[Your SAP Schema]".AUFK aufk ON o.ProductionOrder = aufk.AUFNR
WHERE aufk.AEDAT > o.CreationDate
UNION ALL
-- 5. Goods Issue Posted
SELECT
o.ProductionOrder,
'Goods Issue Posted' AS ActivityName,
TO_TIMESTAMP(mkpf.CPUDT || mkpf.CPUTM, 'YYYYMMDDHH24MISS') AS EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Orders o
JOIN "[Your SAP Schema]".MSEG mseg ON o.ProductionOrder = mseg.AUFNR
JOIN "[Your SAP Schema]".MKPF mkpf ON mseg.MBLNR = mkpf.MBLNR AND mseg.MJAHR = mkpf.MJAHR
WHERE mseg.BWART = '261'
UNION ALL
-- 6. First Confirmation Recorded
SELECT
c.ProductionOrder,
'First Confirmation Recorded' AS ActivityName,
c.EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Confirmations c
JOIN Orders o ON c.ProductionOrder = o.ProductionOrder
WHERE c.rn_asc = 1
UNION ALL
-- 7. Intermediate Confirmation Recorded
SELECT
c.ProductionOrder,
'Intermediate Confirmation Recorded' AS ActivityName,
c.EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Confirmations c
JOIN Orders o ON c.ProductionOrder = o.ProductionOrder
WHERE c.rn_asc > 1 AND c.IsFinalConfirmation IS NULL
UNION ALL
-- 8. Final Confirmation Recorded
SELECT
c.ProductionOrder,
'Final Confirmation Recorded' AS ActivityName,
c.EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Confirmations c
JOIN Orders o ON c.ProductionOrder = o.ProductionOrder
WHERE c.IsFinalConfirmation = 'X'
UNION ALL
-- 9. Goods Receipt Posted
SELECT
o.ProductionOrder,
'Goods Receipt Posted' AS ActivityName,
TO_TIMESTAMP(mkpf.CPUDT || mkpf.CPUTM, 'YYYYMMDDHH24MISS') AS EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Orders o
JOIN "[Your SAP Schema]".MSEG mseg ON o.ProductionOrder = mseg.AUFNR
JOIN "[Your SAP Schema]".MKPF mkpf ON mseg.MBLNR = mkpf.MBLNR AND mseg.MJAHR = mkpf.MJAHR
WHERE mseg.BWART = '101'
UNION ALL
-- 10. Order Technically Completed
SELECT
o.ProductionOrder,
'Order Technically Completed' AS ActivityName,
TO_TIMESTAMP(jcds.UDATE || jcds.UTIME, 'YYYYMMDDHH24MISS') AS EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Orders o
JOIN "[Your SAP Schema]".JCDS jcds ON o.OBJNR = jcds.OBJNR
WHERE jcds.STAT = 'I0045' AND jcds.INACT != 'X'
UNION ALL
-- 11. Order Settlement Ran
SELECT
o.ProductionOrder,
'Order Settlement Ran' AS ActivityName,
TO_TIMESTAMP(jcds.UDATE || jcds.UTIME, 'YYYYMMDDHH24MISS') AS EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Orders o
JOIN "[Your SAP Schema]".JCDS jcds ON o.OBJNR = jcds.OBJNR
WHERE jcds.STAT = 'I0046' AND jcds.INACT != 'X'
UNION ALL
-- 12. Order Cancellation Set
SELECT
o.ProductionOrder,
'Order Cancellation Set' AS ActivityName,
TO_TIMESTAMP(jcds.UDATE || jcds.UTime, 'YYYYMMDDHH24MISS') AS EventTime,
'[Your Source System]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
o.ProductionPlant,
o.ProductCode,
o.PlannedQuantity,
o.DeliveredQuantity,
o.ActualStartDate,
o.ActualEndDate
FROM Orders o
JOIN "[Your SAP Schema]".JCDS jcds ON o.OBJNR = jcds.OBJNR
WHERE jcds.STAT = 'I0076' AND jcds.INACT != 'X'; 步骤
- 确认SAP ECC PP、生产订单处理、确认、库存管理和控制数据均可用,并验证提取用户有权读取所需应用表及执行自定义ABAP报表。
- 在ABAP Workbench中,例如通过事务SE38或SE80,创建专用可执行报表,例如[Your custom report name]。使用包含必填日期参数的选择屏幕,例如[Start date]和[End date],并添加[Company Code]、[Production Plant]、[Order Type]、[Material]和[Production Order]等可选筛选条件。
- 从AUFK及SAP ECC系统中配置的生产订单表读取生产订单抬头和主数据。使用JCDS及相应的状态配置识别明确的状态变更,包括CRTD、released、technically completed以及与取消相关的状态。除非状态历史中包含带时间戳的变更,否则不要假定某个状态代码代表一个事件。
- 从系统中配置的生产订单可用性检查数据读取物料可用性检查结果。如果检查结果未持久化在能够可靠关联订单和时间戳的表中,请实施SAP团队批准的SAP增强、应用日志或审计数据源。不要仅根据订单创建或释放推断已执行检查。
- 从已配置的生产订单变更凭证对象及其关联变更凭证表中读取订单变更历史。仅提取流程负责人批准的重要变更,例如计划数量、日期、BOM、routing或其他字段。使用变更凭证时间戳作为EventTime。
- 从系统中配置的库存物料凭证数据读取发料和收料过账。使用物料凭证数据中的订单引用将过账关联到生产订单。将组件领料分类为Goods Issue Posted,将成品收货分类为Goods Receipt Posted。可用时使用过账日期和过账时间。
- 从系统中配置的生产确认数据源读取确认数据。按生产订单和确认时间戳排序。将第一条确认输出为First Confirmation Recorded,将符合条件的非最终确认输出为Intermediate Confirmation Recorded,将明确标记为最终确认或由已配置的确认完成逻辑识别为最终确认的记录输出为Final Confirmation Recorded。不要根据任意查询返回的最后一行推断最终确认。
- 从系统中配置的控制结算数据源读取结算执行数据。仅当结算执行记录、结算凭证或经批准的结算状态历史提供了与生产订单关联的明确时间戳时,才输出Order Settlement Ran。
- 为每个提取的活动构建一条内部事件记录。填充ProductionOrder、ActivityName、EventTime、SourceSystem、LastDataUpdate、ProductionPlant、ProductCode、PlannedQuantity、DeliveredQuantity、ActualStartDate和ActualEndDate。使用稳定的时间戳转换方式,并保留源系统时区。当存在相关事件时,将ActualStartDate设为首次确认时间戳,将ActualEndDate设为最终确认时间戳。
- 按ProductionOrder和EventTime对事件记录排序;时间戳相同时使用确定性的次级排序。仅删除完全重复的源记录,不要删除合法的重复事件。验证输出架构中包含全部十二个必需活动名称,并确保每条输出记录都有案例标识、活动名称和事件时间戳。
- 使用经批准的ABAP文件接口,将结果写入应用服务器文件,并采用已配置的逻辑文件路径。使用与ProcessMind摄取配置一致的分隔符和文本编码,包含表头行,对包含分隔符的值加引号,并统一时间戳格式,最好采用YYYY-MM-DDThh:mm:ss。
- 按经批准的SAP文件传输流程下载文件,独立检查文件内容,然后将其作为事件日志上传到ProcessMind,使用ProductionOrder作为案例标识,ActivityName作为活动,EventTime作为事件时间戳。确认ProcessMind配置为按原样读取记录,而不是推断缺失的活动。
配置
- 日期范围:初次分析使用三至六个月的滚动提取窗口。评估性能和数据量后再扩大范围。纳入回溯期,以覆盖在所选开始日期前创建、但在分析期间仍处于活动状态的订单。
- 选择筛选条件:支持[公司代码]、[生产工厂]、[订单类型]、[物料]、[生产订单]、订单状态以及创建日期或变更日期筛选。请根据SAP ECC实施情况配置确切字段,因为不同版本和定制方案中的生产订单字段可能有所不同。
- 事件范围:将全部十二项必需活动作为明确的事件记录提取:Production Order Created、Material Availability Checked、Production Order Released、Order Data Changed、Goods Issue Posted、First Confirmation Recorded、Intermediate Confirmation Recorded、Final Confirmation Recorded、Goods Receipt Posted、Order Technically Completed、Order Settlement Ran和Order Cancellation Set。
- 时间戳策略:优先使用源事件日期和时间。如果仅有日期,请记录精度降低的情况,并使用统一的已配置时间,不要呈现虚构的精确时间。将所有时间戳转换为ProcessMind要求的时区。
- 状态处理:状态类活动使用带时间戳的状态历史。根据系统状态配置和流程负责人批准,配置内部状态值到业务活动的映射。
- 可用性检查:配置经批准的可用性检查执行数据源。除非业务批准的数据源明确记录了检查,否则不得根据订单创建、释放、预留或成功发料生成Material Availability Checked记录。
- 确认处理:配置区分首次、中间和最终确认的规则。只有当源数据明确标识某条确认是最终确认,或已配置的SAP确认逻辑能够确定流程完成时,才能将其视为最终确认。
- 数量:尽可能保留源计量单位。如果进行了数量汇总,请说明汇总维度是订单、物料、移动、确认还是事件。除非流程负责人批准该解释,否则DeliveredQuantity应表示已过账的成品收货数量,而不仅是确认产量。
- LastDataUpdate:将提取运行时间戳或源数据刷新时间戳写入此字段,并在同一次运行的每条记录中采用相同且有文档说明的规则。
- 性能:限制选择范围,仅选择所需字段,分批处理数据,使用数据库端筛选,避免在大型循环中嵌套数据库读取;仅通过SAP数据库管理流程创建或使用经批准的索引。内存使用量较高时,增量写入输出。
- 文件输出:根据ProcessMind上传规范配置应用服务器目录、逻辑文件名、分隔符、编码、小数格式、时间戳格式和表头规则。不得在报表或输出文件中暴露凭据。
- 前提条件:确认SAP ECC PP、库存管理、确认、生产订单状态管理和控制结算数据已按需启用。执行前必须获得所需授权、自定义开发治理批准、传输批准、应用服务器文件访问权限以及ProcessMind摄取权限。
- 系统特定配置:必须在目标SAP ECC系统中确认表名、字段、状态代码、变更文档对象、确认数据源、可用性检查数据源和结算数据源。如果实施方案未提供标准且可靠的数据源,请使用[根据您的系统配置]。
a 示例查询 abap
REPORT [Your custom report name].
* This executable ABAP report is a complete extraction framework for the twelve required activities.
* Replace only the marked system-specific source sections, selection parameters, and file configuration.
* Confirm every table and field against the target SAP ECC system before activation.
PARAMETERS p_from TYPE sydatum OBLIGATORY.
PARAMETERS p_to TYPE sydatum OBLIGATORY.
PARAMETERS p_file TYPE string OBLIGATORY DEFAULT '[Application server file path]'.
PARAMETERS p_src TYPE string OBLIGATORY DEFAULT '[SAP ECC system identifier]'.
SELECT-OPTIONS s_werks FOR [Production plant field].
SELECT-OPTIONS s_aufnr FOR [Production order field].
SELECT-OPTIONS s_auart FOR [Production order type field].
SELECT-OPTIONS s_bukrs FOR [Company code field].
TYPES: BEGIN OF ty_event,
productionorder TYPE string,
activityname TYPE string,
eventtime TYPE string,
sourcesystem TYPE string,
lastdataupdate TYPE string,
productionplant TYPE string,
productcode TYPE string,
plannedquantity TYPE string,
deliveredquantity TYPE string,
actualstartdate TYPE string,
actualenddate TYPE string,
END OF ty_event.
DATA gt_events TYPE STANDARD TABLE OF ty_event WITH EMPTY KEY.
DATA gs_event TYPE ty_event.
DATA gv_update_timestamp TYPE string.
DATA gv_line TYPE string.
GET TIME STAMP FIELD DATA(gv_update_ts).
gv_update_timestamp = |{ gv_update_ts TIMESTAMP = ISO }|.
* Production Order Created
SELECT [Production order field], [Production plant field], [Product field], [Planned quantity field], [Creation date field], [Creation time field]
FROM [Production order header table]
INTO TABLE @DATA(lt_created)
WHERE [Creation date field] BETWEEN @p_from AND @p_to
AND [Production order field] IN @s_aufnr
AND [Production plant field] IN @s_werks
AND [Production order type field] IN @s_auart
AND [Company code field] IN @s_bukrs.
LOOP AT lt_created ASSIGNING FIELD-SYMBOL(<created>).
CLEAR gs_event.
gs_event-productionorder = |{ <created>-[Production order field] }|.
gs_event-activityname = 'Production Order Created'.
gs_event-eventtime = |{ <created>-[Creation date field] } { <created>-[Creation time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <created>-[Production plant field] }|.
gs_event-productcode = |{ <created>-[Product field] }|.
gs_event-plannedquantity = |{ <created>-[Planned quantity field] }|.
APPEND gs_event TO gt_events.
ENDLOOP.
* Material Availability Checked
SELECT [Production order field], [Production plant field], [Product field], [Availability check date field], [Availability check time field]
FROM [Availability check source table]
INTO TABLE @DATA(lt_availability)
WHERE [Availability check date field] BETWEEN @p_from AND @p_to
AND [Production order field] IN @s_aufnr
AND [Production plant field] IN @s_werks.
LOOP AT lt_availability ASSIGNING FIELD-SYMBOL(<availability>).
CLEAR gs_event.
gs_event-productionorder = |{ <availability>-[Production order field] }|.
gs_event-activityname = 'Material Availability Checked'.
gs_event-eventtime = |{ <availability>-[Availability check date field] } { <availability>-[Availability check time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <availability>-[Production plant field] }|.
gs_event-productcode = |{ <availability>-[Product field] }|.
APPEND gs_event TO gt_events.
ENDLOOP.
* Production Order Released
SELECT [Production order field], [Status change date field], [Status change time field], [Production plant field], [Product field], [Planned quantity field]
FROM [Order status history source table]
INTO TABLE @DATA(lt_released)
WHERE [Status field] = '[Released status code]'
AND [Status change date field] BETWEEN @p_from AND @p_to
AND [Production order field] IN @s_aufnr.
LOOP AT lt_released ASSIGNING FIELD-SYMBOL(<released>).
CLEAR gs_event.
gs_event-productionorder = |{ <released>-[Production order field] }|.
gs_event-activityname = 'Production Order Released'.
gs_event-eventtime = |{ <released>-[Status change date field] } { <released>-[Status change time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <released>-[Production plant field] }|.
gs_event-productcode = |{ <released>-[Product field] }|.
gs_event-plannedquantity = |{ <released>-[Planned quantity field] }|.
APPEND gs_event TO gt_events.
ENDLOOP.
* Order Data Changed
SELECT [Production order field], [Change date field], [Change time field], [Production plant field], [Product field], [Changed field name]
FROM [Production order change document source table]
INTO TABLE @DATA(lt_changed)
WHERE [Change date field] BETWEEN @p_from AND @p_to
AND [Production order field] IN @s_aufnr
AND [Changed field name] IN ('[Planned quantity field]', '[Basic start date field]', '[Basic finish date field]', '[BOM field]', '[Routing field]').
LOOP AT lt_changed ASSIGNING FIELD-SYMBOL(<changed>).
CLEAR gs_event.
gs_event-productionorder = |{ <changed>-[Production order field] }|.
gs_event-activityname = 'Order Data Changed'.
gs_event-eventtime = |{ <changed>-[Change date field] } { <changed>-[Change time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <changed>-[Production plant field] }|.
gs_event-productcode = |{ <changed>-[Product field] }|.
APPEND gs_event TO gt_events.
ENDLOOP.
* Goods Issue Posted
SELECT [Production order field], [Posting date field], [Posting time field], [Production plant field], [Product field], [Quantity field]
FROM [Material document item source table]
INTO TABLE @DATA(lt_gi)
WHERE [Movement type field] IN ('[Goods issue movement type 1]', '[Goods issue movement type 2]')
AND [Posting date field] BETWEEN @p_from AND @p_to
AND [Production order field] IN @s_aufnr
AND [Production plant field] IN @s_werks.
LOOP AT lt_gi ASSIGNING FIELD-SYMBOL(<gi>).
CLEAR gs_event.
gs_event-productionorder = |{ <gi>-[Production order field] }|.
gs_event-activityname = 'Goods Issue Posted'.
gs_event-eventtime = |{ <gi>-[Posting date field] } { <gi>-[Posting time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <gi>-[Production plant field] }|.
gs_event-productcode = |{ <gi>-[Product field] }|.
gs_event-deliveredquantity = |{ <gi>-[Quantity field] }|.
APPEND gs_event TO gt_events.
ENDLOOP.
* First Confirmation Recorded
SELECT [Production order field], [Confirmation date field], [Confirmation time field], [Production plant field], [Product field], [Confirmed quantity field]
FROM [Production confirmation source table]
INTO TABLE @DATA(lt_confirmations)
WHERE [Confirmation date field] BETWEEN @p_from AND @p_to
AND [Production order field] IN @s_aufnr
AND [Production plant field] IN @s_werks.
SORT lt_confirmations BY [Production order field] [Confirmation date field] [Confirmation time field].
LOOP AT lt_confirmations ASSIGNING FIELD-SYMBOL(<confirmation>) GROUP BY <confirmation>-[Production order field] ASSIGNING FIELD-SYMBOL(<confirmation_group>).
LOOP AT GROUP <confirmation_group> ASSIGNING FIELD-SYMBOL(<first_confirmation>).
CLEAR gs_event.
gs_event-productionorder = |{ <first_confirmation>-[Production order field] }|.
gs_event-activityname = 'First Confirmation Recorded'.
gs_event-eventtime = |{ <first_confirmation>-[Confirmation date field] } { <first_confirmation>-[Confirmation time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <first_confirmation>-[Production plant field] }|.
gs_event-productcode = |{ <first_confirmation>-[Product field] }|.
gs_event-actualstartdate = gs_event-eventtime.
APPEND gs_event TO gt_events.
EXIT.
ENDLOOP.
ENDLOOP.
* Intermediate Confirmation Recorded
LOOP AT lt_confirmations ASSIGNING FIELD-SYMBOL(<intermediate>) GROUP BY <intermediate>-[Production order field] ASSIGNING FIELD-SYMBOL(<intermediate_group>).
DATA(lv_intermediate_index) = 0.
DATA(lv_intermediate_count) = GROUP SIZE.
LOOP AT GROUP <intermediate_group> ASSIGNING FIELD-SYMBOL(<intermediate_row>).
lv_intermediate_index = lv_intermediate_index + 1.
IF lv_intermediate_index < lv_intermediate_count AND <intermediate_row>-[Final confirmation indicator field] <> '[Final confirmation value]'.
CLEAR gs_event.
gs_event-productionorder = |{ <intermediate_row>-[Production order field] }|.
gs_event-activityname = 'Intermediate Confirmation Recorded'.
gs_event-eventtime = |{ <intermediate_row>-[Confirmation date field] } { <intermediate_row>-[Confirmation time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <intermediate_row>-[Production plant field] }|.
gs_event-productcode = |{ <intermediate_row>-[Product field] }|.
APPEND gs_event TO gt_events.
ENDIF.
ENDLOOP.
ENDLOOP.
* Final Confirmation Recorded
LOOP AT lt_confirmations ASSIGNING FIELD-SYMBOL(<final>) WHERE [Final confirmation indicator field] = '[Final confirmation value]'.
CLEAR gs_event.
gs_event-productionorder = |{ <final>-[Production order field] }|.
gs_event-activityname = 'Final Confirmation Recorded'.
gs_event-eventtime = |{ <final>-[Confirmation date field] } { <final>-[Confirmation time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <final>-[Production plant field] }|.
gs_event-productcode = |{ <final>-[Product field] }|.
gs_event-actualenddate = gs_event-eventtime.
APPEND gs_event TO gt_events.
ENDLOOP.
* Goods Receipt Posted
SELECT [Production order field], [Posting date field], [Posting time field], [Production plant field], [Product field], [Quantity field]
FROM [Material document item source table]
INTO TABLE @DATA(lt_gr)
WHERE [Movement type field] IN ('[Goods receipt movement type 1]', '[Goods receipt movement type 2]')
AND [Posting date field] BETWEEN @p_from AND @p_to
AND [Production order field] IN @s_aufnr
AND [Production plant field] IN @s_werks.
LOOP AT lt_gr ASSIGNING FIELD-SYMBOL(<gr>).
CLEAR gs_event.
gs_event-productionorder = |{ <gr>-[Production order field] }|.
gs_event-activityname = 'Goods Receipt Posted'.
gs_event-eventtime = |{ <gr>-[Posting date field] } { <gr>-[Posting time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <gr>-[Production plant field] }|.
gs_event-productcode = |{ <gr>-[Product field] }|.
gs_event-deliveredquantity = |{ <gr>-[Quantity field] }|.
APPEND gs_event TO gt_events.
ENDLOOP.
* Order Technically Completed
SELECT [Production order field], [Status change date field], [Status change time field], [Production plant field], [Product field]
FROM [Order status history source table]
INTO TABLE @DATA(lt_teco)
WHERE [Status field] = '[Technically completed status code]'
AND [Status change date field] BETWEEN @p_from AND @p_to
AND [Production order field] IN @s_aufnr.
LOOP AT lt_teco ASSIGNING FIELD-SYMBOL(<teco>).
CLEAR gs_event.
gs_event-productionorder = |{ <teco>-[Production order field] }|.
gs_event-activityname = 'Order Technically Completed'.
gs_event-eventtime = |{ <teco>-[Status change date field] } { <teco>-[Status change time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <teco>-[Production plant field] }|.
gs_event-productcode = |{ <teco>-[Product field] }|.
APPEND gs_event TO gt_events.
ENDLOOP.
* Order Settlement Ran
SELECT [Production order field], [Settlement date field], [Settlement time field], [Production plant field], [Product field]
FROM [Order settlement source table]
INTO TABLE @DATA(lt_settlement)
WHERE [Settlement date field] BETWEEN @p_from AND @p_to
AND [Production order field] IN @s_aufnr.
LOOP AT lt_settlement ASSIGNING FIELD-SYMBOL(<settlement>).
CLEAR gs_event.
gs_event-productionorder = |{ <settlement>-[Production order field] }|.
gs_event-activityname = 'Order Settlement Ran'.
gs_event-eventtime = |{ <settlement>-[Settlement date field] } { <settlement>-[Settlement time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <settlement>-[Production plant field] }|.
gs_event-productcode = |{ <settlement>-[Product field] }|.
APPEND gs_event TO gt_events.
ENDLOOP.
* Order Cancellation Set
SELECT [Production order field], [Status change date field], [Status change time field], [Production plant field], [Product field]
FROM [Order status history source table]
INTO TABLE @DATA(lt_cancelled)
WHERE [Status field] IN ('[Cancellation status code]', '[Deletion status code]')
AND [Status change date field] BETWEEN @p_from AND @p_to
AND [Production order field] IN @s_aufnr.
LOOP AT lt_cancelled ASSIGNING FIELD-SYMBOL(<cancelled>).
CLEAR gs_event.
gs_event-productionorder = |{ <cancelled>-[Production order field] }|.
gs_event-activityname = 'Order Cancellation Set'.
gs_event-eventtime = |{ <cancelled>-[Status change date field] } { <cancelled>-[Status change time field] }|.
gs_event-sourcesystem = p_src.
gs_event-lastdataupdate = gv_update_timestamp.
gs_event-productionplant = |{ <cancelled>-[Production plant field] }|.
gs_event-productcode = |{ <cancelled>-[Product field] }|.
APPEND gs_event TO gt_events.
ENDLOOP.
SORT gt_events BY productionorder eventtime activityname.
DELETE ADJACENT DUPLICATES FROM gt_events COMPARING productionorder activityname eventtime productionplant productcode.
OPEN DATASET p_file FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc <> 0.
MESSAGE 'The application server output file could not be opened' TYPE 'E'.
ENDIF.
TRANSFER 'ProductionOrder,ActivityName,EventTime,SourceSystem,LastDataUpdate,ProductionPlant,ProductCode,PlannedQuantity,DeliveredQuantity,ActualStartDate,ActualEndDate' TO p_file.
LOOP AT gt_events INTO gs_event.
gv_line = |{ gs_event-productionorder },{ gs_event-activityname },{ gs_event-eventtime },{ gs_event-sourcesystem },{ gs_event-lastdataupdate },{ gs_event-productionplant },{ gs_event-productcode },{ gs_event-plannedquantity },{ gs_event-deliveredquantity },{ gs_event-actualstartdate },{ gs_event-actualenddate }|.
TRANSFER gv_line TO p_file.
ENDLOOP.
CLOSE DATASET p_file.
MESSAGE |Event log written to { p_file }| TYPE 'S'. 立即优化生产计划,提升效率
发现低效环节,将周期时间缩短30%,达成生产目标。
无需信用卡,立即开始优化。