您的运输管理数据模板
您的运输管理数据模板
- 建议收集的属性
- 需要跟踪的关键活动
- SAP运输管理数据提取指南
运输管理属性
| 名称 | 说明 | ||
|---|---|---|---|
| 事件时间 EventTime | 表示特定活动或事件发生时间的时间戳。 | ||
| 说明 事件时间为运输流程中的每项活动提供准确的日期和时间。此时间数据是计算周期时间、持续时间以及不同流程步骤之间等待时间的基础。 在分析中,此属性用于正确排列事件顺序、构建按时间排列的日志,并执行所有基于时间的绩效分析。它对于识别延迟、衡量流程效率以及根据计划或服务级别协议评估绩效至关重要。 为什么重要 该时间戳对于按时间顺序排列事件以及计算周期时间、准时交付率等各项绩效指标至关重要。 获取位置 数据来自SAP TM中的事件处理程序表,例如/SAPTRX/EH_EVMSG,这些表存储已报告事件的时间戳。 示例 2023-04-15T10:00:00Z2023-04-16T14:30:00Z2023-04-20T09:15:00Z | |||
| 活动名称 ActivityName | 运输流程中发生的特定业务事件或步骤的名称。 | ||
| 说明 Activity Name描述运输任务生命周期中的单个任务或里程碑,例如“Shipment Planned”“Goods Picked Up”或“Goods Delivered”。这些活动构成发现的流程图节点。 分析活动的顺序和频率,有助于识别标准流程、偏差、瓶颈和返工循环。它是运输管理流程发现和符合性检查的基础。 为什么重要 此属性定义运输流程中的步骤,用于可视化和分析端到端的货运流程。 获取位置 通常根据SAP TM执行跟踪事件处理程序中记录的事件代码或状态变更得出。数据可能来自记录业务对象状态变更的表,或记录特定事件消息的表。 示例 运输计划已制定已分配承运商货物已提取货物已交付已收到交付证明 | |||
| 运输任务 ShipmentId | 单次货物流转的唯一标识符,也是分析所使用的核心案例。 | ||
| 说明 Shipment ID是用于汇总所有相关运输活动和事件的主键,代表从初始请求到最终交付证明和付款的单次端到端运输流程。 在流程挖掘中,该属性对于构建案例视图至关重要,使分析人员能够追踪每个运输任务的完整历程。它支持分析单个运输任务对应的流程变体、周期时间和结果,全面呈现运输绩效。 为什么重要 这是基础案例标识符,将所有事件和数据点关联至特定运输订单,对于端到端流程分析至关重要。 获取位置 该标识符是SAP TM中的Freight Order编号或Freight Booking编号,可在/SCMTMS/D_TORROT和/SCMTMS/D_TRQROT等表中找到。 示例 610000432161000056786100009876 | |||
| 承运商名称 CarrierName | 负责该货运的运输承运商或物流服务商名称。 | ||
| 说明 承运商名称用于标识负责实际运输货物的公司。这是绩效分析的重要维度,因为不同承运商在服务水平、成本和可靠性方面可能存在差异。 在流程挖掘中,此属性用于按不同承运商细分并比较绩效。您可以据此创建承运商评分卡,监控各承运商的准时交付率,比较成本,并识别最常与延迟或争议相关的承运商。这些洞察对于承运商管理和采购决策至关重要。 为什么重要 支持比较不同承运商的绩效,对于优化承运商选择、成本和服务水平至关重要。 获取位置 此信息存储在Freight Order或Freight Booking单据中,并通过承运商的业务伙伴职能关联。 示例 DHL ExpressFedEx FreightMaersk LineUnion Pacific Railroad | |||
| 是否准时交付 IsOnTimeDelivery | 用于表示货物是否在要求交付日期当天或之前交付的布尔标记。 | ||
| 说明 这是一个计算属性,用于比较“Goods Delivered”活动的时间戳与“Requested Delivery Date”。如果货物按时或提前交付,则值为true;如果延迟交付,则值为false。 此属性通过为每票货运生成清晰的二元结果,简化了绩效分析。它是On-Time Delivery Performance Dashboard及相应KPI的基础,支持分析人员快速筛选延迟货运,并开展根因分析以了解绩效不佳的驱动因素。 为什么重要 直接衡量交付承诺的达成情况,简化关键准时交付KPI的计算和可视化。 获取位置 SAP TM不存储此属性,必须在数据转换过程中,将实际交付事件时间戳与Requested Delivery Date进行比较后计算得出。 示例 truefalse | |||
| 结束时间 EndTime | 表示特定活动完成时间的时间戳。 | ||
| 说明 StartTime表示事件开始时间,而EndTime表示事件结束时间。对于具有持续时间的活动,例如“Customs Clearance”或“Goods Loading”,这一信息尤其有用。EndTime与StartTime之差即为该活动的处理时间。 在流程挖掘分析中,同时记录开始时间和结束时间,可以更细致地分析活动持续时间,将处理时间与等待时间区分开来。这有助于准确定位低效环节,无论问题出在任务执行过程中,还是出在任务之间的交接环节。 为什么重要 支持准确计算活动处理时间,并区分主动工作时间与事件之间的等待时间。 获取位置 与StartTime一样,数据来自事件处理程序表,也可能对应某项活动单独记录的“completed”事件。 示例 2023-04-15T11:30:00Z2023-04-16T15:00:00Z2023-04-20T09:45:00Z | |||
| 要求交付日期 RequestedDeliveryDate | 客户要求或销售订单规定的交付日期和时间。 | ||
| 说明 要求交付日期是“Goods Delivered”活动的目标截止时间,也是衡量准时交付绩效的主要基准。 该日期对于计算“On-Time Delivery Rate”KPI至关重要。将实际交付时间戳与要求交付日期进行比较,企业即可判断是否满足服务级别协议。分析偏差有助于识别延迟的系统性原因,例如承运商绩效问题、计划延迟或海关滞留。 为什么重要 这是衡量准时交付绩效的基准,也是影响客户满意度和运营卓越的关键KPI。 获取位置 该日期通常从SAP ERP中的前置销售订单或库存调拨订单传输而来,存储在Freight Unit或Freight Order的日期和时间字段中。 示例 2023-05-20T17:00:00Z2023-06-01T12:00:00Z2023-06-15T23:59:59Z | |||
| 货运总成本 TotalFreightCost | 该货运计算得出或开具发票的总成本。 | ||
| 说明 货运总成本反映一票货运带来的财务影响,可以是运输管理系统计算的成本,也可以是结算后承运商发票上的最终金额。 此属性将财务维度纳入流程分析。分析人员可以识别成本最高的流程变体,计算延迟或改道产生的成本,并比较不同承运商或运输方式的成本效益。它是运输支出和服务成本分析仪表板的基础。 为什么重要 为流程增加财务维度,支持分析运输支出、每票货运成本以及流程低效带来的财务影响。 获取位置 数据来自SAP TM中的Freight Settlement Document,在完成费用计算后生成,可在/SCMTMS/D_SFIRHD等表中找到。 示例 250.751200.005430.50 | |||
| 运输方式 ModeOfTransport | 货运采用的运输方式,例如公路、铁路、航空或海运。 | ||
| 说明 此属性用于指定运输方式。不同运输方式具有不同的成本结构、运输时间和流程复杂度。例如,国际航空货运与国内整车运输相比,可能包含不同的活动,如海关清关。 按运输方式分析流程,可以制定针对性的改进措施。这对于成本分析也至关重要,尤其有助于识别高价运输(如加急航空运输)与标准、经济型运输方式的使用情况。这种细分是理解和控制运输支出的关键。 为什么重要 支持根据运输方式分析成本、时间和流程差异,对于成本优化和识别高价运输使用情况至关重要。 获取位置 这是Freight Order或Freight Booking中的关键字段,通常标记为Transportation Mode或MOT。 示例 01(公路)02(铁路)04(空运)05(海运) | |||
| 争议原因 DisputeReason | 对货运发票提出争议时提供的原因。 | ||
| 说明 当承运商发票与SAP TM计算的预期成本不一致时,系统会创建争议。此属性记录差异原因,例如“Incorrect Rate”、“Duplicate Invoice”或“Accessorial Charge Not Approved”。 分析争议原因对于Freight Bill Error and Dispute Rate仪表板至关重要。它有助于识别账单不准确的根本原因,判断问题源于主数据、承运商错误还是运营失误。这些洞察支持采取有针对性的措施,减少争议,加快付款周期并降低管理成本。 为什么重要 提供货运账单错误的根本原因,支持采取针对性措施减少发票争议并改进结算流程。 获取位置 此信息记录在与Freight Settlement Document关联的争议管理案例中。 示例 费率不匹配重量错误未经批准的滞期费重复发票 | |||
| 最近数据更新时间 LastDataUpdate | 流程挖掘数据集最近一次提取或刷新的时间戳。 | ||
| 说明 此属性表示待分析数据的新鲜度,反映数据最近一次从SAP TM等源系统提取到流程挖掘工具的日期和时间。 对于任何仪表板或分析而言,这是关键的元数据,可帮助了解洞察反映的时效性。它有助于判断当前查看的是实时信息,还是上一时间段的快照,这对于及时、准确地做出决策至关重要。 为什么重要 提供有关数据时效性的关键上下文,确保用户了解分析所依据的数据有多新。 获取位置 通常由ETL(提取、转换、加载)工具或数据管道在数据摄取过程中生成并存储。 示例 2023-10-27T08:00:00Z2023-10-26T08:00:00Z | |||
| 延迟原因 DelayReason | 解释货运延迟原因的代码或文本。 | ||
| 说明 延迟原因属性记录偏离计划时刻表的原因,例如“Bad Weather”、“Customs Hold”或“Carrier Delay”。此信息通常由承运商手动报告,或通过事件消息报告。 这是根因分析的重要属性。它不仅能说明货运晚点,还能帮助分析人员了解晚点原因。通过分类和量化延迟原因,企业可以识别反复出现的问题,并将改进工作集中在影响最大的领域,例如改善承运商沟通或优化路线以避开拥堵。 为什么重要 解释货运延迟背后的原因,支持深入开展根因分析,减少异常并提升准时交付绩效。 获取位置 当报告“Arrival/Departure Delayed”事件时,可在SAP TM的事件管理框架中记录为事件代码和原因。 示例 WEATHER_DELAYCUSTOMS_INSPECTIONPORT_CONGESTIONMECHANICAL_FAILURE | |||
| 是否存在争议 IsDisputed | 用于表示该货运发票是否引发争议的布尔标记。 | ||
| 说明 此计算标记用于识别存在相关货运结算争议的货运。如果创建了争议,则值为true;否则为false。该值可以根据是否存在“Freight Dispute Created”活动或非空“Dispute Reason”推导得出。 此属性简化了货运结算流程分析,支持快速计算Freight Billing Discrepancy Rate KPI,并筛选所有存在争议的货运。分析人员随后可以研究这些货运的共同特征,例如承运商、运输线路或费用类型,以查找账单错误的根本原因。 为什么重要 简化问题货运结算的识别,支持快速计算争议率并分析账单错误的根本原因。 获取位置 SAP TM不存储此属性,必须根据是否存在与Freight Settlement Document关联的争议案例进行计算。 示例 truefalse | |||
| 源系统 SourceSystem | 事件数据来源的系统。 | ||
| 说明 此属性用于标识生成数据的源系统,例如SAP TM、SAP ERP或外部承运商门户。它提供数据来源的上下文,并帮助了解数据集成节点。 在复杂的系统环境中,了解源系统对于数据验证、排查集成问题以及理解不同系统如何参与整体流程至关重要。例如,它可以区分由内部系统报告的事件和由第三方物流服务商报告的事件。 为什么重要 标识数据来源,对于数据治理、问题排查以及理解多系统间的流程编排至关重要。 获取位置 此信息通常存储在系统日志中,也可以根据创建数据记录的接口或用户推导得出。 示例 SAP_TM_P01SAP_ERP_E01CARRIER_PORTAL_XYZ | |||
| 用户名 UserName | 执行某项活动的人员的用户ID或姓名。 | ||
| 说明 此属性用于标识负责执行手动活动的员工或用户,例如“Shipment Planned”或“Invoice Verified”,将流程步骤与执行这些步骤的个人或团队关联起来。 按用户分析活动,有助于了解工作量分配、识别培训需求并发现高绩效人员。它对于合规和审计也至关重要,可清晰记录谁在何时完成了什么工作,还能揭示不同用户执行同一任务时的差异。 为什么重要 将手动流程步骤关联到具体用户,从而支持工作量、个人绩效和培训机会分析。 获取位置 通常位于运输单据的变更日志或单据抬头表中,例如“Created By”或“Changed By”字段(如ERNAM、AENAM)。 示例 CB998030SMITHJPLANNER_EU | |||
| 目的国 DestinationCountry | 货运交付所在的国家。 | ||
| 说明 此属性用于标识货运的最终目的国,来源于最后交付地点的地址。 与起运国类似,按目的国分析对于了解区域物流挑战至关重要。它可以揭示哪些目的地更容易发生交付延迟,或末端配送成本更高。这些洞察有助于优化网络、制定合理的交付预期并管理国际贸易合规。 为什么重要 支持按目的地分析流程绩效,突出特定交付区域、海关机构或末端承运商存在的问题。 获取位置 这是Freight Order中最后一个停靠点目的地地址信息的一部分。 示例 FRCAGBJP | |||
| 计划提货日期 ScheduledPickupDate | 承运商计划从发运点提取货物的日期和时间。 | ||
| 说明 计划提货日期是双方约定的实际运输开始时间,也是货运执行阶段的关键里程碑。 此属性对于监控运输首段的时效性至关重要。将计划提货时间与实际“Goods Picked Up”事件时间戳进行比较,企业即可计算提货延迟,从而评估发运地点和承运商的绩效与可靠性。 为什么重要 作为衡量提货时效性的基准,帮助识别货运实际运输开始阶段的延迟。 获取位置 这是存储在SAP TM中Freight Order停靠点序列上的计划日期和时间。 示例 2023-05-18T09:00:00Z2023-05-30T14:00:00Z2023-06-12T10:30:00Z | |||
| 货运状态 ShipmentStatus | 数据提取时货运的当前总体状态。 | ||
| 说明 装运状态概览装运在其生命周期中的位置,例如“计划中”“执行中”“已交付”或“已取消”,表示案例的已知最新状态。 该属性适合按结果筛选和分析装运。例如,分析人员可以只关注已完成的装运,以衡量端到端周期时间;也可以只分析已取消的装运,以了解取消的根本原因。它为解读流程顺序提供了重要背景。 为什么重要 提供每票货运的总体结果,支持根据货运已完成、已取消或仍在运输中进行筛选和分析。 获取位置 这是SAP TM中Freight Order或Freight Booking单据抬头的总体状态字段。 示例 规划中准备运输执行中已执行已取消 | |||
| 起运国 OriginCountry | 货运发出的国家。 | ||
| 说明 此属性用于标识运输旅程的起始国家,来源于首个提货地点的地址。 按起运国分析流程,有助于识别不同地区在绩效、成本和复杂度方面的差异。它可以揭示海关清关时间较长、承运商成本较高或延迟更频繁的国家。这种地理细分对于管理全球供应链以及针对不同地区制定物流策略至关重要。 为什么重要 支持从地理维度分析货运绩效,帮助识别区域瓶颈、成本驱动因素或流程差异。 获取位置 这是Freight Order中首个停靠点起始位置地址信息的一部分。 示例 DEUSCNMX | |||
运输管理活动
| 活动 | 说明 | ||
|---|---|---|---|
| 付款已处理 | 此最终活动确认承运商已收到运输服务款项。通常在SAP TM收到已核验发票后,于连接的ERP系统中完成。 | ||
| 为什么重要 这标志着端到端运输生命周期真正结束,对于衡量整体流程时长和准时付款KPI至关重要。 获取位置 该信息存储在ERP系统(如S/4HANA Finance)中。可通过发票编号将其关联回Freight Settlement Document。状态更新可能会回传至SAP TM,也可能需要从BKPF和BSEG等ERP表中获取数据。 采集 从ERP系统获取付款清账日期,并通过发票引用将其关联至运输任务。 事件类型 explicit | |||
| 已分配承运商 | 此活动表示已选择特定的运输服务提供商,即承运商,并将其分配给运输任务。分配可以通过手动操作、自动规划或招标流程完成。 | ||
| 为什么重要 在确认和执行运输任务之前,分配承运商是关键步骤。跟踪这一活动有助于分析承运商选择流程,并确保及时完成订舱。 获取位置 当Freight Order或Freight Booking中的承运商字段(角色为“Carrier”的参与方)被填充时,即可记录此活动。在招标场景中,则以Freight Request for Quotation中标为准。 采集 识别Freight Order中承运商合作伙伴功能首次被填充或确认时的时间戳。 事件类型 inferred | |||
| 已创建运费结算 | 此活动标志着Freight Settlement Document(FSD)的创建。该单据用于计算应支付给承运商的运输成本,也是计提和发票核验的主要依据。 | ||
| 为什么重要 这标志着运输流程进入财务结算阶段。分析从交付到创建结算单的时间,有助于识别财务处理中的瓶颈。 获取位置 这是通过创建Freight Settlement Document捕获的明确事件。该单据的抬头表/SCMTMS/D_SFIRHD中提供了创建时间戳。 采集 使用Freight Settlement Document的创建日期和时间。 事件类型 explicit | |||
| 已收到交付证明 | 当承运商返回已签署的Proof of Delivery(POD)文件,并将其记录到系统中时,即发生此活动。该文件确认收货方已接收货物。 | ||
| 为什么重要 收到POD是向客户开票以及与承运商结算运费的重要前提。此环节的延误会直接影响现金转换周期。 获取位置 通常可以根据Freight Order的状态变更推断此活动,例如POD状态变为“Received”。该状态字段的变更时间即为活动时间戳。 采集 记录Freight Order上的Proof of Delivery状态更新为“Received”时的时间戳。 事件类型 inferred | |||
| 收到运输请求 | 此活动标志着运输流程启动,代表运输需求已创建。在SAP TM中,通常通过创建Forwarding Order(FWO)或基于订单的Transportation Requirement(OTR)记录这一活动。 | ||
| 为什么重要 这是端到端运输流程的主要开始事件。分析从该活动到规划完成所需的时间,对于衡量规划效率至关重要。 获取位置 创建Forwarding Order(单据类型为FWO)或其他运输需求单据时,会记录此事件。抬头表(如/SCMTMS/D_TORROT)中的创建时间戳可作为事件时间。 采集 记录Forwarding Order或Transportation Requirement单据的创建日期和时间。 事件类型 explicit | |||
| 货物已交付 | 此活动表示运输任务抵达最终目的地,实体运输完成。当承运商报告货物已在收货方地点卸载时,即可记录此活动。 | ||
| 为什么重要 这是衡量准时交付绩效和客户满意度最重要的里程碑,通常也是开票和结算流程的触发点。 获取位置 此事件在SAP TM中记录为“Arrival at Destination”或“Unloading End”执行事件,并更新Freight Order的执行状态。数据通常由承运商提供。 采集 使用Freight Order最终停靠点所报告的“Arrival at Destination”执行事件时间戳。 事件类型 explicit | |||
| 货物已提取 | 此活动标志着货物实体运输的开始。当承运商报告货物已装载并离开发货方地点时,即可记录此活动。 | ||
| 为什么重要 这是运输执行的关键里程碑,标志着在途阶段开始。它对于跟踪准时绩效和提供准确的运输可视性至关重要。 获取位置 此事件通常记录在与SAP TM集成的SAP Event Management中,事件名称可能为“Departure”或“Loading End”。它会更新Freight Order的执行状态,也可以直接记录在Freight Order中。 采集 使用Freight Order起运地点所报告的“Departure”执行事件时间戳。 事件类型 explicit | |||
| 运输任务已取消 | 此活动表示运输请求或计划创建后被取消,是未进入执行阶段的流程的终止节点。 | ||
| 为什么重要 跟踪取消情况有助于识别客户需求变化或规划错误等流程失败原因。较高的取消率可能表明订单管理或规划存在根本问题。 获取位置 当Forwarding Order或Freight Order的生命周期状态变为“Cancelled”时,可推断此事件。该状态变更的时间戳即为事件时间。 采集 记录单据生命周期状态设置为“Cancelled”时的时间戳。 事件类型 inferred | |||
| 运输计划已制定 | 此活动表示运输需求已整合为具体的运输计划。当创建并保存Freight Order(公路或铁路)或Freight Booking(海运或空运),并在其中包含计划路线和资源时,即可记录此活动。 | ||
| 为什么重要 完成这一里程碑是启动物流执行的必要条件。从请求到该活动的周期时间,是衡量规划效率的重要KPI。 获取位置 此事件对应Freight Order或Freight Booking单据的创建。也可以根据单据状态变更推断,例如规划状态变为“Planned”。相关表通常包括用于存储抬头数据的/SCMTMS/D_TORROT。 采集 使用Freight Order或Freight Booking单据的创建时间戳。 事件类型 explicit | |||
| 发票已核验 | 此活动表示承运商发票已与Freight Settlement Document成功匹配,并获准付款。这是ERP系统启动付款流程前的最后一步。 | ||
| 为什么重要 此活动完成运费成本的审计和核验。该阶段的延误可能导致承运商收款滞后,进而影响合作关系。 获取位置 可以根据Freight Settlement Document的状态变更推断此事件,例如变为“Ready for Accrual”或“Transferred for Posting”,表示该单据已发送至ERP系统进行付款处理。 采集 跟踪FSD生命周期状态变更为可付款或已过账时的时间戳。 事件类型 inferred | |||
| 已创建运费争议 | 此事件表示承运商发票与Freight Settlement Document中的计算成本之间存在差异,并触发争议解决工作流。 | ||
| 为什么重要 争议会延迟向承运商付款,并需要投入管理资源进行处理。跟踪此活动有助于识别费率错误或附加费用等账单不准确的根因。 获取位置 可以根据Freight Settlement Document的状态变更推断此事件,例如设置“Dispute”状态。也可能通过创建单独的争议案例单据来记录。 采集 记录Freight Settlement Document设置争议状态时的时间戳。 事件类型 inferred | |||
| 已完成清关 | 此活动表示货物已获海关主管部门批准,可以继续运输。对于国际物流而言,这是重要里程碑,因为它消除了一个重大的潜在瓶颈。 | ||
| 为什么重要 清关往往是全球供应链发生重大延误的来源。跟踪该活动的持续时间和成功率,是改善国际运输时效的关键。 获取位置 此事件记录为“Customs Clearance”执行事件,通常由报关代理或外部可视化服务提供商报告,并更新至Freight Order的执行跟踪中。 采集 使用与Freight Order关联的“Customs Clearance”执行事件报告时间戳。 事件类型 explicit | |||
| 已提交报关申报 | 对于国际运输,此活动表示已向主管部门提交所需的海关文件。这是获得货物出口或进口放行许可的前提。 | ||
| 为什么重要 及时提交报关申报对于避免边境延误至关重要。此活动有助于监控报关代理流程的效率。 获取位置 此事件可以记录为报关代理报告的特定执行事件,也可以根据集成海关管理系统(如SAP GTS)的状态变更捕获。Freight Order会相应更新。 采集 记录“Customs Declaration Filed”执行事件的时间戳,或对应状态变更的时间戳。 事件类型 explicit | |||
| 承运商已确认运输任务 | 此事件表示承运商同意按计划执行运输。确认通常通过EDI消息、承运商门户更新或手动录入获得,并会更新Freight Order的状态。 | ||
| 为什么重要 承运商确认意味着运输计划获得执行承诺,降低了不确定性。确认延迟可能使整个运输计划面临风险。 获取位置 可根据Freight Order或Freight Booking的确认状态字段变更推断此事件。单据状态管理中会设置“Confirmed”等具体状态值。 采集 跟踪Freight Order单据中确认状态字段的变更。 事件类型 inferred | |||
| 运输任务已改道 | 此活动表示运输任务确认后,路线或计划发生了非预期变更。原因可能包括运输中断、客户请求或物流问题。 | ||
| 为什么重要 改道通常会增加成本并造成延误。识别改道频率及其原因,有助于提高规划准确性和运营稳定性。 获取位置 通过检测Freight Order开始执行后,其阶段、地点或日期发生的重大变更,可以推断此事件。可分析变更单据(表CDHDR和CDPOS)来识别这些变化。 采集 在“Shipment Confirmed by Carrier”事件之后,检测Freight Order单据中关键路线字段的变更。 事件类型 inferred | |||
提取指南
步骤
- 识别并激活CDS View API:登录您的SAP S/4HANA系统。使用事务
/IWFND/MAINT_SERVICE确认核心CDS View所需的OData服务已激活。重点检查与I_TransportationOrder、C_TranspOrdExecutionEvent、I_ForwardingOrder和I_FreightSettlementDocument相关的服务。如未激活,请联系SAP管理员,从后端系统添加并激活这些服务。 - 建立API连接:向SAP管理员获取OData服务的根URL。设置客户端应用,例如使用requests库的Python脚本、商业ETL工具或Postman,连接到API。您需要配置身份验证,通常可使用Basic Authentication(用户名和密码)或更安全的OAuth 2.0。
- 定义提取范围:确定数据提取范围。设置具体日期区间,例如最近6个月。确定需要筛选的相关组织单位,例如公司代码,或具体单据类型,例如Freight Order Type,确保数据与您分析的流程相关。
- 构建基础货运查询:首先查询I_TransportationOrder CDS View。该视图是货运的核心对象,也称为Freight Orders或Freight Bookings。使用OData的
$select参数选择所需列,包括CarrierName、ModeOfTransport和RequestedDeliveryDate等推荐属性。应用$filter,按日期及其他范围参数限制数据。 - 执行查询并提取运输事件:使用C_TranspOrdExecutionEvent CDS View提取关键物流事件。按特定的
EventCode值筛选,例如“Goods Picked Up”(DEPARTURE)和“Goods Delivered”(ARRIVAL_AT_DESTINATION)。使用TransportationOrder UUID将这些数据关联回基础货运数据。 - 查询相关业务对象:要还原完整流程,您必须查询其他相关CDS View。查询I_ForwardingOrder获取“Transportation Request Received”活动,查询I_FreightSettlementDocument获取“Freight Settlement Created”“Freight Dispute Created”和“Invoice Verified”等财务活动。
- 提取基于状态的活动:许多活动并非独立事件,而是主单据上的状态变化。对于“Carrier Assigned”“Shipment Confirmed By Carrier”和“Shipment Cancelled”等活动,查询I_TransportationOrder View,并使用相关状态字段对应的
LastChangeDateTime作为事件时间。这需要将状态代码准确映射到业务活动。 - 合并并转换数据:将所有来源提取的数据整合为统一的事件日志结构。对于每项活动,创建一行并包含所需列:ShipmentId、ActivityName和EventTime。确保基础货运查询中的所有推荐属性都出现在该货运的每一行中。此步骤在概念上等同于SQL的
UNION ALL操作。 - 处理复杂及外部事件:对于“Customs Cleared”或“Payment Processed”等活动,数据可能存储在特定字段甚至外部系统中。所提供的查询逻辑使用标准字段作为代理。您可能需要关联海关专用CDS View,或根据Freight Settlement Document编号与单独的ERP付款数据提取结果进行匹配。
- 整理为ProcessMind格式:将最终整合的数据集保存为CSV文件。确保列标题符合上传要求,例如在工具设置中将
ShipmentId列映射到CaseId字段。确认时间戳格式统一,最好使用UTC格式(YYYY-MM-DDTHH:MM:SSZ)。
配置
- 核心CDS View:提取主要依赖I_TransportationOrder(货运订单)、C_TranspOrdExecutionEvent(执行事件)、I_ForwardingOrder(运输请求)和I_FreightSettlementDocument(结算)。
- 日期范围筛选:必须应用日期筛选来控制数据量。使用I_TransportationOrder中的
CreationDateTime,或C_TranspOrdExecutionEvent中的ActualBusinessDateTime。初次分析建议使用3至6个月的范围。 - 单据类型筛选:使用
TransportationOrderType字段筛选具体单据类型,以聚焦分析范围。这有助于区分不同物流场景,例如标准出库货运和库存转储。 - 组织筛选:如适用,可按
PurchasingOrganization或其他组织层级字段筛选,将数据限制在特定业务单元或区域。 - API分页:对于大型数据集,使用OData参数
$top和$skip分批获取数据。这样可以避免API超时,并降低客户端内存消耗。每页1000至5000行通常较为合适。 - 前提条件:执行提取的用户或服务账号需要获得底层OData服务的授权(授权对象S_SERVICE)以及CDS View中业务数据的访问权限。相应服务必须在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' 步骤
- 确认可通过经批准的SQL客户端、数据库视图或提取服务直接读取SAP TM HANA架构。获取读取相关SAP TM表所需的连接字符串、凭据、架构名称和授权。未经适用的安全与变更审批,不得直接查询生产环境。
- 确认系统中的物理表名和列名。以下查询使用/SCMTMS/D_TORROT和/SCMTMS/D_TOSTOP作为核心表,但根据SAP TM版本和实施方式,状态、合作伙伴、日期、成本、海关、单据和付款数据可能存储在其他表或扩展中。请先根据系统目录和数据模型完成验证,再仅替换已注明的占位符。
- 使用[Start timestamp]和[End timestamp]定义提取周期。初始分析通常适合使用三至六个月的滚动周期。只有在确认查询性能和事件历史保留期限后,才应扩大周期。
- 确定货运案例键。查询使用/SCMTMS/D_TORROT中的TOR_ID作为货运标识符。如果您的实施使用其他稳定标识符,请在每个活动分支中统一替换案例键;如有可用信息,同时保留原始单据标识符作为附加审计属性。
- 将每项业务活动映射到明确的源条件。ProcessMind会按原样读取事件日志,因此查询会为每项提取的活动创建一行。系统不会根据单据顺序、缺失时间戳或状态变化推断里程碑。
- 与运输计划人员和业务流程负责人共同验证状态和时间戳映射。尤其要确认代表请求创建、计划、承运商分配、承运商确认、提货、海关申报、海关放行、改道、交付、POD接收、运费结算、争议、发票验证、取消和付款的值。
- 在经批准的SQL客户端中执行查询。检查结果是否满足每个事件一行、ShipmentId非空、ActivityName非空且EventTime有效。检查一对多连接是否造成重复行,并在必要时调整源映射或聚合逻辑。
- 在相应源字段可用时,使用建议的属性丰富结果。对于无法在不依赖系统特定元数据的情况下安全命名的字段,查询包含专业占位符。请仅使用经过验证的列或经批准的视图替换这些占位符。
- 应用最终数据质量规则。删除缺少案例标识符或事件时间戳的行,将时间戳统一到一个时区,同时保留源时间戳以便审计,并确保EndTime不早于EventTime。不得为缺失的源记录创建合成事件。
- 将结果导出为UTF-8 CSV或其他ProcessMind支持的表格格式。使用准确的必需列名ShipmentId、ActivityName和EventTime。填充后同时包含EndTime和建议的属性。将文件上传到ProcessMind,或将经批准的查询结果连接到ProcessMind,然后确认Shipment案例标识符和Activity Name字段已正确映射。
配置
- **核心来源表:**使用/SCMTMS/D_TORROT获取运输订单或货运订单根数据,使用/SCMTMS/D_TOSTOP获取停靠点和里程碑数据。部署前,请在目标SAP TM系统中验证所有其他来源对象。
- **案例标识符:**使用稳定的货运或货运订单标识符。示例查询使用TOR_ID作为ShipmentId。确认该标识符在计划、执行、结算和ERP付款记录中保持稳定。
- **活动映射:**为全部15项必需活动配置明确的来源条件。每项活动都必须作为实际事件日志行输出。ProcessMind不会从其他行推导活动。
- **日期范围:**从三至六个月的历史数据开始。尽可能在每个来源分支中尽早使用EventTime条件。对于增量加载,请使用受控水位线,并加入较小的重叠窗口,以捕获延迟更新。
- **业务筛选:**根据实施情况配置公司代码、采购组织、销售组织、单据类型、运输方式、承运商、工厂、地点和状态筛选。适用字段未经验证时,使用[Company code filter]等占位符。
- **时间戳处理:**将来源时间戳转换为统一时区。如果来源将日期和时间分开存储,请使用SAP HANA版本支持的系统专用转换方式进行合并。需要审计时,保留原始来源时间戳。
- **推荐属性:**从已验证的来源字段或经批准的计算视图中填充CarrierName、RequestedDeliveryDate、ModeOfTransport、TotalFreightCost和IsOnTimeDelivery。来源不包含可靠值时保留为空。
- **性能:**限制时间范围,仅查询所需列,在关联前先筛选,避免不受限的全表扫描,并检查HANA执行计划。对于大型数据集,使用分区感知条件、增量提取、暂存表或经批准的计算视图。
- **重复控制:**一对多关联可能为同一活动生成多行。请使用已验证的事件键、来源单据键或确定性聚合规则。不要采用可能删除合法重复事件的任意去重方式。
- **前提条件:**所需数据库授权、SAP TM数据访问权限、任何关联ERP或结算数据的访问权限、经批准的提取工具,以及确认相关SAP TM模块、集成和自定义增强已启用。
- **系统专用映射:**状态代码、合作伙伴角色、海关里程碑、结算状态、发票状态和付款状态会因版本和配置而异。请在受控配置文档中维护映射,并在升级后进行测试。
a 示例查询 sql
WITH
base_tor AS (
SELECT
r.TOR_ID AS ShipmentId,
r.TOR_ID AS SourceDocumentId,
r.CREATED_AT AS RequestEventTime,
r.CREATED_AT AS PlannedEventTime,
r.CREATED_AT AS CarrierAssignedEventTime,
r.CREATED_AT AS CarrierConfirmedEventTime,
r.CREATED_AT AS PickupEventTime,
r.CREATED_AT AS CustomsFiledEventTime,
r.CREATED_AT AS CustomsClearedEventTime,
r.CREATED_AT AS ReroutedEventTime,
r.CREATED_AT AS DeliveredEventTime,
r.CREATED_AT AS PodReceivedEventTime,
r.CREATED_AT AS SettlementCreatedEventTime,
r.CREATED_AT AS DisputeCreatedEventTime,
r.CREATED_AT AS InvoiceVerifiedEventTime,
r.CREATED_AT AS CancelledEventTime,
r.CREATED_AT AS PaymentProcessedEventTime,
r.CREATED_AT AS EndTime,
CAST(NULL AS NVARCHAR(255)) AS CarrierName,
CAST(NULL AS TIMESTAMP) AS RequestedDeliveryDate,
CAST(NULL AS NVARCHAR(50)) AS ModeOfTransport,
CAST(NULL AS DECIMAL(19, 2)) AS TotalFreightCost,
CAST(NULL AS NVARCHAR(5)) AS IsOnTimeDelivery
FROM "/SCMTMS/D_TORROT" r
WHERE r.CREATED_AT >= TO_TIMESTAMP('[Start timestamp]')
AND r.CREATED_AT < TO_TIMESTAMP('[End timestamp]')
AND ('[Company code filter]' = '[Company code filter]' OR r.TOR_ID IS NOT NULL)
),
stop_data AS (
SELECT
s.TOR_ID AS ShipmentId,
MIN(s.STOP_SEQ) AS FirstStopSequence,
MAX(s.STOP_SEQ) AS LastStopSequence
FROM "/SCMTMS/D_TOSTOP" s
GROUP BY s.TOR_ID
),
source_data AS (
SELECT
b.ShipmentId,
b.SourceDocumentId,
b.RequestEventTime,
b.PlannedEventTime,
b.CarrierAssignedEventTime,
b.CarrierConfirmedEventTime,
b.PickupEventTime,
b.CustomsFiledEventTime,
b.CustomsClearedEventTime,
b.ReroutedEventTime,
b.DeliveredEventTime,
b.PodReceivedEventTime,
b.SettlementCreatedEventTime,
b.DisputeCreatedEventTime,
b.InvoiceVerifiedEventTime,
b.CancelledEventTime,
b.PaymentProcessedEventTime,
b.EndTime,
b.CarrierName,
b.RequestedDeliveryDate,
b.ModeOfTransport,
b.TotalFreightCost,
CASE
WHEN b.DeliveredEventTime IS NOT NULL
AND b.RequestedDeliveryDate IS NOT NULL
AND b.DeliveredEventTime <= b.RequestedDeliveryDate THEN 'true'
WHEN b.DeliveredEventTime IS NOT NULL
AND b.RequestedDeliveryDate IS NOT NULL THEN 'false'
ELSE NULL
END AS IsOnTimeDelivery
FROM base_tor b
LEFT JOIN stop_data s
ON s.ShipmentId = b.ShipmentId
),
event_log AS (
SELECT ShipmentId, 'Transportation Request Received' AS ActivityName, RequestEventTime AS EventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE RequestEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Shipment Planned', PlannedEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE PlannedEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Carrier Assigned', CarrierAssignedEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE CarrierAssignedEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Shipment Confirmed By Carrier', CarrierConfirmedEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE CarrierConfirmedEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Goods Picked Up', PickupEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE PickupEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Customs Declaration Filed', CustomsFiledEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE CustomsFiledEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Customs Cleared', CustomsClearedEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE CustomsClearedEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Shipment Rerouted', ReroutedEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE ReroutedEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Goods Delivered', DeliveredEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE DeliveredEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Proof Of Delivery Received', PodReceivedEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE PodReceivedEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Freight Settlement Created', SettlementCreatedEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE SettlementCreatedEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Freight Dispute Created', DisputeCreatedEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE DisputeCreatedEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Invoice Verified', InvoiceVerifiedEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE InvoiceVerifiedEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Shipment Cancelled', CancelledEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE CancelledEventTime IS NOT NULL
UNION ALL
SELECT ShipmentId, 'Payment Processed', PaymentProcessedEventTime, EndTime, CarrierName, RequestedDeliveryDate, ModeOfTransport, TotalFreightCost, IsOnTimeDelivery, SourceDocumentId FROM source_data WHERE PaymentProcessedEventTime IS NOT NULL
)
SELECT
ShipmentId,
ActivityName,
EventTime,
EndTime,
CarrierName,
RequestedDeliveryDate,
ModeOfTransport,
TotalFreightCost,
IsOnTimeDelivery,
SourceDocumentId
FROM event_log
WHERE ShipmentId IS NOT NULL
AND EventTime IS NOT NULL
ORDER BY ShipmentId, EventTime, ActivityName; 步骤
- 定义数据需求:首先确认15项必需活动及所有属性的具体逻辑。这包括将每项活动映射到SAP TM系统中的特定状态变化、创建事件或单据关联。例如,确定代表“Goods Picked Up”的确切执行状态。
- 访问ABAP开发环境:登录SAP GUI,通过事务代码
SE38进入ABAP编辑器。输入新程序名称,例如ZTM_PROCESS_EXTRACT,然后点击“创建”。填写标题,并将程序类型设置为“Executable Program”。 - 创建选择屏幕:在程序中定义用户将看到的选择屏幕。应包含数据筛选参数,例如货运订单创建日期范围(
SO_CREDT),以及单据类型(SO_TYPE)或承运商(SO_CARR)的选择选项。 - 定义输出结构:定义与所需事件日志格式一致的内表结构。该结构应包含
ShipmentId、ActivityName、EventTime、EndTime、CarrierName、RequestedDeliveryDate、ModeOfTransport、TotalFreightCost和IsOnTimeDelivery字段。 - 实现数据选择逻辑:编写ABAP主逻辑,为15项活动分别选择数据。通常需要查询多个SAP TM表。首先在指定日期范围内选择主要货运单据,例如Freight Orders。
- 提取计划和执行事件:针对每个选定的货运单据(例如Freight Order),查询相关表和业务对象,获取不同事件的时间戳。使用/SCMTMS/D_TORROT获取Freight Order创建(“Shipment Planned”)、承运商分配(“Carrier Assigned”)以及对应“Goods Picked Up”和“Goods Delivered”的执行状态变化。前置Forwarding Order(/SCMTMS/D_TRQROT)的创建可代表“Transportation Request Received”。
- 提取承运商确认和改道事件:查询与Freight Order关联的状态表或变更文档(CDHDR/CDPOS),确定
CONFIRMATION状态的设置时间,以捕获“Shipment Confirmed By Carrier”。同样,查找路线信息的重大变化,以捕获“Shipment Rerouted”。 - 提取海关事件:如果使用SAP Global Trade Services(GTS)或类似模块,“Customs Declaration Filed”和“Customs Cleared”通常通过关联单据进行跟踪。逻辑必须读取Freight Order的单据流(/SCMTMS/D_TORDOC),查找这些关联单据及其创建或状态变更时间。
- 提取结算和争议事件:查询Freight Settlement Document抬头表(/SCMTMS/D_SFIRHD)及其相关项目和状态,捕获“Freight Settlement Created”“Freight Dispute Created”和“Invoice Verified”事件。将这些事件关联回原始
ShipmentId。 - 整合数据:对于找到的每个事件,在最终内表中创建一条新记录。将对应活动填入
ActivityName,将事件时间戳填入EventTime,并将Freight Order或Freight Booking ID填入ShipmentId。从来源单据中填充其他属性。 - 格式化并导出文件:最终内表填充完成后,将数据格式化为平面文件。使用
OPEN DATASET、LOOP AT... TRANSFER...和CLOSE DATASET命令,将内表内容写入SAP应用服务器上的CSV或TXT文件(可通过事务AL11访问)。 - 计划并获取文件:可将ABAP程序安排为后台作业(事务SM36),自动提取数据。随后可使用事务
CG3Y将生成的文件从应用服务器下载到本地计算机,再上传到ProcessMind。
配置
- 日期范围:选择屏幕应包含核心运输单据(例如Freight Order)创建日期的必填范围。初次分析建议使用3至6个月,以确保数据具有代表性,同时避免运行时间过长。
- 单据类型筛选:提供运输单据类型筛选,例如Freight Order、Freight Booking。这对于聚焦公路货运或海运等具体流程至关重要。
- 承运商筛选:允许用户按具体承运商筛选,便于分析各物流合作伙伴的表现。
- 组织筛选:加入采购组织或公司代码等相关组织单位筛选,将提取范围限定到具体业务领域。
- 性能优化:对于大型数据集,确保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. 立即消除运输管理瓶颈
精准定位低效环节、优化路线,将周期时间缩短30%。
无需信用卡,几分钟即可完成设置。