您的仓库管理数据模板
您的仓库管理数据模板
- 全面分析所需的推荐属性
- 流程中需要跟踪的关键活动
- 从SAP EWM提取数据的指南
仓库管理属性
| 名称 | 说明 | ||
|---|---|---|---|
| 仓库订单 WarehouseOrder | 仓库订单的唯一标识符,用于归集分配给某项资源执行的一组仓库任务。 | ||
| 说明 仓库订单是追踪仓库内货物处理端到端流程的主要案例标识符。它代表一个工作包,例如为出库交货单拣货或将收到的货物上架。每个仓库订单包含一个或多个仓库任务。 在流程挖掘中,按仓库订单分析可全面了解特定工作包的整个生命周期。这有助于识别瓶颈、衡量从创建到完成的整体周期时间,并了解单项物流指令涉及的完整活动流程。 重要性 这是连接所有相关仓库活动的核心标识符,可用于分析单项工作的端到端流程并衡量周期时间。 获取途径 此标识符通常位于SAP EWM仓库订单抬头表中,例如/SCWM/WHO。 示例 200000145200000146200000147 | |||
| 开始时间 EventTime | 表示活动或事件开始时间的时间戳。 | ||
| 说明 此属性记录具体仓库活动发生的准确日期和时间,是事件排序及计算事件间时长的主要时间依据。 在流程挖掘中,开始时间对于构建每个案例的事件时间顺序至关重要。它用于计算周期时间、等待时间和处理时间,这些指标是绩效分析、瓶颈识别和SLA监控的重要依据。 重要性 此时间戳对于按时间顺序排列事件,以及计算周期时间和时长等各类时间绩效指标至关重要。 获取途径 通常位于/SCWM/ORDIM_C等事件或确认表中(例如字段CONF_TIMESTAMP),也可能记录在与仓库订单和任务相关的状态变更日志中。 示例 2023-10-26T10:00:00Z2023-10-26T10:15:30Z2023-10-26T11:20:00Z | |||
| 数据上次更新时间 LastDataUpdate | 表示此记录的数据上次从源系统刷新时间的时间戳。 | ||
| 说明 此属性记录数据上次从源系统提取的时间,有助于了解所分析数据的新鲜度。 无论是分析还是仪表板,了解数据的时效性对于做出有依据的决策都很重要。此时间戳可帮助用户判断当前查看的是实时信息,还是某个时间点的快照,从而合理评估数据的时效性。 重要性 此属性反映数据的新鲜度,帮助用户了解流程分析所依据的数据有多新。 获取途径 这是通常在数据提取(ETL)过程中生成并添加的元数据字段,记录数据加载时间戳。 示例 2023-11-01T02:00:00Z2023-11-02T02:00:00Z | |||
| 活动名称 ActivityName | 发生的具体仓库管理活动或事件名称,例如“创建拣货任务”或“过账发货”。 | ||
| 说明 此属性描述仓库管理流程中的单个步骤或事件。这些活动构成流程图的基本要素,包括创建、确认、包装、装车和货物移动等任务。 分析这些活动的顺序和频率是流程挖掘的基础,有助于呈现流程、识别常见和少见路径、发现偏离标准过程的情况,并找出导致延误或返工的具体步骤。 重要性 它定义了流程中的各个步骤,构成流程图的基础,并支持对流程、偏差和瓶颈进行分析。 获取途径 可根据仓库订单和任务相关的状态变更、事件消息或事务日志推导,例如/SCWM/ORDIM_C(确认)表中的记录,或通过解读/SCWM/WHO和/SCWM/ORDIM_O中的状态字段得出。 示例 确认拣货任务创建上架任务过账收货完成仓库订单 | |||
| 源系统 SourceSystem | 标识数据提取自哪个源系统,例如SAP EWM生产实例。 | ||
| 说明 此属性指定仓库管理数据的来源系统。在拥有多个系统的企业环境中,标明数据来源对于追溯和理解数据背景至关重要。 分析时,这有助于区分跨多个系统的流程,或比较不同实例中的流程,例如不同地区使用的独立系统。明确的数据沿袭也便于追踪和完整审计。 重要性 在拥有多个SAP实例或集成系统的环境中,此属性可提供追溯能力和数据背景,并确保数据沿袭清晰。 获取途径 这通常是在数据提取、转换和加载(ETL)过程中添加的静态值,用于标识具体的SAP S/4HANA或EWM实例。 示例 SAP_EWM_PROD_EUS4H_US_100EWM_APAC_PRD | |||
| 仓库订单状态 WarehouseOrderStatus | 仓库订单当前或最终的状态,例如“已完成”或“已取消”。 | ||
| 说明 此属性表示仓库订单的最终结果。了解订单是成功完成还是已取消,对于分析流程成功率和查明未完成原因至关重要。 这是许多分析中的关键筛选条件。例如,计算端到端仓库周期时间时,通常只分析已完成的订单。此属性也有助于识别和调查订单取消的频率及原因。 重要性 表示案例的结果,可用于筛选已完成或已取消的订单,这对于准确分析周期时间和吞吐量至关重要。 获取途径 状态字段通常位于仓库订单抬头表/SCWM/WHO中。 示例 已完成处理中已取消 | |||
| 仓库订单类型 WarehouseOrderType | 按用途对仓库订单分类,例如上架、拣货或内部补货。 | ||
| 说明 仓库订单类型根据订单承担的物流职能进行分类。此区分至关重要,因为不同类型的订单遵循不同的流程路径,绩效要求也各不相同。 在分析中,此属性是主要的筛选和比较维度。例如,“仓库订单吞吐量与数量”仪表板会据此区分入库(上架)和出库(拣货)流程的绩效,从而更有针对性地呈现仓库运营情况。 重要性 可按流程类别(如入库或出库)细分分析,从而进行更有针对性的比较并获得相关洞察。 获取途径 此类型由仓库流程类型确定,通常可在仓库订单抬头表/SCWM/WHO中找到。 示例 拣货上架补货存储 | |||
| 优先级 Priority | 分配给仓库订单的优先级,表示其紧急程度(例如高、中、低)。 | ||
| 说明 此属性根据业务重要性或紧急程度对仓库订单进行分类。例如,高优先级订单可能是加急发货或关键生产物料供应订单,需要优先处理。 优先级是“优先级订单履约遵循情况”仪表板和KPI的重要维度。通过筛选和细分绩效数据,可确保最紧急的订单在预期时限内处理,使仓库运营与业务目标保持一致。 重要性 支持按优先级开展分析和监控,确保紧急订单达到服务水平要求,直接影响客户满意度。 获取途径 优先级可在基础交付单据中设置,并传递至仓库订单。相关信息可能位于/SCWM/WHO等表中。 示例 高中低 | |||
| 物料编号 MaterialNumber | 仓库任务中所处理产品或物料的唯一标识符。 | ||
| 说明 此属性指定正在移动、拣取、包装或接收的物料,是根据产品特征细分和分析仓库绩效的重要维度。 按物料编号分析,有助于了解哪些产品上架时间最长、哪些产品最常发生拣货错误,或哪些产品需要质量检验。这对于“收货与上架绩效”和“质量检验周期时间”仪表板至关重要。 重要性 可按产品筛选和细分流程数据,有助于发现产品在搬运、存储或质量控制方面的特定问题。 获取途径 此信息通常可在/SCWM/ORDIM_O等仓库任务表中找到,并与物料主数据关联。 示例 FIN-1001RAW-2050SFIN-300-A | |||
| 用户ID User | 确认或执行活动的仓库操作人员或用户的标识符。 | ||
| 说明 此属性记录负责执行仓库任务的人员用户ID,例如确认拣货的拣货员、包装工位的包装人员,或确认上架的叉车操作员。 此数据对于“资源与设备利用率”仪表板至关重要,可用于分析个人或团队绩效、发现培训需求,并更有效地平衡仓库员工的工作量。 重要性 将工作关联到具体人员,支持按用户或团队分析绩效,并协助管理资源和平衡工作量。 获取途径 通常可在仓库任务的确认数据中找到,例如/SCWM/ORDIM_C表的UNAME字段。 示例 JSMITHARODRIGUEZOPERATOR_05 | |||
| 结束时间 EventEndTime | 表示活动或事件完成时间的时间戳。 | ||
| 说明 此属性记录具体仓库活动结束的日期和时间。对于原子事件,它通常与开始时间相同;对于包装或装车等具有可测量时长的活动,则可能不同。 单独记录结束时间,才能准确计算各项活动的处理时间。这对于分析具体步骤时长的绩效仪表板至关重要,例如“拣货与包装效率”仪表板,可帮助识别最耗时的任务。 重要性 可准确计算单项活动的时长,有助于识别耗时步骤和资源密集型任务。 获取途径 对于离散事件,结束时间通常与开始时间戳相同。对于持续时间较长的任务,它可能是/SCWM/ORDIM_C等表中的独立字段,也可能根据后续状态变更推导。 示例 2023-10-26T10:05:00Z2023-10-26T10:25:45Z2023-10-26T11:20:00Z | |||
| 仓库任务 WarehouseTask | 单个仓库任务的唯一标识符。仓库任务是仓库订单的组成部分。 | ||
| 说明 仓库任务是执行特定货物移动的指令,例如将产品从存储货位移至包装工位。一个仓库订单可包含一个或多个此类任务。 按任务层级分析可更细致地了解仓库作业,有助于分析具体移动的资源绩效、发现难以到达的存储货位,或评估单项拣货和上架活动的效率。 重要性 提供更细致的分析信息,便于检查大型仓库订单中的单项移动和步骤。 获取途径 可在/SCWM/ORDIM_O(任务数据)和/SCWM/ORDIM_C(确认数据)等仓库任务表中找到。 示例 300000451300000452300000453 | |||
| 使用的设备 EquipmentUsed | 用于执行仓库任务的设备标识,例如叉车或托盘搬运车。 | ||
| 说明 此属性指定分配给仓库任务或用于执行任务的物料搬运设备,例如特定叉车、自动导引车(AGV)或某种类型的手推车。 此数据是“资源与设备利用率”仪表板和“设备利用率”KPI的基础。通过跟踪各项任务使用的设备及使用时长,管理者可以分析设备利用模式、安排维护,并据此决定车队规模和构成。 重要性 支持分析设备利用率和效率,帮助优化车队管理并识别资源限制。 获取途径 如果SAP EWM已配置资源管理,此信息可能存储在仓库任务或订单详情中。请参阅SAP Extended Warehouse Management文档。 示例 叉车-07自动导引车-02手推车-15 | |||
| 存储位置 StorageLocation | 仓库内货物移入或移出的具体位置,例如存储货位。 | ||
| 说明 此属性用于标识仓库任务涉及的实际位置,例如拣选的源货位或上架的目标货位。位置范围可以从较大的区域到具体的货架坐标。 按存储位置分析有助于发现运营情况,例如找出拣选率较高的“黄金区域”,或经常发生延误和错误的问题区域。还可用于“拣选路线遵循情况”分析,了解拣货员在仓库内的移动路径。 重要性 提供仓库内的位置背景信息,便于分析移动效率、货位可达性和拣选路线优化情况。 获取途径 通常可在/SCWM/ORDIM_O等仓库任务表中找到,其中包含源货位(VLPLA)和目标货位(NLPLA)信息。 示例 01-02-03包装站-01发货区-A | |||
| 实际数量 ActualQuantity | 用户为仓库任务确认的物料实际数量。 | ||
| 说明 此属性表示仓库操作员实际处理并确认的数量,例如从货位拣出的数量、上架数量或收货时清点的数量。 将实际数量与计划数量比较,是开展“库存差异分析”的基础。两者之间的差异会直接揭示需要调查的流程异常。这是衡量运营准确率的直接指标,也是“库存准确率”和“拣选错误率”KPI的重要输入。 重要性 这是实际处理数量的真实记录。将其与计划数量比较,可直接衡量运营准确率并发现错误。 获取途径 可在仓库任务确认数据中找到,例如/SCWM/ORDIM_C表中的NDIFF(差异数量)字段,或根据已确认数量计算得出。 示例 10049250 | |||
| 数量差异 QuantityVariance | 任务的计划数量与实际确认数量之差。 | ||
| 说明 此计算指标用于量化仓库任务中发现的差异。非零值表示实际情况与系统记录不符,可能意味着拣选错误、收货失误或物品损坏等问题。 此属性可通过显示错误幅度,直接支持“库存差异分析”仪表板。分析差异出现的频率和大小,有助于找出库存管理和运营执行中的系统性问题,为提高准确率提供依据。 重要性 直接量化库存和运营中的不准确情况,便于发现并分析差异幅度。 获取途径 对每项相关任务,用ActualQuantity减去PlannedQuantity计算得出。 示例 0-15 | |||
| 是否按时 IsOnTime | 布尔标记,表示仓库订单是否在要求完成日期前完成。 | ||
| 说明 此标记以简单的二元结果表示SLA达成情况,用于判断仓库订单的最终完成事件是否发生在指定的要求完成日期当天或之前。 此属性是“优先级订单履约遵循情况”仪表板的重要组成部分。它便于创建KPI和可视化内容,也可轻松统计和筛选按时与逾期订单。无需在分析层进行复杂的日期计算,即可快速评估服务水平目标的达成情况。 重要性 通过清晰的二元指标显示每个订单是否按时履约,简化SLA绩效分析。 获取途径 这是一个计算属性。逻辑会比较“仓库订单已完成”活动的时间戳与“RequestedCompletionDate”属性。 示例 truefalse | |||
| 端到端周期时间 EndToEndCycleTime | 从创建仓库订单到最终完成所经过的总时间。 | ||
| 说明 此KPI衡量仓库订单整个生命周期的持续时间,是反映仓库运营整体效率和处理速度的重要高层指标。 此指标是“端到端仓库周期时间”仪表板的核心。持续跟踪该KPI,并按订单类型或物料等维度细分,有助于发现系统性低效问题,并衡量流程改进措施对整体运营的影响。 重要性 这是衡量仓库流程整体效率的核心KPI,可从宏观层面了解运营绩效。 获取途径 在案例层级计算:用最后一个事件(“仓库订单已完成”)的时间戳减去第一个事件(“仓库订单已创建”)的时间戳。 示例 8640017280043200 | |||
| 要求完成日期 RequestedCompletionDate | 要求高优先级仓库订单完成的日期。 | ||
| 说明 此属性定义仓库订单的服务水平协议(SLA)或目标完成日期。实际完成时间将与此截止日期比较,以判断订单是否按时完成。 此日期是计算“优先级订单履约率”KPI的重要依据。将实际完成时间戳与要求完成日期比较,可量化服务水平达成情况,并找出可能逾期或已经延误的订单。 重要性 定义订单的SLA,是衡量按时履约情况的基准,尤其适用于高优先级物料。 获取途径 此日期通常根据触发仓库订单的出库交付订单中的计划发货日期或交付日期得出。请参阅SAP Extended Warehouse Management文档。 示例 2023-10-27T17:00:00Z2023-10-28T12:00:00Z | |||
| 计划发运时间 PlannedDepartureTime | 计划从仓库发出货物的时间。 | ||
| 说明 此属性表示完成拣选、包装和装载后计划发运货物的目标时间,是衡量出库流程最后阶段是否按时完成的基准。 此时间戳对于“货物按时发运绩效”仪表板至关重要。将实际发运时间与计划时间比较,可发现装载、承运商协调或单据处理方面的延误,并了解物流和运输计划的效率。 重要性 为衡量按时发运绩效提供基准,这对于物流计划和遵守承运商时刻安排至关重要。 获取途径 此信息通常位于与仓库订单关联的运输或货运单据中。请参阅SAP Extended Warehouse Management文档。 示例 2023-10-27T18:00:00Z2023-10-28T14:00:00Z | |||
| 计划数量 PlannedQuantity | 仓库任务要求处理的物料预期数量。 | ||
| 说明 此属性表示根据仓库任务指令应移动、拣选或接收的物料目标数量,是与实际执行数量进行比较的基准。 计划数量是“库存差异分析”仪表板和“库存准确率”KPI的重要依据。将其与实际数量比较,系统便可发现差异,这些差异可能源于拣选错误、收货失误或数据录入问题,从而帮助提高库存准确率。 重要性 作为计算库存准确率和识别差异的基准,对于维持准确的库存水平至关重要。 获取途径 可在仓库任务数据中找到,例如/SCWM/ORDIM_O表中的NISTA(目标数量)字段。 示例 10050250 | |||
仓库管理活动
| 活动 | 说明 | ||
|---|---|---|---|
| 创建仓库订单 | 此活动表示创建了一个仓库订单(WO)。仓库订单是由多个仓库任务组成的工作包。系统会根据作业区域、队列或产品等条件生成WO,将工作分配并整理给仓库员工。 | ||
| 重要性 这是仓库执行流程的主要开始事件。分析从创建到首次操作的时间,有助于发现工作分配和资源调度方面的延误。 获取途径 此事件取自仓库订单抬头表/SCWM/WHO中的创建时间戳(字段CREATED_AT)。 采集 从/SCWM/WHO表提取每个仓库订单编号(WHO)的创建时间戳。 事件类型 explicit | |||
| 完成仓库订单 | 仓库订单的所有关联仓库任务均确认后,其状态会设为“已完成”。从执行角度看,这表示该工作包已结束。 | ||
| 重要性 这是流程的主要成功结束事件,对于计算端到端仓库周期时间和衡量整体吞吐量至关重要。 获取途径 追踪仓库订单抬头表/SCWM/WHO中状态字段(STAT)变为“已完成”的记录。可使用该表的更改日志(DBTABLOG)或专用时间戳字段。 采集 确定/SCWM/WHO中的状态设为“C”(已完成)的时间戳。 事件类型 inferred | |||
| 完成包装 | 此活动表示货件中的所有商品均已装入装卸单元,且装卸单元已关闭并贴好标签。包装完成的货物可进入下一阶段,例如集货或装车。 | ||
| 重要性 此节点标志着包装阶段结束。包装完成是集货和发运的前提,因此此处的任何延误都会直接影响整体周期时间及“包装与集货周期时间”KPI。 获取途径 当装卸单元(HU)状态设为“已关闭”,或WO的最后一个包装相关仓库任务得到确认时,可记录此事件。/SCWM/HUHDR表包含HU状态信息。 采集 确定与订单关联的最终运输装卸单元关闭或完成的时间戳。 事件类型 inferred | |||
| 确认上架任务 | 仓库操作人员确认上架仓库任务已完成,即货物已实际放入指定存储货位。确认后,库存位置会实时更新。 | ||
| 重要性 这是入库处理的关键节点,确认库存已可用于拣货。此处的延误会直接影响“从收货到上架周期时间”KPI。 获取途径 取自仓库任务表/SCWM/WT中的确认时间戳(字段CONFIRMED_AT)。任务状态(STAT)也会变为“已确认”。 采集 使用/SCWM/WT表中与仓库订单关联的上架任务确认时间戳。 事件类型 explicit | |||
| 确认拣货任务 | 仓库操作人员确认拣货仓库任务已完成,表示货物已从存储位置实际取出。通常通过RF扫描器完成确认。 | ||
| 重要性 这是订单履约的关键节点,会直接影响订单到发货的周期时间。分析此活动有助于衡量拣货人员的效率并发现拣货瓶颈。 获取途径 取自仓库任务表/SCWM/WT中的确认时间戳(字段CONFIRMED_AT)。任务状态(STAT)会更新为“已确认”。 采集 使用/SCWM/WT表中与仓库订单关联的拣货任务确认时间戳。 事件类型 explicit | |||
| 过账发货 | 这是系统中最后一个物流和财务步骤,正式将货物从仓库库存中扣除。这表示货物所有权已转移,货件已正式发出。 | ||
| 重要性 这是出库流程的关键终点,会触发开票和库存更新,也是衡量准时发货及“装车与发运时间”KPI的重要依据。 获取途径 根据与仓库订单关联的出库交货单过账记录推断。请检查/SCDL/DB_PROCH_O表中的单据流或状态字段(如DGI_STAT)。 采集 确定关联出库交货单的发货状态设为“已完成”的时间戳。 事件类型 explicit | |||
| 创建上架任务 | 系统会生成一项具体指令,即仓库任务(WT),将收到的货物从收货区移至最终存储货位。此活动表示系统已准备好执行上架移动。 | ||
| 重要性 追踪任务创建到确认之间的时间,可了解仓库操作人员需要多久才能接收并执行上架指令,并发现潜在的劳动力或设备短缺。 获取途径 取自/SCWM/WT表中相关仓库任务的创建时间戳(字段CREATED_AT),其流程类型应为上架。 采集 筛选与仓库订单关联且流程类型为上架的仓库任务,并使用其创建时间戳。 事件类型 explicit | |||
| 创建拣货任务 | 系统会生成仓库任务(WT),从存储货位拣取货物以履行出库交货订单。这是系统向操作人员发出的取货指令。 | ||
| 重要性 这是出库实物作业的起点。拣货任务从创建到确认的时间差,是分析拣货效率和资源可用性的关键依据。 获取途径 取自/SCWM/WT表中相关仓库任务的创建时间戳(字段CREATED_AT),其流程类型应为拣货。 采集 筛选与仓库订单关联且流程类型为拣货的仓库任务,并使用其创建时间戳。 事件类型 explicit | |||
| 取消仓库订单 | 仓库订单会在所有任务完成前取消,后续执行也随之停止。库存不足、客户订单变更或其他异常都可能导致取消。 | ||
| 重要性 这代表失败或异常路径。分析取消频率和原因,有助于发现计划、库存准确率或订单管理中的上游问题。 获取途径 追踪仓库订单抬头表/SCWM/WHO中状态字段(STAT)变为“已取消”的记录。 采集 确定/SCWM/WHO中的状态设为取消状态值的时间戳。 事件类型 inferred | |||
| 完成装车 | 表示货件中的所有货物均已实际装上运输单元。这是过账发货和车辆发运的前提。 | ||
| 重要性 这是最终发运前的关键节点。装车完成到发货过账之间的延误,可能表明单据或系统问题正在耽误承运商。 获取途径 根据关联运输单元(TU)或出库交货订单的状态变更推断,状态变为“完成装车”。/SCWM/TU和/SCDL/DB_PROCH_O表中的状态信息与此相关。 采集 记录TU或交货订单状态更新为装车完成时的时间戳。 事件类型 inferred | |||
| 开始包装 | 表示包装作业开始,拣取的商品会集中整理并放入运输容器或装卸单元中。这通常是包装工作中心的第一步。 | ||
| 重要性 标志着增值服务阶段开始。测量包装所需时间,有助于优化工作中心布局、人员配置和物料安排。 获取途径 此事件可能需要推断。可根据商品或装卸单元在包装工位的首次扫描记录推导,相关记录通常保存在工作中心或装卸单元日志中。/SCWM/PACKSPEC等表及相关执行日志也可作为数据来源。 采集 使用该交货单首个与包装相关的仓库任务确认时间戳,或最终运输装卸单元(HU)的创建时间。 事件类型 inferred | |||
| 开始装车 | 此活动表示开始将货物从集货区实际装上卡车或运输单元。通常由用户在系统中执行操作触发。 | ||
| 重要性 这是仓库最后一个实物作业步骤的起点。分析装车时长有助于优化月台门使用率和承运商周转时间。 获取途径 根据关联运输单元(TU)或出库交货订单的状态变更推断,状态变为“开始装车”。可检查/SCWM/TU_STATUS表。 采集 记录TU或交货订单状态更新为装车开始时的时间戳。 事件类型 inferred | |||
| 确认集货任务 | 仓库操作人员确认已将包装好的装卸单元从包装工位或集货区移至指定的发运集货区。此时货物已就位,可供装车。 | ||
| 重要性 这标志着流程从内部处理转入出库物流。集货延误可能导致装货月台秩序混乱,并错过承运商的提货时间。 获取途径 取自流程类型为集货移动的仓库任务(/SCWM/WT)确认时间戳(字段CONFIRMED_AT)。 采集 确定与装卸单元或交货单关联的集货仓库任务确认时间戳。 事件类型 explicit | |||
| 过账收货 | 表示正式接收来自外部供应商或生产环节的货物并将其纳入仓库库存。这是一项重要的财务和库存过账操作,可使库存可见,并供上架等后续流程使用。 | ||
| 重要性 这是入库流程中的关键节点。货物到达与完成过账之间的时间可反映收货区的积压情况,并影响库存可用性。 获取途径 根据与仓库订单关联的入库交货单过账记录推断。请检查/SCDL/DB_PROCH_I表中的单据流或状态字段(如DGRSTAT)。 采集 确定关联入库交货单的收货状态设为“已完成”的时间戳。 事件类型 inferred | |||
数据提取指南
步骤
- 前提条件:确定或创建CDS视图:主要数据源是SAP S/4HANA仓库管理标准CDS视图。关键视图包括用于订单级事件的
I_WarehouseOrder和用于任务级事件的I_WarehouseTask。此外,还需要I_OutboundDeliveryItem、I_InboundDeliveryItem和I_EWMTransportationUnit等视图,以获取相关物流事件。请确认这些视图已在您的系统中激活。 - 创建自定义CDS视图:要将多个来源的数据整合为统一的事件日志格式,必须创建自定义CDS视图。使用Eclipse中的ABAP开发工具(ADT)创建新的数据定义。该自定义视图将使用
UNION ALL合并不同来源的记录,每条记录对应一项独立的业务活动。 - 定义事件日志结构:在自定义CDS视图中,定义事件日志的列字段,包括
WarehouseOrder、ActivityName、EventTime以及其他必需和建议使用的属性。将这些字段映射到基础标准CDS视图中的字段。 - 建模仓库订单事件:在联合查询中添加第一组
SELECT语句。从I_WarehouseOrder中读取数据,使用创建时间戳生成“仓库订单已创建”事件。随后添加SELECT语句,根据订单状态筛选数据,并使用相应的确认时间戳或变更时间戳,生成“仓库订单已完成”和“仓库订单已取消”事件。 - 建模仓库任务事件:添加从
I_WarehouseTask读取数据的SELECT语句。筛选与上架相关的仓库流程类别,生成“上架任务已创建”和“上架任务已确认”事件。同样,根据各自的流程类别以及创建和确认时间戳,生成“拣货任务已创建”“拣货任务已确认”和“集货任务已确认”事件。 - 建模货物移动事件:将交货相关视图与仓库任务关联,以获取货物移动信息。对于“收货已过账”事件,从
I_InboundDeliveryItem中读取ActualGoodsMovementDateTime字段。对于“发货已过账”事件,使用I_OutboundDeliveryItem中的同一字段,并关联相应的仓库订单或任务。 - 建模装载和包装事件:从
I_EWMTransportationUnit中读取专用时间戳,生成“开始装载”和“装载已完成”事件。包装流程可能较复杂,可通过处理单元视图中的创建时间近似表示“开始包装”,并使用状态变更时间表示“包装已完成”。请根据您的具体包装流程调整此步骤。 - 添加注释以公开CDS视图:在自定义CDS视图定义中添加注释
@OData.publish: true。SAP将据此自动根据视图结构生成OData服务。 - 激活CDS视图和OData服务:在ADT中激活新的数据定义。然后前往SAP Gateway中心系统,使用事务
/IWFND/MAINT_SERVICE查找并激活新生成的OData服务。完成后,即可通过REST API端点访问数据。 - 提取数据:使用目标数据平台或ETL工具连接已激活的OData服务端点。在OData URI中直接应用筛选条件,例如按
EventTime筛选以限制数据范围(如?$filter=EventTime ge datetime'2023-01-01T00:00:00')。 - 整理为流程挖掘所需格式:确保将提取的数据保存为CSV等扁平文件,列标题与ProcessMind所需属性一致(如
WarehouseOrder、ActivityName、EventTime等)。将最终文件上传至流程挖掘工具。
配置
- 自定义CDS视图:必须创建专用CDS视图,例如
Z_C_EWM_EVENTLOG_CDS,以统一事件数据。这是提取数据的核心对象。 - OData服务:必须激活根据自定义CDS视图生成的OData服务。服务名称通常是在CDS视图名称后添加
_CDS后缀。 - 日期范围筛选:调用OData API时,必须对
EventTime字段应用日期筛选。首次分析通常可选取3至6个月的数据。如果不设置筛选条件,查询可能超时或影响性能。 - 实体筛选:如需进一步缩小数据范围,可按仓库编号(
仓库)、仓库订单类型(WarehouseOrderType)或特定物料(MaterialNumber)等属性进行筛选。 - 系统授权:创建CDS视图的用户需要在ADT中拥有SAP开发者访问权限。调用OData API的用户或服务账号需要获得访问底层仓库管理数据的授权。
查询示例 sql
DEFINE VIEW Z_C_EWM_EVENTLOG_CDS
WITH PARAMETERS
P_StartDate : abap.dats,
P_EndDate : abap.dats
AS SELECT FROM I_WarehouseOrder AS WO
{
-- Required Attributes
WO.WarehouseOrder AS WarehouseOrder,
CAST('Warehouse Order Created' AS abap.char(40)) AS ActivityName,
WO.CreationDateTime AS EventTime,
CAST('S4HANA_EWM' AS abap.char(20)) AS SourceSystem,
tstmp_current_utctimestamp() AS LastDataUpdate,
-- Recommended Attributes
CAST(NULL AS abap.tstp) AS EventEndTime,
CAST(NULL AS abap.char(40)) AS MaterialNumber,
WO.CreationUser AS User,
WO.WarehouseOrderType AS WarehouseOrderType,
WO.WarehouseOrderStatus AS WarehouseOrderStatus,
WO.Priority AS Priority,
CAST(NULL AS abap.dec(15, 2)) AS ProcessingTime
}
WHERE
CAST(WO.CreationDateTime AS abap.dats) BETWEEN :P_StartDate AND :P_EndDate
UNION ALL
SELECT FROM I_WarehouseOrder AS WO
{
WO.WarehouseOrder,
CAST('Warehouse Order Completed' AS abap.char(40)) AS ActivityName,
WO.ConfirmationDateTime AS EventTime,
CAST('S4HANA_EWM' AS abap.char(20)) AS SourceSystem,
tstmp_current_utctimestamp() AS LastDataUpdate,
CAST(NULL AS abap.tstp) AS EventEndTime,
CAST(NULL AS abap.char(40)) AS MaterialNumber,
WO.ConfirmationUser AS User,
WO.WarehouseOrderType,
WO.WarehouseOrderStatus,
WO.Priority,
CAST(NULL AS abap.dec(15, 2)) AS ProcessingTime
}
WHERE
WO.WarehouseOrderStatus = 'C' AND
CAST(WO.ConfirmationDateTime AS abap.dats) BETWEEN :P_StartDate AND :P_EndDate
UNION ALL
SELECT FROM I_WarehouseOrder AS WO
{
WO.WarehouseOrder,
CAST('Warehouse Order Canceled' AS abap.char(40)) AS ActivityName,
WO.LastChangeDateTime AS EventTime,
CAST('S4HANA_EWM' AS abap.char(20)) AS SourceSystem,
tstmp_current_utctimestamp() AS LastDataUpdate,
CAST(NULL AS abap.tstp) AS EventEndTime,
CAST(NULL AS abap.char(40)) AS MaterialNumber,
WO.LastChangeUser AS User,
WO.WarehouseOrderType,
WO.WarehouseOrderStatus,
WO.Priority,
CAST(NULL AS abap.dec(15, 2)) AS ProcessingTime
}
WHERE
WO.WarehouseOrderStatus = 'X' AND
CAST(WO.LastChangeDateTime AS abap.dats) BETWEEN :P_StartDate AND :P_EndDate
UNION ALL
SELECT FROM I_WarehouseTask AS WT
LEFT JOIN I_InboundDeliveryItem AS IBD ON WT.DeliveryDocument = IBD.InboundDelivery AND WT.DeliveryDocumentItem = IBD.InboundDeliveryItem
{
WT.WarehouseOrder,
CAST('Goods Receipt Posted' AS abap.char(40)) AS ActivityName,
IBD.ActualGoodsMovementDateTime AS EventTime,
CAST('S4HANA_EWM' AS abap.char(20)) AS SourceSystem,
tstmp_current_utctimestamp() AS LastDataUpdate,
CAST(NULL AS abap.tstp) AS EventEndTime,
WT.Product AS MaterialNumber,
IBD.LastChangedByUser AS User,
WT.WarehouseOrderType,
CAST(NULL AS abap.char(1)) AS WarehouseOrderStatus,
CAST(NULL AS abap.numc(2)) AS Priority,
CAST(NULL AS abap.dec(15, 2)) AS ProcessingTime
}
WHERE
WT.WhseTskProcessCat = '1' AND -- Putaway
IBD.GoodsMovementStatus = 'C' AND -- Completed
CAST(IBD.ActualGoodsMovementDateTime AS abap.dats) BETWEEN :P_StartDate AND :P_EndDate
UNION ALL
SELECT FROM I_WarehouseTask AS WT
{
WT.WarehouseOrder,
CAST('Putaway Task Created' AS abap.char(40)) AS ActivityName,
WT.CreationDateTime AS EventTime,
CAST('S4HANA_EWM' AS abap.char(20)) AS SourceSystem,
tstmp_current_utctimestamp() AS LastDataUpdate,
WT.ConfirmationDateTime AS EventEndTime,
WT.Product AS MaterialNumber,
WT.CreationUser AS User,
WT.WarehouseOrderType,
CAST(NULL AS abap.char(1)) AS WarehouseOrderStatus,
CAST(NULL AS abap.numc(2)) AS Priority,
CAST(NULL AS abap.dec(15, 2)) AS ProcessingTime
}
WHERE
WT.WhseTskProcessCat = '1' AND -- Putaway
CAST(WT.CreationDateTime AS abap.dats) BETWEEN :P_StartDate AND :P_EndDate
UNION ALL
SELECT FROM I_WarehouseTask AS WT
{
WT.WarehouseOrder,
CAST('Putaway Task Confirmed' AS abap.char(40)) AS ActivityName,
WT.ConfirmationDateTime AS EventTime,
CAST('S4HANA_EWM' AS abap.char(20)) AS SourceSystem,
tstmp_current_utctimestamp() AS LastDataUpdate,
CAST(NULL AS abap.tstp) AS EventEndTime,
WT.Product AS MaterialNumber,
WT.ConfirmationUser AS User,
WT.WarehouseOrderType,
CAST(NULL AS abap.char(1)) AS WarehouseOrderStatus,
CAST(NULL AS abap.numc(2)) AS Priority,
WT.ProcessorProcTimeInSec AS ProcessingTime
}
WHERE
WT.WhseTskProcessCat = '1' AND -- Putaway
WT.WarehouseTaskStatus = 'C' AND
CAST(WT.ConfirmationDateTime AS abap.dats) BETWEEN :P_StartDate AND :P_EndDate
UNION ALL
SELECT FROM I_WarehouseTask AS WT
{
WT.WarehouseOrder,
CAST('Picking Task Created' AS abap.char(40)) AS ActivityName,
WT.CreationDateTime AS EventTime,
CAST('S4HANA_EWM' AS abap.char(20)) AS SourceSystem,
tstmp_current_utctimestamp() AS LastDataUpdate,
WT.ConfirmationDateTime AS EventEndTime,
WT.Product AS MaterialNumber,
WT.CreationUser AS User,
WT.WarehouseOrderType,
CAST(NULL AS abap.char(1)) AS WarehouseOrderStatus,
CAST(NULL AS abap.numc(2)) AS Priority,
CAST(NULL AS abap.dec(15, 2)) AS ProcessingTime
}
WHERE
WT.WhseTskProcessCat = '2' AND -- Stock Removal
CAST(WT.CreationDateTime AS abap.dats) BETWEEN :P_StartDate AND :P_EndDate
UNION ALL
SELECT FROM I_WarehouseTask AS WT
{
WT.WarehouseOrder,
CAST('Picking Task Confirmed' AS abap.char(40)) AS ActivityName,
WT.ConfirmationDateTime AS EventTime,
CAST('S4HANA_EWM' AS abap.char(20)) AS SourceSystem,
tstmp_current_utctimestamp() AS LastDataUpdate,
CAST(NULL AS abap.tstp) AS EventEndTime,
WT.Product AS MaterialNumber,
WT.ConfirmationUser AS User,
WT.WarehouseOrderType,
CAST(NULL AS abap.char(1)) AS WarehouseOrderStatus,
CAST(NULL AS abap.numc(2)) AS Priority,
WT.ProcessorProcTimeInSec AS ProcessingTime
}
WHERE
WT.WhseTskProcessCat = '2' AND -- Stock Removal
WT.WarehouseTaskStatus = 'C' AND
CAST(WT.ConfirmationDateTime AS abap.dats) BETWEEN :P_StartDate AND :P_EndDate
UNION ALL
SELECT FROM I_WarehouseTask AS WT
{
WT.WarehouseOrder,
CAST('Packing Started' AS abap.char(40)) AS ActivityName,
WT.CreationDateTime AS EventTime,
CAST('S4HANA_EWM' AS abap.char(20)) AS SourceSystem,
tstmp_current_utctimestamp() AS LastDataUpdate,
WT.ConfirmationDateTime AS EventEndTime,
WT.Product AS MaterialNumber,
WT.CreationUser AS User,
WT.WarehouseOrderType,
CAST(NULL AS abap.char(1)) AS WarehouseOrderStatus,
CAST(NULL AS abap.numc(2)) AS Priority,
CAST(NULL AS abap.dec(15, 2)) AS ProcessingTime
}
WHERE
WT.WhseTskProcessCat = '5' AND -- Packing
CAST(WT.CreationDateTime AS abap.dats) BETWEEN :P_StartDate AND :P_EndDate
UNION ALL
SELECT FROM I_WarehouseTask AS WT
{
WT.WarehouseOrder,
CAST('Packing Completed' AS abap.char(40)) AS ActivityName,
WT.ConfirmationDateTime AS EventTime,
CAST('S4HANA_EWM' AS abap.char(20)) AS SourceSystem,
tstmp_current_utctimestamp() AS LastDataUpdate,
CAST(NULL AS abap.tstp) AS EventEndTime,
WT.Product AS MaterialNumber,
WT.ConfirmationUser AS User,
WT.WarehouseOrderType,
CAST(NULL AS abap.char(1)) AS WarehouseOrderStatus,
CAST(NULL AS abap.numc(2)) AS Priority,
WT.ProcessorProcTimeInSec AS ProcessingTime
}
WHERE
WT.WhseTskProcessCat = '5' AND -- Packing
WT.WarehouseTaskStatus = 'C' AND
CAST(WT.ConfirmationDateTime AS abap.dats) BETWEEN :P_StartDate AND :P_EndDate
UNION ALL
SELECT FROM I_WarehouseTask AS WT
{
WT.WarehouseOrder,
CAST('Staging Task Confirmed' AS abap.char(40)) AS ActivityName,
WT.ConfirmationDateTime AS EventTime,
CAST('S4HANA_EWM' AS abap.char(20)) AS SourceSystem,
tstmp_current_utctimestamp() AS LastDataUpdate,
CAST(NULL AS abap.tstp) AS EventEndTime,
WT.Product AS MaterialNumber,
WT.ConfirmationUser AS User,
WT.WarehouseOrderType,
CAST(NULL AS abap.char(1)) AS WarehouseOrderStatus,
CAST(NULL AS abap.numc(2)) AS Priority,
WT.ProcessorProcTimeInSec AS ProcessingTime
}
WHERE
WT.WhseTskProcessCat = '4' AND -- Staging
WT.WarehouseTaskStatus = 'C' AND
CAST(WT.ConfirmationDateTime AS abap.dats) BETWEEN :P_StartDate AND :P_EndDate
UNION ALL
SELECT FROM I_EWMTransportationUnit AS TU
INNER JOIN I_WarehouseTask AS WT ON TU.TransportationUnit = WT.ShipmentOrTransportationUnit
{
WT.WarehouseOrder,
CAST('Loading Started' AS abap.char(40)) AS ActivityName,
TU.LoadingStartDateTime AS EventTime,
CAST('S4HANA_EWM' AS abap.char(20)) AS SourceSystem,
tstmp_current_utctimestamp() AS LastDataUpdate,
TU.LoadingEndDateTime AS EventEndTime,
WT.Product AS MaterialNumber,
TU.LastChangeUser AS User,
WT.WarehouseOrderType,
CAST(NULL AS abap.char(1)) AS WarehouseOrderStatus,
CAST(NULL AS abap.numc(2)) AS Priority,
CAST(NULL AS abap.dec(15, 2)) AS ProcessingTime
}
WHERE
TU.LoadingStartDateTime IS NOT NULL AND
CAST(TU.LoadingStartDateTime AS abap.dats) BETWEEN :P_StartDate AND :P_EndDate
UNION ALL
SELECT FROM I_EWMTransportationUnit AS TU
INNER JOIN I_WarehouseTask AS WT ON TU.TransportationUnit = WT.ShipmentOrTransportationUnit
{
WT.WarehouseOrder,
CAST('Loading Completed' AS abap.char(40)) AS ActivityName,
TU.LoadingEndDateTime AS EventTime,
CAST('S4HANA_EWM' AS abap.char(20)) AS SourceSystem,
tstmp_current_utctimestamp() AS LastDataUpdate,
CAST(NULL AS abap.tstp) AS EventEndTime,
WT.Product AS MaterialNumber,
TU.LastChangeUser AS User,
WT.WarehouseOrderType,
CAST(NULL AS abap.char(1)) AS WarehouseOrderStatus,
CAST(NULL AS abap.numc(2)) AS Priority,
CAST(NULL AS abap.dec(15, 2)) AS ProcessingTime
}
WHERE
TU.LoadingEndDateTime IS NOT NULL AND
TU.LoadingStatus = 'C' AND
CAST(TU.LoadingEndDateTime AS abap.dats) BETWEEN :P_StartDate AND :P_EndDate
UNION ALL
SELECT FROM I_WarehouseTask AS WT
LEFT JOIN I_OutboundDeliveryItem AS OBD ON WT.DeliveryDocument = OBD.OutboundDelivery AND WT.DeliveryDocumentItem = OBD.OutboundDeliveryItem
{
WT.WarehouseOrder,
CAST('Goods Issue Posted' AS abap.char(40)) AS ActivityName,
OBD.ActualGoodsMovementDateTime AS EventTime,
CAST('S4HANA_EWM' AS abap.char(20)) AS SourceSystem,
tstmp_current_utctimestamp() AS LastDataUpdate,
CAST(NULL AS abap.tstp) AS EventEndTime,
WT.Product AS MaterialNumber,
OBD.LastChangedByUser AS User,
WT.WarehouseOrderType,
CAST(NULL AS abap.char(1)) AS WarehouseOrderStatus,
CAST(NULL AS abap.numc(2)) AS Priority,
CAST(NULL AS abap.dec(15, 2)) AS ProcessingTime
}
WHERE
WT.WhseTskProcessCat = '2' AND -- Stock Removal
OBD.GoodsMovementStatus = 'C' AND -- Completed
CAST(OBD.ActualGoodsMovementDateTime AS abap.dats) BETWEEN :P_StartDate AND :P_EndDate 步骤
- 确认已获准直接读取SAP EWM数据库架构,并确定代表仓库订单抬头、仓库任务、仓库订单状态历史、收货和发货过账、包装、集货及装载的实际数据库对象。逻辑对象
/SCWM/WHO和/SCWM/WT通常可作为排查起点,但请在您的系统中核实实际对象、字段、状态代码、时间戳含义和数据库架构。 - 向SAP EWM技术负责人或数据字典获取经过核实的字段映射。映射仓库订单ID、仓库订单类型、状态、优先级、仓库任务ID、任务类别或流程类型、物料、用户、创建时间戳、确认时间戳、包装时间戳、集货时间戳、装载时间戳、收货时间戳、发货时间戳、源系统和最近刷新时间戳。不要假设字段一定存在于同一张表中,也不要假设不同部署中的状态代码含义相同。
- 配置提取连接时,使用只读数据库账户和生产或报表架构,并为提取开始日期、提取结束日期、源系统名称及任何公司专用筛选条件设置参数化值。应按相关事件时间戳筛选日期,而不只是按仓库订单创建时间戳筛选,以免排除订单生命周期后续发生的事件。
- 为每项明确要求的活动各选取一行,生成事件记录。查询必须使用已核实的活动来源字段,不得依赖ProcessMind推断事件。如果某项活动记录在状态历史或应用程序日志中,而不是当前抬头字段中,请使用相应历史记录或日志,并保留事件时间戳和执行用户。
- 将所有活动时间戳统一到同一时区,优先使用UTC,或记录SAP应用服务器时区。将特定来源的状态代码和流程代码转换为事件日志要求的准确活动名称:仓库订单已创建、收货已过账、上架任务已创建、上架任务已确认、拣货任务已创建、拣货任务已确认、开始包装、包装已完成、集货任务已确认、开始装载、装载已完成、发货已过账、仓库订单已完成和仓库订单已取消。
- 确保每条输出记录都包含
WarehouseOrder、ActivityName、EventTime、SourceSystem和LastDataUpdate。存在可靠的完成时间戳时,填写EventEndTime。对于任务级事件,将任务关联到对应仓库订单。如果一个仓库订单包含多个相关任务,则每个任务事件都保留一条记录,同时将仓库订单作为案例标识。如果目标导入格式支持稳定的排序标识,请使用任务ID或源事件ID等字段。 - 导出前验证结果。检查源数据中存在相应业务事件时,14种活动名称是否均有记录;时间戳是否在指定范围内;仓库订单是否意外为空;重复记录是否可由多个任务或重复状态变更解释。将记录数与SAP运营报表或经独立批准的数据提取结果进行核对。
- 将结果导出为ProcessMind兼容的分隔文件或数据库查询结果,每行一条事件。保留准确的必需列名,使用ISO 8601等明确的时间戳格式,根据分隔格式要求为文本值加引号,并包含标题行。上传文件或在ProcessMind中配置数据库连接,将
WarehouseOrder设为案例标识,将ActivityName设为活动,将EventTime设为开始时间戳,并在可用时将EventEndTime设为结束时间戳。
配置
- **源对象映射:**核实仓库订单、仓库任务、状态历史、货物移动、包装、集货和装载所对应的实际数据库对象及字段。
/SCWM/WHO和/SCWM/WT可能是相关逻辑对象,但实施前必须确认其在已部署系统中的数据库表示。 - **日期范围:**先选取连续的3至6个月数据。初始测试可使用较短时间段,完成核对后再扩大范围。增量运行之间应设置一段短暂重叠,以捕获延迟过账和更正记录。
- **事件时间戳选择:**已创建活动使用创建时间戳,已确认活动使用确认时间戳,收货和发货使用过账时间戳,包装、集货和装载使用经核实的执行时间戳。不要用仓库订单创建时间替代所有事件时间。
- **筛选条件:**仅使用已核实的业务筛选条件,例如仓库编号、公司代码、单据类型、仓库订单类型、活动区域、队列、工厂或源系统。公司代码和单据类型字段可能位于相关对象中,必须在目标系统中完成映射。
- **状态映射:**配置准确代表仓库订单已完成和已取消的SAP状态或流程代码。请与EWM功能负责人核实映射,因为不同版本和实施方案中的状态代码及存储方式可能不同。
- **SourceSystem:**设置稳定值,以标识EWM生产实例或报表实例。不要根据可能为空的业务字段生成此值。
- **LastDataUpdate:**每次运行的所有记录均应一致填写提取时间或源数据刷新时间。
- **增量提取:**根据最近一次成功提取的源时间戳保存高水位标记,并设置重叠时间窗口以纳入延迟到达的记录。条件允许时,使用经核实的源标识去重。
- **性能:**尽早限制日期范围,只选择必需列,筛选已建立索引的字段,避免在筛选条件中对已建立索引的时间戳列使用函数,并按日或周分批处理大范围数据。获得许可时,可使用报表副本。
- **关联策略:**确认仓库订单与仓库任务之间的基数关系。关联任务、状态、物料和处理单元数据时,避免意外产生重复记录。关联前先汇总数据或选出适当的事件记录。
- **时区:**配置源时区和转换规则。统一存储时间戳,并记录夏令时处理方式。
- **前提条件:**只读数据库授权、经批准的EWM架构访问权限、经核实的数据字典映射、读取相关运营数据和历史对象的权限,以及经批准的ProcessMind导入配置。所需SAP模块、许可证和授权取决于已部署的EWM架构,必须由系统负责人确认。
查询示例 sql
WITH
params AS (
SELECT
CAST('[Start date and time]' AS TIMESTAMP) AS start_time,
CAST('[End date and time]' AS TIMESTAMP) AS end_time,
CAST('[Source system name]' AS VARCHAR(255)) AS source_system,
CAST(CURRENT_TIMESTAMP AS TIMESTAMP) AS last_data_update
),
warehouse_orders AS (
SELECT
CAST(wo.[Warehouse order ID field] AS VARCHAR(255)) AS WarehouseOrder,
CAST(wo.[Warehouse order type field] AS VARCHAR(255)) AS WarehouseOrderType,
CAST(wo.[Warehouse order status field] AS VARCHAR(255)) AS WarehouseOrderStatus,
CAST(wo.[Priority field] AS VARCHAR(255)) AS Priority,
CAST(wo.[Warehouse order creation timestamp field] AS TIMESTAMP) AS WarehouseOrderCreatedTime,
CAST(wo.[Warehouse order completion timestamp field] AS TIMESTAMP) AS WarehouseOrderCompletedTime,
CAST(wo.[Warehouse order cancellation timestamp field] AS TIMESTAMP) AS WarehouseOrderCanceledTime,
CAST(wo.[Material number field] AS VARCHAR(255)) AS MaterialNumber,
CAST(wo.[User field] AS VARCHAR(255)) AS [User]
FROM [Your warehouse order header table] wo
),
warehouse_tasks AS (
SELECT
CAST(wt.[Warehouse order ID field] AS VARCHAR(255)) AS WarehouseOrder,
CAST(wt.[Warehouse task ID field] AS VARCHAR(255)) AS WarehouseTask,
CAST(wt.[Task category or process type field] AS VARCHAR(255)) AS TaskType,
CAST(wt.[Material number field] AS VARCHAR(255)) AS MaterialNumber,
CAST(wt.[Task creation timestamp field] AS TIMESTAMP) AS TaskCreatedTime,
CAST(wt.[Task confirmation timestamp field] AS TIMESTAMP) AS TaskConfirmedTime,
CAST(wt.[User field] AS VARCHAR(255)) AS [User]
FROM [Your warehouse task table] wt
),
events AS (
SELECT wo.WarehouseOrder, 'Warehouse Order Created' AS ActivityName, wo.WarehouseOrderCreatedTime AS EventTime, CAST(NULL AS TIMESTAMP) AS EventEndTime, wo.MaterialNumber, wo.[User], wo.WarehouseOrderType, wo.WarehouseOrderStatus, wo.Priority FROM warehouse_orders wo
UNION ALL
SELECT gr.[Warehouse order ID field], 'Goods Receipt Posted', CAST(gr.[Goods receipt posting timestamp field] AS TIMESTAMP), CAST(NULL AS TIMESTAMP), CAST(gr.[Material number field] AS VARCHAR(255)), CAST(gr.[User field] AS VARCHAR(255)), wo.WarehouseOrderType, wo.WarehouseOrderStatus, wo.Priority FROM [Your goods receipt posting table] gr LEFT JOIN warehouse_orders wo ON wo.WarehouseOrder = CAST(gr.[Warehouse order ID field] AS VARCHAR(255))
UNION ALL
SELECT wt.WarehouseOrder, 'Putaway Task Created', wt.TaskCreatedTime, CAST(NULL AS TIMESTAMP), wt.MaterialNumber, wt.[User], wo.WarehouseOrderType, wo.WarehouseOrderStatus, wo.Priority FROM warehouse_tasks wt LEFT JOIN warehouse_orders wo ON wo.WarehouseOrder = wt.WarehouseOrder WHERE wt.TaskType = '[Verified putaway task type]'
UNION ALL
SELECT wt.WarehouseOrder, 'Putaway Task Confirmed', wt.TaskConfirmedTime, CAST(NULL AS TIMESTAMP), wt.MaterialNumber, wt.[User], wo.WarehouseOrderType, wo.WarehouseOrderStatus, wo.Priority FROM warehouse_tasks wt LEFT JOIN warehouse_orders wo ON wo.WarehouseOrder = wt.WarehouseOrder WHERE wt.TaskType = '[Verified putaway task type]' AND wt.TaskConfirmedTime IS NOT NULL
UNION ALL
SELECT wt.WarehouseOrder, 'Picking Task Created', wt.TaskCreatedTime, CAST(NULL AS TIMESTAMP), wt.MaterialNumber, wt.[User], wo.WarehouseOrderType, wo.WarehouseOrderStatus, wo.Priority FROM warehouse_tasks wt LEFT JOIN warehouse_orders wo ON wo.WarehouseOrder = wt.WarehouseOrder WHERE wt.TaskType = '[Verified picking task type]'
UNION ALL
SELECT wt.WarehouseOrder, 'Picking Task Confirmed', wt.TaskConfirmedTime, CAST(NULL AS TIMESTAMP), wt.MaterialNumber, wt.[User], wo.WarehouseOrderType, wo.WarehouseOrderStatus, wo.Priority FROM warehouse_tasks wt LEFT JOIN warehouse_orders wo ON wo.WarehouseOrder = wt.WarehouseOrder WHERE wt.TaskType = '[Verified picking task type]' AND wt.TaskConfirmedTime IS NOT NULL
UNION ALL
SELECT pk.[Warehouse order ID field], 'Packing Started', CAST(pk.[Packing start timestamp field] AS TIMESTAMP), CAST(NULL AS TIMESTAMP), CAST(pk.[Material number field] AS VARCHAR(255)), CAST(pk.[User field] AS VARCHAR(255)), wo.WarehouseOrderType, wo.WarehouseOrderStatus, wo.Priority FROM [Your packing event table] pk LEFT JOIN warehouse_orders wo ON wo.WarehouseOrder = CAST(pk.[Warehouse order ID field] AS VARCHAR(255))
UNION ALL
SELECT pk.[Warehouse order ID field], 'Packing Completed', CAST(pk.[Packing completion timestamp field] AS TIMESTAMP), CAST(NULL AS TIMESTAMP), CAST(pk.[Material number field] AS VARCHAR(255)), CAST(pk.[User field] AS VARCHAR(255)), wo.WarehouseOrderType, wo.WarehouseOrderStatus, wo.Priority FROM [Your packing event table] pk LEFT JOIN warehouse_orders wo ON wo.WarehouseOrder = CAST(pk.[Warehouse order ID field] AS VARCHAR(255))
UNION ALL
SELECT st.[Warehouse order ID field], 'Staging Task Confirmed', CAST(st.[Staging confirmation timestamp field] AS TIMESTAMP), CAST(NULL AS TIMESTAMP), CAST(st.[Material number field] AS VARCHAR(255)), CAST(st.[User field] AS VARCHAR(255)), wo.WarehouseOrderType, wo.WarehouseOrderStatus, wo.Priority FROM [Your staging event table] st LEFT JOIN warehouse_orders wo ON wo.WarehouseOrder = CAST(st.[Warehouse order ID field] AS VARCHAR(255))
UNION ALL
SELECT ld.[Warehouse order ID field], 'Loading Started', CAST(ld.[Loading start timestamp field] AS TIMESTAMP), CAST(NULL AS TIMESTAMP), CAST(ld.[Material number field] AS VARCHAR(255)), CAST(ld.[User field] AS VARCHAR(255)), wo.WarehouseOrderType, wo.WarehouseOrderStatus, wo.Priority FROM [Your loading event table] ld LEFT JOIN warehouse_orders wo ON wo.WarehouseOrder = CAST(ld.[Warehouse order ID field] AS VARCHAR(255))
UNION ALL
SELECT ld.[Warehouse order ID field], 'Loading Completed', CAST(ld.[Loading completion timestamp field] AS TIMESTAMP), CAST(NULL AS TIMESTAMP), CAST(ld.[Material number field] AS VARCHAR(255)), CAST(ld.[User field] AS VARCHAR(255)), wo.WarehouseOrderType, wo.WarehouseOrderStatus, wo.Priority FROM [Your loading event table] ld LEFT JOIN warehouse_orders wo ON wo.WarehouseOrder = CAST(ld.[Warehouse order ID field] AS VARCHAR(255))
UNION ALL
SELECT gi.[Warehouse order ID field], 'Goods Issue Posted', CAST(gi.[Goods issue posting timestamp field] AS TIMESTAMP), CAST(NULL AS TIMESTAMP), CAST(gi.[Material number field] AS VARCHAR(255)), CAST(gi.[User field] AS VARCHAR(255)), wo.WarehouseOrderType, wo.WarehouseOrderStatus, wo.Priority FROM [Your goods issue posting table] gi LEFT JOIN warehouse_orders wo ON wo.WarehouseOrder = CAST(gi.[Warehouse order ID field] AS VARCHAR(255))
UNION ALL
SELECT wo.WarehouseOrder, 'Warehouse Order Completed', wo.WarehouseOrderCompletedTime, CAST(NULL AS TIMESTAMP), wo.MaterialNumber, wo.[User], wo.WarehouseOrderType, wo.WarehouseOrderStatus, wo.Priority FROM warehouse_orders wo WHERE wo.WarehouseOrderCompletedTime IS NOT NULL
UNION ALL
SELECT wo.WarehouseOrder, 'Warehouse Order Canceled', wo.WarehouseOrderCanceledTime, CAST(NULL AS TIMESTAMP), wo.MaterialNumber, wo.[User], wo.WarehouseOrderType, wo.WarehouseOrderStatus, wo.Priority FROM warehouse_orders wo WHERE wo.WarehouseOrderCanceledTime IS NOT NULL
)
SELECT
e.WarehouseOrder,
e.ActivityName,
e.EventTime,
e.EventEndTime,
p.source_system AS SourceSystem,
p.last_data_update AS LastDataUpdate,
e.MaterialNumber,
e.[User],
e.WarehouseOrderType,
e.WarehouseOrderStatus,
e.Priority
FROM events e
CROSS JOIN params p
WHERE e.WarehouseOrder IS NOT NULL
AND e.EventTime IS NOT NULL
AND e.EventTime >= p.start_time
AND e.EventTime < p.end_time
ORDER BY e.WarehouseOrder, e.EventTime, e.ActivityName; 减少拣货错误,立即优化仓库管理
数周内将库存准确率提升至99.5%,消除订单履行延误。
无需信用卡,几分钟即可完成设置。