您的生产计划数据模板
您的生产计划数据模板
- 生产计划分析的推荐属性
- 需要跟踪的关键生产计划活动
- SAPS/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 | 生产订单的唯一标识符,用作生产计划流程的主要案例标识符。 | ||
| 说明 生产订单号是SAP S/4HANA生成的唯一键,用于管理和跟踪特定产品数量制造相关的所有活动。它将从计划和下达,到执行和最终结算的所有相关事件关联起来。 在流程挖掘中,该属性对于将所有相关事件归入单个端到端流程实例至关重要。按生产订单分析流程,可以衡量周期时间、计划遵循率等关键绩效指标,并识别影响特定生产批次的瓶颈。 为什么重要 这是连接所有流程步骤的基础属性,可对生产生命周期从开始到结束进行完整的案例级分析。 获取位置 这是生产订单号,通常位于SAP表AFKO(字段AUFNR)和AFPO中。 示例 100056710008341001299 | |||
| 最后数据更新时间 LastDataUpdate | 表示数据上次从源系统刷新或提取时间的时间戳。 | ||
| 说明 该属性记录最近一次提取数据的日期和时间,是说明所分析数据新鲜度的关键元数据。 了解最后更新时间对于正确解读分析结果至关重要。它有助于您判断当前查看的是实时信息,还是某一时间点的快照,从而评估分析发现及基于这些数据所作决策的相关性。 为什么重要 它确保您了解数据的时效性,这对于作出准确且相关的业务决策至关重要。 获取位置 该时间戳在数据提取、转换和加载(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)关联。 示例 CRTDRELTECOCLSD | |||
| 已确认数量 TotalConfirmedQuantity | 已确认生产的订单物料总数量。 | ||
| 说明 该属性表示通过生产确认上报的成品或半成品累计数量,用于跟踪订单向完成目标推进的进度。 将已确认数量与计划数量进行比较,有助于监控生产进度并识别产出率问题或数量差异。它是衡量产出的基础指标,也用于计算报废率和效率等多项绩效指标。 为什么重要 它跟踪生产订单的实际产出,对于监控进度、计算产出率和识别差异至关重要。 获取位置 根据AFRU中的确认记录汇总得出(产出数量字段LMNGA)。 示例 9801000501200 | |||
| 是否按时完成 IsOnTime | 用于标识生产订单是否在计划结束日期当天或之前完成的标记。 | ||
| 说明 该计算得出的布尔属性通过比较实际完成日期与计划结束日期,直接衡量计划遵循情况。它为每个生产订单的按时性提供清晰的二元结果。 该属性是生产计划遵循率KPI的基础。通过区分按时订单和延期订单,可以简化分析,并帮助识别与延迟相关的常见特征或流程路径。 为什么重要 它为每个订单提供清晰、简单的计划遵循指标,便于分析延迟根因。 获取位置 计算字段。如果“订单技术完成”活动的时间戳小于或等于“计划结束日期”属性,则设为true。 示例 truefalse | |||
| 是否返工 IsRework | 用于标识生产订单是否在开始生产后发生返工或重大计划调整的标记。 | ||
| 说明 该布尔属性用于识别生产开始后采取纠正措施或发生计划变更的生产订单。触发条件可能是明确的返工活动,或“生产计划已调整”事件发生在“生产已开始”之后。 该标记对于计算生产返工率KPI以及生成生产返工与修订仪表板至关重要。它支持快速筛选和分析问题案例,帮助发现导致高成本返工的质量问题或流程偏差根因。 为什么重要 它可以单独筛选返工案例,支持针对性分析,从而了解并减少质量问题、流程偏差及相关成本。 获取位置 计算字段。如果同一案例中“生产计划已调整”活动发生在“生产已开始”活动之后,或使用了特定返工订单类型,则设为true。 示例 truefalse | |||
| 物料可用性状态 MaterialAvailabilityStatus | 表示生产订单所需的全部物料是否可用。 | ||
| 说明 该状态反映生产订单物料可用性检查的结果。它可以表示所有物料均可用、部分物料缺失,或尚未执行检查。“短缺”状态是潜在延迟的重要触发信号。 该属性是物料短缺影响分析仪表板的关键基础。通过将短缺状态与订单下达到生产开始之间的时间关联起来,可以量化物料不可用造成的延迟。改善这一指标是实现生产流程顺畅运行的关键。 为什么重要 它直接解释订单下达到生产开始之间的延迟,有助于量化供应链问题对制造环节的影响。 获取位置 这是一个状态,通常根据物料组件的汇总状态得出。它可以在系统状态(JEST)中找到,例如“MSPT”(物料短缺)。 示例 可用短缺未检查 | |||
| 生产优先级 ProductionPriority | 分配给生产订单、用于表示其紧急程度或重要性的代码或数值。 | ||
| 说明 计划员和排程员使用生产优先级对订单进行排序和优先处理,尤其是在资源受限时。理想情况下,高优先级订单应先于低优先级订单处理。 分析该属性有助于评估车间是否遵循既定优先级。生产优先级一致性仪表板将处理顺序与分配的优先级进行比较,以识别不一致情况,从而改善排程纪律,增强计划与执行之间的一致性。 为什么重要 它有助于判断生产排程是否遵循业务优先级,确保关键订单按预期优先处理。 获取位置 通常是自定义字段,或根据其他订单参数确定。具体位置取决于系统配置。 示例 高中低15 | |||
| 用户 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 | |||
| 生产计划已调整 | 表示生产订单下达后发生的重大变更,例如数量、日期或物料清单变更。该事件通过分析变更文档捕获。 | ||
| 为什么重要 频繁调整可能表明计划不稳定或需求波动。该活动是生产计划修订率KPI的基础,也有助于识别流程变异来源。 获取位置 根据CDHDR(变更文档抬头)和CDPOS(变更文档项目)表中记录的生产订单对象(AUFK或AFPO)变更日志推断。下达日期之后发生的变更视为计划调整。 采集 识别下达事件之后CDHDR/CDPOS中关键字段(例如数量、日期)的变更。 事件类型 inferred | |||
| 生产订单已下达 | 这是一个关键里程碑,表示生产订单已获批准,可在车间执行。订单下达后,发料、确认及其他执行步骤即可开始。 | ||
| 为什么重要 该事件标志着可执行生产流程正式开始,是衡量周期时间的关键节点。从创建到下达的时间,是生产前效率的重要KPI。 获取位置 用户或系统作业明确触发下达,并将状态设为REL。该状态变更及时间戳记录在JCDS表中。下达日期通常也存储在AFKO-FTRMI中。 采集 JCDS表中状态变更为“REL”的时间戳。 事件类型 inferred | |||
| 生产订单已创建 | 这是系统中创建生产订单的初始步骤,表示正式提出生产指定数量产品的请求。当用户保存新订单并将其初始状态设为CRTD(Created)时,系统会明确记录此事件。 | ||
| 为什么重要 标志着生产订单生命周期的开始。分析从创建到下达所需的时间,有助于识别生产正式排程前的行政或计划延迟。 获取位置 该事件记录在AUFK表(订单主数据)中,使用创建日期(ERDAT)。创建状态(CRTD)记录在JEST和JCDS表中,并通过订单对象号(OBJNR)关联。 采集 取自AUFK-ERDAT的时间戳,或JCDS中状态变更为“CRTD”的时间戳。 事件类型 explicit | |||
| 订单已技术完成 | 这是一个行政关闭步骤,可阻止订单发生进一步的物流变更,例如物料移动或确认。从物流角度看,订单已完成。 | ||
| 为什么重要 TECO是生产流程的最终节点,对于计算生产订单总周期时间至关重要。它表示所有物流活动均已完成,订单可以进行财务结算。 获取位置 用户将状态设为TECO(Technically Completed)后触发。该事件作为状态变更记录在JCDS表中,并带有相应时间戳。 采集 JCDS表中状态变更为“TECO”的时间戳。 事件类型 inferred | |||
| 发生物料短缺 | 表示生产流程因一个或多个所需组件不可用而受到影响或停滞。系统会为订单设置特定状态,以反映这一情况。 | ||
| 为什么重要 跟踪物料短缺对于物料短缺影响分析至关重要。它有助于量化供应链问题造成的延迟,并改善物料规划。 获取位置 根据生产订单激活“MSPT”(Material shortage)状态推断。该状态变更的时间戳可在JCDS表中找到。 采集 JCDS表中状态变更为“MSPT”的时间戳。 事件类型 inferred | |||
| 发生非计划停顿 | 该计算事件表示生产执行阶段出现较长的闲置时间。它不是系统明确记录的事件,而是通过识别连续生产确认之间的长时间间隔推导得出。 | ||
| 为什么重要 有助于监控机器故障或质量问题等非计划中断。识别频繁或持续时间较长的停顿,是提高车间稳定性和产出的关键。 获取位置 通过分析AFRU表中连续“已录入生产确认”活动的时间戳计算得出。超过预设阈值的时间间隔会被标记为非计划停顿。 采集 计算连续确认时间戳(AFRU-BUDAT/UZEIT)之间的时间差。 事件类型 calculated | |||
| 已录入生产确认 | 表示记录生产订单中特定工序的进度,包括记录产量、报废数量以及工作中心耗用的时间。 | ||
| 为什么重要 确认记录提供车间进度的实时可见性,对于跟踪生产状态至关重要。分析确认的频率和时间,有助于监控流程并识别工序之间的延迟。 获取位置 每条确认记录都会明确写入AFRU(订单完成确认)表,并包含时间戳(BUDAT、UZEIT)及工序详细信息。 采集 以文档形式记录在AFRU表中。 事件类型 explicit | |||
| 已检查物料可用性 | 表示系统或用户检查生产订单所需的全部组件是否按所需数量及时可用。该检查通常在订单创建或下达时自动执行,也可能由用户手动执行,并更新订单状态。 | ||
| 为什么重要 及早识别物料短缺对于主动规划至关重要。跟踪此活动有助于了解物料可用性如何影响订单下达和按时开工。 获取位置 根据订单状态推断。MACM(Material committed)等状态,或物料可用日期(AFKO-MSERF)发生变更,表示已执行检查。没有物料短缺状态(MSPT)也可以推断物料可用。 采集 根据与物料承诺相关的状态变更或COMAC事务执行情况推断。 事件类型 inferred | |||
| 已规划产能需求 | 该活动包括安排生产订单工序,并检查所需工作中心的产能可用性。系统会评估工作中心的产能负荷,并在完成配置时进行平衡,从而确定生产日期。 | ||
| 为什么重要 这一步对于确保生产排程可行至关重要。分析其持续时间和结果,有助于识别产能瓶颈,提高资源规划准确性。 获取位置 通常根据系统状态推断,例如表示订单已排程的SETC(Scheduling carried out)。已填入计划开始和结束日期(AUFK-GSTRP、AUFK-GLTRP)也表示该活动已完成。 采集 根据AUFK/AFKO中已填入计划日期,或JEST中的排程相关状态推断。 事件类型 inferred | |||
| 生产订单已取消 | 表示生产订单在完成前被取消,是流程的一种非成功终止状态。 | ||
| 为什么重要 分析已取消订单,可以发现需求计划、主数据或销售流程中的问题。较高的取消率可能表明存在需要解决的系统性问题。 获取位置 根据JCDS表中设置的系统状态CACL(Cancellation)推断。或者,删除标识(AUFK-LOEKZ)也可以表示取消。 采集 JCDS中状态变更为“CACL”的时间戳,或AUFK中删除标识的设置时间。 事件类型 inferred | |||
| 订单已财务关闭 | 这是订单结算的最终关闭步骤,此后无法再进行财务过账。从控制和会计角度看,这标志着订单生命周期结束。 | ||
| 为什么重要 虽然该活动通常不属于纯生产分析范围,但它可以提供完整的端到端视图,并帮助分析物流完成(TECO)与财务关闭之间的时间。 获取位置 用户将状态设为CLSD(Closed)后触发。该事件作为状态变更记录在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和源系统标识符。调整“非计划停机已发生”事件的阈值(例如'24:00:00'),使其符合您的业务场景。 - 执行提取查询:针对SAP S/4HANA系统数据库运行配置好的SQL脚本。对于覆盖较长时间段的大型数据集,可按月分批提取,以避免性能问题。
- 初步检查数据:查询执行完成后,快速检查输出结果。确认行数、所有列以及
活动列中是否包含多种预期事件。 - 验证数据:按照
validationSteps部分列出的步骤执行更全面的验证。可在SAP系统中使用事务CO03交叉核对几张生产订单及其详细信息,确认提取的事件日志准确无误。 - 导出为CSV:将最终结果集导出为CSV文件。请确保文件编码为UTF-8,以避免字符显示问题。
- 准备上传:确认CSV列标题与所需属性名称一致:
ProductionOrder、活动、StartTime、SourceSystem和LastDataUpdate。上传至流程挖掘工具前,请确保StartTime列采用标准时间戳格式,例如ISO 8601(YYYY-MM-DDTHH:MM:SS)。
配置
- Core CDS Views:提取主要依赖一组标准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 HANA架构的直接读取权限,并明确架构所有者、客户端处理方式、时间戳约定和授权模型。使用SAP HANA Database Explorer或获批准的SQL客户端。在最终确定查询前,验证相关SAP S/4HANA版本及已激活的生产计划范围。
- 配置连接字符串、凭据、架构名称、客户端值、提取开始日期、提取结束日期和公司专用筛选条件。以下查询使用AUFK、AFPO、JEST和JCDS,并引用AFKO、AFVC、AFRU、RESB、MSEG、CDHDR和CDPOS。执行前确认这些对象在您的系统中可用且字段定义一致,因为扩展、兼容性视图和版本差异可能影响结果。
- 在SAP HANA Database Explorer或获批准的SQL执行工具中运行查询。查询会为每个明确提取的活动生成一行,并通过UNION ALL合并活动行,不依赖ProcessMind推断事件。
- 检查源数据,并在必要时调整标记为系统专用的表达式。尤其要确认物料可用性、产能计划、技术完成、财务结算和取消所使用的状态代码。同时确认用于识别生产计划调整的变更文档对象和字段名称。
- 验证时间戳转换和客户端筛选。SAP系统可能将日期和时间存储在不同字段中,有些安装使用UTC,有些使用工厂或系统本地时间。确保生成的StartTime使用统一时区,并排除无效或初始SAP日期。
- 将结果导出为ProcessMind支持的扁平文件,优先使用CSV或UTF-8分隔文本。保留准确的输出列名:ProductionOrder、Activity、StartTime、SourceSystem、LastDataUpdate、MaterialNumber、Plant、WorkCenter、PlannedEndDate和OrderStatus。
- 按ProductionOrder和StartTime对导出行排序。如果上传流程支持,请为相同时间戳设置确定性的次级排序。每个事件保留一行;如果重复确认和重复状态变更对应不同源记录,也应保留。
- 将文件上传到ProcessMind,并将ProductionOrder映射为案例标识符、Activity映射为活动、StartTime映射为事件时间戳。根据ProcessMind导入配置,将其余列映射为事件或案例属性。确认查询生成的全部14个活动标签均按原样保留。
配置
- 日期范围:从滚动的3至6个月开始。初次测试使用较短时间范围,验证行数和查询性能后再扩大范围。
- 提取参数:将[Your schema name]、[Your client]、[Extraction start date]、[Extraction end date]和[Your source system name]替换为您环境中的实际值。确认相关组织字段及其取值后,再应用公司专用筛选条件。
- 状态配置:核实您系统中用于CRTD、发布、物料可用性、产能计划、技术完成、财务结算和取消的准确SAP状态代码及状态对象标识符。状态配置文件和自定义增强可能改变可用代码。
- 变更文档:确认生产订单变更文档对象、表名、字段名,以及数量、日期、BOM和工艺路线变更所使用的值格式。查询将匹配的CDHDR和CDPOS记录视为计划调整证据。
- 时间戳处理:将所有源时间戳统一为一个时区。确认日期和时间字段是否分开存储、时间戳使用本地时间还是UTC,以及初始日期的表示方式。
- 性能:按订单创建日期或其他已建立索引的生产订单日期限制提取范围,按客户端筛选,仅选择所需列,并在合适的报表时段执行。对于大型数据集,可按月或生产订单范围提取,并逐步保存结果。
- 数据库对象:确认所选架构中可用且可读的对象包括AUFK、AFPO、JEST、JCDS、AFKO、AFVC、AFRU、RESB、MSEG、CDHDR和CDPOS。如果您的版本中视图或字段不同,请替换为对应的已发布或获批准对象。
- 授权:所需权限包括对所选SAP HANA架构及对象的读取授权,以及执行SQL的权限。根据您的治理流程,可能还需要SAP应用授权。
- 功能范围:所选期间必须保留生产计划与执行数据、库存移动数据、状态历史和变更文档。已归档或删除的记录不会返回。
- ProcessMind映射:将ProductionOrder配置为案例标识符,Activity配置为活动,StartTime配置为事件时间戳。不要期待ProcessMind根据属性推导缺失活动。
a 示例查询 sql
WITH
params AS (
SELECT
'[Your client]' AS mandt,
TO_DATE('[Extraction start date]', 'YYYY-MM-DD') AS date_from,
TO_DATE('[Extraction end date]', 'YYYY-MM-DD') AS date_to,
'[Your source system name]' AS source_system,
CURRENT_UTCTIMESTAMP AS last_data_update
FROM DUMMY
),
orders AS (
SELECT
a.mandt,
LTRIM(a.aufnr, '0') AS production_order,
a.aufnr AS production_order_raw,
a.erdat AS order_created_date,
a.erfzeit AS order_created_time,
a.auart AS order_type,
a.werks AS plant,
a.objnr AS object_number,
a.ktext AS order_text,
p.matnr AS material_number,
p.psmng AS planned_quantity,
p.wemng AS delivered_quantity,
k.gstrp AS planned_start_date,
k.gltrp AS planned_end_date,
k.ftrmi AS release_date,
k.ftrmp AS release_time,
k.gamng AS total_order_quantity,
k.plnbez AS header_material_number,
k.plnty AS task_list_type,
k.plnnr AS task_list_group,
k.plnal AS task_list_group_counter
FROM [Your schema name].AUFK a
LEFT JOIN [Your schema name].AFPO p
ON p.mandt = a.mandt
AND p.aufnr = a.aufnr
LEFT JOIN [Your schema name].AFKO k
ON k.mandt = a.mandt
AND k.aufnr = a.aufnr
CROSS JOIN params x
WHERE a.mandt = x.mandt
AND a.erdat >= x.date_from
AND a.erdat < ADD_DAYS(x.date_to, 1)
),
status_history AS (
SELECT
o.*,
j.stat,
j.inact,
j.chgnr,
j.udate AS status_date,
j.utime AS status_time,
c.usnam AS status_user,
c.chind AS status_change_indicator
FROM orders o
INNER JOIN [Your schema name].JEST j
ON j.mandt = o.mandt
AND j.objnr = o.object_number
LEFT JOIN [Your schema name].JCDS c
ON c.mandt = j.mandt
AND c.objnr = j.objnr
AND c.stat = j.stat
AND c.chgnr = j.chgnr
WHERE COALESCE(j.inact, '') <> 'X'
),
operations AS (
SELECT
o.production_order,
o.mandt,
v.vornr,
v.arbid,
v.steus,
v.ltxa1,
v.aufpl,
v.aplzl,
cr.name1 AS work_center
FROM orders o
LEFT JOIN [Your schema name].AFVC v
ON v.mandt = o.mandt
AND v.aufpl = (SELECT MAX(k2.aufpl) FROM [Your schema name].AFKO k2 WHERE k2.mandt = o.mandt AND k2.aufnr = o.production_order_raw)
LEFT JOIN [Your schema name].CRHD cr
ON cr.mandt = v.mandt
AND cr.objty = 'A'
AND cr.objid = v.arbid
),
confirmations AS (
SELECT
o.production_order,
o.mandt,
r.rmzhl,
r.vornr,
r.budat AS confirmation_date,
r.ersda AS entry_date,
r.erzet AS entry_time,
r.ism01,
r.ism02,
r.ism03,
r.ism04,
r.ism05,
r.ism06,
r.xmnga,
r.stzhl,
r.stzhl AS reversal_counter,
r.lmnga AS confirmed_quantity,
r.xmnge AS scrap_quantity,
r.aufpl,
r.aplzl,
op.work_center
FROM orders o
INNER JOIN [Your schema name].AFRU r
ON r.mandt = o.mandt
AND r.aufnr = o.production_order_raw
LEFT JOIN operations op
ON op.production_order = o.production_order
AND op.mandt = r.mandt
AND op.vornr = r.vornr
),
first_confirmation AS (
SELECT production_order, MIN(TO_TIMESTAMP(TO_VARCHAR(entry_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(entry_time), 6, '0'), 'YYYYMMDDHH24MISS')) AS start_time
FROM confirmations
GROUP BY production_order
),
last_confirmation AS (
SELECT production_order, MAX(TO_TIMESTAMP(TO_VARCHAR(entry_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(entry_time), 6, '0'), 'YYYYMMDDHH24MISS')) AS final_time
FROM confirmations
GROUP BY production_order
),
first_goods_issue AS (
SELECT
o.production_order,
MIN(TO_TIMESTAMP(TO_VARCHAR(m.budat_mkpf, 'YYYYMMDD') || LPAD(TO_VARCHAR(m.cputm_mkpf), 6, '0'), 'YYYYMMDDHH24MISS')) AS start_time
FROM orders o
INNER JOIN [Your schema name].MSEG m
ON m.mandt = o.mandt
AND m.aufnr = o.production_order_raw
AND m.bwart IN ('261', '262')
GROUP BY o.production_order
),
first_receipt AS (
SELECT
o.production_order,
MIN(TO_TIMESTAMP(TO_VARCHAR(m.budat_mkpf, 'YYYYMMDD') || LPAD(TO_VARCHAR(m.cputm_mkpf), 6, '0'), 'YYYYMMDDHH24MISS')) AS receipt_time
FROM orders o
INNER JOIN [Your schema name].MSEG m
ON m.mandt = o.mandt
AND m.aufnr = o.production_order_raw
AND m.bwart IN ('101', '102')
GROUP BY o.production_order
),
plan_changes AS (
SELECT
o.production_order,
MIN(TO_TIMESTAMP(TO_VARCHAR(h.udate, 'YYYYMMDD') || LPAD(TO_VARCHAR(h.utime), 6, '0'), 'YYYYMMDDHH24MISS')) AS adjustment_time
FROM orders o
INNER JOIN [Your schema name].CDHDR h
ON h.mandant = o.mandt
AND h.objectid = o.production_order_raw
INNER JOIN [Your schema name].CDPOS p
ON p.mandant = h.mandant
AND p.objectclas = h.objectclas
AND p.objectid = h.objectid
AND p.changenr = h.changenr
WHERE h.objectclas IN ('ORDER', 'PP_ORDER')
AND p.tabname IN ('AFKO', 'AFPO', 'AFVC', 'RESB')
AND p.fname IN ('GAMNG', 'PSMNG', 'GSTRP', 'GLTRP', 'MATNR', 'BDMNG', 'VORNR')
GROUP BY o.production_order
),
status_times AS (
SELECT
production_order,
MIN(CASE WHEN stat IN ('I0001', 'CRTD') THEN TO_TIMESTAMP(TO_VARCHAR(status_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(status_time), 6, '0'), 'YYYYMMDDHH24MISS') END) AS created_status_time,
MIN(CASE WHEN stat IN ('I0002', 'REL') THEN TO_TIMESTAMP(TO_VARCHAR(status_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(status_time), 6, '0'), 'YYYYMMDDHH24MISS') END) AS released_time,
MIN(CASE WHEN stat IN ('I0003', 'MATC', 'MANC') THEN TO_TIMESTAMP(TO_VARCHAR(status_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(status_time), 6, '0'), 'YYYYMMDDHH24MISS') END) AS material_available_time,
MIN(CASE WHEN stat IN ('I0004', 'CAPC', 'CAPA') THEN TO_TIMESTAMP(TO_VARCHAR(status_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(status_time), 6, '0'), 'YYYYMMDDHH24MISS') END) AS capacity_planned_time,
MIN(CASE WHEN stat IN ('I0045', 'TECO') THEN TO_TIMESTAMP(TO_VARCHAR(status_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(status_time), 6, '0'), 'YYYYMMDDHH24MISS') END) AS technically_completed_time,
MIN(CASE WHEN stat IN ('I0046', 'CLSD') THEN TO_TIMESTAMP(TO_VARCHAR(status_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(status_time), 6, '0'), 'YYYYMMDDHH24MISS') END) AS financially_closed_time,
MIN(CASE WHEN stat IN ('I0076', 'DLFL', 'CANC') THEN TO_TIMESTAMP(TO_VARCHAR(status_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(status_time), 6, '0'), 'YYYYMMDDHH24MISS') END) AS cancelled_time
FROM status_history
GROUP BY production_order
),
material_shortages AS (
SELECT
o.production_order,
MIN(TO_TIMESTAMP(TO_VARCHAR(j.status_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(j.status_time), 6, '0'), 'YYYYMMDDHH24MISS')) AS shortage_time
FROM status_history j
INNER JOIN orders o
ON o.production_order = j.production_order
WHERE j.stat IN ('I0042', 'MANC', 'MSHT')
GROUP BY o.production_order
),
capacity_times AS (
SELECT
production_order,
MIN(COALESCE(released_time, created_status_time)) AS capacity_time
FROM status_times
GROUP BY production_order
),
base_attributes AS (
SELECT
o.production_order,
o.material_number,
o.plant,
COALESCE(op.work_center, '') AS work_center,
o.planned_end_date,
COALESCE(st.stat, '') AS current_status
FROM orders o
LEFT JOIN status_history st
ON st.production_order = o.production_order
AND st.inact = ''
LEFT JOIN operations op
ON op.production_order = o.production_order
AND op.vornr = (SELECT MIN(op2.vornr) FROM operations op2 WHERE op2.production_order = o.production_order)
),
events AS (
SELECT o.production_order, 'Production Order Created' AS activity, COALESCE(st.created_status_time, TO_TIMESTAMP(TO_VARCHAR(o.order_created_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(o.order_created_time), 6, '0'), 'YYYYMMDDHH24MISS')) AS start_time FROM orders o LEFT JOIN status_times st ON st.production_order = o.production_order
UNION ALL
SELECT production_order, 'Material Availability Checked', material_available_time FROM status_times WHERE material_available_time IS NOT NULL
UNION ALL
SELECT production_order, 'Capacity Requirements Planned', capacity_time FROM capacity_times WHERE capacity_time IS NOT NULL
UNION ALL
SELECT production_order, 'Production Order Released', released_time FROM status_times WHERE released_time IS NOT NULL
UNION ALL
SELECT o.production_order, 'Production Started', LEAST(COALESCE(fc.start_time, TO_TIMESTAMP('99991231235959', 'YYYYMMDDHH24MISS')), COALESCE(fg.start_time, TO_TIMESTAMP('99991231235959', 'YYYYMMDDHH24MISS'))) FROM orders o LEFT JOIN first_confirmation fc ON fc.production_order = o.production_order LEFT JOIN first_goods_issue fg ON fg.production_order = o.production_order WHERE fc.start_time IS NOT NULL OR fg.start_time IS NOT NULL
UNION ALL
SELECT production_order, 'Production Confirmation Entered', TO_TIMESTAMP(TO_VARCHAR(entry_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(entry_time), 6, '0'), 'YYYYMMDDHH24MISS') FROM confirmations
UNION ALL
SELECT production_order, 'Material Shortage Occurred', shortage_time FROM material_shortages WHERE shortage_time IS NOT NULL
UNION ALL
SELECT production_order, 'Production Plan Adjusted', adjustment_time FROM plan_changes WHERE adjustment_time IS NOT NULL
UNION ALL
SELECT c.production_order, 'Unplanned Halt Occurred', ADD_SECONDS(c.confirmation_time, 1) FROM (SELECT production_order, TO_TIMESTAMP(TO_VARCHAR(entry_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(entry_time), 6, '0'), 'YYYYMMDDHH24MISS') AS confirmation_time, LEAD(TO_TIMESTAMP(TO_VARCHAR(entry_date, 'YYYYMMDD') || LPAD(TO_VARCHAR(entry_time), 6, '0'), 'YYYYMMDDHH24MISS')) OVER (PARTITION BY production_order ORDER BY entry_date, entry_time, rmzhl) AS next_confirmation_time FROM confirmations) c WHERE c.next_confirmation_time IS NOT NULL AND SECONDS_BETWEEN(c.confirmation_time, c.next_confirmation_time) >= 86400
UNION ALL
SELECT production_order, 'Final Confirmation Entered', final_time FROM last_confirmation WHERE final_time IS NOT NULL
UNION ALL
SELECT production_order, 'Goods Receipt Posted', receipt_time FROM first_receipt WHERE receipt_time IS NOT NULL
UNION ALL
SELECT production_order, 'Order Technically Completed', technically_completed_time FROM status_times WHERE technically_completed_time IS NOT NULL
UNION ALL
SELECT production_order, 'Order Financially Closed', financially_closed_time FROM status_times WHERE financially_closed_time IS NOT NULL
UNION ALL
SELECT production_order, 'Production Order Cancelled', cancelled_time FROM status_times WHERE cancelled_time IS NOT NULL
)
SELECT
e.production_order AS "ProductionOrder",
e.activity AS "Activity",
e.start_time AS "StartTime",
p.source_system AS "SourceSystem",
p.last_data_update AS "LastDataUpdate",
b.material_number AS "MaterialNumber",
b.plant AS "Plant",
NULLIF(b.work_center, '') AS "WorkCenter",
b.planned_end_date AS "PlannedEndDate",
b.current_status AS "OrderStatus"
FROM events e
INNER JOIN base_attributes b
ON b.production_order = e.production_order
CROSS JOIN params p
WHERE e.start_time IS NOT NULL
ORDER BY e.production_order, e.start_time, e.activity; 立即开始优化您的生产计划
识别并消除瓶颈,将生产周期时间缩短30%。
无需信用卡