您的生产计划数据模板
您的生产计划数据模板
- 生产计划分析建议属性
- 需追踪的关键生产计划活动
- 针对 SAP S/4HANA 的详细数据提取指南
生产计划属性
| 名称 | 描述 | ||
|---|---|---|---|
| 开始时间 StartTime | 指示特定活动或事件开始的时间戳。 | ||
| 描述 此属性提供生产流程中每个记录事件的日期和时间。它是所有基于时间的流程分析的时间基础。 开始时间对于计算活动之间的时长、衡量生产订单的总周期以及了解事件的时序至关重要。通过将实际时间戳与计划日期对比,它支持对瓶颈、等待时间和计划达成率的深入分析。 为何重要 为所有事件提供时间背景,使分析流程绩效、时长和瓶颈成为可能。 获取方式 此类信息通常存在于用于状态更改的变更凭证表 (CDHDR/CDPOS)、用于执行步骤的确认表 (AFRU) 以及用于创建日期的抬头表 (AFKO) 中。 示例 2023-10-26T09:00:00Z2023-10-26T14:30:00Z2023-10-27T08:15:00Z | |||
| 活动 Activity | 在生产计划流程中特定时间点发生的事件或任务的名称。 | ||
| 描述 此属性记录生产订单生命周期中的各个步骤和里程碑。例如:“生产订单已创建”、“物料可用性已检查”、“生产已开始”和“订单财务已关闭”。每个活动都代表系统记录的特定操作或状态更改。 分析这些活动的顺序和频率是流程挖掘的核心。它有助于可视化流程流向,识别偏离标准规程的情况,并精准找出导致延迟或导致频繁返工(如“生产计划已调整”)的活动。 为何重要 它定义了流程步骤,支持对实际生产工作流及其变体进行发现和可视化。 获取方式 推导自 JEST 和 JCDS 等表中的状态变更、使用的事务代码(例如创建订单的 CO01)或 AFRU 中的特定确认记录。 示例 生产订单已创建生产订单已下达生产已开始已输入最终确认收货过账完成 | |||
| 生产订单 ProductionOrder | 生产订单的唯一标识符,作为生产计划流程的主要 Case 标识符。 | ||
| 描述 生产订单号是 SAP S/4HANA 生成的唯一键,用于管理和跟踪与特定产品数量制造相关的所有活动。它将从计划、下达到执行和最终结算的所有相关事件串联在一起。 在流程挖掘中,此属性对于将所有相关事件归组到单个端到端流程实例至关重要。按生产订单分析流程支持衡量周期、计划达成率等关键绩效指标 (KPI),并识别影响特定生产批次的瓶颈。 为何重要 这是连接所有流程步骤的基础属性,支持对生产生命周期从开始到结束进行完整的 Case 级别分析。 获取方式 这是生产订单号,通常存在于 SAP 表中,如 AFKO(字段 AUFNR)和 AFPO。 示例 100056710008341001299 | |||
| 最后数据更新 LastDataUpdate | 指示 data 上次刷新或从 source system 提取的时间的 timestamp。 | ||
| 描述 此属性记录最近一次抓取数据的日期和时间。它是一项关键的元数据,让用户了解所分析数据的新鲜程度。 了解最后更新时间对于正确解读分析结果至关重要。它能帮助用户判断当前查看的是实时信息还是特定时间点的快照,从而影响基于该数据得出的结论和决策的有效性。 为何重要 确保用户了解数据的时效性,这对于做出准确且相关的业务决策至关重要。 获取方式 此时间戳在数据提取、转换与加载(ETL)过程中生成并添加。 示例 2024-05-21T02:00:00Z2024-05-22T02:00:00Z2024-05-23T02:00:00Z | |||
| 源系统 SourceSystem | 提取生产计划数据的来源系统。 | ||
| 描述 此属性标识数据的来源,这在包含多个集成系统的环境中至关重要。对于此流程,它通常是特定的 SAP S/4HANA 实例。 在更广泛的数据分析背景下,了解来源系统有助于确保数据完整性,并在合并来自不同渠道的数据时提供正确的上下文。它是数据治理和追溯的一项基础元数据。 为何重要 为数据治理提供关键元数据,确保流程数据的来源和背景清晰明确。 获取方式 这通常是在数据提取过程中添加的静态值,用于标识 SAP S/4HANA 客户端和系统 ID (SID)。 示例 S4P_100S4H_PRD_200S4Q_300 | |||
| 工作中心 WorkCenter | 负责某项工序的特定机器、机器组或组装区域。 | ||
| 描述 工作中心代表工厂内执行生产步骤的特定操作单元。它可以是单台机器、一条生产线或一组员工。 按工作中心分析流程数据是识别产能瓶颈和优化资源分配的关键。它可以帮助解答哪些工作中心过载、哪些利用不足,以及在生产执行阶段哪些地方最常发生延误。这对于“产能瓶颈识别”仪表板至关重要。 为何重要 有助于精准定位作为瓶颈的特定机器或生产线,从而针对产能和资源利用率进行改进。 获取方式 位于生产订单的工序数据中,表 AFVC(字段 ARBPL)。 示例 WC-ASSEMBLY-01WC-MILLING-05WC-PACKING | |||
| 工厂 Plant | 执行生产订单的制造工厂或地点。 | ||
| 描述 工厂是 SAP 中的组织单位,代表生产基地或设施。每个生产订单都会分配到执行制造活动的特定工厂。 此属性对于跨不同制造地点的对比分析至关重要。通过按工厂细分流程数据,企业可以进行绩效基准评估,识别特定场地的瓶颈或最佳实践,并了解不同区域在效率、产能或标准遵守方面的差异。 为何重要 支持不同生产基地之间的绩效对比,有助于识别并分享最佳实践,或解决特定地点的问题。 获取方式 位于生产订单抬头表 AFKO(字段 DWERK)。 示例 100017102000 | |||
| 物料编号 MaterialNumber | 生产订单中所制造产品的唯一标识符。 | ||
| 描述 物料编号指定了生产订单的目标产品。它将生产流程与物料主数据(包括物料清单 BOM 和工艺路线信息)联系起来。 按物料编号分析流程有助于识别哪些产品更容易出现延迟、返工或物料短缺。这支持针对特定产品的流程优化,例如调整计划参数或改善特定组件的供应链。 为何重要 支持基于所生产产品进行过滤和分析,揭示特定产品的效率低点或瓶颈。 获取方式 位于生产订单行项目表 AFPO(字段 MATNR)。 示例 RM-1001FG-2050SA-3100-B | |||
| 计划结束日期 PlannedEndDate | 根据初始计划,生产订单的排程完工日期。 | ||
| 描述 计划结束日期是预期完成订单所有生产活动的目标日期。该日期在生产计划的调度阶段确定。 此属性对于衡量计划达成率至关重要。通过对比计划结束日期与实际完成时间戳,企业可以计算生产计划达成率 KPI 并识别逾期订单。此分析对于提高计划准确性和客户满意度非常关键。 为何重要 作为衡量进度达成率的基准,有助于评估计划的准确性和执行的效率。 获取方式 位于生产订单抬头表 AFKO(字段 GLTRP)。 示例 2023-11-152023-12-012024-01-20 | |||
| 订单状态 OrderStatus | 生产订单的当前处理状态,例如已创建、已下达或技术已完成。 | ||
| 描述 订单状态指示生产订单在其生命周期中所处的总体阶段。它是应用于订单的各种系统和用户状态的汇总。常见状态包括 CRTD(已创建)、REL(已下达)、CNF(已确认)、TECO(技术已完成)和 CLSD(已关闭)。 分析订单的当前状态有助于了解在制品的分布情况。在流程挖掘中,跟踪这些状态随时间的变化会生成活动日志,从而详细查看流程流向以及每个阶段所花费的时间。 为何重要 提供订单生命周期阶段的高层视图,是推导流程挖掘活动序列的基础。 获取方式 推导自表 JEST 中存储的系统状态,通过 AFKO 中的对象编号(字段 OBJNR)关联。 示例 已创建REL技术完工 (TECO)CLSD | |||
| 已确认数量 TotalConfirmedQuantity | 订单中已确认生产的物料总数量。 | ||
| 描述 此属性代表通过生产确认报告的成品或半成品的累计数量。它跟踪订单向完工目标推进的进度。 将确认数量与计划数量进行对比,有助于监控生产进度并识别收率问题或差异。它是产出的基础衡量标准,用于各种绩效计算,包括报废率和效率分析。 为何重要 追踪生产订单的实际产出,这对于监控进度、计算良率和识别差异至关重要。 获取方式 从 AFRU 中的确认记录汇总(字段 LMNGA 表示合格产出数量)。 示例 9801000501200 | |||
| 是否按时 IsOnTime | 一个标识位,用于指示生产订单是否在计划结束日期当天或之前完成。 | ||
| 描述 此计算布尔属性通过对比实际完成日期与计划结束日期,直接衡量计划达成率。它为每个生产订单的准时性提供了一个明确的二元结果。 该属性是“生产计划达成率”KPI 的基础。它通过对准时与逾期订单进行简单分类来简化分析,有助于识别与延迟相关的共同特征或流程路径。 为何重要 为每个订单提供清晰简单的进度达成衡量标准,便于分析延迟的根因。 获取方式 计算字段。如果“Order Technically Completed”(订单技术完工)活动的时间戳早于或等于“Planned End Date”(计划结束日期)属性,则设为 true。 示例 truefalse | |||
| 是否返工 IsRework | 一个标识位,用于指示生产订单在启动后是否涉及返工或重大的计划调整。 | ||
| 描述 此布尔属性用于识别在生产启动后经历了纠正操作或计划变更的生产订单。这可能是由明确的返工活动触发,或者是“生产开始”后发生了“生产计划已调整”事件。 该标记对于计算“生产返效率”KPI 以及“生产返工与修订”仪表板至关重要。它支持对问题 Case 进行轻松过滤和分析,有助于揭示导致高昂返工成本的质量问题或流程偏差的根本原因。 为何重要 它能隔离出涉及返工的 Case,从而通过针对性分析来理解并减少质量问题、流程偏差及相关成本。 获取方式 计算字段。如果在同一个 Case 中,“Production Started”(生产开始)活动之后发生了“Production Plan Adjusted”(生产计划调整)活动,或者使用了特定的返工订单类型,则设为 true。 示例 truefalse | |||
| 物料可用性状态 MaterialAvailabilityStatus | 指示生产订单所需的所有物料是否可用。 | ||
| 描述 此状态反映了为生产订单执行物料可用性检查的结果。它可以指示所有物料均可用、部分物料缺失或尚未执行检查。“短缺”状态是引发潜在延迟的关键触发因素。 该属性对于“物料短缺影响分析”仪表板至关重要。通过将短缺状态与订单下达到生产开始之间的时间相关联,它有助于量化因物料不可用导致的延迟。改善此指标是实现更顺畅生产流程的关键。 为何重要 它能直接解释订单下达与开工之间的延误,有助于量化供应链问题对制造端的影响。 获取方式 这是一种状态,通常源自物料组件的集合状态。可以在系统状态 (JEST) 中找到,如“MSPT”(物料短缺)。 示例 可用短缺未检查 | |||
| 生产优先级 ProductionPriority | 分配给生产订单的代码或数值,用于指示其紧急程度或重要性。 | ||
| 描述 计划员和排程员使用生产优先级来排列订单顺序,尤其是在资源受限的情况下。理想情况下,高优先级订单应先于低优先级订单处理。 分析此属性有助于评估车间是否严格遵守了设定的优先级。通过“生产优先级一致性”仪表板,您可以对比实际加工顺序与分配的优先级,识别不一致之处,从而强化调度纪律,实现计划与执行的高度同步。 为何重要 有助于判断生产排程是否遵循了业务优先级,确保关键订单按预期得到了加急处理。 获取方式 这通常是自定义字段或基于其他订单参数。具体位置取决于系统配置。 示例 高中低15 | |||
| 生产周期 ProductionCycleTime | 从生产订单下达到其技术完成所经历的总时间。 | ||
| 描述 此计算指标衡量生产订单在执行生命周期中的端到端时长。它是反映生产流程整体效率的关键绩效指标。 该属性是“生产订单交付周期概览”仪表板和“平均生产订单周期”KPI 的主要衡量标准。通过分析其组成部分(如等待时间与处理时间的对比),有助于识别流程加速和缩短交付周期的最大切入点。 为何重要 这是衡量整体生产效率及识别加速订单履行机会的关键 KPI。 获取方式 通过计算每个生产订单在“Production Order Released”(生产订单下达)活动与“Order Technically Completed”(订单技术完工)活动之间的时间跨度得出。 示例 P5DT12H30MP10DT2HP3D | |||
| 用户 User | 创建、更改或确认生产订单事件的用户的系统 ID。 | ||
| 描述 此属性捕获与特定事务或状态更改(如下达订单或录入确认)关联的 SAP 用户 ID。它为系统内执行的操作提供了追溯能力。 按用户分析活动有助于了解工作量分配,识别培训需求并确保符合操作规程。例如,它可以突出显示某些用户是否频繁参与计划调整,或者延迟是否与特定团队有关。 为何重要 提供问责依据,并支持分析工作负载、用户特定行为以及潜在的培训机会。 获取方式 通常存在于变更凭证抬头(CDHDR,字段 UNAME)或确认记录(AFRU,人员编号字段 PERNR)中。 示例 CB9980000021JSMITHPLANNER01 | |||
| 结束时间 EndTime | 指示特定活动或事件完成时间的精确时间戳。 | ||
| 描述 此属性提供每个记录事件的完成日期和时间。它与“开始时间”配合,定义活动的持续时长。 结束时间对于计算单个活动的精确处理时间至关重要,这是产能和资源利用率分析的关键输入。它有助于区分实际作业时间与闲置或等待时间,从而实现更准确的瓶颈识别。 为何重要 支持计算精确的活动时长,这对于分析资源效率和识别流程瓶颈至关重要。 获取方式 执行步骤的数据位于确认表 (AFRU) 中。对于其他瞬时事件,结束时间可能与开始时间相同。 示例 2023-10-26T09:45:00Z2023-10-26T15:00:00Z2023-10-27T10:30:00Z | |||
| 计划启动日期 PlannedStartDate | 根据初始计划,生产订单的排程开始日期。 | ||
| 描述 计划开始日期是订单生产活动预期启动的目标日期。这是排程过程的核心产出。 此属性为计划达成率分析提供了起始基准。将计划开始日期与实际启动时间进行对比,有助于了解前端延迟(如物料准备延迟或订单下达延迟),这些延迟会对整个生产时间线产生连锁反应。 为何重要 为衡量开工准时性提供基准,这对于识别订单下达和物料就位等生产前阶段的延误至关重要。 获取方式 位于生产订单抬头表 AFKO(字段 GSTRP)。 示例 2023-11-102023-11-252024-01-15 | |||
| 订单类型 OrderType | 对生产订单的分类,用于定义其用途并控制其处理逻辑。 | ||
| 描述 订单类型是 SAP PP 中的核心配置元素,决定了系统如何处理生产订单。它控制编号范围、主数据选择、成本核算参数和结算规则。例如:标准生产订单、返工订单或原型订单。 按订单类型分析流程可以对比不同生产任务的绩效和流向。这能揭示返工订单是否耗时过长,或者某些订单类型是否更容易发生计划调整,从而为针对性的流程改进提供价值。 为何重要 支持按订单的业务用途进行细分分析,从而实现标准生产、返工和其他流程之间的对比。 获取方式 位于生产订单抬头表 AFKO(字段 AUART)。 示例 PP01PP03ZP01 | |||
生产计划活动
| 活动 | 描述 | ||
|---|---|---|---|
| 已输入最终确认 | 此活动标志着生产订单工艺路线中最后一道工序的确认。它意味着车间已完成所有计划内的制造步骤。 | ||
| 为何重要 最终确认是一个关键里程碑,标志着实际生产工作的结束。在最终收货前,它通常被用作衡量车间周期的更精确终点。 获取方式 推导自 AFRU 表中的确认数据。具体识别为最后一道工序序列 (AFVC-VPLNR) 且设置了“最终确认”标识 (AFRUD-AUERU) 的确认记录。 捕获 在 AFRU 中查找设置了最终确认标识的最后一次工序确认。 事件类型 inferred | |||
| 收货过账完成 | 此事件记录从生产线收到的成品入库。它正式增加了产出物料的库存水平。 | ||
| 为何重要 这是一个关键里程碑,代表生产产出的完成。在衡量准时交付和总交付周期时,它通常被视为生产周期的终点。 获取方式 这是记录在物料凭证表 MSEG(项目层级)和 MKPF(抬头层级)中的显式财务过账,通常移动类型为 101。这些凭证与生产订单相关联。 捕获 在 MSEG 中查找与该订单关联且移动类型为 101 的物料凭证。 事件类型 explicit | |||
| 生产已开始 | 表示该订单实际生产活动的开始。通常推导自首次车间工序确认或针对该订单的首次组件发料。 | ||
| 为何重要 此活动标志着从计划到执行的转变。通过对比实际开始日期与计划开始日期,它对于跟踪计划达成率至关重要。 获取方式 这是一个推导出的事件。它通常源自与订单关联的货物移动过账(MSEG 表,移动类型 261)或时间确认过账(AFRU 表)的最早时间戳。 捕获 取自该订单在 AFRU(确认)或 MSEG(货物移动)中的最早时间戳。 事件类型 inferred | |||
| 生产计划已调整 | 代表生产订单下达后发生的重大变更,例如数量、日期或物料清单 (BOM) 的修改。这通过分析变更凭证来捕获。 | ||
| 为何重要 频繁调整可能预示着计划不稳定或需求波动剧烈。此活动是“生产计划修订率”KPI 的基础,有助于识别流程波动的来源。 获取方式 推导自生产订单对象(AUFK 或 AFPO)在 CDHDR(变更凭证抬头)和 CDPOS(变更凭证行项目)表中记录的变更日志。下达日期之后做出的修改被视为调整。 捕获 在下达事件后,识别 CDHDR/CDPOS 中关键字段(如数量、日期)的变更。 事件类型 inferred | |||
| 生产订单已下达 | 这是一个关键里程碑,标志着生产订单已获批准并可在车间执行。订单下达后,即可开始发货、确认和其他执行步骤。 | ||
| 为何重要 此事件标志着可执行生产流程的正式启动,是衡量交付周期的关键点。从创建到下达之间的时间是衡量生产前效率的核心 KPI。 获取方式 订单下达由用户或系统作业明确触发,从而产生 REL 状态。此状态更改记录在 JCDS 表中并带有时间戳。下达日期也通常存储在 AFKO-FTRMI 中。 捕获 JCDS 表中状态更改为“REL”的时间戳。 事件类型 inferred | |||
| 生产订单已创建 | 这是系统内生产订单的初始创建,作为生产指定数量产品的正式请求。当用户保存新订单时,此事件会被显式捕获,并将其初始状态设置为 CRTD(已创建)。 | ||
| 为何重要 标志着生产订单生命周期的开始。分析从创建到下达的时间,有助于识别正式排产前的行政审批或计划延误。 获取方式 此事件记录在 AUFK 表(订单主数据)中,带有创建日期 (ERDAT)。创建状态 (CRTD) 记录在 JEST 和 JCDS 表中,通过订单的对象编号 (OBJNR) 进行链接。 捕获 来自 AUFK-ERDAT 的时间戳或 JCDS 中更改为“CRTD”的状态更改日志。 事件类型 explicit | |||
| 订单技术已完成 | 这是一个管理性关闭步骤,可防止对订单进行进一步的物流更改(如货物移动或确认)。从物流角度看,订单被视为已完成。 | ||
| 为何重要 TECO 是生产流程的明确终点,对于计算总生产订单周期至关重要。它标志着所有物流活动均已结束,订单已准备好进行财务结算。 获取方式 这由用户将状态设置为 TECO(技术已完成)来触发。该事件作为状态更改记录在 JCDS 表中,并带有相应的时间戳。 捕获 JCDS 表中状态更改为“TECO”的时间戳。 事件类型 inferred | |||
| 发生物料短缺 | 此事件表示由于一个或多个所需组件不可用,导致生产流程受到影响或停滞。系统会在订单上设置特定状态以反映此情况。 | ||
| 为何重要 跟踪物料短缺对于“物料短缺影响分析”至关重要。它有助于量化供应链问题导致的延迟并改善物料计划。 获取方式 这是根据生产订单激活了“MSPT”(物料短缺)状态推导出来的。该状态更改的时间戳可以在 JCDS 表中找到。 捕获 JCDS 表中状态更改为“MSPT”的时间戳。 事件类型 inferred | |||
| 发生计划外停机 | 此计算事件代表生产执行阶段的一个显著闲置期。它不是一个显式的系统事件,而是通过识别连续生产确认之间的时间长间隙推导出来的。 | ||
| 为何重要 有助于监控机器故障或质量问题等意外中断。识别频繁或长时间的停机是提高车间稳定性和吞吐量的关键。 获取方式 这是通过分析 AFRU 表中连续的“录入生产确认”活动的时间戳计算得出的。超过预定义阈值的间隙将被标记为计划外停滞。 捕获 计算连续确认时间戳之间的差值 (AFRU-BUDAT/UZEIT)。 事件类型 calculated | |||
| 已录入生产确认 | 代表记录生产订单中特定工序的进度。这包括记录产出数量、报废数量以及在工作中心花费的时间。 | ||
| 为何重要 工序确认提供了车间进度的实时可视化,对于追踪生产状态至关重要。通过分析确认的频率和时间点,有助于监控流程并识别工序间的延误。 获取方式 每次确认都会作为一条条目明确记录在 AFRU(订单完工确认)表中,带有时间戳(BUDAT、UZEIT)和工序详情。 捕获 记录为 AFRU 表中的凭证。 事件类型 explicit | |||
| 已规划产能需求 | 此活动涉及对生产订单的工序进行排程,并检查所需工作中心的产能可用性。系统评估工作中心产能负荷,并在配置后进行平衡,从而确定生产日期。 | ||
| 为何重要 此步骤对于确保生产计划的可行性至关重要。分析其持续时间和结果有助于识别产能瓶颈并提高资源计划的准确性。 获取方式 这通常根据表示订单已排产的系统状态(如 SETC,即排程已执行)推导得出。排程开始和结束日期(AUFK-GSTRP、AUFK-GLTRP)的填充也标志着该活动的完成。 捕获 推导自 AUFK/AFKO 中排程日期的填充情况或 JEST 中与排程相关的状态。 事件类型 inferred | |||
| 物料可用性已检查 | 代表系统或用户执行的检查操作,确认生产订单所需的所有组件是否齐备、数量是否正确且能否按时到位。这通常是在订单创建或下达时进行的自动检查,或手动检查,并会更新订单状态。 | ||
| 为何重要 及早识别物料短缺对于主动规划至关重要。追踪此活动有助于了解物料可用性如何影响订单下达和准时开工的能力。 获取方式 推导自订单状态。如 MACM(物料已承诺)状态或物料可用日期 (AFKO-MSERF) 的变更均表示已执行检查。若无物料短缺状态 (MSPT),亦可推断为可用。 捕获 推导自与物料承诺相关的状态变更或事务代码 COMAC 的执行。 事件类型 inferred | |||
| 生产订单已取消 | 代表生产订单在完工前被取消。这是流程的一种非理想终结状态。 | ||
| 为何重要 分析已取消的订单可以揭示需求计划、主数据或销售流程中的问题。高取消率可能预示着需要解决的系统性问题。 获取方式 这是根据 JCDS 表中设置的系统状态 CACL(取消)推导出来的。此外,删除标记 (AUFK-LOEKZ) 也可以表示取消。 捕获 JCDS 中更改为“CACL”的状态更改时间戳或 AUFK 中的删除标记设置。 事件类型 inferred | |||
| 订单财务已结算 | 最后的关闭步骤,此时订单已结算,无法再进行财务过账。从管理会计的角度来看,这标志着订单生命周期的结束。 | ||
| 为何重要 虽然通常超出了纯生产分析的范围,但此活动提供了一个完整的端到端视图。它有助于分析从物流完成 (TECO) 到财务关闭之间的时间。 获取方式 这由用户将状态设置为 CLSD(已关闭)来触发。该事件作为状态更改记录在 JCDS 表中,并带有相应的时间戳。 捕获 JCDS 表中状态更改为“CLSD”的时间戳。 事件类型 inferred | |||
提取指南
步骤
- 验证前提条件:确保您拥有具备相应权限的 SAP S/4HANA 用户,能够访问核心数据服务 (CDS) 视图。所需的视图包括
I_ProductionOrder、I_ProdOrdConfirmation、I_MaterialDocumentItem、I_ObjectStatus和I_ChangeDocument。此外,还需要连接到 SAP HANA 数据库的 SQL 执行环境,例如 SAP HANA Studio、DBeaver 或外部 ETL 工具。 - 确定系统详细信息:记录用于
SourceSystem属性的源系统标识符。这是您定义的用于标识数据来源的逻辑名称,例如S4H_PROD。 - 设置提取参数:在运行查询之前,定义关键参数。包括提取周期的开始和结束日期,以及用于限制数据范围的特定过滤器(如
Plant或ProductionOrderType)。 - 准备 SQL 查询:将
query部分提供的完整 SQL 查询脚本复制到您选择的 SQL 客户端或数据提取工具中。 - 配置占位符:将查询中的占位符替换为您自己的特定参数。包括
_StartDate、_EndDate和源系统标识符。根据您的业务场景调整Unplanned Halt Occurred事件的阈值(例如'24:00:00')。 - 执行提取查询:针对 SAP S/4HANA 系统数据库运行配置好的 SQL 脚本。对于跨度较长的大型数据集,请考虑分批次提取数据(例如按月提取),以避免系统性能问题。
- 初步数据审查:查询执行完成后,快速查看输出结果。检查行数,确保所有列都已导出,并验证
Activity列中是否包含预期的各种事件类型。 - 数据校验:按照
validationSteps部分所述的步骤进行更彻底的校验。通过事务代码CO03在 SAP 系统中抽查几个生产订单,核实提取的事件日志是否准确。 - 导出为 CSV:将最终结果集导出为 CSV 文件。请务必使用 UTF-8 编码,以防止出现乱码问题。
- 准备上传:确认 CSV 文件列标题与要求的属性名称匹配:
ProductionOrder、Activity、StartTime、SourceSystem和LastDataUpdate。在上传到流程挖掘工具之前,确保StartTime列符合标准时间戳格式(如 ISO 8601 格式 YYYY-MM-DDTHH:MM:SS)。
配置
- 核心 CDS 视图:数据提取主要依赖一组标准 CDS 视图,这些视图提供了基于业务视角的 SAP 底层表结构。关键视图包括:
I_ProductionOrder:用于获取表头数据和创建事件。I_ProdOrdConfirmation:用于获取所有工序确认信息。I_MaterialDocumentItem:用于获取发料和收货等货物移动记录。I_ObjectStatus:用于读取生产订单的状态变更。I_ChangeDocument及相关视图:用于捕捉关键订单字段的修改记录。
- 日期范围过滤:为控制数据量,必须设置日期范围过滤。提供的查询脚本使用生产订单的
CreationDate。初次分析通常建议选择 3 到 6 个月的数据。 - 关键业务过滤条件:为进一步精简数据集,可以根据组织或主数据属性应用过滤条件。常用的过滤器包括:
Plant(工厂):分析特定的制造设施。ProductionOrderType(生产订单类型):关注标准生产、返工或其他订单类型。CompanyCode(公司代码):将数据限制在特定的法人实体内。
- 非计划停机阈值:查询逻辑中包含推导
Unplanned Halt Occurred(非计划停机)事件的规则。该逻辑需要设定一个时间阈值,用于定义工序之间多长的间隔算作显著停工。该值应根据典型的生产周期和业务规则进行配置。 - 权限要求:执行查询的 SAP 用户必须拥有所有 CDS 视图及其底层表的显示权限。缺少权限将导致结果集为空或不完整。
a 查询示例 sql
WITH BaseOrders AS (
SELECT
ProductionOrder,
Material AS MaterialNumber,
ProductionPlant AS Plant,
CreationDate,
CreationTime,
BasicEndDate AS PlannedEndDate,
TechnicalCompletionDate,
LastChangeDateTime
FROM I_ProductionOrder
-- P_CreationDateFrom and P_CreationDateTo are placeholders for your date range
WHERE CreationDate BETWEEN '[_StartDate]' AND '[_EndDate]'
-- Add other filters as needed, for example:
-- AND ProductionPlant IN ('[Your_Plant_1]', '[Your_Plant_2]')
-- AND ProductionOrderType = '[Your_Order_Type]'
)
SELECT
bo.ProductionOrder,
'Production Order Created' AS Activity,
TO_TIMESTAMP(bo.CreationDate || ' ' || LPAD(bo.CreationTime, 6, '0'), 'YYYYMMDD HH24MISS') AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
bo.MaterialNumber,
bo.Plant,
NULL AS WorkCenter,
bo.PlannedEndDate,
'CRTD' AS OrderStatus
FROM BaseOrders bo
UNION ALL
-- System status changes like Released, Technically Completed, Closed, Cancelled, Material Shortage
SELECT
os.ObjectInternalID AS ProductionOrder,
CASE os.SystemStatus
WHEN 'I0002' THEN 'Production Order Released'
WHEN 'I0043' THEN 'Material Availability Checked' -- Status: MACM (Material committed)
WHEN 'I0045' THEN 'Order Technically Completed'
WHEN 'I0046' THEN 'Order Financially Closed'
WHEN 'I0047' THEN 'Production Order Cancelled'
WHEN 'I0010' THEN 'Material Shortage Occurred' -- Status: MSPT (Material shortage)
END AS Activity,
os.StatusChangeDateTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
bo.MaterialNumber,
bo.Plant,
NULL AS WorkCenter,
bo.PlannedEndDate,
os.SystemStatus AS OrderStatus
FROM I_ObjectStatus AS os
JOIN BaseOrders AS bo ON os.ObjectInternalID = bo.ProductionOrder
WHERE os.SystemStatus IN ('I0002', 'I0043', 'I0045', 'I0046', 'I0047', 'I0010') AND os.StatusIsInactive = ''
UNION ALL
-- Production Started, inferred from the first goods issue or first confirmation
SELECT
s.ProductionOrder,
'Production Started' AS Activity,
s.StartEventTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
s.MaterialNumber,
s.Plant,
NULL AS WorkCenter,
s.PlannedEndDate,
NULL AS OrderStatus
FROM (
SELECT
bo.ProductionOrder,
bo.MaterialNumber,
bo.Plant,
bo.PlannedEndDate,
MIN(COALESCE(gm.PostingTime, cf.ConfirmationDateTime)) AS StartEventTime,
ROW_NUMBER() OVER(PARTITION BY bo.ProductionOrder ORDER BY MIN(COALESCE(gm.PostingTime, cf.ConfirmationDateTime))) as rn
FROM BaseOrders bo
LEFT JOIN I_MaterialDocumentItem gm ON bo.ProductionOrder = gm.ProductionOrder AND gm.GoodsMovementType IN ('261', '262') -- Goods Issue
LEFT JOIN I_ProdOrdConfirmation cf ON bo.ProductionOrder = cf.ProductionOrder
WHERE gm.ProductionOrder IS NOT NULL OR cf.ProductionOrder IS NOT NULL
GROUP BY bo.ProductionOrder, bo.MaterialNumber, bo.Plant, bo.PlannedEndDate
) s
WHERE s.rn = 1
UNION ALL
-- Production Confirmation Entered (for each confirmation)
SELECT
cf.ProductionOrder,
'Production Confirmation Entered' AS Activity,
cf.ConfirmationDateTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
bo.MaterialNumber,
bo.Plant,
cf.WorkCenter,
bo.PlannedEndDate,
NULL AS OrderStatus
FROM I_ProdOrdConfirmation cf
JOIN BaseOrders bo ON cf.ProductionOrder = bo.ProductionOrder
UNION ALL
-- Final Confirmation Entered
SELECT
cf.ProductionOrder,
'Final Confirmation Entered' AS Activity,
cf.ConfirmationDateTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
bo.MaterialNumber,
bo.Plant,
cf.WorkCenter,
bo.PlannedEndDate,
NULL AS OrderStatus
FROM I_ProdOrdConfirmation cf
JOIN BaseOrders bo ON cf.ProductionOrder = bo.ProductionOrder
WHERE cf.IsFinalConfirmation = 'X'
UNION ALL
-- Unplanned Halt Occurred (derived from gaps between confirmations)
SELECT
ProductionOrder,
'Unplanned Halt Occurred' AS Activity,
PreviousConfirmationTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
MaterialNumber,
Plant,
WorkCenter,
PlannedEndDate,
NULL AS OrderStatus
FROM (
SELECT
cf.ProductionOrder,
bo.MaterialNumber,
bo.Plant,
bo.PlannedEndDate,
cf.WorkCenter,
cf.ConfirmationDateTime,
LAG(cf.ConfirmationDateTime, 1) OVER (PARTITION BY cf.ProductionOrder ORDER BY cf.ConfirmationDateTime) AS PreviousConfirmationTime,
(SECONDS_BETWEEN(LAG(cf.ConfirmationDateTime, 1) OVER (PARTITION BY cf.ProductionOrder ORDER BY cf.ConfirmationDateTime), cf.ConfirmationDateTime) / 3600.0) as HoursDiff
FROM I_ProdOrdConfirmation cf
JOIN BaseOrders bo ON cf.ProductionOrder = bo.ProductionOrder
) AS gaps
WHERE gaps.HoursDiff > 24 -- Configurable threshold in hours, e.g. 24 hours
UNION ALL
-- Goods Receipt Posted
SELECT
gm.ProductionOrder,
'Goods Receipt Posted' AS Activity,
gm.PostingTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
bo.MaterialNumber,
bo.Plant,
NULL AS WorkCenter,
bo.PlannedEndDate,
NULL AS OrderStatus
FROM I_MaterialDocumentItem gm
JOIN BaseOrders bo ON gm.ProductionOrder = bo.ProductionOrder
WHERE gm.GoodsMovementType = '101'
UNION ALL
-- Capacity Requirements Planned (using Release event as a proxy)
SELECT
os.ObjectInternalID AS ProductionOrder,
'Capacity Requirements Planned' AS Activity,
os.StatusChangeDateTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
bo.MaterialNumber,
bo.Plant,
NULL AS WorkCenter,
bo.PlannedEndDate,
os.SystemStatus AS OrderStatus
FROM I_ObjectStatus AS os
JOIN BaseOrders AS bo ON os.ObjectInternalID = bo.ProductionOrder
WHERE os.SystemStatus = 'I0002' AND os.StatusIsInactive = '' -- Status 'REL' (Released)
UNION ALL
-- Production Plan Adjusted
SELECT
ch.ObjectValue AS ProductionOrder,
'Production Plan Adjusted' AS Activity,
ch.CreationDateTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
bo.MaterialNumber,
bo.Plant,
NULL as WorkCenter,
bo.PlannedEndDate,
NULL as OrderStatus
FROM I_ChangeDocument AS ch
JOIN BaseOrders bo ON ch.ObjectValue = bo.ProductionOrder
WHERE ch.ChangeDocumentObject = 'PRODORDER'
-- Monitoring changes in key fields like Total Quantity (GAMNG) or Basic Finish Date (GLTRP)
AND ch.FieldName IN ('GAMNG', 'GLTRP')
GROUP BY ch.ObjectValue, ch.CreationDateTime, bo.MaterialNumber, bo.Plant, bo.PlannedEndDate 步骤
- 验证前提条件:确保您拥有具备相应权限的 SAP S/4HANA 用户,能够访问核心数据服务 (CDS) 视图。所需的视图包括
I_ProductionOrder、I_ProdOrdConfirmation、I_MaterialDocumentItem、I_ObjectStatus和I_ChangeDocument。此外,还需要连接到 SAP HANA 数据库的 SQL 执行环境,例如 SAP HANA Studio、DBeaver 或外部 ETL 工具。 - 确定系统详细信息:记录用于
SourceSystem属性的源系统标识符。这是您定义的用于标识数据来源的逻辑名称,例如S4H_PROD。 - 设置提取参数:在运行查询之前,定义关键参数。包括提取周期的开始和结束日期,以及用于限制数据范围的特定过滤器(如
Plant或ProductionOrderType)。 - 准备 SQL 查询:将
query部分提供的完整 SQL 查询脚本复制到您选择的 SQL 客户端或数据提取工具中。 - 配置占位符:将查询中的占位符替换为您自己的特定参数。包括
_StartDate、_EndDate和源系统标识符。根据您的业务场景调整Unplanned Halt Occurred事件的阈值(例如'24:00:00')。 - 执行提取查询:针对 SAP S/4HANA 系统数据库运行配置好的 SQL 脚本。对于跨度较长的大型数据集,请考虑分批次提取数据(例如按月提取),以避免系统性能问题。
- 初步数据审查:查询执行完成后,快速查看输出结果。检查行数,确保所有列都已导出,并验证
Activity列中是否包含预期的各种事件类型。 - 数据校验:按照
validationSteps部分所述的步骤进行更彻底的校验。通过事务代码CO03在 SAP 系统中抽查几个生产订单,核实提取的事件日志是否准确。 - 导出为 CSV:将最终结果集导出为 CSV 文件。请务必使用 UTF-8 编码,以防止出现乱码问题。
- 准备上传:确认 CSV 文件列标题与要求的属性名称匹配:
ProductionOrder、Activity、StartTime、SourceSystem和LastDataUpdate。在上传到流程挖掘工具之前,确保StartTime列符合标准时间戳格式(如 ISO 8601 格式 YYYY-MM-DDTHH:MM:SS)。
配置
- 核心 CDS 视图:数据提取主要依赖一组标准 CDS 视图,这些视图提供了基于业务视角的 SAP 底层表结构。关键视图包括:
I_ProductionOrder:用于获取表头数据和创建事件。I_ProdOrdConfirmation:用于获取所有工序确认信息。I_MaterialDocumentItem:用于获取发料和收货等货物移动记录。I_ObjectStatus:用于读取生产订单的状态变更。I_ChangeDocument及相关视图:用于捕捉关键订单字段的修改记录。
- 日期范围过滤:为控制数据量,必须设置日期范围过滤。提供的查询脚本使用生产订单的
CreationDate。初次分析通常建议选择 3 到 6 个月的数据。 - 关键业务过滤条件:为进一步精简数据集,可以根据组织或主数据属性应用过滤条件。常用的过滤器包括:
Plant(工厂):分析特定的制造设施。ProductionOrderType(生产订单类型):关注标准生产、返工或其他订单类型。CompanyCode(公司代码):将数据限制在特定的法人实体内。
- 非计划停机阈值:查询逻辑中包含推导
Unplanned Halt Occurred(非计划停机)事件的规则。该逻辑需要设定一个时间阈值,用于定义工序之间多长的间隔算作显著停工。该值应根据典型的生产周期和业务规则进行配置。 - 权限要求:执行查询的 SAP 用户必须拥有所有 CDS 视图及其底层表的显示权限。缺少权限将导致结果集为空或不完整。
a 查询示例 sql
WITH BaseOrders AS (
SELECT
ProductionOrder,
Material AS MaterialNumber,
ProductionPlant AS Plant,
CreationDate,
CreationTime,
BasicEndDate AS PlannedEndDate,
TechnicalCompletionDate,
LastChangeDateTime
FROM I_ProductionOrder
-- P_CreationDateFrom and P_CreationDateTo are placeholders for your date range
WHERE CreationDate BETWEEN '[_StartDate]' AND '[_EndDate]'
-- Add other filters as needed, for example:
-- AND ProductionPlant IN ('[Your_Plant_1]', '[Your_Plant_2]')
-- AND ProductionOrderType = '[Your_Order_Type]'
)
SELECT
bo.ProductionOrder,
'Production Order Created' AS Activity,
TO_TIMESTAMP(bo.CreationDate || ' ' || LPAD(bo.CreationTime, 6, '0'), 'YYYYMMDD HH24MISS') AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
bo.MaterialNumber,
bo.Plant,
NULL AS WorkCenter,
bo.PlannedEndDate,
'CRTD' AS OrderStatus
FROM BaseOrders bo
UNION ALL
-- System status changes like Released, Technically Completed, Closed, Cancelled, Material Shortage
SELECT
os.ObjectInternalID AS ProductionOrder,
CASE os.SystemStatus
WHEN 'I0002' THEN 'Production Order Released'
WHEN 'I0043' THEN 'Material Availability Checked' -- Status: MACM (Material committed)
WHEN 'I0045' THEN 'Order Technically Completed'
WHEN 'I0046' THEN 'Order Financially Closed'
WHEN 'I0047' THEN 'Production Order Cancelled'
WHEN 'I0010' THEN 'Material Shortage Occurred' -- Status: MSPT (Material shortage)
END AS Activity,
os.StatusChangeDateTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
bo.MaterialNumber,
bo.Plant,
NULL AS WorkCenter,
bo.PlannedEndDate,
os.SystemStatus AS OrderStatus
FROM I_ObjectStatus AS os
JOIN BaseOrders AS bo ON os.ObjectInternalID = bo.ProductionOrder
WHERE os.SystemStatus IN ('I0002', 'I0043', 'I0045', 'I0046', 'I0047', 'I0010') AND os.StatusIsInactive = ''
UNION ALL
-- Production Started, inferred from the first goods issue or first confirmation
SELECT
s.ProductionOrder,
'Production Started' AS Activity,
s.StartEventTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
s.MaterialNumber,
s.Plant,
NULL AS WorkCenter,
s.PlannedEndDate,
NULL AS OrderStatus
FROM (
SELECT
bo.ProductionOrder,
bo.MaterialNumber,
bo.Plant,
bo.PlannedEndDate,
MIN(COALESCE(gm.PostingTime, cf.ConfirmationDateTime)) AS StartEventTime,
ROW_NUMBER() OVER(PARTITION BY bo.ProductionOrder ORDER BY MIN(COALESCE(gm.PostingTime, cf.ConfirmationDateTime))) as rn
FROM BaseOrders bo
LEFT JOIN I_MaterialDocumentItem gm ON bo.ProductionOrder = gm.ProductionOrder AND gm.GoodsMovementType IN ('261', '262') -- Goods Issue
LEFT JOIN I_ProdOrdConfirmation cf ON bo.ProductionOrder = cf.ProductionOrder
WHERE gm.ProductionOrder IS NOT NULL OR cf.ProductionOrder IS NOT NULL
GROUP BY bo.ProductionOrder, bo.MaterialNumber, bo.Plant, bo.PlannedEndDate
) s
WHERE s.rn = 1
UNION ALL
-- Production Confirmation Entered (for each confirmation)
SELECT
cf.ProductionOrder,
'Production Confirmation Entered' AS Activity,
cf.ConfirmationDateTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
bo.MaterialNumber,
bo.Plant,
cf.WorkCenter,
bo.PlannedEndDate,
NULL AS OrderStatus
FROM I_ProdOrdConfirmation cf
JOIN BaseOrders bo ON cf.ProductionOrder = bo.ProductionOrder
UNION ALL
-- Final Confirmation Entered
SELECT
cf.ProductionOrder,
'Final Confirmation Entered' AS Activity,
cf.ConfirmationDateTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
bo.MaterialNumber,
bo.Plant,
cf.WorkCenter,
bo.PlannedEndDate,
NULL AS OrderStatus
FROM I_ProdOrdConfirmation cf
JOIN BaseOrders bo ON cf.ProductionOrder = bo.ProductionOrder
WHERE cf.IsFinalConfirmation = 'X'
UNION ALL
-- Unplanned Halt Occurred (derived from gaps between confirmations)
SELECT
ProductionOrder,
'Unplanned Halt Occurred' AS Activity,
PreviousConfirmationTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
MaterialNumber,
Plant,
WorkCenter,
PlannedEndDate,
NULL AS OrderStatus
FROM (
SELECT
cf.ProductionOrder,
bo.MaterialNumber,
bo.Plant,
bo.PlannedEndDate,
cf.WorkCenter,
cf.ConfirmationDateTime,
LAG(cf.ConfirmationDateTime, 1) OVER (PARTITION BY cf.ProductionOrder ORDER BY cf.ConfirmationDateTime) AS PreviousConfirmationTime,
(SECONDS_BETWEEN(LAG(cf.ConfirmationDateTime, 1) OVER (PARTITION BY cf.ProductionOrder ORDER BY cf.ConfirmationDateTime), cf.ConfirmationDateTime) / 3600.0) as HoursDiff
FROM I_ProdOrdConfirmation cf
JOIN BaseOrders bo ON cf.ProductionOrder = bo.ProductionOrder
) AS gaps
WHERE gaps.HoursDiff > 24 -- Configurable threshold in hours, e.g. 24 hours
UNION ALL
-- Goods Receipt Posted
SELECT
gm.ProductionOrder,
'Goods Receipt Posted' AS Activity,
gm.PostingTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
bo.MaterialNumber,
bo.Plant,
NULL AS WorkCenter,
bo.PlannedEndDate,
NULL AS OrderStatus
FROM I_MaterialDocumentItem gm
JOIN BaseOrders bo ON gm.ProductionOrder = bo.ProductionOrder
WHERE gm.GoodsMovementType = '101'
UNION ALL
-- Capacity Requirements Planned (using Release event as a proxy)
SELECT
os.ObjectInternalID AS ProductionOrder,
'Capacity Requirements Planned' AS Activity,
os.StatusChangeDateTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
bo.MaterialNumber,
bo.Plant,
NULL AS WorkCenter,
bo.PlannedEndDate,
os.SystemStatus AS OrderStatus
FROM I_ObjectStatus AS os
JOIN BaseOrders AS bo ON os.ObjectInternalID = bo.ProductionOrder
WHERE os.SystemStatus = 'I0002' AND os.StatusIsInactive = '' -- Status 'REL' (Released)
UNION ALL
-- Production Plan Adjusted
SELECT
ch.ObjectValue AS ProductionOrder,
'Production Plan Adjusted' AS Activity,
ch.CreationDateTime AS StartTime,
'[_SourceSystemName]' AS SourceSystem,
CURRENT_UTCTIMESTAMP AS LastDataUpdate,
bo.MaterialNumber,
bo.Plant,
NULL as WorkCenter,
bo.PlannedEndDate,
NULL as OrderStatus
FROM I_ChangeDocument AS ch
JOIN BaseOrders bo ON ch.ObjectValue = bo.ProductionOrder
WHERE ch.ChangeDocumentObject = 'PRODORDER'
-- Monitoring changes in key fields like Total Quantity (GAMNG) or Basic Finish Date (GLTRP)
AND ch.FieldName IN ('GAMNG', 'GLTRP')
GROUP BY ch.ObjectValue, ch.CreationDateTime, bo.MaterialNumber, bo.Plant, bo.PlannedEndDate