您的运输管理数据模板
您的运输管理数据模板
- 建议收集的属性
- 需要追踪的关键活动
- SAP 运输管理数据提取指南
运输管理属性
| 名称 | 描述 | ||
|---|---|---|---|
| Event 时间 EventTime | 指示特定活动或事件发生时间的时间戳。 | ||
| 描述 Event Time 为运输流程中的每个活动提供精确的日期和时间。此时间 data 是计算各流程步骤之间周期时间、持续时间及等待时间的基础。 在分析中,此属性用于对 event 进行正确排序、构建按时间顺序排列的日志,并执行所有基于时间的绩效分析。它对于识别延迟、衡量流程效率以及根据时间表或服务水平协议评估绩效至关重要。 为何重要 时间戳对于按时间顺序排列事件以及计算所有绩效指标(如周期时间和按时交付率)至关重要。 获取方式 源自 SAP TM 中的事件处理表(例如 /SAPTRX/EH_EVMSG),这些表存储了已报告事件的时间戳。 示例 2023-04-15T10:00:00Z2023-04-16T14:30:00Z2023-04-20T09:15:00Z | |||
| 活动名称 ActivityName | 运输流程中发生的特定业务事件或步骤的名称。 | ||
| 描述 “活动名称”描述了运输生命周期中的单个任务或里程碑,例如“已计划运输”、“已取货”或“已送达”。这些活动构成了所发现流程图中的节点。 分析活动的顺序和频率有助于识别标准流程流、偏差、瓶颈和返工循环。它是运输管理中流程发现和一致性检查的核心。 为何重要 此属性定义了运输流程中的各个步骤,从而能够对端到端的运输流进行可视化和分析。 获取方式 这通常推导自 SAP TM 执行追踪事件处理程序中记录的事件代码或状态更改。它可能源自记录业务对象状态更改或特定事件消息的表。 示例 发运计划已创建承运商已分配货物已提取货物已送达收到交货证明 | |||
| 货物运输 ShipmentId | 单次货物移动的唯一标识符,作为分析的核心案例 (Case)。 | ||
| 描述 “运输 ID (Shipment ID)”是将所有相关运输活动和事件分组的主键。它代表了从最初请求到最终交付证明和付款的完整端到端运输流程。 在流程挖掘中,此属性对于构建“案例视图”至关重要,它允许分析师追踪每项运输的完整旅程。它支持对单个运输相关的流程变体、周期时间和结果进行分析,从而提供运输绩效的全景视图。 为何重要 这是基础案例标识符,将所有事件和数据点链接到特定的运输订单,这对于端到端流程分析至关重要。 获取方式 此标识符是 SAP TM 中的货运订单号或货运预订号。可以在 /SCMTMS/D_TORROT 和 /SCMTMS/D_TRQROT 等表中找到。 示例 610000432161000056786100009876 | |||
| 客户要求的交货日期 RequestedDeliveryDate | 客户要求或销售订单中规定的交付日期和时间。 | ||
| 描述 “要求交付日期”是“货物已送达”活动的目标期限。它是衡量按时交付表现的主要基准。 此日期对于计算“按时交付率”KPI 至关重要。通过将实际交付时间戳与此要求日期进行对比,企业可以确定是否履行了服务水平协议 (SLA)。分析偏差有助于识别导致延迟的系统性原因,例如承运商表现问题、计划延迟或海关扣留。 为何重要 这是衡量准时交付表现的基准,是提升客户满意度与运营卓越的关键KPI。 获取方式 此日期通常从 SAP ERP 的前导销售订单或库存转储订单中传输。它存储在货运单元 (Freight Unit) 或货运订单的日期/时间字段中。 示例 2023-05-20T17:00:00Z2023-06-01T12:00:00Z2023-06-15T23:59:59Z | |||
| 总运费 (Total Freight Cost) TotalFreightCost | 该运输任务的总计算成本或发票金额。 | ||
| 描述 总运费(Total Freight Cost)代表货运产生的财务影响。这可以是运输管理系统计算出的成本,也可以是结算后承运商发票上的最终金额。 该属性使财务维度能够整合到流程分析中。分析师可以识别最昂贵的流程变体,计算延误或重新路由的成本,并比较不同承运商或运输模式的成本效益。它是专注于运输支出和“服务成本”分析的仪表板的基础。 为何重要 为流程增加财务维度,从而能够分析运输支出、每笔货运的成本以及流程低效带来的财务影响。 获取方式 源自完成费用计算后的 SAP TM 货运结算单据。可以在 /SCMTMS/D_SFIRHD 等表中找到。 示例 250.751200.005430.50 | |||
| 承运商名称 CarrierName | 分配给该项运输任务的承运商或物流服务供应商名称。 | ||
| 描述 “承运商名称”识别负责实体运输货物的公司。这是绩效分析的关键维度,因为不同承运商的服务水平、成本和可靠性各不相同。 在流程挖掘中,此属性用于细分和比较不同承运商的表现。它支持创建承运商计分卡、监控每个承运商的按时交付率、比较成本,并识别哪些承运商最常与延迟或争议相关联。这些洞察对于战略性承运商管理和采购至关重要。 为何重要 能够对不同承运商进行绩效比较,这是优化承运商选择、成本和服务水平的关键。 获取方式 此信息存储在货运订单或货运预订单据上。它通过承运商的业务合作伙伴功能进行链接。 示例 DHL ExpressFedEx Freight马士基航运 (Maersk Line)Union Pacific Railroad | |||
| 是否按期交付 IsOnTimeDelivery | 布尔标志,指示货物是否在要求的送货日期当天或之前送达。 | ||
| 描述 这是一个计算属性,它比较“货物已送达”活动的时间戳与“要求交付日期”。如果交付准时或提前,其值为 true;如果延迟,则为 false。 此属性通过为每项运输创建清晰的二元结果来简化绩效分析。它是“按时交付绩效仪表板”和相应 KPI 的基础。它允许分析师轻松过滤延迟运输并进行根因分析,以了解绩效不佳的驱动因素。 为何重要 直接衡量对交付承诺的遵守情况,简化关键准时交付 KPI 的计算和可视化。 获取方式 此属性不存储在 SAP TM 中。必须在数据转换期间,通过比较实际交付事件的时间戳与“要求交付日期”来计算得出。 示例 truefalse | |||
| 结束时间 EndTime | 指示特定活动完成的时间戳。 | ||
| 描述 StartTime表示event的开始,而EndTime标志着其结束。这对于具有持续时间的活动特别有用,例如“清关”或“货物装载”。EndTime和StartTime之间的差值代表该活动的处理时间。 在Process Mining分析中,同时拥有开始和结束时间可以进行更细粒度的活动持续时间分析,从而将处理时间与等待时间分开。这有助于精准定位效率低下的环节,无论是在任务执行过程中,还是在任务之间的交接环节。 为何重要 允许精确计算活动处理时间,将实际工作时间与 event 之间的等待时间区分开来。 获取方式 与 StartTime 类似,此数据来源于事件处理表。它可能对应于特定活动的独立“完成”事件。 示例 2023-04-15T11:30:00Z2023-04-16T15:00:00Z2023-04-20T09:45:00Z | |||
| 运输方式 ModeOfTransport | 运输所使用的具体方式,例如公路、铁路、航空或海运。 | ||
| 描述 此属性指定运输方式。不同的方式具有不同的成本结构、运输时间和流程复杂性。例如,与国内卡车运输相比,国际空运会有不同的活动(如清关)。 按运输方式分析流程可以实现定制化的改进举措。这对于成本分析也至关重要,特别是识别加急运费(如快递空运)与标准、更经济方式的使用比例。这种细分是理解和控制运输支出的关键。 为何重要 能够基于运输方式分析成本、时间和流程差异,这对于成本优化和识别加急货运的使用至关重要。 获取方式 这是货运订单或货运预订上的关键字段,通常标记为运输方式或 MOT。 示例 01 (公路)02 (铁路)04 (空运)05 (海运) | |||
| 争议原因 DisputeReason | 货运发票发生争议时提供的具体原因。 | ||
| 描述 当承运商的发票与SAP TM计算的预期成本不符时,系统就会产生争议。此属性记录了差异产生的原因,例如“费率错误”、“发票重复”或“杂费未经批准”。 分析争议原因对于“运单错误和争议率”仪表板至关重要。它有助于识别计费不准确的根本原因,无论这些原因是源于主data问题、承运商错误还是运营故障。这些见解使企业能够采取针对性措施减少争议,从而加快付款周期并减少管理开销。 为何重要 提供货运账单错误的根本原因,以便采取针对性措施减少发票争议并改进结算流程。 获取方式 此信息在与货运结算单据关联的争议管理案例中捕获。 示例 费率不匹配重量错误未经批准的滞期费重复发票 | |||
| 最后数据更新 LastDataUpdate | 流程挖掘数据集最近一次数据提取或刷新的时间戳。 | ||
| 描述 此属性表示所分析数据的新鲜度。它反映了数据最后一次从来源系统(如 SAP TM)提取到流程挖掘工具中的日期和时间。 这是任何仪表板或分析的关键元数据元素,因为它提供了有关洞察时效性的上下文。它帮助用户了解他们是在查看实时信息还是过去某个时间点的快照,这对于做出及时且明智的决策至关重要。 为何重要 提供有关数据时效性的关键背景,确保用户了解分析结果的最新程度。 获取方式 这通常在数据摄取过程中由 ETL(提取、转换、加载)工具或数据管道生成并存储。 示例 2023-10-27T08:00:00Z2023-10-26T08:00:00Z | |||
| 延迟原因 DelayReason | 解释货运延迟原因的代码或文本。 | ||
| 描述 “延迟原因”属性捕获偏离计划进度的时间原因,例如“恶劣天气”、“海关扣留”或“承运商延迟”。此类信息通常手动报告或通过承运商的事件消息发送。 这是根因分析的强大属性。它让分析师不仅知道运输迟到了,还能了解其原因。通过对延迟原因进行分类和量化,企业可以识别反复出现的问题,并将改进工作集中在影响最大的领域,例如改善承运商沟通或优化路线以避开拥堵。 为何重要 解释货运延迟背后的原因,实现强大的根本原因分析,从而减少异常并提高准时绩效。 获取方式 当报告“到达/离开延迟”事件时,可以在 SAP TM 的事件管理框架中将其捕获为事件代码和原因。 示例 WEATHER_DELAYCUSTOMS_INSPECTION港口拥堵机械故障 | |||
| 是否有争议 IsDisputed | 布尔标志,指示货运发票是否导致争议。 | ||
| 描述 此计算标识识别具有关联货运结算争议的运输。如果创建了争议,则其值为 true,否则为 false。它可以根据是否存在“已创建货运争议”活动或非空的“争议原因”来推导。 此属性简化了货运结算流程的分析。它可以轻松计算“货运账单差异率”KPI,并有助于过滤所有有争议的运输。分析师随后可以调查这些运输的共同特征(如承运商、航线或费用类型),以寻找计费错误的根源。 为何重要 简化了对有问题的货运结算的识别,能够快速计算争议率并对计费错误进行根因分析。 获取方式 此属性不存储在 SAP TM 中。必须根据与货运结算单据关联的争议案例是否存在来进行计算。 示例 truefalse | |||
| 来源国 OriginCountry | 货物运输的始发国。 | ||
| 描述 此属性识别运输旅程的起始国家。它源自最初取货地点的地址。 按始发国分析流程有助于识别绩效、成本和复杂性方面的区域差异。它可以突出显示清关时间较长、承运商成本较高或延迟较频繁的国家。这种地理细分对于管理全球供应链以及针对特定区域量身定制物流策略至关重要。 为何重要 允许对货运绩效进行地理分析,有助于识别区域瓶颈、成本驱动因素或流程差异。 获取方式 这是货运订单中第一站始发地点的地址信息的一部分。 示例 DE美国中国墨西哥 (MX) | |||
| 源系统 SourceSystem | 事件数据产生的来源系统。 | ||
| 描述 此属性识别生成数据的来源系统,例如 SAP TM、SAP ERP 或外部承运商门户。它提供了有关数据来源的上下文,有助于理解数据集成点。 在复杂的系统中,了解来源系统对于数据验证、故障排除以及理解不同系统如何支撑整体流程至关重要。例如,它可以区分是由内部系统报告的事件,还是由第三方物流供应商报告的事件。 为何重要 识别数据来源,这对于数据治理、故障排除以及理解多系统间的流程编排至关重要。 获取方式 此信息通常作为系统日志的一部分存储,或者可以根据创建数据条目的接口或用户来推导。 示例 SAP_TM_P01SAP_ERP_E01CARRIER_PORTAL_XYZ | |||
| 用户名称 UserName | 执行某项活动的用户的 ID 或姓名。 | ||
| 描述 此属性识别负责执行手动活动(如“已计划运输”或“已验证发票”)的员工或用户。它将流程步骤与执行人员或团队联系起来。 按用户分析活动有助于了解工作负载分配、识别培训需求并表彰优秀员工。这对于合规和审计也至关重要,它提供了关于谁在何时做了什么的清晰记录,并能揭示不同用户在执行相同任务时的差异。 为何重要 将手动流程步骤归因于特定用户,从而能够分析工作负载、个人绩效和培训机会。 获取方式 通常可以在运输单据的变更日志或单据抬头表中找到,例如“创建者”或“更改者”字段(例如ERNAM、AENAM)。 示例 CB998030SMITHJ欧洲区计划员 | |||
| 目的地国家 DestinationCountry | 货物送达的目的地国家。 | ||
| 描述 此属性根据最终送货地址识别运输的目标国家。 与始发国类似,按目的国进行分析对于理解区域物流挑战至关重要。它可以揭示一些模式,例如哪些目的地最容易出现延迟,或哪些目的地的最后一公里交付成本更高。这些洞察对于网络优化、设定现实的交付预期以及管理国际贸易合规性具有很高价值。 为何重要 能够按目的地分析流程绩效,突出显示特定交付地区、海关当局或最后一公里承运商的问题。 获取方式 这是货运订单中最后一站目的地点的地址信息的一部分。 示例 FRCAGBJP | |||
| 计划取货日期 ScheduledPickupDate | 承运商计划从发货点取货的日期和时间。 | ||
| 描述 “计划取货日期”是商定的实体运输开始时间。它是运输执行阶段的关键里程碑。 此属性对于监控首程运输的及时性至关重要。通过将计划取货时间与实际“货物已取走”事件时间戳进行对比,公司可以计算出取货延迟。这有助于评估发货地和承运商的绩效及可靠性。 为何重要 作为衡量取货及时性的基准,有助于在运输实体旅程的最开始阶段识别延迟。 获取方式 这是存储在 SAP TM 中货运订单停止顺序上的计划日期/时间。 示例 2023-05-18T09:00:00Z2023-05-30T14:00:00Z2023-06-12T10:30:00Z | |||
| 运输周期时间 ShipmentCycleTime | 从最初请求到最终交付证明的运输总持续时间。 | ||
| 描述 这是一个计算指标,代表运输的端到端周期时间。它通常计算为“收到交付证明”与“收到运输请求”时间戳之间的差值。 “运输周期时间”是衡量运输流程整体效率的主要 KPI。它提供了绩效的高层级视图,当按时间或按承运商、路线等不同维度进行分析时,可以揭示趋势和重大瓶颈。这对于“端到端运输周期时间仪表板”至关重要。 为何重要 测量运输流程的端到端总持续时间,作为衡量整体流程速度和效率的关键指标。 获取方式 这是一个计算指标,通过从每个案例最后一个事件的结束时间减去第一个事件的开始时间得出。 示例 5 天 4 小时12天8小时22 hours 30 minutes | |||
| 运输状态 ShipmentStatus | 提取数据时运输任务的当前整体状态。 | ||
| 描述 “运输状态”提供了运输生命周期的即时概览,例如“计划中”、“执行中”、“已交付”或“已取消”。它代表了该案例的最新已知状态。 此属性对于根据结果过滤和分析运输非常有用。例如,分析师可以仅关注已完成的运输来测量端到端周期时间,或仅分析已取消的运输以了解取消的根本原因。它为解读流程流提供了重要的上下文。 为何重要 提供每项运输的高层级结果,允许根据运输是已完成、已取消还是仍在运输中进行过滤和分析。 获取方式 这是 SAP TM 中货运订单或货运预订单据标题上的整体状态字段。 示例 计划中待运输执行中已执行已取消 | |||
运输管理活动
| 活动 | 描述 | ||
|---|---|---|---|
| 付款已处理 | 这项最终活动确认已向承运商支付运输服务费用。此事件通常发生在连接的 ERP 系统中,此前系统已收到来自 SAP TM 的验证发票。 | ||
| 为何重要 这标志着端到端运输生命周期的真正结束。它对于衡量整个流程时长以及准时付款KPI至关重要。 获取方式 此信息位于 ERP 系统(如 S/4HANA Finance)中。可以通过发票号码将其链接回货运结算单据。状态更新可能会发送回 SAP TM,或者必须从 ERP 表(如 BKPF 和 BSEG)中获取数据。 捕获 从 ERP 系统中获取付款清算日期,通过发票引用将其与运输记录相关联。 事件类型 explicit | |||
| 发运计划已创建 | 此活动表示运输需求已整合为具体的运输计划。当包含计划路线和资源的货运订单(公路/铁路)或货运预订(海运/空运)创建并保存时,系统会捕获此事件。 | ||
| 为何重要 完成这一里程碑对于启动物流执行至关重要。从请求到该活动的周期时间是衡量计划效率的关键 KPI。 获取方式 此事件对应于货运订单或货运预订单据的创建。它也可以从单据的状态更改(例如计划状态变为“已计划”)中推导。相关表通常是用于标题数据的 /SCMTMS/D_TORROT。 捕获 使用运单或货运订舱单的创建timestamp。 事件类型 explicit | |||
| 已收到运输请求 | 此活动标志着运输流程的启动,代表运输需求的创建。在 SAP TM 中,这通常通过创建货运代理订单 (FWO) 或基于订单的运输需求 (OTR) 来捕获。 | ||
| 为何重要 这是端到端运输流程的主要启动事件。分析从该活动到计划完成的时间对于衡量计划效率至关重要。 获取方式 此事件在创建货运代理订单(单据类型 FWO)或其他运输需求单据时记录。标题表(如 /SCMTMS/D_TORROT)中的创建时间戳即为事件时间。 捕获 捕获货运代理订单或运输需求单据的创建日期和时间。 事件类型 explicit | |||
| 承运商已分配 | 此活动表示已选择特定的运输服务供应商(承运商)并将其分配给该运输任务。这可以通过手动分配、自动计划或招标流程来完成。 | ||
| 为何重要 指派承运商是确认和执行货运前的关键步骤。跟踪此环节有助于分析承运商选择流程并确保及时订舱。 获取方式 当在货运订单或货运预订中填充承运商字段(角色为“承运商”的参与方)时,会捕获此信息。对于招标,则是在授予货运报价请求时捕获。 捕获 确定货运订单 (Freight Order) 中首次填充或确认承运商合作伙伴功能的具体时间戳。 事件类型 inferred | |||
| 收到交货证明 | 当从承运商处收到已签署的交付证明 (POD) 单据并记录在系统中时,会发生此活动。这确认了收货人已接收货物。 | ||
| 为何重要 获取交付证明 (POD) 是向客户开具发票以及与承运商结算运费的关键前提。此环节的延迟会直接影响现金周转周期。 获取方式 这通常是根据运单(Freight Order)的状态变化推断出来的,例如POD状态被设为“已收货”。该状态字段的变更提供了该活动的timestamp。 捕获 捕获货运订单上的交付证明状态更新为“已收到”时的 timestamp。 事件类型 inferred | |||
| 货物已提取 | 此活动标志着货物实体运输的开始。当承运商报告货物已装载并从发货人处出发时,系统会捕获此事件。 | ||
| 为何重要 这是标志着在途阶段开始的关键执行里程碑。它对于追踪准时绩效和提供准确的运输可见性至关重要。 获取方式 此事件通常在与 SAP TM 集成的 SAP Event Management 中记录为“出发”或“装载结束”事件。它会更新货运订单的执行状态。它也可以直接记录在货运订单中。 捕获 使用运单起始地的“发运”执行event的timestamp。 事件类型 explicit | |||
| 货物已送达 | 此活动代表运输到达最终目的地并完成实体运输。当承运商报告货物已在收货人所在地卸货时,系统会捕获此事件。 | ||
| 为何重要 这是衡量按时交付表现和客户满意度最重要的里程碑。它通常也是开票和结算流程的触发点。 获取方式 这在 SAP TM 中被记录为“到达目的地”或“卸货结束”执行事件,并更新货运订单的执行状态。数据通常接收自承运商。 捕获 使用运单最后一个站点的“到达目的地”执行event的timestamp。 事件类型 explicit | |||
| 货运结算已创建 | 此活动标志着货运结算单据 (FSD) 的创建,用于计算支付给承运商的运输费用。这是用于计提费用和发票验证的主要单据。 | ||
| 为何重要 这开启了运输流程的财务结算阶段。分析从交付到创建结算的时间有助于识别财务处理中的瓶颈。 获取方式 这是通过创建货运结算单据捕获的显式事件。此单据的标题表 /SCMTMS/D_SFIRHD 中包含创建时间戳。 捕获 使用运费结算单(Freight Settlement Document)的创建日期和时间。 事件类型 explicit | |||
| 运输已取消 | 此活动代表在请求或计划后取消运输。它作为未进入执行阶段的流程的终止点。 | ||
| 为何重要 跟踪取消操作有助于识别流程失败的原因,例如客户需求变化或规划错误。高取消率可能表明订单管理或规划中存在潜在问题。 获取方式 这是根据货运代理订单或货运订单的生命周期状态更改为“已取消”而推导出的。此状态更改的时间戳即为事件时间。 捕获 捕获单据生命周期状态设置为“已取消”时的 timestamp。 事件类型 inferred | |||
| 发票已核验 | 此活动表示承运商的发票已成功与货运结算单据匹配,并被批准付款。这是在 ERP 系统启动付款流程之前的最后一步。 | ||
| 为何重要 此活动完成了运费的审计和验证流程。此阶段的延迟可能导致承运商付款逾期,从而可能损害合作关系。 获取方式 这是从货运结算单据的状态更改(如“待计提”或“已传输过账”)中推导出来的,表明它已发送到 ERP 系统进行付款。 捕获 跟踪FSD生命周期状态变更的timestamp,以指示其已准备好付款或已过账。 事件类型 inferred | |||
| 承运商已确认运输 | 此事件代表承运商同意按计划执行运输。确认通常通过 EDI 消息、承运商门户更新或手动输入接收,并更新货运订单的状态。 | ||
| 为何重要 承运商确认是对货运计划的承诺,可减少不确定性。延迟收到此确认可能会危及整个货运进度。 获取方式 这是从货运订单或货运预订的确认状态字段更改中推导出来的。在单据的状态管理中将设置一个特定的状态值(如“已确认”)。 捕获 跟踪运单文档内确认状态字段的变更。 事件类型 inferred | |||
| 海关申报已提交 | 对于国际货运,此活动代表向当局提交所需的海关单据。这是获得进出口货物清关的前置条件。 | ||
| 为何重要 及时提交报关单对于避免边境延误至关重要。此活动有助于监控报关流程的效率。 获取方式 此事件可以捕获为由报关行报告的特定执行事件,或捕获自集成海关管理系统(如 SAP GTS)中的状态更改。货运订单将据此更新。 捕获 捕获“海关申报已提交”执行 event 的 timestamp 或相应的状态更改。 事件类型 explicit | |||
| 清关完成 | 此活动表示运输已获得海关当局的批准并可以放行。对于国际物流而言,这一事件是一个重大的里程碑,因为它消除了一个重大的潜在瓶颈。 | ||
| 为何重要 清关往往是全球供应链重大延误的来源。跟踪此活动的持续时间和成功率是缩短国际运输时间的关键。 获取方式 这被捕获为“清关”执行事件,通常由报关行或外部可见性提供商报告,并在货运订单的执行追踪中更新。 捕获 使用与运单关联的“清关”执行event的timestamp。 事件类型 explicit | |||
| 货运争议已创建 | 此事件表示在承运商的发票与货运结算单据中的计算成本之间发现了差异。这将触发争议解决工作流。 | ||
| 为何重要 争议会延迟承运商付款,并需要行政精力来解决。跟踪此活动有助于识别计费不准确(如费率错误或附加费)的根本原因。 获取方式 这可以从货运结算单据的状态更改(设置为“争议”状态)中推导出来。它还可能涉及创建单独的争议案例单据。 捕获 捕获在货运结算单上设置争议状态时的 timestamp。 事件类型 inferred | |||
| 运输已改道 | 此活动表示在确认运输后,其路线或进度发生了计划外变更。这可能是由于突发干扰、客户要求或物流问题造成的。 | ||
| 为何重要 改道往往会导致成本增加和延迟。识别改道的频率和原因有助于提高计划准确性和运营稳定性。 获取方式 此事件是通过检测货运订单在开始执行后对阶段、地点或日期的重大更改而推导出的。可以为此分析更改单据(表 CDHDR 和 CDPOS)。 捕获 在“承运商已确认货运” event 之后,检测货运订单单据中关键路由字段的更改。 事件类型 inferred | |||
提取指南
步骤
- 识别并激活 CDS View API: 登录您的 SAP S/4HANA 系统。使用事务
/IWFND/MAINT_SERVICE验证核心 CDS Views 所需的 OData 服务是否已激活。需要检查的关键服务包括与 I_TransportationOrder、C_TranspOrdExecutionEvent、I_ForwardingOrder 和 I_FreightSettlementDocument 相关的服务。如果未激活,请联系您的 SAP 管理员从后端系统添加并激活它们。 - 建立 API 连接: 从您的 SAP 管理员处获取 OData 服务的根 URL。设置客户端应用程序(例如使用 requests 库的 Python 脚本、商业 ETL 工具或 Postman 之类的工具)来连接 API。您需要配置身份验证,通常使用基本身份验证(用户名和密码)或 OAuth 2.0 以实现更安全的连接。
- 定义提取范围: 确定 data 提取的范围。定义特定的日期范围,例如过去 6 个月。确定要过滤的相关组织单位(如公司代码)或特定单据类型(如货运订单类型),以确保 data 与您分析的流程相关。
- 构建基础货运查询: 首先查询 I_TransportationOrder CDS View。此视图是货运(也称为货运订单或货运预订)的中心对象。使用 OData
$select参数选择所需的列,包括建议的属性,如 CarrierName、ModeOfTransport 和 RequestedDeliveryDate。应用$filter以按日期和其他范围参数限制 data。 - 查询执行和运输 event: 使用 C_TranspOrdExecutionEvent CDS View 提取关键物流 event。为此视图过滤特定的
EventCode值,这些值对应于“货物已提取” (DEPARTURE) 和“货物已送达” (ARRIVAL_AT_DESTINATION) 等活动。使用 TransportationOrder UUID 将此 data 联接到您的基础货运 data 中。 - 查询相关业务对象: 为了捕获完整流程,您必须查询其他相关的 CDS Views。查询 I_ForwardingOrder 以获取“收到运输请求”活动,查询 I_FreightSettlementDocument 以获取财务活动,如“货运结算已创建”、“货运争议已创建”和“发票已验证”。
- 提取基于状态的活动: 许多活动不是离散的 event,而是主要单据上的状态更改。对于“承运商已指派”、“承运商已确认货运”和“货运已取消”等活动,您将查询 I_TransportationOrder 视图,并使用与相关状态字段关联的
LastChangeDateTime作为 event 时间。这需要将状态代码仔细映射到业务活动。 - 合并与转换 data: 将从所有来源提取的 data 合并到单个事件日志结构中。对于提取的每个活动,创建一行包含所需列的数据:ShipmentId、ActivityName 和 EventTime。确保基础货运查询中的所有建议属性都存在于该货运的每一行中。此步骤在概念上等同于 SQL
UNION ALL操作。 - 处理复杂和外部 event: 对于“清关完成”或“付款已处理”等活动,data 可能驻留在特定字段甚至外部系统中。提供的查询逻辑使用标准字段作为代理。您可能需要调整查询以联接特定于海关的 CDS Views,或根据货运结算单编号与单独的 ERP 提取进行付款 data 关联。
- 为 ProcessMind 格式化: 将最终合并的 data 集保存为 CSV 文件。确保列标题与上传要求匹配,例如,在工具设置中将
ShipmentId列映射到CaseId字段。验证 timestamp 是否格式一致,建议使用 UTC (YYYY-MM-DDTHH:MM:SSZ)。
配置
- 核心 CDS Views: 提取主要依赖于 I_TransportationOrder(用于货运订单)、C_TranspOrdExecutionEvent(用于执行 event)、I_ForwardingOrder(用于运输请求)和 I_FreightSettlementDocument(用于结算单)。
- 日期范围过滤: 应用日期过滤来管理 data 量至关重要。请使用 I_TransportationOrder 上的
CreationDateTime或 C_TranspOrdExecutionEvent 上的ActualBusinessDateTime。初次分析建议选择 3 到 6 个月的时间范围。 - 单据类型过滤: 为了使分析更具针对性,请使用
TransportationOrderType字段过滤特定的单据类型。这有助于区分不同的物流场景,例如标准出库货运与库存转储。 - 组织过滤: 如果适用,可以按
PurchasingOrganization或其他组织级字段进行过滤,将 data 限制在特定的业务单位或区域。 - API 分页: 对于大型 data 集,请使用 OData 参数
$top和$skip来分页检索 data。这可以防止 API 超时并降低客户端的内存消耗。通常 1000 到 5000 行的分页大小最为有效。 - 前置条件: 执行提取的用户或服务账户需要具备对底层 OData 服务(授权对象 S_SERVICE)以及 CDS Views 内业务 data 的访问权限。相应的服务必须在 SAP Gateway (
/IWFND/MAINT_SERVICE) 中激活。
a 查询示例 sql
WITH Shipments AS (
SELECT
TransportationOrder AS ShipmentId,
CarrierName,
TranspOrdExecutionBlockRsnCode,
TransportationMode AS ModeOfTransport,
ShippingType AS ShipmentType,
CreationDateTime AS ShipmentCreationTime,
LastChangeDateTime,
LifeCycleStatus,
ConfirmationStatus,
OverallExecutionStatus,
DeliveryOverallStatus,
PlannedDepDateTimeReqByCust AS RequestedDeliveryDate,
TotalChargesAmountInTransacCrcy AS TotalFreightCost
FROM I_TransportationOrder
WHERE
CreationDateTime >= '[START_DATE]' AND CreationDateTime <= '[END_DATE]'
-- AND TransportationOrderType IN ('[Your_Type_1]', '[Your_Type_2]')
)
SELECT
fwo.PurchasingDocument AS ShipmentId,
'Transportation Request Received' AS ActivityName,
fwo.CreationDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM I_ForwardingOrder AS fwo
LEFT JOIN Shipments s ON fwo.PurchasingDocument = s.ShipmentId
WHERE fwo.CreationDateTime >= '[START_DATE]' AND fwo.CreationDateTime <= '[END_DATE]'
UNION ALL
SELECT
s.ShipmentId,
'Shipment Planned' AS ActivityName,
s.ShipmentCreationTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
UNION ALL
SELECT
s.ShipmentId,
'Carrier Assigned' AS ActivityName,
s.LastChangeDateTime AS EventTime, -- Best approximation using last change time
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.CarrierName IS NOT NULL
UNION ALL
SELECT
s.ShipmentId,
'Shipment Confirmed By Carrier' AS ActivityName,
s.LastChangeDateTime AS EventTime, -- Best approximation using last change time
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.ConfirmationStatus = 'C' -- 'Confirmed'
UNION ALL
SELECT
s.ShipmentId,
'Goods Picked Up' AS ActivityName,
evt.ActualBusinessDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM C_TranspOrdExecutionEvent AS evt
JOIN Shipments s ON evt.TransportationOrder = s.ShipmentId
WHERE evt.EventCode = 'DEPARTURE'
UNION ALL
SELECT
s.ShipmentId,
'Customs Declaration Filed' AS ActivityName,
s.LastChangeDateTime AS EventTime, -- Approximation based on status change
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.CustomsRelevance IS NOT NULL -- This is a proxy, system config dependent
UNION ALL
SELECT
s.ShipmentId,
'Customs Cleared' AS ActivityName,
s.LastChangeDateTime AS EventTime, -- Approximation based on status change
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.CustomsOverallStatus = '4' -- 'Customs Cleared'
UNION ALL
SELECT
s.ShipmentId,
'Shipment Rerouted' AS ActivityName,
s.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.TranspOrdExecutionBlockRsnCode = '[Your Rerouting Reason Code]'
UNION ALL
SELECT
s.ShipmentId,
'Goods Delivered' AS ActivityName,
evt.ActualBusinessDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM C_TranspOrdExecutionEvent AS evt
JOIN Shipments s ON evt.TransportationOrder = s.ShipmentId
WHERE evt.EventCode = 'ARRIVAL_AT_DESTINATION'
UNION ALL
SELECT
s.ShipmentId,
'Proof Of Delivery Received' AS ActivityName,
s.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.DeliveryOverallStatus = 'C' -- 'POD Received'
UNION ALL
SELECT
fsd.SourceDocument AS ShipmentId,
'Freight Settlement Created' AS ActivityName,
fsd.CreationDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
fsd.TotalAmount AS TotalFreightCost
FROM I_FreightSettlementDocument AS fsd
JOIN Shipments s ON fsd.SourceDocument = s.ShipmentId
UNION ALL
SELECT
fsd.SourceDocument AS ShipmentId,
'Freight Dispute Created' AS ActivityName,
fsd.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
fsd.TotalAmount AS TotalFreightCost
FROM I_FreightSettlementDocument AS fsd
JOIN Shipments s ON fsd.SourceDocument = s.ShipmentId
WHERE fsd.DisputeStatus = '1' -- 'In Dispute'
UNION ALL
SELECT
fsd.SourceDocument AS ShipmentId,
'Invoice Verified' AS ActivityName,
fsd.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
fsd.TotalAmount AS TotalFreightCost
FROM I_FreightSettlementDocument AS fsd
JOIN Shipments s ON fsd.SourceDocument = s.ShipmentId
WHERE fsd.OverallLifeCycleStatus = '06' -- 'Posted for Accruals'
UNION ALL
SELECT
s.ShipmentId,
'Shipment Cancelled' AS ActivityName,
s.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.LifeCycleStatus = 'X' -- 'Cancelled'
UNION ALL
SELECT
fsd.SourceDocument AS ShipmentId,
'Payment Processed' AS ActivityName,
fsd.LastChangeDateTime AS EventTime, -- Approximation, actual payment is in ERP
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
fsd.TotalAmount AS TotalFreightCost
FROM I_FreightSettlementDocument AS fsd
JOIN Shipments s ON fsd.SourceDocument = s.ShipmentId
WHERE fsd.InvoiceProcessingStatus = 'C' -- 'Completely Invoiced' 步骤
- 识别并激活 CDS View API: 登录您的 SAP S/4HANA 系统。使用事务
/IWFND/MAINT_SERVICE验证核心 CDS Views 所需的 OData 服务是否已激活。需要检查的关键服务包括与 I_TransportationOrder、C_TranspOrdExecutionEvent、I_ForwardingOrder 和 I_FreightSettlementDocument 相关的服务。如果未激活,请联系您的 SAP 管理员从后端系统添加并激活它们。 - 建立 API 连接: 从您的 SAP 管理员处获取 OData 服务的根 URL。设置客户端应用程序(例如使用 requests 库的 Python 脚本、商业 ETL 工具或 Postman 之类的工具)来连接 API。您需要配置身份验证,通常使用基本身份验证(用户名和密码)或 OAuth 2.0 以实现更安全的连接。
- 定义提取范围: 确定 data 提取的范围。定义特定的日期范围,例如过去 6 个月。确定要过滤的相关组织单位(如公司代码)或特定单据类型(如货运订单类型),以确保 data 与您分析的流程相关。
- 构建基础货运查询: 首先查询 I_TransportationOrder CDS View。此视图是货运(也称为货运订单或货运预订)的中心对象。使用 OData
$select参数选择所需的列,包括建议的属性,如 CarrierName、ModeOfTransport 和 RequestedDeliveryDate。应用$filter以按日期和其他范围参数限制 data。 - 查询执行和运输 event: 使用 C_TranspOrdExecutionEvent CDS View 提取关键物流 event。为此视图过滤特定的
EventCode值,这些值对应于“货物已提取” (DEPARTURE) 和“货物已送达” (ARRIVAL_AT_DESTINATION) 等活动。使用 TransportationOrder UUID 将此 data 联接到您的基础货运 data 中。 - 查询相关业务对象: 为了捕获完整流程,您必须查询其他相关的 CDS Views。查询 I_ForwardingOrder 以获取“收到运输请求”活动,查询 I_FreightSettlementDocument 以获取财务活动,如“货运结算已创建”、“货运争议已创建”和“发票已验证”。
- 提取基于状态的活动: 许多活动不是离散的 event,而是主要单据上的状态更改。对于“承运商已指派”、“承运商已确认货运”和“货运已取消”等活动,您将查询 I_TransportationOrder 视图,并使用与相关状态字段关联的
LastChangeDateTime作为 event 时间。这需要将状态代码仔细映射到业务活动。 - 合并与转换 data: 将从所有来源提取的 data 合并到单个事件日志结构中。对于提取的每个活动,创建一行包含所需列的数据:ShipmentId、ActivityName 和 EventTime。确保基础货运查询中的所有建议属性都存在于该货运的每一行中。此步骤在概念上等同于 SQL
UNION ALL操作。 - 处理复杂和外部 event: 对于“清关完成”或“付款已处理”等活动,data 可能驻留在特定字段甚至外部系统中。提供的查询逻辑使用标准字段作为代理。您可能需要调整查询以联接特定于海关的 CDS Views,或根据货运结算单编号与单独的 ERP 提取进行付款 data 关联。
- 为 ProcessMind 格式化: 将最终合并的 data 集保存为 CSV 文件。确保列标题与上传要求匹配,例如,在工具设置中将
ShipmentId列映射到CaseId字段。验证 timestamp 是否格式一致,建议使用 UTC (YYYY-MM-DDTHH:MM:SSZ)。
配置
- 核心 CDS Views: 提取主要依赖于 I_TransportationOrder(用于货运订单)、C_TranspOrdExecutionEvent(用于执行 event)、I_ForwardingOrder(用于运输请求)和 I_FreightSettlementDocument(用于结算单)。
- 日期范围过滤: 应用日期过滤来管理 data 量至关重要。请使用 I_TransportationOrder 上的
CreationDateTime或 C_TranspOrdExecutionEvent 上的ActualBusinessDateTime。初次分析建议选择 3 到 6 个月的时间范围。 - 单据类型过滤: 为了使分析更具针对性,请使用
TransportationOrderType字段过滤特定的单据类型。这有助于区分不同的物流场景,例如标准出库货运与库存转储。 - 组织过滤: 如果适用,可以按
PurchasingOrganization或其他组织级字段进行过滤,将 data 限制在特定的业务单位或区域。 - API 分页: 对于大型 data 集,请使用 OData 参数
$top和$skip来分页检索 data。这可以防止 API 超时并降低客户端的内存消耗。通常 1000 到 5000 行的分页大小最为有效。 - 前置条件: 执行提取的用户或服务账户需要具备对底层 OData 服务(授权对象 S_SERVICE)以及 CDS Views 内业务 data 的访问权限。相应的服务必须在 SAP Gateway (
/IWFND/MAINT_SERVICE) 中激活。
a 查询示例 sql
WITH Shipments AS (
SELECT
TransportationOrder AS ShipmentId,
CarrierName,
TranspOrdExecutionBlockRsnCode,
TransportationMode AS ModeOfTransport,
ShippingType AS ShipmentType,
CreationDateTime AS ShipmentCreationTime,
LastChangeDateTime,
LifeCycleStatus,
ConfirmationStatus,
OverallExecutionStatus,
DeliveryOverallStatus,
PlannedDepDateTimeReqByCust AS RequestedDeliveryDate,
TotalChargesAmountInTransacCrcy AS TotalFreightCost
FROM I_TransportationOrder
WHERE
CreationDateTime >= '[START_DATE]' AND CreationDateTime <= '[END_DATE]'
-- AND TransportationOrderType IN ('[Your_Type_1]', '[Your_Type_2]')
)
SELECT
fwo.PurchasingDocument AS ShipmentId,
'Transportation Request Received' AS ActivityName,
fwo.CreationDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM I_ForwardingOrder AS fwo
LEFT JOIN Shipments s ON fwo.PurchasingDocument = s.ShipmentId
WHERE fwo.CreationDateTime >= '[START_DATE]' AND fwo.CreationDateTime <= '[END_DATE]'
UNION ALL
SELECT
s.ShipmentId,
'Shipment Planned' AS ActivityName,
s.ShipmentCreationTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
UNION ALL
SELECT
s.ShipmentId,
'Carrier Assigned' AS ActivityName,
s.LastChangeDateTime AS EventTime, -- Best approximation using last change time
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.CarrierName IS NOT NULL
UNION ALL
SELECT
s.ShipmentId,
'Shipment Confirmed By Carrier' AS ActivityName,
s.LastChangeDateTime AS EventTime, -- Best approximation using last change time
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.ConfirmationStatus = 'C' -- 'Confirmed'
UNION ALL
SELECT
s.ShipmentId,
'Goods Picked Up' AS ActivityName,
evt.ActualBusinessDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM C_TranspOrdExecutionEvent AS evt
JOIN Shipments s ON evt.TransportationOrder = s.ShipmentId
WHERE evt.EventCode = 'DEPARTURE'
UNION ALL
SELECT
s.ShipmentId,
'Customs Declaration Filed' AS ActivityName,
s.LastChangeDateTime AS EventTime, -- Approximation based on status change
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.CustomsRelevance IS NOT NULL -- This is a proxy, system config dependent
UNION ALL
SELECT
s.ShipmentId,
'Customs Cleared' AS ActivityName,
s.LastChangeDateTime AS EventTime, -- Approximation based on status change
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.CustomsOverallStatus = '4' -- 'Customs Cleared'
UNION ALL
SELECT
s.ShipmentId,
'Shipment Rerouted' AS ActivityName,
s.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.TranspOrdExecutionBlockRsnCode = '[Your Rerouting Reason Code]'
UNION ALL
SELECT
s.ShipmentId,
'Goods Delivered' AS ActivityName,
evt.ActualBusinessDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM C_TranspOrdExecutionEvent AS evt
JOIN Shipments s ON evt.TransportationOrder = s.ShipmentId
WHERE evt.EventCode = 'ARRIVAL_AT_DESTINATION'
UNION ALL
SELECT
s.ShipmentId,
'Proof Of Delivery Received' AS ActivityName,
s.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.DeliveryOverallStatus = 'C' -- 'POD Received'
UNION ALL
SELECT
fsd.SourceDocument AS ShipmentId,
'Freight Settlement Created' AS ActivityName,
fsd.CreationDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
fsd.TotalAmount AS TotalFreightCost
FROM I_FreightSettlementDocument AS fsd
JOIN Shipments s ON fsd.SourceDocument = s.ShipmentId
UNION ALL
SELECT
fsd.SourceDocument AS ShipmentId,
'Freight Dispute Created' AS ActivityName,
fsd.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
fsd.TotalAmount AS TotalFreightCost
FROM I_FreightSettlementDocument AS fsd
JOIN Shipments s ON fsd.SourceDocument = s.ShipmentId
WHERE fsd.DisputeStatus = '1' -- 'In Dispute'
UNION ALL
SELECT
fsd.SourceDocument AS ShipmentId,
'Invoice Verified' AS ActivityName,
fsd.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
fsd.TotalAmount AS TotalFreightCost
FROM I_FreightSettlementDocument AS fsd
JOIN Shipments s ON fsd.SourceDocument = s.ShipmentId
WHERE fsd.OverallLifeCycleStatus = '06' -- 'Posted for Accruals'
UNION ALL
SELECT
s.ShipmentId,
'Shipment Cancelled' AS ActivityName,
s.LastChangeDateTime AS EventTime,
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
s.TotalFreightCost
FROM Shipments AS s
WHERE s.LifeCycleStatus = 'X' -- 'Cancelled'
UNION ALL
SELECT
fsd.SourceDocument AS ShipmentId,
'Payment Processed' AS ActivityName,
fsd.LastChangeDateTime AS EventTime, -- Approximation, actual payment is in ERP
s.CarrierName,
s.ModeOfTransport,
s.RequestedDeliveryDate,
fsd.TotalAmount AS TotalFreightCost
FROM I_FreightSettlementDocument AS fsd
JOIN Shipments s ON fsd.SourceDocument = s.ShipmentId
WHERE fsd.InvoiceProcessingStatus = 'C' -- 'Completely Invoiced' 步骤
- 定义 data 需求: 首先确认 15 个所需活动及所有属性的准确逻辑。这包括将每个活动映射到 SAP TM 系统中的特定状态更改、创建 event 或单据链接。例如,确定代表“货物已提取”的准确执行状态。
- 进入 ABAP 开发环境: 登录 SAP GUI,使用事务代码
SE38进入 ABAP 编辑器。为新程序输入名称(例如ZTM_PROCESS_EXTRACT),然后点击“创建”。提供标题并将程序类型设置为“可执行程序”。 - 创建选择屏幕: 在程序中定义用户将看到的选择屏幕。这应包括过滤 data 的参数,例如货运订单创建日期的范围 (
SO_CREDT),以及单据类型 (SO_TYPE) 或承运商 (SO_CARR) 的选择选项。 - 定义输出结构: 定义一个与所需事件日志格式匹配的内部表结构。该结构应包含
ShipmentId、ActivityName、EventTime、EndTime、CarrierName、RequestedDeliveryDate、ModeOfTransport、TotalFreightCost和IsOnTimeDelivery字段。 - 实现 data 选择逻辑: 编写主要的 ABAP 逻辑,为 15 个活动中的每一个选择 data。这通常涉及查询多个 SAP TM 表。首先选择在指定日期范围内的主要货运单据,如货运订单。
- 提取计划和执行 event: 对于每个选定的货运单据(如货运订单),查询相关表和业务对象以找到不同 event 的 timestamp。使用
/SCMTMS/D_TORROT表查询货运订单创建(“货运已计划”)、承运商分配(“承运商已指派”)以及对应于“货物已提取”和“货物已送达”的执行状态更改。前置货运代理订单 (/SCMTMS/D_TRQROT) 的创建可以代表“收到运输请求”。 - 提取承运商确认与重新路由: 查询与货运订单关联的状态表或变更单据 (CDHDR/CDPOS),以识别
CONFIRMATION状态的设置时间,从而捕获“承运商已确认货运”。类似地,寻找路由信息的重大变更以捕获“货运已重排路由”。 - 提取海关 event: 如果使用 SAP 全球贸易服务 (GTS) 或类似模块,海关 event(“海关申报已提交”、“清关完成”)通常通过链接单据进行跟踪。逻辑必须读取货运订单的单据流 (
/SCMTMS/D_TORDOC),以找到这些相关单据及其创建或状态更改时间。 - 提取结算和争议 event: 查询货运结算单头表 (
/SCMTMS/D_SFIRHD) 及其相关项目和状态,以捕获“货运结算已创建”、“货运争议已创建”和“发票已验证” event。将这些链接回原始的ShipmentId。 - 合并 data: 对于找到的每个 event,在最终内部表中创建一条新记录。使用相应的活动填充
ActivityName,使用 event 的 timestamp 填充EventTime,并使用货运订单或货运预订 ID 填充ShipmentId。从源单据中填充其他属性。 - 格式化并导出文件: 最终内部表填充完毕后,将 data 格式化为平面文件。使用
OPEN DATASET、LOOP AT... TRANSFER...和CLOSE DATASET命令将内部表内容写入 SAP 应用服务器上的 CSV 或 TXT 文件(可通过事务 AL11 访问)。 - 排程与检索: ABAP 程序可以安排为后台作业(事务 SM36)以自动提取 data。然后可以使用事务
CG3Y将生成的文件从应用服务器下载到本地计算机,以便上传到 ProcessMind。
配置
- 日期范围: 选择屏幕应包含核心运输单据(如货运订单)创建日期的必选范围。对于初始分析,建议选择 3 到 6 个月,以确保 data 集具有代表性且不会导致运行时间过长。
- 单据类型过滤: 提供运输单据类型(如货运订单、货运预订)的过滤器。这对于将分析重点放在特定流程(如公路运输与海运)上至关重要。
- 承运商过滤: 允许用户按特定承运商进行过滤。这有助于分析单个物流合作伙伴的绩效。
- 组织过滤: 包含相关组织单位(如采购组织或公司代码)的过滤器,以便将提取范围缩小到特定的业务领域。
- 性能优化: 对于大型 data 集,请确保 ABAP 代码在
WHERE子句中使用索引数据库字段,尽可能避免嵌套循环,并仅从数据库中选择必要的字段,以最大限度地降低内存消耗。 - 前置条件: 运行报表的用户需要具备执行 ABAP 程序的权限。开发人员需要
S_DEVELOP权限。程序本身需要文件系统访问权限(对象S_DATASET)以及对相关 TM 数据库表和 BOPF 对象的访问权限。
a 查询示例 abap
REPORT ztm_process_extract.
*&---------------------------------------------------------------------*
*& Data Structures
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_s_event_log,
shipmentid TYPE /scmtms/tor_id,
activityname TYPE string,
eventtime TYPE timestamp,
endtime TYPE timestamp,
carriername TYPE string,
requesteddeliverydate TYPE timestamp,
modeoftransport TYPE /scmtms/mot,
totalfreightcost TYPE /scmtms/chargeable_weight,
isontimedelivery TYPE abap_bool,
END OF ty_s_event_log.
DATA: lt_event_log TYPE TABLE OF ty_s_event_log.
*&---------------------------------------------------------------------*
*& Selection Screen
*&---------------------------------------------------------------------*
SELECT-OPTIONS: so_credt FOR sy-datum OBLIGATORY.
SELECT-OPTIONS: so_torid FOR /scmtms/d_torrot-tor_id.
SELECT-OPTIONS: so_carr FOR /scmtms/d_torrot-lsp_id.
*&---------------------------------------------------------------------*
*& Main Logic
*&---------------------------------------------------------------------*
START-OF-SELECTION.
DATA: ls_event_log TYPE ty_s_event_log.
" Select base data: Freight Orders (Shipments)
SELECT tor_id, tor_cat, lsp_id, mot_code, cretd_tst, btd_tstmp_end
FROM /scmtms/d_torrot
INTO TABLE @DATA(lt_tor_root)
WHERE CAST( cretd_tst AS DATS ) IN @so_credt
AND tor_id IN @so_torid
AND lsp_id IN @so_carr.
IF lt_tor_root IS INITIAL.
MESSAGE 'No data found for the given selection.' TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
" Loop through each shipment to build the event log
LOOP AT lt_tor_root INTO DATA(ls_tor_root).
" 1. Transportation Request Received (Approximation from FWO creation)
SELECT SINGLE created_at_utc FROM /scmtms/d_trqrot
WHERE db_key IN ( SELECT trq_root_key FROM /scmtms/d_tordoc
WHERE parent_key = @ls_tor_root-db_key AND bo_node_cat = 'TRQ_ROOT' )
INTO @DATA(lv_trq_created_ts).
IF sy-subrc = 0.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Transportation Request Received'.
ls_event_log-eventtime = lv_trq_created_ts.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 2. Shipment Planned
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Shipment Planned'.
ls_event_log-eventtime = ls_tor_root-cretd_tst.
APPEND ls_event_log TO lt_event_log.
" 3. Carrier Assigned
IF ls_tor_root-lsp_id IS NOT INITIAL.
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Carrier Assigned'.
ls_event_log-eventtime = ls_tor_root-cretd_tst. " Approximated with creation time
APPEND ls_event_log TO lt_event_log.
ENDIF.
" Get statuses from /SCMTMS/D_TORSTA
SELECT status, tstmp FROM /scmtms/d_torsta
INTO TABLE @DATA(lt_statuses)
WHERE parent_key = @ls_tor_root-db_key.
" 4. Shipment Confirmed By Carrier
READ TABLE lt_statuses WITH KEY status = 'CONFIRMED' INTO DATA(ls_conf_status).
IF sy-subrc = 0.
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Shipment Confirmed By Carrier'.
ls_event_log-eventtime = ls_conf_status-tstmp.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 5. Goods Picked Up
READ TABLE lt_statuses WITH KEY status = 'LOADING_END' INTO DATA(ls_pickup_status). " Example status
IF sy-subrc = 0.
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Goods Picked Up'.
ls_event_log-eventtime = ls_pickup_status-tstmp.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 6. Customs Declaration Filed (Placeholder logic)
" 7. Customs Cleared (Placeholder logic)
" 8. Shipment Rerouted (Placeholder logic, needs change documents)
" 9. Goods Delivered
READ TABLE lt_statuses WITH KEY status = 'UNLOADING_END' INTO DATA(ls_delivery_status). " Example status
IF sy-subrc = 0.
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Goods Delivered'.
ls_event_log-eventtime = ls_delivery_status-tstmp.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 10. Proof Of Delivery Received
READ TABLE lt_statuses WITH KEY status = 'POD_RECEIVED' INTO DATA(ls_pod_status). " Example status
IF sy-subrc = 0.
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Proof Of Delivery Received'.
ls_event_log-eventtime = ls_pod_status-tstmp.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 11. Freight Settlement Created
SELECT SINGLE created_at_utc FROM /scmtms/d_sfirhd
WHERE db_key IN ( SELECT sfir_root_key FROM /scmtms/d_tordoc
WHERE parent_key = @ls_tor_root-db_key AND bo_node_cat = 'SFIR_ROOT' )
INTO @DATA(lv_fsd_created_ts).
IF sy-subrc = 0.
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Freight Settlement Created'.
ls_event_log-eventtime = lv_fsd_created_ts.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 12. Freight Dispute Created (Needs logic based on dispute status in SFIR)
" 13. Invoice Verified (Needs logic based on invoice status in SFIR)
" 14. Shipment Cancelled
READ TABLE lt_statuses WITH KEY status = 'CANCELLED' INTO DATA(ls_cancel_status).
IF sy-subrc = 0.
CLEAR ls_event_log.
ls_event_log-shipmentid = ls_tor_root-tor_id.
ls_event_log-activityname = 'Shipment Cancelled'.
ls_event_log-eventtime = ls_cancel_status-tstmp.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 15. Payment Processed (Data is typically in the ERP system, not TM)
ENDLOOP.
" Final step: Write lt_event_log to a file on the application server
DATA(lv_filepath) = '/usr/sap/trans/[YourInstance]/[YourFileName].csv'.
OPEN DATASET lv_filepath FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc = 0.
" Write header
DATA(lv_header) = 'ShipmentId,ActivityName,EventTime'.
TRANSFER lv_header TO lv_filepath.
" Write data
LOOP AT lt_event_log INTO ls_event_log.
DATA(lv_line) = |{ ls_event_log-shipmentid },{ ls_event_log-activityname },{ ls_event_log-eventtime }|.
TRANSFER lv_line TO lv_filepath.
ENDLOOP.
CLOSE DATASET lv_filepath.
ELSE.
MESSAGE 'Error opening file on application server.' TYPE 'E'.
ENDIF.
ENDFOR.