您的生产计划数据模板
您的生产计划数据模板
- 建议收集的属性
- 需要追踪的关键活动
- 数据抽取实用指南
生产计划属性
| 名称 | 描述 | ||
|---|---|---|---|
| Event 时间 EventTime | 标识该活动发生时间的精确时间戳。 | ||
| 描述 事件时间 (Event Time) 记录了特定活动执行或状态记录在系统中的日期和时间。该时间戳是所有基于时间的流程分析(包括计算生产周期、等待时间及整体流程时长)的基础。 准确的时间戳对于正确排列事件顺序及性能分析至关重要。它使分析师能够衡量活动间的时长、识别延迟,并评估其相对于计划或服务水平协议 (SLA) 的表现。在生产计划语境下,这有助于理解计划与执行的每个阶段所需的时间。 为何重要 该属性提供了事件的时间顺序,这对于计算时长、分析绩效和识别瓶颈至关重要。 获取方式 源自与交易和状态变更相关的各种日期和时间字段,例如物料凭证中的过账日期 (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 中的变更文档。 示例 生产订单已下达发货出库已过账已记录最终确认订单技术性完工 (TECO) | |||
| 生产订单 ProductionOrder | 生产订单的唯一标识符,作为生产计划和执行流程的主要个案标识 (Case ID)。 | ||
| 描述 生产订单号是分配给 SAP ECC PP 中每个制造订单的唯一字母数字键。作为核心对象,它连接了从创建、计划到执行和最终结算的所有相关活动。 在流程挖掘中,该属性对于将属于单次生产运行的所有事件进行分组至关重要。这使得能够对生产订单的整个生命周期进行端到端分析,包括跟踪进度、测量周期时间以及识别与标准流程的任何偏差。按生产订单分析流程,可以清晰地展示各个制造请求是如何被履行的。 为何重要 这是连接所有相关流程事件的核心标识符,使得能够重建和分析从开始到结束的每一次生产历程。 获取方式 该属性可在 SAP 表 AUFK 的 AUFNR 字段中找到。 示例 1000345100034610003471000348 | |||
| 最后数据更新 LastDataUpdate | 指示此 event 的 data 上次刷新或提取时间的 timestamp。 | ||
| 描述 该属性记录了数据从源系统提取到流程挖掘工具的日期和时间。它不代表业务事件,而是用于数据管理目的的技术时间戳。 其主要用途是确保数据的新鲜度,并帮助管理员和分析人员了解所分析数据的时效性。这对于验证流程分析是否基于最新信息至关重要,尤其是在监控持续运营时。 为何重要 它确认了数据的时效性,确保分析结果是基于可获得的最新信息。 获取方式 此值通常在数据摄取过程中,由数据提取、转换和加载 (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 | |||
| 产品代码 ProductCode | 正在制造的物料或产品的唯一标识符。 | ||
| 描述 产品代码(或物料编号)标识了生产订单要产出的项目。这是连接生产计划与库存管理、销售和成本核算的核心主数据元素。 在流程挖掘中,按产品代码进行过滤或细分对于理解特定产品的制造流程至关重要。它有助于回答“哪些产品的周期时间最长?”或“某些产品是否更容易出现质量问题或物料延迟?”等问题。这种分析对于产品组合管理以及识别特定物料类型的流程标准化或优化机会非常关键。 为何重要 它支持针对特定产品的流程分析,揭示哪些物料与流程低效、延迟或高成本相关。 获取方式 这可以在 SAP 表 AFPO 的 MATNR 字段中找到。 示例 FG-123RM-45AHALB-7890CHEM-22 | |||
| 实际开始日期 ActualStartDate | 第一次记录的生产活动的时间戳,标志着实际执行的开始。 | ||
| 描述 实际开始日期是标志着物理生产工作开始的第一个事件的时间戳。通常取自第一次生产确认事件或订单的第一次原材料发料。 这一派生属性对于计划达成率分析非常关键。它提供了与“计划开始日期”进行对比的实际起点,从而能够精确计算开始时间的偏差。了解计划开始日期与实际开始日期之间的差距,有助于发现与物料准备、机器调试或资源可用性相关的产前延迟。 为何重要 它提供了生产执行的真实起点,从而能精确计算开工延迟和整体生产提前期。 获取方式 通过在事件日志中为每个生产订单查找特定执行活动(如“首次确认已记录”或“发料已过账”)的最小时间戳得出。 示例 2023-05-11T08:30:00Z2023-06-22T14:00:00Z2023-07-02T09:15:00Z | |||
| 实际结束日期 ActualEndDate | 最后一次生产活动的时间戳,标志着订单的实际完工。 | ||
| 描述 实际结束日期是标志着订单所有生产活动完成的事件时间戳。通常取自“最终确认已记录”或最后一次“收货已过账”事件的时间戳。 该属性对于衡量总生产周期时间和分析计划达成率至关重要。通过对比“实际结束日期”和“计划结束日期”,可以确定订单是否准时完成。分析“实际开始日期”和“实际结束日期”之间的时间间隔,即可得出真实的生产产出周期(throughput time)。 为何重要 它标志着生产的结束,从而能够精确衡量准时交付表现和总执行时长。 获取方式 通过在事件日志中查找关键完成活动(如“最终确认已记录”或“收货已过账”)的最大时间戳得出。 示例 2023-05-14T16:00:00Z2023-06-29T11:30:00Z2023-07-05T17:00:00Z | |||
| 已交付数量 DeliveredQuantity | 已生产并入库的产品实际数量。 | ||
| 描述 已交付数量(也称为收货数量)是针对特定生产订单确认已产出的成品总量。该数值在发生“收货已过账”事件时更新。 此属性与“计划数量”相对应,是计算“计划与实际数量偏差”KPI 的核心。它提供了生产产出的最终衡量标准,使分析师能够识别可能由报废、良率损失或其他生产问题引起的差异。通过在工厂、产品或时间维度上对比已交付数量,可以快速锁定效率低下的环节。 为何重要 它衡量生产过程的实际产出,支持与计划目标进行直接对比以评估绩效。 获取方式 可在 SAP 表 AFPO 的 WEMNG(收货数量)字段中找到。 示例 984950751255 | |||
| 生产工厂 ProductionPlant | 执行生产订单的制造设施或地点。 | ||
| 描述 生产工厂是 SAP 中的关键组织单元,代表制造设施。它被分配给每个生产订单,并决定了生产活动实际发生的物理地点。 按生产工厂分析流程可以对不同地点的绩效进行对比。这有助于识别哪些工厂效率更高,哪些工厂面临更多的延迟或物料短缺,以及在何处可以共享最佳实践。它是吞吐量和资源利用率仪表板中进行根本原因分析的基础维度。 为何重要 它支持在不同制造地点之间进行绩效对比,有助于识别特定工厂的问题或推广最佳实践。 获取方式 该属性存储在 SAP 表 AUFK 的 WERKS 字段中。 示例 100017102000DE01 | |||
| 计划数量 PlannedQuantity | 订单中计划生产的产品总数。 | ||
| 描述 计划数量是指在计划阶段定义的生产订单目标产出量。该数值是衡量实际生产产出的基准。 该属性是“计划与实际产量差异”等生产绩效和计划达成率相关 KPI 的基础。它有助于评估生产计划的准确性,并识别与生产过剩或产出不足相关的系统性问题。分析该数值是了解生产执行与最初计划匹配程度的关键。 为何重要 该属性是衡量生产产出差异和评估计划准确性的基准。 获取方式 该值可在 SAP 表 AFKO 的字段 GAMNG(总订单数量)中找到。 示例 1005000751250 | |||
| 周期时间 CycleTime | 从生产订单下达到最终完工所经过的总时间。 | ||
| 描述 生产周期 (Cycle Time) 是衡量生产执行阶段耗时的关键绩效指标。其计算方式为“生产订单已释放”事件与完成事件(如“最终确认已记录”或“收货已过账”)之间的时间差。 这一计算指标是评估制造效率的基石。通过分析生产周期的趋势并跨产品、跨工厂或跨时间段进行对比,有助于发现缩短提前期、提升吞吐量以及增加整体产能的机会。它是许多核心仪表板和 KPI 的基础指标。 为何重要 它直接衡量生产执行过程的效率和速度,揭示缩短提前期的机会。 获取方式 计算字段:“生产订单已完成”的时间戳减去“生产订单已释放”的时间戳。 示例 3 days 4 hours10 小时 15 分钟7 天 0 小时1 天 12 小时 | |||
| 数量差异 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 | |||
| 计划结束日期 PlannedEndDate | 订单计划生产完成的预定日期。 | ||
| 描述 计划结束日期是在调度过程中确定的生产订单目标完成日期。它定义了完成所有生产活动(包括最终确认和收货)的预期时间框架。 该日期对于计算“计划达成率”KPI 至关重要。通过将“计划结束日期”与实际完成时间(如“收货已过账”或“最终确认已记录”的时间戳)进行对比,可以揭示订单是否准时完工。该分析有助于评估生产调度的可靠性,并识别交付逾期的根本原因。 为何重要 它是判断生产订单是否准时完成的基准,直接影响客户满意度和计划可靠性。 获取方式 这是基本完成日期,位于 SAP 表 AFKO 的 GLTRP 字段中。 示例 2023-05-152023-06-282023-07-05 | |||
| 计划达成状态 ScheduleAdherenceStatus | 指示生产订单是否在计划结束日期前完成的标记。 | ||
| 描述 计划达成状态是一个计算得出的布尔值或分类属性,能够直观地反映准时交付表现。它通过对比“实际结束日期”和“计划结束日期”得出。如果实际结束日期不晚于计划日期,则状态为“准时”;否则为“逾期”。 该属性简化了仪表板中的分析与可视化。通过简单的过滤和聚合,即可计算“计划达成率”KPI,并识别导致订单逾期的主要因素,如特定产品、工厂或物料短缺。 为何重要 它通过将订单分类为“准时”或“逾期”来简化绩效分析,使衡量和汇报进度可靠性变得轻松简单。 获取方式 计算字段: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 | |||
| 已记录首次确认 | 该事件标志着订单实际生产工作的开始。当生产订单中任何工序的第一次时间确认输入系统时,该事件即被捕获。 | ||
| 为何重要 该活动提供了生产的实际开始时间,这对于衡量计划达成率以及识别资源分配与工作开始之间的延迟至关重要。 获取方式 这是通过在 AFRU 表中查找为该订单记录的所有确认中最早的过账日期 (AFRU-BUDAT) 推断出来的。第一个分录即标志着物理生产的开始。 捕获 根据 AFRU 表中的过账日期识别该订单的首条报工记录。 事件类型 inferred | |||
| 收货过账完成 | 该事件记录了将生产订单中的成品收货入库。它标志着制造的产品现在可供发货或进一步加工。 | ||
| 为何重要 这是一个关键的完工里程碑,代表生产流程的最终产出。从下达到收货的时间即为总生产前置时间。 获取方式 记录在 MKPF/MSEG 表中的物料凭证,移动类型通常为“101”,并引用生产订单。同时,订单系统状态会设为“DLV”(I0012,已交付)。 捕获 捕捉移动类型为“101”的物料凭证过账日期,或“DLV”状态变更的时间戳。 事件类型 explicit | |||
| 生产订单已下达 | 该活动标志着生产订单的正式批准并下达执行。一旦释放,物料预留将生效,并且可以开始领料和确认等生产活动。 | ||
| 为何重要 这是一个关键里程碑,代表从计划到执行的移交。从创建到下达之间的时间间隔是衡量计划效率的关键指标。 获取方式 当生产订单被赋予系统状态“REL”(I0002) 时明确捕捉。该变更会记录在 JCDS 表中并带有时间戳,关联至订单的对象编号 (AUFK-OBJNR)。 捕获 识别该订单“REL”状态激活的时间戳。 事件类型 explicit | |||
| 生产订单已创建 | 该事件标志着新生产订单的创建,通常由计划运行或手动录入启动。当新订单记录在系统中保存并获得“CRTD”(已创建)状态时,该事件会被明确捕获。 | ||
| 为何重要 这是每个生产订单个案的起点。分析从该事件到订单下达的时间,有助于识别产前计划和行政准备阶段的延迟。 获取方式 该事件取自生产订单的创建日期 (AUFK-ERDAT) 和时间 (AUFK-ERZET)。系统分配“CRTD”(I0001) 状态,并记录在与订单对象编号 (AUFK-OBJNR) 链接的 JEST 和 JCDS 表中。 捕获 追踪创建时间戳以及 'CRTD' 状态的分配。 事件类型 explicit | |||
| 订单技术性完工 (TECO) | 这是一个行政关闭步骤,从物流角度完成生产订单。它会阻止进一步的物料移动或确认,并允许进行财务结算。 | ||
| 为何重要 这是订单在物流生命周期中的最终终点。分析该事件有助于了解整个流程时长,包括生产后的行政管理任务。 获取方式 当订单被赋予系统状态“TECO”(I0045,技术完成) 时明确捕捉。该变更记录在 JCDS 表中并带有时间戳。 捕获 在 JCDS 中识别该订单“TECO”状态激活的时间戳。 事件类型 explicit | |||
| 发货出库已过账 | 该活动代表从库存中提取组件物料用于生产订单。它确认了必要的原材料或半成品已准备就绪,可以投入生产。 | ||
| 为何重要 该事件标志着物料消耗的开始。订单下达到发料之间的时间延迟可能反映出仓库物流、配料过程或库存准确性方面的问题。 获取方式 记录在 MKPF(抬头)和 MSEG(行项目)表中的物料凭证,移动类型通常为“261”,并引用生产订单号(MSEG-AUFNR)。 捕获 捕捉与订单关联且移动类型为“261”的物料凭证过账日期 (MKPF-BUDAT)。 事件类型 explicit | |||
| 已记录中间确认 | 通过工序的部分确认来更新生产订单进度。这在周期较长的订单中很常见,需要在最终完工前跟踪中间进度。 | ||
| 为何重要 分析中间报工有助于监控长周期生产的进度,并能识别生产过程内部(而非仅在起止环节)的瓶颈。 获取方式 从 AFRU 表中未标记为“最后确认”的报工记录中捕捉。每条记录都包含过账日期 (AFRU-BUDAT) 和时间。 捕获 从 AFRU 中提取所有未标记为工序“最后确认”的报工记录。 事件类型 explicit | |||
| 物料可用性已检查 | 代表执行一次检查,以确认生产订单所需的所有组件是否可用。这可以是订单创建或下达时的自动检查,也可以是手动触发的操作。 | ||
| 为何重要 该活动对于了解由物料短缺引起的延迟至关重要。频繁的检查或物料到位前漫长的等待时间可能预示着供应链或库存管理存在问题。 获取方式 系统会设置诸如“MACM”(物料已承诺)或“MSPT”(物料短缺)之类的状态。执行情况可以从 JEST/JCDS 表中该状态变更的时间戳推断出来。结果可在订单抬头中查看。 捕获 从与物料可用性相关的状态变更(如“MACM”或“MSPT”)时间戳中推断。 事件类型 inferred | |||
| 订单已设为取消 | 该事件表示生产订单在完工前已被取消。通常通过设置特定状态或删除标记来实现,以防止任何进一步的处理。 | ||
| 为何重要 这是一个需要重点跟踪的负面结果。分析已取消的订单可以揭示需求预测、计划准确性或主数据管理方面的问题。 获取方式 这可以从分配的“DLFL”(I0076,删除标记)状态或配置的特定“已取消”状态推断出来。变更会带有时间戳记录在 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。基于上一步创建的 InfoSet 创建一个新查询,例如ZPP_EVENTS。 - 设计查询布局: 在查询设计器中,定义筛选屏幕字段。推荐的筛选条件包括:生产订单
AUFNR、工厂WERKS、订单类型AUART以及订单创建日期范围AUFK-ERDAT。 - 定义输出列表: 选择要在报告输出中显示的字段。此列表应与事件日志要求的列完全匹配,包括
ActivityName和EventTime等自定义字段。 - 执行查询: 使用所需的筛选条件运行查询,例如提取过去 3 到 6 个月的生产订单数据。
- 导出数据: 查询显示结果后,导出列表。最常用且可靠的格式是“电子表格”或“本地文件”(选择制表符分隔或 CSV 格式)。
- 为 ProcessMind 进行格式化: 在 Excel 或类似软件中打开导出的文件。检查列标题是否符合要求的属性(
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)的显示权限。
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 Schema: 确定存储 SAP 表的正确数据库模式 (Schema)。通常为
SAPSR3或类似的系统特定名称。您需要将查询中的[Your SAP Schema]占位符替换为此实际值。 - 准备 SQL 查询: 复制“查询”部分提供的完整 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 平台进行深度分析。
配置
- 数据库模式 (Schema): 您必须指定生产计划表所在的 SAP Schema。请将查询中的
[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 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。基于上一步创建的 InfoSet 创建一个新查询,例如ZPP_EVENTS。 - 设计查询布局: 在查询设计器中,定义筛选屏幕字段。推荐的筛选条件包括:生产订单
AUFNR、工厂WERKS、订单类型AUART以及订单创建日期范围AUFK-ERDAT。 - 定义输出列表: 选择要在报告输出中显示的字段。此列表应与事件日志要求的列完全匹配,包括
ActivityName和EventTime等自定义字段。 - 执行查询: 使用所需的筛选条件运行查询,例如提取过去 3 到 6 个月的生产订单数据。
- 导出数据: 查询显示结果后,导出列表。最常用且可靠的格式是“电子表格”或“本地文件”(选择制表符分隔或 CSV 格式)。
- 为 ProcessMind 进行格式化: 在 Excel 或类似软件中打开导出的文件。检查列标题是否符合要求的属性(
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)的显示权限。
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';