生产计划数据模板
生产计划数据模板
- 生产计划分析建议属性
- 建议跟踪的生产计划关键活动
- 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 | 生产订单的唯一标识符,也是生产计划流程的主要案例标识符。 | ||
| 说明 生产订单号是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 | |||
生产计划活动
| 活动 | 说明 | ||
|---|---|---|---|
| 下达生产订单 | 这是一个关键里程碑,表示生产订单已获批准,可以在车间执行。订单下达后,便可开始发料、报工等执行步骤。 | ||
| 重要性 此事件标志着生产流程正式进入可执行阶段,是衡量周期时间的关键节点。创建到下达之间的时间是衡量投产前效率的重要KPI。 获取途径 用户或系统作业明确触发订单下达,并将状态设为REL。此状态变更及其时间戳记录在JCDS表中。下达日期通常也存储在AFKO-FTRMI中。 采集 JCDS表中状态变更为REL的时间戳。 事件类型 inferred | |||
| 创建生产订单 | 这是系统中生产订单的初始创建,表示正式提出生产指定数量产品的请求。用户保存新订单时会明确记录此事件,并将订单初始状态设为CRTD(已创建)。 | ||
| 重要性 标记生产订单生命周期的开始。分析从创建到下达的时间,有助于发现正式排入生产计划前的行政处理或计划延误。 获取途径 此事件记录在AUFK表(订单主数据)中,使用创建日期(ERDAT)。创建状态(CRTD)记录在JEST和JCDS表中,并通过订单对象编号(OBJNR)关联。 采集 AUFK-ERDAT中的时间戳,或JCDS中状态变更为CRTD的时间戳。 事件类型 explicit | |||
| 开始生产 | 表示订单的实际生产活动开始。通常根据首次车间报工或首次针对该订单的组件发料推断。 | ||
| 重要性 此活动标志着流程从计划阶段转入执行阶段。将实际开始日期与计划开始日期进行比较,是跟踪排程达成率的重要依据。 获取途径 这是一个推断事件。通常根据与订单关联的最早货物移动过账时间戳(MSEG表,移动类型261)或工时确认过账时间戳(AFRU表)确定。 采集 订单在AFRU(确认记录)或MSEG(货物移动)中的最早时间戳。 事件类型 inferred | |||
| 录入最终确认 | 此活动表示生产订单工艺路线中最后一道工序已确认,意味着车间已完成所有计划的制造步骤。 | ||
| 重要性 最终确认是一个关键里程碑,表示实际生产作业已结束。在最终收货之前,它通常是衡量车间周期时间更准确的终点。 获取途径 根据AFRU表中的确认数据推断。识别方法是查找最后一道工序序列(AFVC-VPLNR)的确认记录,并确认其“最终确认”标记(AFRUD-AUERU)已设置。 采集 在AFRU中查找已设置最终确认标记的最后一道工序确认记录。 事件类型 inferred | |||
| 订单技术性完成 | 这是一个行政关闭步骤,可阻止订单发生进一步的物流变更,例如货物移动或确认。从物流角度看,订单至此视为完成。 | ||
| 重要性 TECO是生产流程的明确终点,是计算生产订单总周期时间的关键。它表示所有物流活动均已完成,订单可以进行财务结算。 获取途径 用户将状态设为TECO(技术性完成)后触发此事件。该事件作为状态变更记录在JCDS表中,并附有相应时间戳。 采集 JCDS表中状态变更为TECO的时间戳。 事件类型 inferred | |||
| 调整生产计划 | 表示生产订单下达后发生的重大变更,例如数量、日期或物料清单变更。可通过分析变更凭证捕获此事件。 | ||
| 重要性 频繁调整可能表明计划不稳定或需求波动较大。此活动是生产计划修订率KPI的计算依据,也有助于找出流程波动的来源。 获取途径 根据CDHDR(变更凭证抬头)和CDPOS(变更凭证项目)表中生产订单对象(AUFK或AFPO)的变更日志推断。下达日期之后发生的变更视为调整。 采集 识别下达后CDHDR/CDPOS中关键字段(例如数量、日期)的变更。 事件类型 inferred | |||
| 过账收货 | 此事件记录成品从生产线入库的情况,并正式增加所生产物料的库存数量。 | ||
| 重要性 这是一个关键里程碑,表示生产产出已完成。衡量按时交付和整体周期时间时,通常将其视为生产周期的终点。 获取途径 这是明确记录的财务过账,存储在物料凭证表MSEG(项目级)和MKPF(抬头级)中,通常使用移动类型101。这些凭证与生产订单关联。 采集 在MSEG中查找与订单关联且移动类型为101的物料凭证。 事件类型 explicit | |||
| 发生物料短缺 | 此事件表示由于一种或多种所需组件无法供应,生产流程受到影响或中断。系统会为订单设置特定状态以反映此情况。 | ||
| 重要性 跟踪物料短缺对于物料短缺影响分析至关重要,有助于量化供应链问题造成的延误并改善物料计划。 获取途径 根据生产订单的MSPT(物料短缺)状态是否启用推断。此状态变更的时间戳可在JCDS表中查找。 采集 JCDS表中状态变更为MSPT的时间戳。 事件类型 inferred | |||
| 发生非计划停产 | 此计算事件表示生产执行阶段出现较长的闲置时段。它不是系统中明确记录的事件,而是通过识别连续生产确认之间的长时间间隔推算得出。 | ||
| 重要性 有助于监控机器故障或质量问题等非计划中断。发现频繁或持续时间较长的停产,是提高车间稳定性和产出的关键。 获取途径 通过分析AFRU表中连续“录入生产确认”活动的时间戳计算得出。若间隔超过预设阈值,则标记为非计划停产。 采集 计算连续确认时间戳(AFRU-BUDAT/UZEIT)之间的时间差。 事件类型 calculated | |||
| 取消生产订单 | 表示生产订单在完成前被取消。这是流程未成功结束的一种情况。 | ||
| 重要性 分析已取消的订单,有助于发现需求计划、主数据或销售流程中的问题。取消率较高可能表明存在需要解决的系统性问题。 获取途径 根据JCDS表中设置的系统状态CACL(已取消)推断。或者,删除标记(AUFK-LOEKZ)也可表示订单已取消。 采集 JCDS中状态变更为CACL的时间戳,或AUFK中设置删除标记的时间戳。 事件类型 inferred | |||
| 录入生产确认 | 表示记录生产订单中特定工序的进度,包括记录产量、废品数量以及在工作中心耗费的时间。 | ||
| 重要性 生产确认可实时反映车间进度,是跟踪生产状态的重要依据。分析确认的频率和时间,有助于监控流程并发现工序之间的延误。 获取途径 每条确认记录都会明确写入AFRU表(订单完成确认),包含时间戳(BUDAT、UZEIT)和工序详情。 采集 记录为AFRU表中的一条单据。 事件类型 explicit | |||
| 检查物料可用性 | 表示系统或用户检查生产订单所需的所有组件是否数量充足、能否按时到位。通常在创建或下达订单时自动检查,也可能由人工检查,并更新订单状态。 | ||
| 重要性 及早发现物料短缺对主动规划至关重要。跟踪此活动有助于了解物料可用性如何影响订单下达和按时开工。 获取途径 根据订单状态推断。MACM(物料已承诺)等状态,或物料可用日期(AFKO-MSERF)的变更,表明已执行检查。若没有物料短缺状态(MSPT),也可据此推断物料可用。 采集 根据与物料承诺相关的状态变更或COMAC事务的执行情况推断。 事件类型 inferred | |||
| 计划产能需求 | 此活动包括为生产订单工序排程,并检查所需工作中心是否有可用产能。系统会评估工作中心的产能负荷,并在启用相关配置时进行平衡,从而确定生产日期。 | ||
| 重要性 此步骤对于确保生产排程可行至关重要。分析其耗时和结果,有助于发现产能瓶颈并提高资源计划的准确性。 获取途径 通常根据表明订单已排程的系统状态推断,例如SETC(已执行排程)。已填写计划开始和结束日期(AUFK-GSTRP、AUFK-GLTRP)也表明此活动已完成。 采集 根据AUFK/AFKO中已填写的计划日期,或JEST中的排程相关状态推断。 事件类型 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视图及其底层表的显示权限。缺少权限可能导致结果为空或不完整。
查询示例 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状态代码及状态对象标识符。状态配置文件和自定义增强可能会改变可用代码。
- 变更凭证:确认生产订单变更凭证对象、表名、字段名,以及数量、日期、物料清单和工艺路线变更所用的值格式。查询将符合条件的CDHDR和CDPOS记录作为计划调整的依据。
- 时间戳处理:将所有源时间戳统一为同一时区。确认日期和时间字段是否分开存储、时间戳使用本地时间还是UTC,以及初始日期的表示方式。
- 性能:按订单创建日期或其他已建立索引的生产订单日期限制提取范围,筛选客户端,只选择所需列,并在合适的报表时段执行。对于大型数据集,可按月或生产订单范围分批提取,并增量保存结果。
- 数据库对象:确认所选架构中存在且可读取AUFK、AFPO、JEST、JCDS、AFKO、AFVC、AFRU、RESB、MSEG、CDHDR和CDPOS。如果您的版本中视图或字段有所不同,请替换为对应的已发布或经批准对象。
- 授权:需要具备所选SAP HANA架构及对象的读取权限和SQL执行权限。根据您的治理流程,可能还需要SAP应用程序授权。
- 功能范围:所选时间段的生产计划与执行数据、库存移动数据、状态历史记录和变更凭证必须保留在系统中。已归档或删除的记录不会被提取。
- ProcessMind映射:将ProductionOrder配置为案例标识符、Activity配置为活动、StartTime配置为事件时间戳。不要依赖ProcessMind根据属性推导缺失的活动。
查询示例 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%。
无需信用卡