您的资产维护数据模板
您的资产维护数据模板
- 建议采集的属性
- 需要跟踪的关键维护活动
- SAP PM技术提取指南
资产维护属性
| 名称 | 说明 | ||
|---|---|---|---|
| 事件时间戳 EventTimestamp | 活动发生的准确日期和时间。 | ||
| 说明 记录事件发生的具体时刻。对于状态变更,时间来自系统状态更新时间;对于操作,时间来自确认时间。准确的时间戳对于计算周期时间、提前期,以及识别“计划”和“执行”等流程步骤之间的瓶颈至关重要。 为什么重要 用于正确排列事件顺序,并计算所有基于时长的KPI。 获取位置 JEST(UDATE/UTIME)、AFRU(ISDD/ISDZ)、MKPF(CPUDT/CPUTM) 示例 2023-10-15T08:30:00Z2023-10-15T14:45:12Z | |||
| 最近数据更新 LastDataUpdate | 最近一次数据提取的时间戳。 | ||
| 说明 表示流程挖掘数据模型最近一次刷新的时间。分析人员可以据此了解洞察的新鲜度,并验证监控实时积压或SLA遵循情况的仪表板中的数据是否及时。 为什么重要 对于数据治理以及建立对仪表板的信任至关重要。 获取位置 ETL时间戳 示例 2023-11-01T12:00:00Z | |||
| 活动名称 Activity | 已发生的具体任务或状态变更。 | ||
| 说明 表示维护流程中执行的步骤,例如“Maintenance Order Created”“Goods Issue Posted”或“Order Operation Confirmed”。这些活动通常源自状态管理表JEST中的状态变更,或事务表中的记录(AFRU用于确认,MKPF用于物料移动)。该属性决定流程图中的节点。 为什么重要 它定义流程中的“内容”,是发现流程顺序流和变体的基础。 获取位置 源自JEST(状态)、AFRU(确认)和QMEL(通知) 示例 Maintenance Order已创建工单已下达技术上已完成 | |||
| 源系统 SourceSystem | 数据来源所在的系统。 | ||
| 说明 用于识别具体的SAP客户端或实例,例如“SAP_PM_PROD”。在包含多个ERP系统的环境中,该属性有助于区分ID可能相同、但属于不同法人实体或系统环境的记录。 为什么重要 确保多系统环境中的数据唯一性和数据血缘。 获取位置 系统配置/提取日志 示例 SAP_ECC_P01SAP_S4H_100 | |||
| 维护工单 MaintenanceWorkOrder | Maintenance Work Order的唯一标识符。 | ||
| 说明 Maintenance Work Order是SAP Plant Maintenance中的核心单据(表AUFK,字段AUFNR),用于将维护需求(Notification)与执行资源、物料和成本关联起来。在流程挖掘分析中,它充当Case ID,用于重建维护作业从创建到技术完成和业务完成的端到端生命周期。 为什么重要 它是连接所有活动、成本和时间戳的唯一键,可用于可视化流程顺序流。 获取位置 SAP表AUFK,字段AUFNR 示例 00004001234540012345000040098765 | |||
| Maintenance Order类型 MaintenanceOrderType | 对工单进行分类,例如预防性或纠正性。 | ||
| 说明 SAP PM中的Order Type(AUART)用于区分维护工作的性质。常见类型包括PM01(纠正性)、PM02(预防性)和PM03(翻新)。该属性对于“Emergency Work Order Impact Monitor”以及流程变体分段至关重要,因为预防性工作流与响应式工作流存在显著差异。 为什么重要 对计划内和计划外工作进行分段分析的基础。 获取位置 SAP表AUFK,字段AUART 示例 PM01PM02PM03 | |||
| 主要工作中心 MainWorkCenter | 负责执行工单的主要工作中心或团队。 | ||
| 说明 Main Work Center(VAPLZ)代表执行实体工作的技术人员或机器组。该属性映射到“Team”,对于分析各团队的执行效率至关重要,例如按团队计算“Mean Time to Repair”。它还有助于区分内部人工与外部承包商。 为什么重要 支持资源层面的绩效分析。 获取位置 SAP表AFKO,字段VAPLZ(或根据配置使用AUFK-VAPLZ) 示例 MECH_01ELEC_TEAMEXT_CONT | |||
| 创建用户 CreatedByUser | 创建订单人员的用户名。 | ||
| 说明 标识负责发起工单的用户(ERNAM)。该字段在通用模型中映射为“User”,可用于分析手动创建与自动创建的差异,并帮助审计“Maintenance Order Created”活动。 为什么重要 支持用户行为分析和审计。 获取位置 SAP表AUFK,字段ERNAM 示例 JSMITHBSERVICEDDAVIS | |||
| 功能位置 FunctionalLocation | 资产安装所在的层级位置。 | ||
| 说明 表示技术结构中执行维护任务的位置(TPLNR)。Equipment可以移动,而Functional Location是固定的。该属性支持“Technical Inspection Cycle Times”仪表板,可比较工厂不同区域的绩效,例如锅炉房与包装线。 为什么重要 支持对维护绩效进行空间和层级分析。 获取位置 SAP表IFLOT,字段TPLNR(或通过AUFK-TPLNR获取) 示例 PLANT1-BLD2-LN01US-TX-DAL-01 | |||
| 目标完成日期 TargetFinishDate | 维护工作的计划完成日期。 | ||
| 说明 该日期通常为Basic Finish Date(GLTRP),代表工单截止日期。将其与实际完成时间戳进行比较,可计算“SLA Adherence Rate”KPI,并据此判断工单是否按时完成。 为什么重要 所有按时交付(OTD)计算的参考基准。 获取位置 SAP表AFKO,字段GLTRP 示例 2023-12-012023-12-15 | |||
| 系统状态 SystemStatus | 订单当前的技术状态,例如REL、TECO。 | ||
| 说明 由当前应用于订单的活动系统状态(来自JEST)拼接而成的字符串或列表。常见值包括CRTD(已创建)、REL(已下达)、TECO(技术完成)和CLSD(已关闭)。该字段有助于在“Backlog and Work In Progress Monitor”中筛选未关闭和已关闭案例。 为什么重要 标识订单生命周期阶段的主要指标。 获取位置 SAP函数模块STATUS_TEXT_EDIT或表JEST 示例 REL CNFTECOCRTD MACM | |||
| 维护优先级 MaintenancePriority | 分配给工单的紧急程度。 | ||
| 说明 表示维护任务的优先级(PRIOK),例如“1-Very High”“2-High”或“3-Medium”。该字段是“Emergency Work Order Ratio”KPI的直接输入。按优先级分析流程,有助于判断高优先级工单是否确实比常规工作更快完成。 为什么重要 SLA分析和识别紧急工作的关键驱动因素。 获取位置 SAP表AFKO,字段PRIOK(或通过视图从AUFK获取) 示例 1-紧急2-高3-中4-低 | |||
| 维护工厂 MaintenancePlant | 负责维护工作的物流工厂。 | ||
| 说明 Plant(WERKS)是物流中的主要组织单位,用于按实体设施划分数据。该属性对于跨不同地点进行绩效基准比较至关重要,并映射到“BusinessUnit”,支持在仪表板中进行高层级组织筛选。 为什么重要 用于设施基准比较的主要组织筛选条件。 获取位置 SAP表AUFK,字段WERKS 示例 100020003000 | |||
| 计划员组 ResponsiblePlannerGroup | 负责处理工单的计划员团队。 | ||
| 说明 Planner Group(INGRP)用于识别负责维护工作计划的具体团队或部门。该属性映射到“Department”,对于“Resource Utilization and Scheduling”仪表板至关重要,可用于识别准备阶段存在瓶颈的计划团队。 为什么重要 识别负责计划流程的行政团队。 获取位置 SAP表AUFK,字段INGRP 示例 M01ELEMEC | |||
| 设备编号 EquipmentNumber | 待维护具体实体资产的标识符。 | ||
| 说明 Equipment Number(EQUNR)用于识别单台机器或资产对象。通过按该字段汇总数据,分析人员可以构建“Asset Maintenance Cost and Throughput”仪表板,找出需要频繁且高成本维修的“问题设备”,从而支持以可靠性为中心的维护分析。 为什么重要 将流程绩效与具体实体资产关联起来。 获取位置 SAP表AUFK,字段EQUNR 示例 10004567PUMP-001HVAC-202 | |||
| 通知编号 NotificationNumber | 触发该工单的维护通知。 | ||
| 说明 Notification Number(QMNUM)将Work Order关联回初始请求(Notification)。该关联是计算从“Maintenance Request Received”到完成的完整提前期所必需的。缺少该关联,分析将无法覆盖维护生命周期中的初始检测和报告阶段。 为什么重要 将执行阶段连接回请求/检测阶段。 获取位置 SAP表AUFK,字段QMNUM 示例 1000050010000501 | |||
| 实际总成本 TotalActualCost | 已过账到工单的实际总成本。 | ||
| 说明 汇总人工、物料和服务成本(来自PMCO表)。该属性支持“Asset Maintenance Cost and Throughput”仪表板,帮助管理人员了解维护活动的财务影响,也是判断维修资产还是更换资产更具成本效益的基础。 为什么重要 为运营流程数据提供财务维度。 获取位置 SAP表PMCO(汇总价值类型04,即实际值) 示例 150.002500.500.00 | |||
| 是否为紧急工单 IsEmergencyWork | 标识工单是否为紧急工单的标志。 | ||
| 说明 根据Maintenance Priority计算得出的布尔属性。如果Priority为“1”(或配置中代表紧急的特定代码),则该标志为true。无需在仪表板层编写复杂逻辑,即可简化筛选并构建“Emergency Work Order Ratio”KPI。 为什么重要 简化关键响应式维护分析的筛选。 获取位置 根据MaintenancePriority计算 示例 truefalse | |||
| 是否返工 IsRework | 标识订单是否包含返工活动的标志。 | ||
| 说明 用于识别流程是否出现循环的布尔计算属性,具体判断“Maintenance Task Executed”活动是否发生多次,或状态是否从“Technically Completed”回退至“In Process”。该属性支持“Maintenance Rework Rate”KPI,并有助于识别质量问题。 为什么重要 直接支持质量控制分析。 获取位置 根据流程顺序流计算 示例 truefalse | |||
| 计划人工工时 PlannedLaborHours | 订单预计所需的人工工时。 | ||
| 说明 订单工序中的计划工作总量(ARBEI)。将其与实际Activity Duration进行比较,可在“Planning and Estimation Performance”仪表板中评估维护计划的准确性。 为什么重要 用于计划准确性分析的基础指标。 获取位置 SAP表AFKO(工序计划工作量总和) 示例 4.08.512.0 | |||
资产维护活动
| 活动 | 说明 | ||
|---|---|---|---|
| Goods Issue已过账 | 记录针对工单实际领用备件或物料的情况。该活动取自与工单关联的物料凭证抬头。 | ||
| 为什么重要 确认备件可用且已完成拣配,直接影响Parts Availability Wait Time分析。 获取位置 表MSEG/MKPF,移动类型261(工单发料)。 采集 执行事务MIGO/MB1A时记录 事件类型 explicit | |||
| Maintenance Order已下达 | 表示计划已完成,工单已下达执行。通过监控系统状态日志中变更为REL的状态进行捕获。 | ||
| 为什么重要 该里程碑将计划阶段与执行阶段分开,是衡量Planning and Estimation Lead Time的关键。 获取位置 表JCDS(状态变更文档),状态I0002(REL)。 采集 JCDS中状态更新为REL时记录 事件类型 explicit | |||
| Maintenance Order已创建 | 标志着系统中Maintenance Work Order对象的生成。该活动直接取自Order Master Data表的创建时间戳。 | ||
| 为什么重要 这是案例的核心锚点事件,标志着流程从请求转入计划和执行。 获取位置 表AUFK,字段ERDAT(日期)和ERFZEIT(时间)。 采集 执行事务IW31时记录 事件类型 explicit | |||
| Order Operation已确认 | 表示记录技术人员在特定操作上实际投入的时间,反映资产上的实际执行工作。 | ||
| 为什么重要 该活动是计算Mean Time to Repair和人工成本的主要数据来源。 获取位置 表AFRU(订单确认)。 采集 执行事务IW41时记录 事件类型 explicit | |||
| 已设置Business Completion | 标志着工单最终完成行政关闭,之后不得再过账成本。通过状态变更为CLSD(Closed)进行捕获。 | ||
| 为什么重要 表示工单生命周期的最终终点,对Data Accuracy和Records Compliance至关重要。 获取位置 表JCDS,状态I0046(CLSD)。 采集 JCDS中状态更新为CLSD时记录 事件类型 explicit | |||
| 已设置Technical Completion | 标志着维护工作已在物理和技术层面完成。通过状态变更为TECO(Technically Completed)进行捕获。 | ||
| 为什么重要 这是运营分析中最关键的终点,表示资产已恢复,维护工作已完成。 获取位置 表JCDS,状态I0045(TECO)。 采集 JCDS中状态更新为TECO时记录 事件类型 explicit | |||
| Maintenance Notification已创建 | 记录Maintenance Notification的初始创建,通常这是生成工单的触发事件。该活动取自QMEL表的创建时间戳,将上游请求与执行工单关联起来。 | ||
| 为什么重要 该活动标志着端到端维护流程的开始,可用于计算故障检测到工单生成之间的响应时间。 获取位置 表QMEL,字段ERDAT(创建日期)和MZEIT(时间)。通过QMEL-AUFNR与工单关联。 采集 QMEL表创建记录时记录 事件类型 explicit | |||
| Maintenance Priority已更改 | 记录工单优先级的更新,例如升级为Emergency。该活动源自与订单主数据关联的Change Documents。 | ||
| 为什么重要 跟踪优先级变更有助于解释流程偏差,并通过识别响应式升级,为Emergency Work Order Impact Monitor提供支持。 获取位置 表CDPOS/CDHDR,对象类AUFTRAG,字段PRIOK。 采集 在Change Documents(CDPOS)中记录 事件类型 explicit | |||
| Order Cost已结算 | 表示工单归集的成本已转入控制对象,例如成本中心。该活动取自Controlling凭证。 | ||
| 为什么重要 跟踪财务结算环节,并为Financial Settlement Duration KPI提供支持。 获取位置 表COBK(CO对象:凭证抬头),与工单关联。 采集 执行结算事务KO88时记录 事件类型 explicit | |||
| Purchase Requisition已创建 | 表示已生成外部采购或服务请求,将内部维护工单与外部供应链连接起来。 | ||
| 为什么重要 对于分析外部供应商或非库存物料采购造成的延误至关重要。 获取位置 表EBAN,通过科目分配与AUFK-AUFNR关联。 采集 创建EBAN记录时记录 事件类型 explicit | |||
| Technical Completion已撤销 | 记录撤销Technical Completion状态,表示工单已重新打开,并在流程模型中形成返工循环。 | ||
| 为什么重要 这是Maintenance Rework Rate KPI的主要指标,可突出显示过早关闭或质量问题。 获取位置 表JCDS,状态I0045(TECO)变更为非活动。 采集 TECO状态停用时记录 事件类型 explicit | |||
| Work Order已排程 | 表示将具体操作安排到某项产能或日期。该活动根据向操作分配Dispatch状态推断。 | ||
| 为什么重要 衡量资源分配效率,并为Resource Utilization and Scheduling仪表板提供支持。 获取位置 操作对应的表JCDS(状态变更文档),对象类型OV,状态I0009(DSPT)。 采集 比较状态字段变更前后的值 事件类型 inferred | |||
| 已添加物料组件 | 记录向工单组件清单中添加备件或物料。该活动取自预留行项目的创建。 | ||
| 为什么重要 标志着所需备件采购周期的开始,为Spare Parts Procurement Lead Times仪表板提供支持。 获取位置 表RESB,字段BDTER(需求日期)或创建时间戳。 采集 向RESB添加行项目时记录 事件类型 explicit | |||
| 已记录测量读数 | 记录测量凭证的录入,例如计数器读数或状态评估。该活动通常作为Technical Inspection事件。 | ||
| 为什么重要 对于Condition Based Maintenance和跟踪Technical Inspection Cycle Times至关重要。 获取位置 表IMRG(测量凭证),与Equipment或Functional Location关联。 采集 创建测量凭证时记录 事件类型 explicit | |||
提取指南
步骤
确定数据源接口:确定访问SAP S/4HANA SQL接口的方式。通常可通过SAP HANA Studio、Eclipse中的ABAP Development Tools(ADT),或在HANA数据库向分析层开放时使用DBaaS连接字符串。
确认CDS视图可用性:确保S/4HANA系统中的标准Core Data Services(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')筛选,避免数据重复或跨客户端数据泄露。 - 日期范围:建议将Maintenance Order的CreationDate筛选为最近6至12个月。若不设置日期筛选,查询JCDS(状态)或CDPOS(变更文档)的完整历史可能导致性能超时。
- 语言键:查询默认使用英语('E')。如果组织使用其他主要语言显示文本描述,请调整语言筛选条件。
- 系统访问:需要访问ABAP Core Data Services架构或底层HANA表。访问原始表JCDS和CDHDR对于历史状态分析至关重要,因为纯CDS视图通常基于快照。
- 订单类型:查询会提取所有订单类型。如果只需分析特定维护场景,可按
MaintenanceOrderType筛选,例如仅保留PM01、PM02。
a 示例查询 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不保留状态变更历史,请配置[Your status history table]及其时间戳字段。
- 从QMEL提取通知创建记录,从RESB提取组件创建记录,从EBAN提取采购申请创建记录,从MSEG和MKPF提取货物发放信息,从AFRU提取确认记录,从IMRG提取计量读数,并从[Your controlling document table]提取控制结算记录。从[Your order change document table]和[Your change document item table]提取优先级变更。这些源是必需的,因为仅凭AUFK、AFVC和JEST无法提供所需的全部14项活动。
- 将所有源时间戳规范化为统一时区和单一时间戳数据类型。将SAP日期和时间字段或数据库时间戳字段转换为EventTimestamp。保留系统提供的源时间戳精度。按EventTimestamp应用配置的提取时间范围,而不仅按订单创建日期筛选。
- 为每个源事件创建一行事件。不要依赖ProcessMind推断事件。分配查询中指定的准确Activity值,填充MaintenanceWorkOrder、EventTimestamp、SourceSystem、LastDataUpdate以及可用的建议属性,并在有助于调查重复记录时保留源标识符。
- 仅使用稳定的源键对完全相同的源事件去重。不要合并在不同时间发生的独立状态变更、确认、物料移动、计量读数或结算文档。如果多个源记录代表同一业务事件,请在提取规范中记录所选源的优先级。
- 验证全部14个活动值均以明确事件行形式出现,且每行都有案例标识符和时间戳,同时确认时间戳位于请求的提取期间内。使用相同筛选条件与SAP报表或源表记录数进行比对。
- 将结果导出为UTF-8 CSV或其他ProcessMind支持的事件日志格式。每行保留一个事件,使用准确配置名称包含必需列,在支持的情况下保留ISO 8601时间戳,然后将文件上传到ProcessMind,或在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个月开始。使用包含起始边界、不包含结束边界的时间范围,避免增量运行之间产生重复事件。进行历史回填时,按月或数据库支持的其他周期分段提取。
- 筛选条件:根据报表范围配置[Company Code filter]、[Order Type filter]、[Maintenance Plant filter]、[Notification Type filter]和[Document Type filter]。不要应用会排除无通知、工序、组件、采购申请、确认、测量或结算文档订单的筛选条件。
- 状态历史:JEST通常表示状态分配,但历史状态变更可能需要[Your status history table]或变更文档。请配置包含状态变更时间戳和状态转换历史的数据源。
- 优先级历史:优先级变更需要[Your order change document table]和[Your change document item table],并获取相关对象标识符、字段名称、旧值、新值和变更时间戳。
- 源系统值:将[Your SAP system identifier]替换为组织使用的稳定源系统名称。
- 上次数据更新:将[Your extraction timestamp]替换为提取运行开始或结束时生成的时间戳,并对该次运行的所有行使用相同值。
- 性能:在允许的情况下为连接和筛选列建立索引或分区,限制提取窗口,仅选择必需列,分批处理较大周期,并在直接跨架构连接较慢时物化中间源数据。
- 前提条件:具备数据库连接、所有已配置源表的读取权限、访问相关工厂维护、物料管理、控制和测量数据的权限,以及提取运营数据的批准。请确认数据库平台的复制或许可限制。
a 示例查询 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分钟完成设置