您的资产维护数据模板
您的资产维护数据模板
- 建议采集的属性
- 需要跟踪的关键维护活动
- SAP PM技术提取指南
资产维护属性
| 名称 | 说明 | ||
|---|---|---|---|
| 上次数据更新 LastDataUpdate | 最近一次数据提取的时间戳。 | ||
| 说明 表示流程挖掘数据模型最近一次刷新的时间。分析人员可据此了解洞察的时效性,并验证监控实时积压或SLA达成情况的仪表板所用数据是否为最新。 重要性 对于数据治理和建立对仪表板的信任至关重要。 获取途径 ETL时间戳 示例 2023-11-01T12:00:00Z | |||
| 事件时间戳 EventTimestamp | 活动发生的准确日期和时间。 | ||
| 说明 记录事件发生的具体时刻。状态变更的时间取自系统状态更新时间,作业的时间则取自确认时间。准确的时间戳对于计算周期时间、提前期,以及识别“计划”和“执行”等流程步骤之间的瓶颈至关重要。 重要性 用于按正确顺序排列事件,并计算所有基于时长的KPI。 获取途径 JEST(UDATE/UTIME)、AFRU(ISDD/ISDZ)、MKPF(CPUDT/CPUTM) 示例 2023-10-15T08:30:00Z2023-10-15T14:45:12Z | |||
| 活动名称 Activity | 发生的具体任务或状态变更。 | ||
| 说明 表示维护流程中执行的步骤,例如“创建维护工单”“过账发货”或“确认工单作业”。状态变更通常取自状态管理表JEST,确认记录取自事务表AFRU,物料移动记录取自MKPF。此属性决定流程图中的节点。 重要性 此属性定义流程中的“做什么”,是发现流程顺序和流程变体的关键。 获取途径 取自JEST(状态)、AFRU(确认)和QMEL(通知) 示例 创建维护工单释放工单技术完成 | |||
| 源系统 SourceSystem | 数据来源系统。 | ||
| 说明 标识具体的SAP客户端或实例,例如“SAP_PM_PROD”。在包含多个ERP系统的环境中,此属性有助于区分ID相同但属于不同法人实体或系统环境的记录。 重要性 确保多系统环境中的数据唯一性和来源可追溯。 获取途径 系统配置/提取日志 示例 SAP_ECC_P01SAP_S4H_100 | |||
| 维护工单 MaintenanceWorkOrder | 维护工单的唯一标识符。 | ||
| 说明 维护工单是SAP Plant Maintenance中的核心单据(AUFK表,字段AUFNR)。它将维护需求(通知)与执行所需的资源、物料和成本关联起来。在流程挖掘分析中,它作为案例ID,可用于还原维护作业从创建到技术完成和业务完成的完整生命周期。 重要性 这是关联所有活动、成本和时间戳的唯一键,可用于呈现流程顺序。 获取途径 SAP表AUFK,字段AUFNR 示例 00004001234540012345000040098765 | |||
| 主要工作中心 MainWorkCenter | 负责执行工单的主要工作中心或班组。 | ||
| 说明 主要工作中心(VAPLZ)代表负责实际作业的技术人员或机器团队。此属性映射为“团队”,对于分析执行效率至关重要,例如按班组计算平均修复时间。它还有助于区分内部员工和外部承包商。 重要性 支持按资源层级分析绩效。 获取途径 SAP表AFKO,字段VAPLZ(具体取决于配置,也可能是AUFK-VAPLZ) 示例 MECH_01ELEC_TEAMEXT_CONT | |||
| 创建者用户名 CreatedByUser | 创建工单人员的用户名。 | ||
| 说明 标识负责发起工单的用户(ERNAM),并映射到通用模型中的“用户”。可用于分析工单是手动创建还是自动创建,并审计“维护工单已创建”活动。 重要性 支持用户行为分析与审计。 获取途径 SAP表AUFK,字段ERNAM 示例 JSMITHBSERVICEDDAVIS | |||
| 功能位置 FunctionalLocation | 资产安装所在的层级位置。 | ||
| 说明 表示维护任务执行所在的技术结构位置(TPLNR)。设备可以移动,功能位置则固定。此属性可用于“技术检查周期时间”仪表板,比较工厂不同区域的绩效,例如锅炉房与包装线。 重要性 支持从空间和层级维度分析维护绩效。 获取途径 SAP表IFLOT,字段TPLNR(或通过AUFK-TPLNR关联) 示例 PLANT1-BLD2-LN01US-TX-DAL-01 | |||
| 目标完成日期 TargetFinishDate | 维护工作计划完成日期。 | ||
| 说明 此日期通常为基本完成日期(GLTRP),代表工单的截止日期。将其与实际完成时间戳进行比较,可计算“SLA达成率”指标。该日期是判断工单是否按时完成的基准。 重要性 所有按时交付(OTD)计算的基准日期。 获取途径 SAP表AFKO,字段GLTRP 示例 2023-12-012023-12-15 | |||
| 系统状态 SystemStatus | 工单当前的技术状态,例如REL、TECO。 | ||
| 说明 当前应用于工单的有效系统状态(来自JEST)的拼接字符串或列表。常见值包括CRTD(已创建)、REL(已下达)、TECO(技术性完成)和CLSD(已关闭)。可用于在“积压与进行中工作监控”中筛选未关闭和已关闭案件。 重要性 标识工单生命周期阶段的主要指标。 获取途径 SAP功能模块STATUS_TEXT_EDIT或表JEST 示例 REL CNFTECOCRTD MACM | |||
| 维护优先级 MaintenancePriority | 分配给工单的紧急程度。 | ||
| 说明 表示维护任务的优先级(PRIOK),例如“1-紧急”“2-高”和“3-中”。此字段是“紧急工单占比”KPI的直接数据来源。按优先级分析流程,有助于判断高优先级工单是否确实比常规工单处理得更快。 重要性 SLA分析和识别紧急工作的关键依据。 获取途径 SAP表AFKO,字段PRIOK(或通过视图关联AUFK) 示例 1-紧急2-高3-中4-低 | |||
| 维护工单类型 MaintenanceOrderType | 对工单进行分类,例如预防性维护或纠正性维护。 | ||
| 说明 SAP PM中的工单类型(AUART)用于区分维护工作的性质。常见类型包括PM01(纠正性维护)、PM02(预防性维护)和PM03(翻新)。此属性对于“紧急工单影响监控”以及流程变体细分至关重要,因为预防性维护工作流与响应式维护工作流差异显著。 重要性 区分计划内和计划外工作的分析基础。 获取途径 SAP表AUFK,字段AUART 示例 PM01PM02PM03 | |||
| 维护工厂 MaintenancePlant | 负责维护工作的物流工厂。 | ||
| 说明 工厂(WERKS)是物流中的主要组织单位,用于按实体设施划分数据。此属性对于跨站点绩效对标至关重要,并映射为“业务单元”,以支持在仪表板中按组织层级筛选。 重要性 用于设施对标的主要组织筛选条件。 获取途径 SAP表AUFK,字段WERKS 示例 100020003000 | |||
| 计划员组 ResponsiblePlannerGroup | 负责处理工单的计划员团队。 | ||
| 说明 计划员组(INGRP)用于标识负责维护工作计划的具体团队或部门。此属性映射为“部门”,对于“资源利用率和排程”仪表板至关重要,可用于识别准备阶段中造成瓶颈的计划团队。 重要性 标识负责计划流程的行政团队。 获取途径 SAP表AUFK,字段INGRP 示例 M01ELEMEC | |||
| 设备编号 EquipmentNumber | 待维护实体资产的唯一标识符。 | ||
| 说明 设备编号(EQUNR)用于标识单台机器或资产对象。按此字段汇总数据,分析人员可以通过“资产维护成本与吞吐量”仪表板,找出需要频繁维修且维修成本高的“问题设备”,从而开展以可靠性为中心的维护分析。 重要性 将流程绩效与具体实体资产关联起来。 获取途径 SAP表AUFK,字段EQUNR 示例 10004567PUMP-001HVAC-202 | |||
| 通知编号 NotificationNumber | 触发此工单的维护通知。 | ||
| 说明 通知编号(QMNUM)将工单关联回最初的请求(通知)。通过此关联,可以计算从“收到维护请求”到完成的完整周期时间。缺少此关联,分析就无法涵盖维护生命周期中最初的故障发现和报告阶段。 重要性 将执行阶段与请求/检测阶段关联起来。 获取途径 SAP表AUFK,字段QMNUM 示例 1000050010000501 | |||
| 实际总成本 TotalActualCost | 记入工单的实际总成本。 | ||
| 说明 汇总人工、材料和服务成本(来自PMCO表)。此属性支持“资产维护成本与吞吐量”仪表板,帮助管理者了解维护活动的财务影响,也是判断维修资产还是更换资产更具成本效益的重要依据。 重要性 为运营流程数据补充财务维度。 获取途径 SAP表PMCO(价值类型04,即实际值的总和) 示例 150.002500.500.00 | |||
| 是否为紧急工作 IsEmergencyWork | 标识工单是否属于紧急工作的标记。 | ||
| 说明 根据维护优先级计算的布尔属性。如果优先级为“1”(或配置中代表紧急情况的特定代码),此标记为true。这样无需在仪表板层编写复杂逻辑,即可轻松筛选数据并构建“紧急工单占比”指标。 重要性 便于筛选数据,分析严重的故障响应维护。 获取途径 根据MaintenancePriority计算 示例 truefalse | |||
| 是否返工 IsRework | 标识工单是否涉及返工活动的标记。 | ||
| 说明 用于识别流程是否出现循环的计算型布尔值。例如,“维护任务已执行”活动发生多次,或状态从“技术性完成”回退到“处理中”。此属性支持“维护返工率”指标,并有助于发现质量问题。 重要性 直接支持质量控制分析。 获取途径 根据流程顺序流计算 示例 truefalse | |||
| 计划人工工时 PlannedLaborHours | 工单的预计人工工时。 | ||
| 说明 工单工序的计划总工作量(ARBEI)。将其与实际活动时长进行比较,可在“计划与估算绩效”仪表板中评估维护计划的准确性。 重要性 分析计划准确性的基础指标。 获取途径 SAP表AFKO(工序计划工作量总和) 示例 4.08.512.0 | |||
资产维护活动
| 活动 | 说明 | ||
|---|---|---|---|
| 创建维护工单 | 标记系统中维护工单对象的生成。此活动直接取自工单主数据表的创建时间戳。 | ||
| 重要性 这是案例的核心锚点事件,标志着流程从请求转入计划和执行。 获取途径 AUFK表,字段ERDAT(日期)和ERFZEIT(时间)。 采集 执行事务IW31时记录 事件类型 explicit | |||
| 确认工单作业 | 记录技术人员在特定作业上实际耗费的时间,反映资产维护工作的实际执行情况。 | ||
| 重要性 此活动是计算平均修复时间和人工成本的主要数据来源。 获取途径 AFRU表(工单确认)。 采集 执行事务IW41时记录 事件类型 explicit | |||
| 设置业务完成 | 标记工单已完成最终行政关闭,之后无法再过账成本。通过状态变为CLSD(已关闭)记录。 | ||
| 重要性 表示工单生命周期的最终结束,是确保数据准确性和记录合规的关键节点。 获取途径 JCDS表,状态I0046(CLSD)。 采集 JCDS中的状态更新为CLSD时记录 事件类型 explicit | |||
| 设置技术完成 | 标记维护工作已在实际和技术层面完成。通过状态变为TECO(技术完成)记录。 | ||
| 重要性 这是运营分析中最关键的终点,表示资产已恢复运行,维护工作已完成。 获取途径 JCDS表,状态I0045(TECO)。 采集 JCDS中的状态更新为TECO时记录 事件类型 explicit | |||
| 过账发货 | 记录工单所耗用的备件或物料。此活动取自与工单关联的物料凭证抬头。 | ||
| 重要性 确认备件已备妥并完成领料,直接影响备件可用等待时间分析。 获取途径 MSEG/MKPF表,移动类型261(工单发货)。 采集 执行事务MIGO/MB1A时记录 事件类型 explicit | |||
| 释放维护工单 | 表示计划已完成,工单已释放,可进入执行阶段。通过监控系统状态日志中状态变为REL来记录。 | ||
| 重要性 此里程碑将计划阶段与执行阶段分开,是衡量计划和估算周期时间的关键节点。 获取途径 JCDS表(状态变更凭证),状态I0002(REL)。 采集 JCDS中的状态更新为REL时记录 事件类型 explicit | |||
| 创建维护通知 | 记录维护通知的创建时间。维护通知通常是工单的触发来源。此活动取自QMEL表的创建时间戳,将上游请求与执行工单关联起来。 | ||
| 重要性 此活动标志着端到端维护流程的开始,可用于计算故障发现到生成工单之间的响应时间。 获取途径 QMEL表,字段ERDAT(创建日期)和MZEIT(时间)。通过QMEL-AUFNR关联工单。 采集 QMEL表记录创建时记录 事件类型 explicit | |||
| 创建采购申请 | 表示已生成外部采购或服务请求,将内部维护工单与外部供应链关联起来。 | ||
| 重要性 对于分析外部供应商或非库存物料采购造成的延误至关重要。 获取途径 EBAN表,通过科目分配与AUFK-AUFNR关联。 采集 创建EBAN记录时记录 事件类型 explicit | |||
| 安排工单 | 表示已将具体作业安排到某个产能或日期。根据作业被分配“已派工”状态推断此活动。 | ||
| 重要性 衡量资源分配效率,为资源利用率和排程仪表板提供支持。 获取途径 JCDS表(状态变更凭证)中的作业记录(对象类型OV),状态I0009(DSPT)。 采集 比较状态字段变更前后的值 事件类型 inferred | |||
| 撤销技术完成 | 记录技术完成状态被撤销,表示工单已重新打开。这会在流程模型中形成返工循环。 | ||
| 重要性 这是维护返工率KPI的主要指标,可揭示过早关闭工单或质量问题。 获取途径 JCDS表,状态I0045(TECO)变为非活跃。 采集 停用TECO状态时记录 事件类型 explicit | |||
| 更改维护优先级 | 记录工单优先级的更新,例如升级为紧急。此活动根据与工单主数据关联的更改凭证生成。 | ||
| 重要性 跟踪优先级变更有助于解释流程偏差,并通过识别临时升级情况,为紧急工单影响监控提供支持。 获取途径 对象类别为AUFTRAG的CDPOS/CDHDR表,字段PRIOK。 采集 在更改凭证(CDPOS)中记录 事件类型 explicit | |||
| 添加物料组件 | 记录向工单组件清单中添加备件或物料的情况。此活动取自预留行项目的创建记录。 | ||
| 重要性 标记所需备件采购周期的开始,为备件采购周期时间仪表板提供支持。 获取途径 RESB表,字段BDTER(需求日期)或创建时间戳。 采集 向RESB添加行项目时记录 事件类型 explicit | |||
| 结算工单成本 | 表示工单归集的成本已转入成本中心等控制对象。此活动取自控制凭证。 | ||
| 重要性 跟踪财务结算情况,为财务结算周期时间KPI提供支持。 获取途径 COBK表(CO对象:凭证抬头),与工单关联。 采集 执行结算事务KO88时记录 事件类型 explicit | |||
| 记录测量读数 | 记录测量凭证的录入,例如计数器读数或状态评估。此活动通常对应技术检查事件。 | ||
| 重要性 对于基于状态的维护以及跟踪技术检查周期时间至关重要。 获取途径 IMRG表(测量凭证),与设备或功能位置关联。 采集 创建测量凭证时记录 事件类型 explicit | |||
数据提取指南
步骤
确定数据源接口:确定如何访问SAP S/4HANA SQL接口。通常可通过SAP HANA Studio、Eclipse中的ABAP开发工具(ADT),或在HANA数据库向分析层开放时使用DBaaS连接字符串进行访问。
确认CDS视图可用:确保S/4HANA系统中已启用标准核心数据服务(CDS)视图。所需的主要视图包括I_MaintenanceOrder、I_MaintenanceOrderOperation、I_MaintenanceNotification、I_MaintOrderConfirmation和I_MeasurementDocument。您还需要访问系统状态历史表JCDS和变更凭证表(CDHDR/CDPOS),以重建完整事件历史,因为标准CDS视图通常只显示当前状态。
准备SQL环境:打开SQL编辑器。确保您的用户对上述对象对应的DDL SQL视图(通常位于SAPABAP1或类似架构)拥有SELECT权限。
执行提取查询:将提供的SQL脚本复制到编辑器中。将占位符[Your Client Number]替换为您的SAP客户端ID(例如100)。如果要筛选特定日期范围,请更新WHERE子句中的EventTimestamp筛选条件。
转换数据:查询会处理大部分转换,例如转换时间戳类型,以及将状态代码映射为可读文本。不过,如果目标系统有要求,请确保导出时EventTimestamp列采用ISO 8601格式(YYYY-MM-DDTHH:MM:SS)。
导出结果:执行查询,并将结果导出为CSV或Parquet文件。请使用UTF-8编码,以正确处理用户名或说明中的特殊字符。
验证列映射:抽查导出文件,确保MaintenanceWorkOrder、Activity和EventTimestamp列均已完整填充。检查Activity列是否包含要求中列出的具体字符串(例如Maintenance Order Created、Goods Issue Posted)。
上传到ProcessMind:将验证通过的平面文件导入ProcessMind。将Activity列映射到Activity ID字段,将MaintenanceWorkOrder映射到Case ID字段,并将EventTimestamp映射到Timestamp字段。
配置
- 客户端筛选:SAP系统支持多客户端。请始终按
MANDT或Client(例如'100')筛选,避免数据重复或跨客户端泄露。 - 日期范围:建议筛选最近6至12个月内创建的维护订单(按
CreationDate)。如果不按日期筛选就查询JCDS(状态)或CDPOS(变更凭证)的完整历史记录,可能导致查询超时。 - 语言键:查询默认使用英语('E')。如果组织使用其他主要语言显示文本说明,请调整语言筛选条件。
- 系统访问权限:需要访问ABAP核心数据服务架构或底层HANA表。访问原始表JCDS和CDHDR对于历史状态分析至关重要,因为纯CDS视图通常只反映某一时点的状态。
- 订单类型:查询会提取所有订单类型。如果只需分析特定维护场景,可按
MaintenanceOrderType筛选(例如仅提取PM01、PM02)。
查询示例 sql
/* Activity 1: Maintenance Notification Created */
SELECT
CAST(N.MaintenanceOrder AS VARCHAR(20)) AS MaintenanceWorkOrder,
'Maintenance Notification Created' AS Activity,
TO_TIMESTAMP(CONCAT(CONCAT(N.CreationDate, ' '), N.CreationTime), 'YYYYMMDD HH24MISS') AS EventTimestamp,
'SAP S/4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
N.MaintenanceOrderType,
N.MaintenancePriority,
N.Equipment AS EquipmentNumber,
N.FunctionalLocation,
N.MaintenancePlant,
N.MaintenancePlannerGroup AS ResponsiblePlannerGroup,
N.MainWorkCenter,
N.MaintenanceNotification AS NotificationNumber,
CAST(NULL AS DATE) AS TargetFinishDate,
N.CreatedByUser,
O.SystemStatusName AS SystemStatus
FROM I_MaintenanceNotification N
JOIN I_MaintenanceOrder O ON N.MaintenanceOrder = O.MaintenanceOrder
WHERE N.MaintenanceOrder IS NOT NULL AND N.MaintenanceOrder <> ''
UNION ALL
/* Activity 2: Maintenance Order Created */
SELECT
CAST(O.MaintenanceOrder AS VARCHAR(20)) AS MaintenanceWorkOrder,
'Maintenance Order Created' AS Activity,
O.CreationDate AS EventTimestamp,
'SAP S/4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
O.MaintenanceOrderType,
O.MaintenancePriority,
O.Equipment AS EquipmentNumber,
O.FunctionalLocation,
O.MaintenancePlant,
O.ResponsiblePlannerGroup,
O.MainWorkCenter,
O.MaintenanceNotification AS NotificationNumber,
O.BasicEndDateTime AS TargetFinishDate,
O.CreatedByUser,
O.SystemStatusName AS SystemStatus
FROM I_MaintenanceOrder O
UNION ALL
/* Activity 3: Maintenance Priority Changed */
SELECT
CAST(O.MaintenanceOrder AS VARCHAR(20)) AS MaintenanceWorkOrder,
'Maintenance Priority Changed' AS Activity,
TO_TIMESTAMP(CONCAT(CONCAT(H.UDATE, ' '), H.UTIME), 'YYYYMMDD HH24MISS') AS EventTimestamp,
'SAP S/4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
O.MaintenanceOrderType,
O.MaintenancePriority,
O.Equipment AS EquipmentNumber,
O.FunctionalLocation,
O.MaintenancePlant,
O.ResponsiblePlannerGroup,
O.MainWorkCenter,
O.MaintenanceNotification AS NotificationNumber,
O.BasicEndDateTime AS TargetFinishDate,
H.USERNAME AS CreatedByUser,
O.SystemStatusName AS SystemStatus
FROM CDHDR H
JOIN CDPOS P ON H.OBJECTCLAS = P.OBJECTCLAS AND H.OBJECTID = P.OBJECTID AND H.CHANGENR = P.CHANGENR
JOIN I_MaintenanceOrder O ON O.MaintenanceOrder = H.OBJECTID
WHERE H.OBJECTCLAS = 'ORDER'
AND P.TABNAME = 'AFKO'
AND P.FNAME = 'PRIOK'
UNION ALL
/* Activity 4: Maintenance Order Released */
SELECT
CAST(O.MaintenanceOrder AS VARCHAR(20)) AS MaintenanceWorkOrder,
'Maintenance Order Released' AS Activity,
TO_TIMESTAMP(CONCAT(CONCAT(J.UDATE, ' '), J.UTIME), 'YYYYMMDD HH24MISS') AS EventTimestamp,
'SAP S/4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
O.MaintenanceOrderType,
O.MaintenancePriority,
O.Equipment AS EquipmentNumber,
O.FunctionalLocation,
O.MaintenancePlant,
O.ResponsiblePlannerGroup,
O.MainWorkCenter,
O.MaintenanceNotification AS NotificationNumber,
O.BasicEndDateTime AS TargetFinishDate,
J.USNAM AS CreatedByUser,
O.SystemStatusName AS SystemStatus
FROM JCDS J
JOIN I_MaintenanceOrder O ON J.OBJNR = CONCAT('OR', O.MaintenanceOrder)
WHERE J.STAT = 'I0002' /* REL Status */
AND J.INACT = ' '
UNION ALL
/* Activity 5: Material Component Added */
SELECT
CAST(C.MaintenanceOrder AS VARCHAR(20)) AS MaintenanceWorkOrder,
'Material Component Added' AS Activity,
TO_TIMESTAMP(CONCAT(CONCAT(C.CreationDate, ' '), COALESCE(C.CreationTime, '000000')), 'YYYYMMDD HH24MISS') AS EventTimestamp,
'SAP S/4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
O.MaintenanceOrderType,
O.MaintenancePriority,
O.Equipment AS EquipmentNumber,
O.FunctionalLocation,
O.MaintenancePlant,
O.ResponsiblePlannerGroup,
O.MainWorkCenter,
O.MaintenanceNotification AS NotificationNumber,
O.BasicEndDateTime AS TargetFinishDate,
O.CreatedByUser,
O.SystemStatusName AS SystemStatus
FROM I_MaintenanceOrderComponent C
JOIN I_MaintenanceOrder O ON C.MaintenanceOrder = O.MaintenanceOrder
UNION ALL
/* Activity 6: Purchase Requisition Created */
SELECT
CAST(O.MaintenanceOrder AS VARCHAR(20)) AS MaintenanceWorkOrder,
'Purchase Requisition Created' AS Activity,
PR.CreationDate AS EventTimestamp,
'SAP S/4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
O.MaintenanceOrderType,
O.MaintenancePriority,
O.Equipment AS EquipmentNumber,
O.FunctionalLocation,
O.MaintenancePlant,
O.ResponsiblePlannerGroup,
O.MainWorkCenter,
O.MaintenanceNotification AS NotificationNumber,
O.BasicEndDateTime AS TargetFinishDate,
PR.CreatedByUser,
O.SystemStatusName AS SystemStatus
FROM I_PurchasingDocumentItem PR
JOIN I_MaintenanceOrder O ON PR.ServiceMaintenanceOrder = O.MaintenanceOrder
WHERE PR.PurchasingDocumentCategory = 'B' /* Requisition */
UNION ALL
/* Activity 7: Goods Issue Posted */
SELECT
CAST(O.MaintenanceOrder AS VARCHAR(20)) AS MaintenanceWorkOrder,
'Goods Issue Posted' AS Activity,
TO_TIMESTAMP(CONCAT(CONCAT(MD.CreationDate, ' '), MD.CreationTime), 'YYYYMMDD HH24MISS') AS EventTimestamp,
'SAP S/4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
O.MaintenanceOrderType,
O.MaintenancePriority,
O.Equipment AS EquipmentNumber,
O.FunctionalLocation,
O.MaintenancePlant,
O.ResponsiblePlannerGroup,
O.MainWorkCenter,
O.MaintenanceNotification AS NotificationNumber,
O.BasicEndDateTime AS TargetFinishDate,
MD.CreatedByUser,
O.SystemStatusName AS SystemStatus
FROM I_MaterialDocumentItem MD
JOIN I_MaintenanceOrder O ON MD.MaintenanceOrder = O.MaintenanceOrder
WHERE MD.GoodsMovementType = '261'
UNION ALL
/* Activity 8: Work Order Scheduled (Operation Dispatched) */
SELECT
CAST(O.MaintenanceOrder AS VARCHAR(20)) AS MaintenanceWorkOrder,
'Work Order Scheduled' AS Activity,
TO_TIMESTAMP(CONCAT(CONCAT(J.UDATE, ' '), J.UTIME), 'YYYYMMDD HH24MISS') AS EventTimestamp,
'SAP S/4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
O.MaintenanceOrderType,
O.MaintenancePriority,
O.Equipment AS EquipmentNumber,
O.FunctionalLocation,
O.MaintenancePlant,
O.ResponsiblePlannerGroup,
O.MainWorkCenter,
O.MaintenanceNotification AS NotificationNumber,
O.BasicEndDateTime AS TargetFinishDate,
J.USNAM AS CreatedByUser,
O.SystemStatusName AS SystemStatus
FROM JCDS J
JOIN I_MaintenanceOrderOperation OP ON J.OBJNR = OP.MaintenanceOrderOperationInternalID
JOIN I_MaintenanceOrder O ON OP.MaintenanceOrder = O.MaintenanceOrder
WHERE J.STAT = 'I0019' /* DSP Dispatched Status */
AND J.INACT = ' '
UNION ALL
/* Activity 9: Order Operation Confirmed */
SELECT
CAST(CNF.MaintenanceOrder AS VARCHAR(20)) AS MaintenanceWorkOrder,
'Order Operation Confirmed' AS Activity,
TO_TIMESTAMP(CONCAT(CONCAT(CNF.CreationDate, ' '), CNF.CreationTime), 'YYYYMMDD HH24MISS') AS EventTimestamp,
'SAP S/4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
O.MaintenanceOrderType,
O.MaintenancePriority,
O.Equipment AS EquipmentNumber,
O.FunctionalLocation,
O.MaintenancePlant,
O.ResponsiblePlannerGroup,
O.MainWorkCenter,
O.MaintenanceNotification AS NotificationNumber,
O.BasicEndDateTime AS TargetFinishDate,
CNF.CreatedByUser,
O.SystemStatusName AS SystemStatus
FROM I_MaintOrderConfirmation CNF
JOIN I_MaintenanceOrder O ON CNF.MaintenanceOrder = O.MaintenanceOrder
WHERE CNF.IsReversed = ' '
UNION ALL
/* Activity 10: Measurement Reading Recorded */
SELECT
CAST(O.MaintenanceOrder AS VARCHAR(20)) AS MaintenanceWorkOrder,
'Measurement Reading Recorded' AS Activity,
TO_TIMESTAMP(CONCAT(CONCAT(M.CreationDate, ' '), M.CreationTime), 'YYYYMMDD HH24MISS') AS EventTimestamp,
'SAP S/4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
O.MaintenanceOrderType,
O.MaintenancePriority,
O.Equipment AS EquipmentNumber,
O.FunctionalLocation,
O.MaintenancePlant,
O.ResponsiblePlannerGroup,
O.MainWorkCenter,
O.MaintenanceNotification AS NotificationNumber,
O.BasicEndDateTime AS TargetFinishDate,
M.CreatedByUser,
O.SystemStatusName AS SystemStatus
FROM I_MeasurementDocument M
JOIN I_MaintenanceOrder O ON M.MaintenanceOrder = O.MaintenanceOrder
UNION ALL
/* Activity 11: Technical Completion Set */
SELECT
CAST(O.MaintenanceOrder AS VARCHAR(20)) AS MaintenanceWorkOrder,
'Technical Completion Set' AS Activity,
TO_TIMESTAMP(CONCAT(CONCAT(J.UDATE, ' '), J.UTIME), 'YYYYMMDD HH24MISS') AS EventTimestamp,
'SAP S/4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
O.MaintenanceOrderType,
O.MaintenancePriority,
O.Equipment AS EquipmentNumber,
O.FunctionalLocation,
O.MaintenancePlant,
O.ResponsiblePlannerGroup,
O.MainWorkCenter,
O.MaintenanceNotification AS NotificationNumber,
O.BasicEndDateTime AS TargetFinishDate,
J.USNAM AS CreatedByUser,
O.SystemStatusName AS SystemStatus
FROM JCDS J
JOIN I_MaintenanceOrder O ON J.OBJNR = CONCAT('OR', O.MaintenanceOrder)
WHERE J.STAT = 'I0045' /* TECO Status */
AND J.INACT = ' '
UNION ALL
/* Activity 12: Technical Completion Reversed */
SELECT
CAST(O.MaintenanceOrder AS VARCHAR(20)) AS MaintenanceWorkOrder,
'Technical Completion Reversed' AS Activity,
TO_TIMESTAMP(CONCAT(CONCAT(J.UDATE, ' '), J.UTIME), 'YYYYMMDD HH24MISS') AS EventTimestamp,
'SAP S/4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
O.MaintenanceOrderType,
O.MaintenancePriority,
O.Equipment AS EquipmentNumber,
O.FunctionalLocation,
O.MaintenancePlant,
O.ResponsiblePlannerGroup,
O.MainWorkCenter,
O.MaintenanceNotification AS NotificationNumber,
O.BasicEndDateTime AS TargetFinishDate,
J.USNAM AS CreatedByUser,
O.SystemStatusName AS SystemStatus
FROM JCDS J
JOIN I_MaintenanceOrder O ON J.OBJNR = CONCAT('OR', O.MaintenanceOrder)
WHERE J.STAT = 'I0045' /* TECO Status */
AND J.INACT = 'X' /* Inactive indicates it was removed/reversed */
AND J.CHIND = 'U' /* Update indicator */
UNION ALL
/* Activity 13: Order Cost Settled */
SELECT
CAST(O.MaintenanceOrder AS VARCHAR(20)) AS MaintenanceWorkOrder,
'Order Cost Settled' AS Activity,
JE.CreationDateTime AS EventTimestamp,
'SAP S/4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
O.MaintenanceOrderType,
O.MaintenancePriority,
O.Equipment AS EquipmentNumber,
O.FunctionalLocation,
O.MaintenancePlant,
O.ResponsiblePlannerGroup,
O.MainWorkCenter,
O.MaintenanceNotification AS NotificationNumber,
O.BasicEndDateTime AS TargetFinishDate,
JE.CreatedByUser,
O.SystemStatusName AS SystemStatus
FROM I_ActualPlanJrnlEntryItem JE
JOIN I_MaintenanceOrder O ON JE.OrderID = O.MaintenanceOrder
WHERE JE.BusinessTransactionType = 'KOAO' /* Settlement */
UNION ALL
/* Activity 14: Business Completion Set */
SELECT
CAST(O.MaintenanceOrder AS VARCHAR(20)) AS MaintenanceWorkOrder,
'Business Completion Set' AS Activity,
TO_TIMESTAMP(CONCAT(CONCAT(J.UDATE, ' '), J.UTIME), 'YYYYMMDD HH24MISS') AS EventTimestamp,
'SAP S/4HANA' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
O.MaintenanceOrderType,
O.MaintenancePriority,
O.Equipment AS EquipmentNumber,
O.FunctionalLocation,
O.MaintenancePlant,
O.ResponsiblePlannerGroup,
O.MainWorkCenter,
O.MaintenanceNotification AS NotificationNumber,
O.BasicEndDateTime AS TargetFinishDate,
J.USNAM AS CreatedByUser,
O.SystemStatusName AS SystemStatus
FROM JCDS J
JOIN I_MaintenanceOrder O ON J.OBJNR = CONCAT('OR', O.MaintenanceOrder)
WHERE J.STAT = 'I0046' /* CLSD Status */
AND J.INACT = ' ' 步骤
- 确认可以直接读取AUFK、AFVC、JEST、QMEL、RESB、EBAN、MSEG、MKPF、AFRU、IMRG,以及适用的变更凭证表和控制凭证表。请在SAP数据库中确认准确的物理表名和字段映射,因为不同部署的字段可用性和复制表结构可能有所不同。
- 配置提取连接、凭据、提取开始日期、提取结束日期及公司特定筛选条件。初次验证时使用滚动的3至6个月时间段;性能和完整性检查通过后,再延长提取范围。
- 从AUFK提取订单抬头属性,从AFVC提取工序属性,并从JEST提取状态记录。通过SAP架构中使用的订单编号字段关联订单相关记录。在许多SAP实施中,JEST是当前状态表,因此历史状态时间戳需要从状态历史源或变更凭证源获取。如果JEST不保留状态变更历史,请配置[您的状态历史表]及其时间戳字段。
- 从QMEL提取通知单创建记录,从RESB提取组件创建记录,从EBAN提取采购申请创建记录,从MSEG和MKPF提取发料信息,从AFRU提取确认记录,从IMRG提取测量读数,并从[您的控制凭证表]提取控制结算记录。从[您的订单变更凭证表]和[您的变更凭证项目表]提取优先级变更记录。由于AUFK、AFVC和JEST无法单独提供所需的全部14项活动,因此必须使用这些数据源。
- 将所有源时间戳统一转换为同一时区和单一时间戳数据类型。将SAP日期和时间字段或数据库时间戳字段转换为EventTimestamp。保留系统中可用的源时间戳精度。根据EventTimestamp应用配置的提取时间范围,而不只是按订单创建日期筛选。
- 为每条源记录创建一行事件。不要依赖ProcessMind推断事件。为每行填入查询指定的准确Activity值、MaintenanceWorkOrder、EventTimestamp、SourceSystem、LastDataUpdate及可用的建议属性;保留源标识符,以便在需要时调查重复记录。
- 仅使用稳定的源键对完全相同的源事件去重。不要合并发生时间不同的状态变更、确认、物料移动、测量读数或结算凭证。如果多条源记录代表同一业务事件,请在提取规范中说明所采用的数据源优先顺序。
- 验证全部14种活动值均以独立行出现,每行都包含案例标识符和时间戳,且时间戳位于所需提取时间范围内。使用相同筛选条件,将记录数与SAP报表或源表记录数进行比较。
- 将结果导出为UTF-8 CSV或其他ProcessMind支持的事件日志格式。每个事件占一行,包含名称与配置完全一致的必需列;在支持的情况下保留ISO 8601时间戳,然后上传文件或在ProcessMind中配置数据库连接。将MaintenanceWorkOrder设为案例标识符,Activity设为活动列,EventTimestamp设为时间戳列。
配置
- 源表与映射:AUFK提供订单抬头数据,AFVC提供工序数据,JEST提供系统状态数据。要生成全部14项活动,还需要QMEL、RESB、EBAN、MSEG、MKPF、AFRU、IMRG、变更凭证数据源和控制凭证数据源。执行前请在SAP数据库中核实准确的字段名称。
- 必需输出列:每个事件行都必须包含MaintenanceWorkOrder、Activity、EventTimestamp、SourceSystem和LastDataUpdate。
- 建议输出列:如有数据,请填充MaintenanceOrderType、MaintenancePriority、EquipmentNumber、FunctionalLocation、MaintenancePlant、ResponsiblePlannerGroup、MainWorkCenter、NotificationNumber、TargetFinishDate、CreatedByUser和SystemStatus。
- 日期范围:从3至6个月开始。使用包含开始时间、不包含结束时间的边界,避免增量运行时重复提取事件。回填历史数据时,按月或数据库支持的其他时间段分批提取。
- 筛选条件:根据报表范围配置[公司代码筛选条件]、[订单类型筛选条件]、[维护工厂筛选条件]、[通知单类型筛选条件]和[凭证类型筛选条件]。不要使用会排除没有通知单、工序、组件、采购申请、确认、测量记录或结算凭证的订单的筛选条件。
- 状态历史:JEST通常记录状态分配,但历史状态变更可能需要从[您的状态历史表]或变更凭证中获取。请配置包含状态变更时间戳和状态转换历史的数据源。
- 优先级历史:提取优先级变更需要使用[您的订单变更凭证表]和[您的变更凭证项目表],并获取相关对象标识符、字段名称、旧值、新值和变更时间戳。
- 源系统值:将[您的SAP系统标识符]替换为组织使用的稳定源系统名称。
- 上次数据更新时间:将[您的提取时间戳]替换为提取开始或结束时生成的时间戳,并在本次运行的所有行中使用同一值。
- 性能:在允许的情况下为连接列和筛选列创建索引或分区;限制提取时间范围,只选择必需列;将较长时间段分批处理;如果跨架构直接连接速度较慢,可将中间源数据提取结果实体化。
- 前提条件:具备数据库连接、读取所有已配置源表的授权,以及访问相关工厂维护、物料管理、控制和测量数据的权限,并获得提取运营数据的批准。请确认数据库平台的复制或许可限制。
查询示例 sql
WITH
params AS (
SELECT
CAST('[Start date and time]' AS TIMESTAMP) AS start_ts,
CAST('[End date and time]' AS TIMESTAMP) AS end_ts,
CAST('[Your SAP system identifier]' AS VARCHAR(100)) AS source_system,
CAST('[Your extraction timestamp]' AS TIMESTAMP) AS last_data_update
),
order_base AS (
SELECT
a.[Order number field] AS MaintenanceWorkOrder,
a.[Order type field] AS MaintenanceOrderType,
a.[Priority field] AS MaintenancePriority,
a.[Equipment field] AS EquipmentNumber,
a.[Functional location field] AS FunctionalLocation,
a.[Maintenance plant field] AS MaintenancePlant,
a.[Planner group field] AS ResponsiblePlannerGroup,
a.[Main work center field] AS MainWorkCenter,
a.[Notification number field] AS NotificationNumber,
a.[Target finish date field] AS TargetFinishDate,
a.[Created by field] AS CreatedByUser,
a.[System status field] AS SystemStatus,
a.[Creation date field] AS OrderCreationDate,
a.[Creation time field] AS OrderCreationTime
FROM AUFK a
WHERE a.[Order number field] IS NOT NULL
AND a.[Company code field] = '[Your company code filter]'
),
base_events AS (
SELECT
o.MaintenanceWorkOrder,
'Maintenance Notification Created' AS Activity,
CAST(q.[Notification creation timestamp field] AS TIMESTAMP) AS EventTimestamp,
o.MaintenanceOrderType, o.MaintenancePriority, o.EquipmentNumber,
o.FunctionalLocation, o.MaintenancePlant, o.ResponsiblePlannerGroup,
o.MainWorkCenter, o.NotificationNumber, o.TargetFinishDate,
o.CreatedByUser, o.SystemStatus
FROM order_base o
JOIN QMEL q ON q.[Notification number field] = o.NotificationNumber
CROSS JOIN params p
WHERE q.[Notification creation timestamp field] >= p.start_ts
AND q.[Notification creation timestamp field] < p.end_ts
UNION ALL
SELECT o.MaintenanceWorkOrder, 'Maintenance Order Created',
CAST(o.OrderCreationDate || ' ' || o.OrderCreationTime AS TIMESTAMP),
o.MaintenanceOrderType, o.MaintenancePriority, o.EquipmentNumber,
o.FunctionalLocation, o.MaintenancePlant, o.ResponsiblePlannerGroup,
o.MainWorkCenter, o.NotificationNumber, o.TargetFinishDate,
o.CreatedByUser, o.SystemStatus
FROM order_base o CROSS JOIN params p
WHERE CAST(o.OrderCreationDate || ' ' || o.OrderCreationTime AS TIMESTAMP) >= p.start_ts
AND CAST(o.OrderCreationDate || ' ' || o.OrderCreationTime AS TIMESTAMP) < p.end_ts
UNION ALL
SELECT o.MaintenanceWorkOrder, 'Maintenance Priority Changed',
CAST(c.[Change timestamp field] AS TIMESTAMP),
o.MaintenanceOrderType, c.[New priority value field], o.EquipmentNumber,
o.FunctionalLocation, o.MaintenancePlant, o.ResponsiblePlannerGroup,
o.MainWorkCenter, o.NotificationNumber, o.TargetFinishDate,
o.CreatedByUser, o.SystemStatus
FROM order_base o
JOIN [Your order change document table] h ON h.[Order object identifier field] = o.MaintenanceWorkOrder
JOIN [Your change document item table] c ON c.[Change document number field] = h.[Change document number field]
CROSS JOIN params p
WHERE c.[Changed field name field] = '[Your priority field name]'
AND CAST(c.[Change timestamp field] AS TIMESTAMP) >= p.start_ts
AND CAST(c.[Change timestamp field] AS TIMESTAMP) < p.end_ts
UNION ALL
SELECT o.MaintenanceWorkOrder, 'Maintenance Order Released',
CAST(s.[Status change timestamp field] AS TIMESTAMP),
o.MaintenanceOrderType, o.MaintenancePriority, o.EquipmentNumber,
o.FunctionalLocation, o.MaintenancePlant, o.ResponsiblePlannerGroup,
o.MainWorkCenter, o.NotificationNumber, o.TargetFinishDate,
o.CreatedByUser, 'REL'
FROM order_base o
JOIN [Your status history table] s ON s.[Order number field] = o.MaintenanceWorkOrder
CROSS JOIN params p
WHERE s.[Status code field] = 'REL'
AND s.[Status change timestamp field] >= p.start_ts
AND s.[Status change timestamp field] < p.end_ts
UNION ALL
SELECT o.MaintenanceWorkOrder, 'Material Component Added',
CAST(r.[Reservation creation timestamp field] AS TIMESTAMP),
o.MaintenanceOrderType, o.MaintenancePriority, o.EquipmentNumber,
o.FunctionalLocation, o.MaintenancePlant, o.ResponsiblePlannerGroup,
o.MainWorkCenter, o.NotificationNumber, o.TargetFinishDate,
o.CreatedByUser, o.SystemStatus
FROM order_base o
JOIN RESB r ON r.[Order number field] = o.MaintenanceWorkOrder
CROSS JOIN params p
WHERE r.[Reservation line creation timestamp field] >= p.start_ts
AND r.[Reservation line creation timestamp field] < p.end_ts
UNION ALL
SELECT o.MaintenanceWorkOrder, 'Purchase Requisition Created',
CAST(e.[Purchase requisition creation timestamp field] AS TIMESTAMP),
o.MaintenanceOrderType, o.MaintenancePriority, o.EquipmentNumber,
o.FunctionalLocation, o.MaintenancePlant, o.ResponsiblePlannerGroup,
o.MainWorkCenter, o.NotificationNumber, o.TargetFinishDate,
o.CreatedByUser, o.SystemStatus
FROM order_base o
JOIN EBAN e ON e.[Order number field] = o.MaintenanceWorkOrder
CROSS JOIN params p
WHERE e.[Purchase requisition creation timestamp field] >= p.start_ts
AND e.[Purchase requisition creation timestamp field] < p.end_ts
UNION ALL
SELECT o.MaintenanceWorkOrder, 'Goods Issue Posted',
CAST(m.[Material document timestamp field] AS TIMESTAMP),
o.MaintenanceOrderType, o.MaintenancePriority, o.EquipmentNumber,
o.FunctionalLocation, o.MaintenancePlant, o.ResponsiblePlannerGroup,
o.MainWorkCenter, o.NotificationNumber, o.TargetFinishDate,
o.CreatedByUser, o.SystemStatus
FROM order_base o
JOIN MSEG m ON m.[Order number field] = o.MaintenanceWorkOrder
JOIN MKPF k ON k.[Material document number field] = m.[Material document number field]
AND k.[Material document year field] = m.[Material document year field]
CROSS JOIN params p
WHERE m.[Movement type field] IN ('201', '261')
AND k.[Material document timestamp field] >= p.start_ts
AND k.[Material document timestamp field] < p.end_ts
UNION ALL
SELECT o.MaintenanceWorkOrder, 'Work Order Scheduled',
CAST(v.[Dispatch status timestamp field] AS TIMESTAMP),
o.MaintenanceOrderType, o.MaintenancePriority, o.EquipmentNumber,
o.FunctionalLocation, o.MaintenancePlant, o.ResponsiblePlannerGroup,
o.MainWorkCenter, o.NotificationNumber, o.TargetFinishDate,
o.CreatedByUser, o.SystemStatus
FROM order_base o
JOIN AFVC v ON v.[Order number field] = o.MaintenanceWorkOrder
CROSS JOIN params p
WHERE v.[Dispatch status field] = '[Your dispatch status value]'
AND v.[Dispatch status timestamp field] >= p.start_ts
AND v.[Dispatch status timestamp field] < p.end_ts
UNION ALL
SELECT o.MaintenanceWorkOrder, 'Order Operation Confirmed',
CAST(f.[Confirmation timestamp field] AS TIMESTAMP),
o.MaintenanceOrderType, o.MaintenancePriority, o.EquipmentNumber,
o.FunctionalLocation, o.MaintenancePlant, o.ResponsiblePlannerGroup,
o.MainWorkCenter, o.NotificationNumber, o.TargetFinishDate,
o.CreatedByUser, o.SystemStatus
FROM order_base o
JOIN AFRU f ON f.[Order number field] = o.MaintenanceWorkOrder
CROSS JOIN params p
WHERE f.[Confirmation timestamp field] >= p.start_ts
AND f.[Confirmation timestamp field] < p.end_ts
UNION ALL
SELECT o.MaintenanceWorkOrder, 'Measurement Reading Recorded',
CAST(i.[Measurement document timestamp field] AS TIMESTAMP),
o.MaintenanceOrderType, o.MaintenancePriority, o.EquipmentNumber,
o.FunctionalLocation, o.MaintenancePlant, o.ResponsiblePlannerGroup,
o.MainWorkCenter, o.NotificationNumber, o.TargetFinishDate,
o.CreatedByUser, o.SystemStatus
FROM order_base o
JOIN IMRG i ON i.[Equipment field] = o.EquipmentNumber
CROSS JOIN params p
WHERE i.[Measurement document timestamp field] >= p.start_ts
AND i.[Measurement document timestamp field] < p.end_ts
UNION ALL
SELECT o.MaintenanceWorkOrder, 'Technical Completion Set',
CAST(s.[Status change timestamp field] AS TIMESTAMP),
o.MaintenanceOrderType, o.MaintenancePriority, o.EquipmentNumber,
o.FunctionalLocation, o.MaintenancePlant, o.ResponsiblePlannerGroup,
o.MainWorkCenter, o.NotificationNumber, o.TargetFinishDate,
o.CreatedByUser, 'TECO'
FROM order_base o
JOIN [Your status history table] s ON s.[Order number field] = o.MaintenanceWorkOrder
CROSS JOIN params p
WHERE s.[Status code field] = 'TECO'
AND s.[Status change timestamp field] >= p.start_ts
AND s.[Status change timestamp field] < p.end_ts
UNION ALL
SELECT o.MaintenanceWorkOrder, 'Technical Completion Reversed',
CAST(s.[Status change timestamp field] AS TIMESTAMP),
o.MaintenanceOrderType, o.MaintenancePriority, o.EquipmentNumber,
o.FunctionalLocation, o.MaintenancePlant, o.ResponsiblePlannerGroup,
o.MainWorkCenter, o.NotificationNumber, o.TargetFinishDate,
o.CreatedByUser, s.[Resulting system status field]
FROM order_base o
JOIN [Your status history table] s ON s.[Order number field] = o.MaintenanceWorkOrder
CROSS JOIN params p
WHERE s.[Previous status code field] = 'TECO'
AND s.[Status code field] <> 'TECO'
AND s.[Status change timestamp field] >= p.start_ts
AND s.[Status change timestamp field] < p.end_ts
UNION ALL
SELECT o.MaintenanceWorkOrder, 'Order Cost Settled',
CAST(c.[Controlling document timestamp field] AS TIMESTAMP),
o.MaintenanceOrderType, o.MaintenancePriority, o.EquipmentNumber,
o.FunctionalLocation, o.MaintenancePlant, o.ResponsiblePlannerGroup,
o.MainWorkCenter, o.NotificationNumber, o.TargetFinishDate,
o.CreatedByUser, o.SystemStatus
FROM order_base o
JOIN [Your controlling document table] c ON c.[Order number field] = o.MaintenanceWorkOrder
CROSS JOIN params p
WHERE c.[Controlling document timestamp field] >= p.start_ts
AND c.[Controlling document timestamp field] < p.end_ts
UNION ALL
SELECT o.MaintenanceWorkOrder, 'Business Completion Set',
CAST(s.[Status change timestamp field] AS TIMESTAMP),
o.MaintenanceOrderType, o.MaintenancePriority, o.EquipmentNumber,
o.FunctionalLocation, o.MaintenancePlant, o.ResponsiblePlannerGroup,
o.MainWorkCenter, o.NotificationNumber, o.TargetFinishDate,
o.CreatedByUser, 'CLSD'
FROM order_base o
JOIN [Your status history table] s ON s.[Order number field] = o.MaintenanceWorkOrder
CROSS JOIN params p
WHERE s.[Status code field] = 'CLSD'
AND s.[Status change timestamp field] >= p.start_ts
AND s.[Status change timestamp field] < p.end_ts
)
SELECT
e.MaintenanceWorkOrder,
e.Activity,
e.EventTimestamp,
p.source_system AS SourceSystem,
p.last_data_update AS LastDataUpdate,
e.MaintenanceOrderType,
e.MaintenancePriority,
e.EquipmentNumber,
e.FunctionalLocation,
e.MaintenancePlant,
e.ResponsiblePlannerGroup,
e.MainWorkCenter,
e.NotificationNumber,
e.TargetFinishDate,
e.CreatedByUser,
e.SystemStatus
FROM base_events e
CROSS JOIN params p
WHERE e.MaintenanceWorkOrder IS NOT NULL
AND e.EventTimestamp IS NOT NULL
AND e.EventTimestamp >= p.start_ts
AND e.EventTimestamp < p.end_ts
ORDER BY e.MaintenanceWorkOrder, e.EventTimestamp, e.Activity; 立即解决SAP资产维护瓶颈
立即开始,将维护周期时间缩短30%
无需信用卡……5分钟即可完成设置