生产计划数据模板
生产计划数据模板
- 建议收集的属性
- 需要跟踪的关键活动
- 实用的数据提取说明
生产计划属性
| 名称 | 说明 | ||
|---|---|---|---|
| 事件时间 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 | 最后一项生产活动的时间戳,标志着订单实际完成。 | ||
| 说明 实际结束日期是表示订单所有生产活动完成的事件时间戳。通常取自“最终确认已记录”或最后一次“货物收货已过账”事件的时间戳。 此属性对于衡量生产总周期时间和分析计划执行情况至关重要。将“实际结束日期”与“计划结束日期”进行比较,可以判断订单是否按时完成。分析“实际开始日期”与“实际结束日期”之间的时长,可得出实际生产周期时间。 重要性 该日期标志着生产完成,可用于准确衡量按时交付绩效和总执行时间。 获取途径 从事件日志中查找关键完成活动(如“最终确认已记录”或“货物收货已过账”)的最大时间戳得出。 示例 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 | 表示生产订单所需的所有组件是否均已备齐。 | ||
| 说明 物料可用性状态是衡量生产准备情况的重要指标。系统会检查订单所需的所有组件物料,并据此确定状态。“可用”表示生产可以继续,不会因物料问题延误;“短缺”则表示存在问题。 此属性对于“物料短缺影响分析”仪表板至关重要。分析订单因物料短缺而等待的时长,可以量化供应链问题对生产计划的影响,并帮助识别不可靠的供应商或经常导致延误的问题组件。 重要性 该属性可直接显示物料短缺造成的延误,而物料短缺是生产计划偏差常见且重要的根本原因。 获取途径 这不是单独存储的字段,而是可用性检查(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 | |||
| 计划执行状态 ScheduleAdherenceStatus | 用于标记生产订单是否在计划结束日期前完成。 | ||
| 说明 计划执行状态是一个计算得出的布尔值或类别属性,可直观展示订单是否按时完成。该属性通过比较“实际结束日期”和“计划结束日期”得出。实际结束日期不晚于计划结束日期时,状态为“按时”;否则为“延迟”。 此属性可简化仪表板中的分析和可视化。您可以轻松筛选和汇总数据,计算“计划执行率”KPI,并找出订单延迟的主要原因,例如特定产品、工厂或物料短缺。 重要性 该属性将订单归类为“按时”或“延迟”,简化绩效分析,便于衡量和报告计划执行情况。 获取途径 计算字段:IF('ActualEndDate' <= 'PlannedEndDate', '按时', '延迟')。 示例 按时延迟 | |||
| 计划结束日期 PlannedEndDate | 计划完成生产订单的日期。 | ||
| 说明 计划结束日期是排程过程中为生产订单设定的目标完成日期,规定了完成所有生产活动(包括最终报工和收货)的预期时间范围。 此日期是计算“计划执行率”KPI的重要依据。将计划结束日期与实际完成时间(例如“过账收货”或“记录最终报工”活动的时间戳)进行比较,可以判断订单是否按时完成。这有助于评估生产排程的可靠性,并找出交付延误的根本原因。 重要性 此日期是判断生产订单是否按时完成的基准,直接影响客户满意度和计划可靠性。 获取途径 这是基本结束日期,位于SAP表AFKO的字段GLTRP中。 示例 2023-05-152023-06-282023-07-05 | |||
| 责任用户 ResponsibleUser | 创建或最后修改生产订单的人员的用户ID。 | ||
| 说明 责任用户用于标识与生产订单生命周期关键事件(如创建或下达)相关联的SAP用户账号,从而确保操作可追溯、责任可明确。 在流程挖掘中,此属性可用于分析不同用户行为带来的流程差异,帮助识别可能需要额外培训的用户,或发现未遵循标准流程的情况。它还可用于资源分析,了解工作在不同用户之间的分配情况。 重要性 该属性将流程活动关联到具体人员,支持用户级绩效分析并明确责任。 获取途径 订单创建者记录在AUFK-ERNAM中,最后修改者记录在AUFK-AENAM中。变更凭证(CDHDR-USERNAME)可提供具体变更的用户历史记录。 示例 JSMITHPROD_PLANNER1BATCH_USERAMILLER | |||
生产计划活动
| 活动 | 说明 | ||
|---|---|---|---|
| 下达生产订单 | 此活动表示生产订单已正式获批并下达执行。订单下达后,物料预留生效,发料和报工等生产活动即可开始。 | ||
| 重要性 这是从计划转入执行的关键节点。从创建到下达所需的时间,是衡量计划效率的重要指标。 获取途径 当系统将状态“REL”(I0002)分配给生产订单时,即可明确捕获此事件。状态变更时间戳记录在JCDS表中,并关联订单对象编号(AUFK-OBJNR)。 采集 确定订单“REL”状态生效的时间戳。 事件类型 explicit | |||
| 创建生产订单 | 此事件表示新生产订单已创建,通常由计划运行生成或手动录入。当系统保存新的订单记录并将其状态设为“CRTD”(已创建)时,即可明确捕获此事件。 | ||
| 重要性 这是每个生产订单案例的起点。分析从此事件到订单下达的耗时,有助于发现生产前计划和行政准备环节的延误。 获取途径 此事件根据生产订单的创建日期(AUFK-ERDAT)和时间(AUFK-ERZET)捕获。系统会将状态“CRTD”(I0001)分配给订单,并在JEST和JCDS表中记录该状态,关联订单对象编号(AUFK-OBJNR)。 采集 跟踪创建时间戳以及“CRTD”状态的分配情况。 事件类型 explicit | |||
| 订单技术性完成 | 这是从物流角度完成生产订单的行政收尾步骤。此步骤会阻止后续物料移动或报工,并允许进行财务结算。 | ||
| 重要性 这是订单物流生命周期的最终节点。分析此事件有助于了解整个流程的持续时间,包括生产后的行政工作。 获取途径 当系统将状态“TECO”(I0045,技术性完成)分配给订单时,即可明确捕获此事件。状态变更时间戳记录在JCDS表中。 采集 在JCDS表中确定订单“TECO”状态生效的时间戳。 事件类型 explicit | |||
| 记录最终报工 | 此活动表示从车间执行角度看,生产订单的所有工序均已完成。最后一道工序的最终报工记录会标记这一状态。 | ||
| 重要性 此节点标志着实际生产活动结束。从首次报工到最终报工的时长,即为实际生产执行时间。 获取途径 当系统设置状态“CNF”(I0009,已确认)时,即可捕获此事件。通常,AFRU表中的最终报工记录(AFRU-AUERU = “X”)会触发该状态。状态变更记录在JCDS表中。 采集 确定“CNF”状态的设置时间戳,或查找AFRU表中的最后一条报工记录。 事件类型 explicit | |||
| 记录首次报工 | 此事件表示订单的实际生产工作已经开始。当生产订单中任一工序的首次工时确认录入系统时,即可捕获此事件。 | ||
| 重要性 此活动提供生产的实际开始时间,是衡量计划执行情况、发现资源分配到实际开工之间延误的重要依据。 获取途径 可在AFRU表中查找该订单所有报工记录的最早过账日期(AFRU-BUDAT)进行推断。首条记录标志着实际生产开始。 采集 根据AFRU表中的过账日期,确定该订单的首条报工记录。 事件类型 inferred | |||
| 过账收货 | 此事件记录生产订单的成品入库,表示制造完成的产品现已可供发运或进一步加工。 | ||
| 重要性 这是生产完成的关键节点,代表生产流程的最终产出。从订单下达到收货的时间,即为生产总周期。 获取途径 此活动记录为MKPF/MSEG表中的物料凭证,移动类型通常为“101”,并关联生产订单。订单还会设置系统状态“DLV”(I0012,已交付)。 采集 捕获移动类型为“101”的物料凭证过账日期,或“DLV”状态变更的时间戳。 事件类型 explicit | |||
| 执行订单结算 | 表示对生产订单进行财务结算,将归集的成本分配到相应的成本对象。这是从管理会计角度看订单生命周期的最后一步。 | ||
| 重要性 虽然结算属于财务活动,但结算延误可能表明成本报告或订单数据准确性存在问题。此事件标志着生产流程在财务上的正式结束。 获取途径 当订单余额归零,或系统状态“SETC”(I0076,已创建结算规则)之后出现结算运行日志时,可以推断此事件。实际结算记录在COSP和COSS等管理会计表中。 采集 根据CO表中与订单关联的结算凭证,或“SETC”状态的生效情况进行推断。 事件类型 inferred | |||
| 更改订单数据 | 此事件记录生产订单创建后发生的重要修改,例如计划数量、日期或物料清单(BOM)的变更。系统会记录这些变更,以供审计。 | ||
| 重要性 跟踪这些变更有助于发现流程不稳定和频繁重新计划的情况。变更频繁可能意味着初始计划不准确、需求波动或数据有误。 获取途径 AFKO(订单抬头)和AFPO(订单项目)等表中的关键字段变更,会记录在变更凭证表CDHDR(抬头)和CDPOS(项目)中。每项相关变更都可以提取为一项活动。 采集 从CDHDR和CDPOS表中提取生产订单对象类的变更日志记录。 事件类型 explicit | |||
| 检查物料可用性 | 表示检查生产订单所需的所有组件是否齐备。此检查可以在创建或下达订单时自动执行,也可以由用户手动触发。 | ||
| 重要性 此活动对于了解物料短缺造成的延误至关重要。频繁检查物料或物料长时间无法到位,可能表明供应链或库存管理存在问题。 获取途径 系统会设置“MACM”(物料已承诺)或“MSPT”(物料短缺)等状态。可根据JEST/JCDS表中状态变更的时间戳推断检查执行时间,检查结果可在订单抬头中查看。 采集 根据物料可用性相关状态(如“MACM”或“MSPT”)变更的时间戳进行推断。 事件类型 inferred | |||
| 记录中间报工 | 表示通过对某道工序进行部分报工,更新生产订单的进度。对于需要在最终完成前跟踪进度的长周期订单,这种做法很常见。 | ||
| 重要性 分析中间报工有助于监控长周期生产进度,并发现生产流程内部的瓶颈,而不仅仅是流程开始或结束环节的问题。 获取途径 此事件根据AFRU表中未标记为最终报工的记录捕获。每条记录都包含过账日期(AFRU-BUDAT)和时间。 采集 从AFRU表中提取所有未标记为工序最终报工的记录。 事件类型 explicit | |||
| 设置订单取消状态 | 此事件表示生产订单在完成前已取消。通常通过设置特定状态或删除标记来取消订单,之后无法继续处理。 | ||
| 重要性 这是需要跟踪的负面结果。分析已取消的订单,有助于发现需求预测、计划准确性或主数据管理方面的问题。 获取途径 可根据“DLFL”(I0076,删除标记)状态的分配情况,或系统配置的特定“已取消”状态进行推断。状态变更时间戳记录在JCDS表中。 采集 确定订单删除标记(“DLFL”)或取消状态的设置时间戳。 事件类型 inferred | |||
| 过账发料 | 此活动表示从库存中领出组件物料,用于生产订单。它确认所需原材料或半成品已备妥,可投入生产。 | ||
| 重要性 此事件标志着物料消耗开始。订单下达到发料之间的延误,可能反映仓库物流、物料备料或库存准确性方面的问题。 获取途径 此活动记录为MKPF(抬头)和MSEG(项目)表中的物料凭证,包含移动类型(通常为“261”),并关联生产订单编号(MSEG-AUFNR)。 采集 捕获与订单关联、移动类型为“261”的物料凭证过账日期(MKPF-BUDAT)。 事件类型 explicit | |||
数据提取指南
步骤
- 在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-OBJNRANDJEST-STAT = JCDS-STAT。注意:此连接用于读取状态变更历史。AUFK连接AFRU(订单完成确认):AUFK-AUFNR = AFRU-AUFNRAUFK连接MSEG(物料凭证段):AUFK-AUFNR = MSEG-AUFNRMSEG连接MKPF(物料凭证抬头):MSEG-MBLNR = MKPF-MBLNRANDMSEG-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。基于前面创建的InfoSet新建查询,例如ZPP_EVENTS。 - 设计查询布局:在查询设计器中定义选择屏幕字段。建议选择生产订单
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连接:此方法的核心是使用复杂的InfoSet连接订单抬头、状态、确认记录和物料移动表。主要连接包括
AUFK->AFKO、AUFK->JEST->JCDS、AUFK->AFRU以及AUFK->MSEG->MKPF。连接错误或效率低下可能导致性能不佳或数据不准确。 - 筛选条件:必须设置适当的筛选范围,以免影响系统性能。查询启动屏幕应包含以下关键筛选字段:
- 生产工厂(
AUFK-WERKS) - 生产订单类型(
AUFK-AUART) - 订单创建日期(
AUFK-ERDAT):建议提取滚动周期内3至6个月的数据,以控制数据集大小。
- 生产工厂(
- 系统状态:识别“已创建”“已下达”“技术性完成”和“已取消”等事件,需要使用特定系统状态代码(例如I0001、I0002、I0045、I0047)。这些代码通常适用于各SAP系统,但仍应进行核实。
- 移动类型:“货物发出”和“货物收货”等事件通过对应的移动类型(
MSEG-BWART)识别,通常分别为“261”和“101”。请确认这些值与贵组织的配置一致。 - 授权:运行查询的用户需要有权访问
SQ01、SQ02和SQ03事务,并拥有所有底层表(AUFK、AFKO、JEST、JCDS、AFRU、MSEG、MKPF)的显示权限。
查询示例 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)筛选,以限制数据量。 - 连接并执行:使用标准SQL客户端(如DBeaver、SAP HANA Studio)或自定义脚本(Python、Java),并使用第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用户都默认拥有直接数据库访问权限,通常需要特别授权。
查询示例 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事务),创建专用可执行报表,例如[您的自定义报表名称]。设置选择屏幕,包含必填日期参数,例如[开始日期]和[结束日期],以及可选筛选条件:[公司代码]、[生产工厂]、[订单类型]、[物料]和[生产订单]。
- 从AUFK及SAP ECC系统中配置的生产订单表读取生产订单抬头和主数据。使用JCDS及相应的状态配置识别明确的状态变更,包括CRTD、已下达、技术性完成和与取消相关的状态。除非状态历史记录中包含带时间戳的变更,否则不要将状态代码视为事件。
- 从系统中配置的生产订单可用性检查数据读取物料可用性检查结果。如果检查结果未保存在可可靠关联到订单和时间戳的表中,请使用SAP团队批准的配置增强、应用程序日志或审计数据源。不要仅根据订单创建或下达推断已执行检查。
- 从已配置的生产订单变更凭证对象及其关联变更凭证表读取订单变更历史。仅提取重要变更,例如计划数量、日期、BOM、工艺路线或流程负责人批准的其他字段。将变更凭证时间戳用作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对事件记录排序;时间戳相同时,使用确定性的次级排序。仅删除完全重复的源记录,不要删除合理的重复事件。验证输出架构包含全部12个必需活动名称,并确保每条输出记录都包含案例标识、活动名称和事件时间戳。
- 使用经批准的ABAP文件接口,将结果写入应用服务器文件,并使用已配置的逻辑文件路径。按照ProcessMind数据导入配置约定分隔符和文本编码,添加标题行,为包含分隔符的值加引号,并统一时间戳格式,建议使用YYYY-MM-DDThh:mm:ss。
- 按照经批准的SAP文件传输流程下载文件,独立检查文件后,将其作为事件日志上传到ProcessMind,并将ProductionOrder设为案例标识、ActivityName设为活动、EventTime设为事件时间戳。确认ProcessMind已配置为按原样读取记录,不需要推断缺失的活动。
配置
- 日期范围:初次分析使用滚动提取窗口,覆盖3至6个月。评估性能和数据量后再扩大范围。纳入回溯期,以涵盖在所选开始日期之前创建、但在分析期间仍处于活动状态的订单。
- 筛选条件:支持[公司代码]、[生产工厂]、[订单类型]、[物料]、[生产订单]、订单状态以及创建日期或变更日期筛选。根据SAP ECC的具体实施配置准确字段,因为不同版本和定制可能导致生产订单字段有所差异。
- 事件范围:将全部12项必需活动作为明确的事件记录提取: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系统中确认表名、字段、状态代码、变更凭证对象、确认数据源、可用性检查数据源和结算数据源。如果实施中没有标准且可靠的数据源,请使用[根据您的系统配置]。
查询示例 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%,并达成目标。
无需信用卡。立即开始优化。