运输管理数据模板
运输管理数据模板
- 建议收集的属性
- 需要跟踪的关键活动
- SAP运输管理数据提取指南
运输管理属性
| 名称 | 说明 | ||
|---|---|---|---|
| 事件时间 EventTime | 表示特定活动或事件发生时间的时间戳。 | ||
| 说明 事件时间提供运输流程中每项活动的精确日期和时间。此类时间数据是计算周期时间、持续时间及流程步骤间等待时间的基础。 在分析中,此属性用于正确排列事件顺序、构建按时间排序的日志,并开展各类基于时间的绩效分析。它对于发现延误、衡量流程效率,以及根据计划或服务级别协议评估绩效至关重要。 重要性 时间戳对于按时间顺序排列事件和计算各项绩效指标至关重要,例如周期时间和按时交付情况。 获取途径 数据来自SAP TM中的事件处理程序表,例如/SAPTRX/EH_EVMSG,其中存储了已报告事件的时间戳。 示例 2023-04-15T10:00:00Z2023-04-16T14:30:00Z2023-04-20T09:15:00Z | |||
| 活动名称 ActivityName | 运输流程中发生的特定业务事件或步骤的名称。 | ||
| 说明 活动名称用于描述货运生命周期中的单项任务或里程碑,例如“已制定货运计划”“已提货”或“货物已送达”。这些活动构成了发现的流程图中的节点。 分析活动的顺序和频率,有助于识别标准流程、偏差、瓶颈和返工循环。这也是运输管理流程发现和一致性检查的基础。 重要性 此属性定义运输流程中的各个步骤,可用于展示和分析端到端货运流转情况。 获取途径 此属性通常根据SAP TM执行跟踪事件处理程序中记录的事件代码或状态变更生成。数据可能来自记录业务对象状态变更的表,或特定事件消息。 示例 已制定货运计划已分配承运商已提货货物已送达已收到交货证明 | |||
| 货运 ShipmentId | 用于标识单次货物流转的唯一标识符,也是分析时的核心案例。 | ||
| 说明 Shipment ID是主键,用于归集所有相关运输活动和事件。它代表一个完整的端到端运输流程,从最初的需求到最终的交货证明和付款。 在流程挖掘中,此属性对于构建案例视图至关重要,可帮助分析人员追踪每批货运的完整过程。借此可以分析各批货运的流程变体、周期时间和结果,全面了解运输绩效。 重要性 这是基本的案例标识符,可将所有事件和数据点关联到特定运输订单,是端到端流程分析的关键。 获取途径 此标识符是SAP TM中的货运订单编号或货运订舱编号,可在/SCMTMS/D_TORROT和/SCMTMS/D_TRQROT等表中找到。 示例 610000432161000056786100009876 | |||
| 承运商名称 CarrierName | 负责此次货运的承运商或物流服务提供商名称。 | ||
| 说明 承运商名称用于标识实际运输货物的公司。不同承运商的服务水平、成本和可靠性可能各不相同,因此这是绩效分析的重要维度。 在流程挖掘中,您可以按此属性对不同承运商的绩效进行分组和比较,制作承运商绩效评分卡,监控各承运商的按时交付率、比较成本,并找出经常出现延误或争议的承运商。这些信息有助于制定承运商管理和采购策略。 重要性 便于比较不同承运商的绩效,为优化承运商选择、成本和服务水平提供依据。 获取途径 此信息存储在货运订单或货运预订单据中,并通过承运商的业务伙伴职能关联。 示例 DHL ExpressFedEx FreightMaersk LineUnion Pacific Railroad | |||
| 是否按时交付 IsOnTimeDelivery | 用于标记货物是否在要求交付日期当天或之前交付的布尔值。 | ||
| 说明 这是一个计算属性,用于比较“货物已交付”活动的时间戳与“要求交付日期”。按时或提前交付时值为true,延迟交付时值为false。 此属性为每项货运提供清晰的二元结果,简化绩效分析。它是按时交付绩效仪表板及相关KPI的基础。分析人员可以轻松筛选延误货运,并进一步分析绩效不佳的原因。 重要性 直接衡量是否履行交付承诺,简化关键按时交付KPI的计算与可视化。 获取途径 SAP TM中不存储此属性。您需要在数据转换期间,将实际交付事件的时间戳与要求交付日期进行比较后计算得出。 示例 truefalse | |||
| 结束时间 EndTime | 表示特定活动完成时间的时间戳。 | ||
| 说明 开始时间表示事件的起点,结束时间则标记事件的终点。对于有持续时间的活动,例如“海关清关”或“货物装载”,此属性尤其有用。结束时间与开始时间之差即为该活动的处理时间。 在流程挖掘分析中,同时记录开始和结束时间,可以更细致地分析活动持续时间,并区分处理时间和等待时间。这有助于准确定位低效环节,无论问题出在任务执行过程中,还是任务之间的交接环节。 重要性 可精确计算活动处理时间,并区分实际作业时间与事件间的等待时间。 获取途径 与开始时间一样,此属性也来自事件处理程序表,可能对应某项活动单独记录的“已完成”事件。 示例 2023-04-15T11:30:00Z2023-04-16T15:00:00Z2023-04-20T09:45:00Z | |||
| 要求交付日期 RequestedDeliveryDate | 客户要求的交付日期和时间,或销售订单中规定的交付日期和时间。 | ||
| 说明 要求交付日期是“货物已交付”活动的目标期限,也是衡量按时交付绩效的主要基准。 此日期对于计算“按时交付率”KPI至关重要。将实际交付时间戳与要求交付日期进行比较,即可判断是否达到服务水平协议要求。分析偏差有助于找出延误的系统性原因,例如承运商绩效问题、计划延迟或海关滞留。 重要性 这是衡量按时交付绩效的基准,也是影响客户满意度和运营卓越表现的重要KPI。 获取途径 此日期通常从SAP ERP中的前序销售订单或库存调拨订单传入,存储在货运单元或货运订单的日期/时间字段中。 示例 2023-05-20T17:00:00Z2023-06-01T12:00:00Z2023-06-15T23:59:59Z | |||
| 货运总成本 TotalFreightCost | 货运的计算总成本或开票总成本。 | ||
| 说明 货运总成本反映一项货运产生的财务影响。该金额可以是运输管理系统计算的成本,也可以是结算后承运商发票上的最终金额。 此属性将财务维度纳入流程分析。分析人员可以找出成本最高的流程变体,计算延误或改道造成的成本,并比较不同承运商或运输方式的成本效益。它也是运输支出和服务成本分析仪表板的重要基础。 重要性 为流程分析增加财务维度,便于分析运输支出、单票货运成本以及流程低效造成的财务影响。 获取途径 费用计算完成后,此数据取自SAP TM中的货运结算单据,可在/SCMTMS/D_SFIRHD等表中找到。 示例 250.751200.005430.50 | |||
| 运输方式 ModeOfTransport | 货运采用的运输方式,例如公路、铁路、航空或海运。 | ||
| 说明 此属性用于指定运输方式。不同方式的成本结构、运输时间和流程复杂度各不相同。例如,国际空运可能涉及海关清关等活动,而国内整车运输则不同。 按运输方式分析流程,有助于制定有针对性的改进措施,也有助于分析成本,尤其是识别加急空运等高价运输方式与标准经济运输方式的使用情况。通过这种分类,您可以更好地了解和控制运输支出。 重要性 按运输方式分析成本、时间和流程差异,为优化成本及识别高价运输方式的使用情况提供依据。 获取途径 这是货运订单或货运预订中的重要字段,通常标记为运输方式或MOT。 示例 01(公路)02(铁路)04(航空)05(海运) | |||
| 争议原因 DisputeReason | 对货运发票提出争议时填写的原因。 | ||
| 说明 当承运商发票金额与SAP TM计算的预期成本不符时,系统会创建争议。此属性记录差异原因,例如“费率错误”“重复开票”或“未经批准的附加费用”。 分析争议原因对于货运账单错误与争议率仪表板至关重要。通过分析,您可以找出账单不准确的根本原因,判断问题来自主数据、承运商错误还是运营失误,并采取有针对性的措施减少争议,从而加快付款周期、降低管理开销。 重要性 揭示货运账单错误的根本原因,便于采取有针对性的措施减少发票争议并改进结算流程。 获取途径 此信息记录在与货运结算单据关联的争议管理案例中。 示例 费率不符重量错误未经批准的滞期费重复开票 | |||
| 最近数据更新时间 LastDataUpdate | 流程挖掘数据集最近一次提取或刷新的时间戳。 | ||
| 说明 此属性用于说明所分析数据的新鲜度,反映数据最近一次从SAP TM等源系统提取到流程挖掘工具的日期和时间。 这是仪表板或分析中的关键元数据,可帮助了解洞察所依据的数据有多新。用户可以据此判断查看的是实时信息,还是之前某个时间段的数据快照,从而做出及时、明智的决策。 重要性 提供数据时效性的重要背景信息,让用户了解当前分析所依据的数据有多新。 获取途径 此属性通常由ETL(提取、转换、加载)工具或数据管道在数据导入过程中生成并存储。 示例 2023-10-27T08:00:00Z2023-10-26T08:00:00Z | |||
| 始发国 OriginCountry | 货运的始发国家或地区。 | ||
| 说明 此属性用于标识运输行程的始发国家或地区,取自最初提货地点的地址。 按始发国分析流程,有助于发现不同地区在绩效、成本和复杂度方面的差异。例如,您可以找出清关时间较长、承运商成本较高或延误较频繁的国家或地区。此类地理维度分析对于管理全球供应链、制定适合各地区的物流策略至关重要。 重要性 支持按地理区域分析货运绩效,帮助识别区域瓶颈、成本驱动因素或流程差异。 获取途径 这是货运订单中第一个停靠点的始发地点地址信息之一。 示例 DEUSCNMX | |||
| 延误原因 DelayReason | 说明货运延误原因的代码或文本。 | ||
| 说明 延误原因属性记录偏离计划进度的原因,例如“恶劣天气”“海关滞留”或“承运商延误”。此信息通常由人工报告,或通过承运商发送的事件消息获取。 此属性有助于分析根本原因。您不仅可以了解货运是否延误,还能进一步查明原因。对延误原因进行分类和量化,有助于发现反复出现的问题,并将改进工作集中在影响最大的方面,例如改善与承运商的沟通,或优化路线以避开拥堵。 重要性 说明货运延误的原因,便于分析根本原因、减少异常并提升按时交付绩效。 获取途径 在SAP TM事件管理框架中报告“到达/离开延误”事件时,可以记录相应的事件代码和原因。 示例 天气延误海关检查港口拥堵机械故障 | |||
| 是否存在争议 IsDisputed | 用于标记该货运的货运发票是否引发争议的布尔值。 | ||
| 说明 此计算标记用于识别存在相关货运结算争议的货运。创建了争议时值为true,否则为false。可根据是否存在“已创建货运争议”活动或“争议原因”字段非空来计算。 此属性简化了货运结算流程分析,便于计算货运账单差异率KPI并筛选所有存在争议的货运。分析人员可以进一步调查这些货运的共同特征,例如承运商、运输线路或费用类型,从而找出账单错误的根本原因。 重要性 便于识别存在问题的货运结算,快速计算争议率并分析账单错误的根本原因。 获取途径 SAP TM中不存储此属性。您需要根据是否存在与货运结算单据关联的争议案例进行计算。 示例 truefalse | |||
| 源系统 SourceSystem | 事件数据的来源系统。 | ||
| 说明 此属性用于标识生成数据的源系统,例如SAP TM、SAP ERP或外部承运商门户。它说明数据的来源,有助于了解数据集成点。 在复杂的系统环境中,了解源系统对于数据验证、排查集成问题,以及理解不同系统如何参与整体流程至关重要。例如,它可以区分由内部系统报告的事件和由第三方物流服务提供商报告的事件。 重要性 标识数据来源,对于数据治理、问题排查以及了解多个系统间的流程编排至关重要。 获取途径 此信息通常存储在系统日志中,也可以根据创建数据条目的接口或用户推断。 示例 SAP_TM_P01SAP_ERP_E01CARRIER_PORTAL_XYZ | |||
| 用户名 UserName | 执行某项活动的人员用户ID或姓名。 | ||
| 说明 此属性用于标识负责执行手动活动的员工或用户,例如“已制定货运计划”或“发票已核验”,并将流程步骤关联到执行人员或团队。 按用户分析活动有助于了解工作量分配、发现培训需求并识别表现突出的人员。它对于合规和审计也至关重要,可清楚记录谁在何时执行了什么操作,还能揭示不同用户执行同一任务的差异。 重要性 将手动流程步骤关联到具体用户,以便分析工作量、个人绩效和培训机会。 获取途径 通常可在运输单据的更改日志或抬头表中找到,例如“创建者”或“更改者”字段(如ERNAM、AENAM)。 示例 CB998030SMITHJPLANNER_EU | |||
| 目的国 DestinationCountry | 货物交付目的地所在的国家或地区。 | ||
| 说明 此属性用于标识货运的最终目的国,取自最后一个交付地点的地址。 与始发国类似,按目的国分析有助于了解各地区的物流挑战。例如,您可以发现哪些目的地更容易发生交付延误,或末端配送成本较高。这些信息有助于优化网络、设定合理的交付预期,并管理国际贸易合规事宜。 重要性 支持按目的地分析流程绩效,突出特定交付区域、海关机构或末端承运商相关的问题。 获取途径 这是货运订单中最后一个停靠点的目的地地址信息之一。 示例 FRCAGBJP | |||
| 计划提货日期 ScheduledPickupDate | 承运商计划从发货地点提取货物的日期和时间。 | ||
| 说明 计划提货日期是双方约定的实际运输开始时间,也是货运执行阶段的重要里程碑。 此属性对于监控运输首段是否按时至关重要。将计划提货时间与实际“货物已提取”事件的时间戳进行比较,即可计算提货延误。这有助于评估发货地点和承运商的绩效与可靠性。 重要性 作为衡量提货是否及时的基准,帮助识别货物实际运输开始时的延误。 获取途径 这是存储在SAP TM货运订单停靠点顺序中的计划日期/时间。 示例 2023-05-18T09:00:00Z2023-05-30T14:00:00Z2023-06-12T10:30:00Z | |||
| 货运状态 ShipmentStatus | 数据提取时货运的当前总体状态。 | ||
| 说明 货运状态反映货运任务所处的生命周期阶段,例如“计划中”“执行中”“已交付”或“已取消”,表示该案例最近一次记录的状态。 此属性可用于按货运结果筛选和分析。例如,分析人员可以只查看已完成的货运任务,衡量端到端周期时间;也可以只分析已取消的任务,了解取消的根本原因。它为解读流程提供了重要背景。 重要性 概括每项货运的结果,便于按已完成、已取消或仍在运输中进行筛选和分析。 获取途径 这是SAP TM中货运订单或货运预订单据抬头上的总体状态字段。 示例 计划中待运输执行中已执行已取消 | |||
运输管理活动
| 活动 | 说明 | ||
|---|---|---|---|
| 付款已处理 | 此最终活动确认承运商已收到运输服务款项。通常在SAP TM收到已核验的发票后,由连接的ERP系统完成付款。 | ||
| 重要性 这标志着端到端运输生命周期真正结束。跟踪此活动对于衡量整体流程时长和按时付款指标至关重要。 获取途径 此信息存储在ERP系统中(例如S/4HANA Finance)。可通过发票编号将其关联回运费结算单。状态更新可能会发送回SAP TM,也可以从BKPF和BSEG等ERP表中提取数据。 采集 从ERP系统获取付款清账日期,并通过发票参考信息将其关联到货运。 事件类型 explicit | |||
| 已分配承运商 | 此活动表示已选定特定运输服务提供商(即承运商),并将其分配给货运。分配方式可以是手动指定、自动计划或招标。 | ||
| 重要性 分配承运商是确认并执行货运前的关键步骤。跟踪此活动有助于分析承运商选择流程,并确保及时订舱。 获取途径 在货运订单或货运订舱中填写承运商字段(角色为“承运商”的合作伙伴)时,即可记录此活动。通过招标分配时,则以货运询价授标为准。 采集 确定货运订单中首次填写或确认承运商合作伙伴功能的时间戳。 事件类型 inferred | |||
| 已创建运费结算单 | 此活动标志着运费结算单(FSD)已创建。该单据用于计算应付给承运商的运输成本,也是计提和发票核验的主要单据。 | ||
| 重要性 此活动标志着运输流程进入财务结算阶段。分析从交付到创建结算单所需的时间,有助于发现财务处理中的瓶颈。 获取途径 创建运费结算单时会明确记录此事件。该单据的表头表/SCMTMS/D_SFIRHD中包含创建时间戳。 采集 使用运费结算单的创建日期和时间。 事件类型 explicit | |||
| 已制定货运计划 | 此活动表示运输需求已整合为具体的货运计划。创建并保存货运订单(公路或铁路)或货运订舱(海运或空运),并包含计划路线和资源时,即可记录此活动。 | ||
| 重要性 完成这一里程碑是启动物流执行的必要条件。从收到需求到完成此活动的周期时间,是衡量计划效率的关键指标。 获取途径 此事件对应货运订单或货运订舱单据的创建。也可以根据单据状态变更推断,例如计划状态变为“已计划”。相关数据通常位于表头数据表/SCMTMS/D_TORROT中。 采集 使用货运订单或货运订舱单据的创建时间戳。 事件类型 explicit | |||
| 已提货 | 此活动标志着货物开始实际运输。承运商报告货物已装载并离开发货方所在地时,即可记录此活动。 | ||
| 重要性 这是重要的执行里程碑,标志着货物进入在途阶段。跟踪此活动对于衡量按时交付绩效和准确掌握货运状态至关重要。 获取途径 此事件通常记录在与SAP TM集成的SAP Event Management中,事件类型为“发运”或“装载完成”,并更新货运订单的执行状态。也可以直接记录在货运订单中。 采集 使用货运订单起运地所报告的“发运”执行事件时间戳。 事件类型 explicit | |||
| 已收到交货证明 | 承运商返回已签署的交货证明(POD)文件并录入系统时,即发生此活动。这确认收货方已接收货物。 | ||
| 重要性 收到POD是向客户开票并与承运商结算运费的重要前提。此环节延误会直接影响现金周转周期。 获取途径 通常可根据货运订单的状态变更推断此活动,例如POD状态变为“已收到”。该状态字段的变更时间即为活动时间戳。 采集 记录货运订单上的交货证明状态更新为“已收到”时的时间戳。 事件类型 inferred | |||
| 收到运输需求 | 此活动标志着运输流程启动,即运输需求已创建。在SAP TM中,通常通过创建货运代理订单(FWO)或基于订单的运输需求(OTR)记录此活动。 | ||
| 重要性 这是端到端货运流程的主要开始事件。分析从此活动到计划完成所需的时间,是衡量计划效率的关键。 获取途径 创建货运代理订单(单据类型FWO)或其他运输需求单据时,会记录此事件。事件时间可取自表头表(如/SCMTMS/D_TORROT)中的创建时间戳。 采集 记录货运代理订单或运输需求单据的创建日期和时间。 事件类型 explicit | |||
| 货物已送达 | 此活动表示货运已抵达最终目的地,实际运输已经完成。承运商报告货物已在收货方所在地卸载时,即可记录此活动。 | ||
| 重要性 这是衡量按时交付绩效和客户满意度最重要的里程碑,通常也是启动开票和结算流程的触发条件。 获取途径 此活动在SAP TM中记录为“抵达目的地”或“卸货完成”执行事件,并更新货运订单的执行状态。相关数据通常由承运商提供。 采集 使用货运订单最终停靠点所报告的“抵达目的地”执行事件时间戳。 事件类型 explicit | |||
| 货运已取消 | 此活动表示货运需求提出或计划制定后,货运被取消。对于未进入执行阶段的流程,此活动是其终止节点。 | ||
| 重要性 跟踪取消情况有助于发现流程未能继续的原因,例如客户需求变化或计划错误。取消率偏高可能反映订单管理或计划环节存在潜在问题。 获取途径 货运代理订单或货运订单的生命周期状态变为“已取消”时,即可推断此事件。状态变更时间戳即为事件时间。 采集 记录单据生命周期状态设为“已取消”时的时间戳。 事件类型 inferred | |||
| 发票已核验 | 此活动表示承运商发票已与运费结算单成功匹配,并获准付款。这是ERP系统启动付款流程前的最后一步。 | ||
| 重要性 此活动完成了运费成本的审计和核验流程。此阶段延误可能导致承运商收款逾期,影响双方合作关系。 获取途径 可根据运费结算单的状态变更推断此活动,例如状态变为“可计提”或“已转入过账”,表示单据已发送至ERP系统进行付款处理。 采集 跟踪FSD生命周期状态变为可付款或已过账时的时间戳。 事件类型 inferred | |||
| 已创建运费争议 | 此事件表示承运商发票金额与运费结算单中的计算成本不一致,因此启动争议解决工作流。 | ||
| 重要性 争议会延迟向承运商付款,也需要投入行政资源处理。跟踪此活动有助于找出账单不准确的根本原因,例如费率错误或附加费用有误。 获取途径 可根据运费结算单的状态变更推断此事件,例如状态变为“争议中”。也可能会创建单独的争议案例单据。 采集 记录运费结算单的争议状态设置时间戳。 事件类型 inferred | |||
| 已完成海关清关 | 此活动表示货物已获海关批准,可以继续运输。这是国际物流的重要里程碑,因为它消除了一个可能造成重大延误的瓶颈。 | ||
| 重要性 海关清关往往是全球供应链延误的重要原因。跟踪此活动的耗时和成功率,是缩短国际运输时间的关键。 获取途径 此活动记录为“海关清关”执行事件,通常由报关行或外部可视化服务提供商报告,并更新至货运订单的执行跟踪信息中。 采集 使用与货运订单关联的“海关清关”执行事件报告时间戳。 事件类型 explicit | |||
| 已提交海关申报 | 对于国际货运,此活动表示已向主管部门提交所需的海关文件。这是取得货物出口或进口放行许可的前提。 | ||
| 重要性 及时提交海关申报对于避免口岸延误至关重要。跟踪此活动有助于监控报关流程的效率。 获取途径 此事件可根据报关行报告的特定执行事件,或集成海关管理系统(如SAP GTS)的状态变更记录。货运订单也会相应更新。 采集 记录“已提交海关申报”执行事件的时间戳,或相应状态变更的时间戳。 事件类型 explicit | |||
| 承运商已确认货运 | 此事件表示承运商同意按计划执行运输。通常通过EDI消息、承运商门户更新或手动录入收到确认,并据此更新货运订单状态。 | ||
| 重要性 承运商确认意味着其承诺执行货运计划,可减少不确定性。若确认延迟,整个货运计划都可能面临风险。 获取途径 可根据货运订单或货运订舱中的确认状态字段变更推断此事件。单据状态管理中会设置特定状态值,例如“已确认”。 采集 跟踪货运订单中的确认状态字段变更。 事件类型 inferred | |||
| 货运路线已变更 | 此活动表示货运确认后,路线或计划发生了非预期变更。原因可能包括突发情况、客户要求或物流问题。 | ||
| 重要性 变更路线往往会增加成本并造成延误。了解路线变更的频率和原因,有助于提高计划准确性和运营稳定性。 获取途径 货运开始执行后,如果货运订单中的阶段、地点或日期发生重大变更,即可推断此事件。可分析变更单据表CDHDR和CDPOS来识别这些变更。 采集 在“承运商已确认货运”事件之后,检测货运订单中关键路线字段的变更。 事件类型 inferred | |||
数据提取指南
步骤
- 识别并激活CDS视图API:登录SAP S/4HANA系统。使用事务代码
/IWFND/MAINT_SERVICE,确认核心CDS视图所需的OData服务已激活。重点检查与I_TransportationOrder、C_TranspOrdExecutionEvent、I_ForwardingOrder和I_FreightSettlementDocument相关的服务。如果服务尚未激活,请联系SAP管理员,从后端系统添加并激活。 - 建立API连接:向SAP管理员获取OData服务的根URL。设置客户端应用程序,例如使用requests库的Python脚本、商业ETL工具或Postman。您需要配置身份验证,通常使用基本身份验证(用户名和密码),也可以使用更安全的OAuth 2.0。
- 确定提取范围:设定数据提取范围,例如最近6个月的数据。确定需要筛选的组织单元,如公司代码,或特定单据类型,如货运订单类型,确保数据与待分析流程相关。
- 构建基础货运查询:首先查询I_TransportationOrder CDS视图。该视图是货运数据的核心对象,也称为货运订单或货运预订。使用OData的
$select参数选择所需列,包括建议的属性CarrierName、ModeOfTransport和RequestedDeliveryDate。使用$filter按日期及其他范围条件筛选数据。 - 查询运输执行事件:使用C_TranspOrdExecutionEvent CDS视图提取关键物流事件。按特定的
EventCode值筛选,例如对应“货物已提取”(DEPARTURE)和“货物已送达”(ARRIVAL_AT_DESTINATION)的事件。使用TransportationOrder UUID将这些数据关联到基础货运数据。 - 查询相关业务对象:要还原完整流程,还需查询其他相关CDS视图。查询I_ForwardingOrder,获取“收到运输请求”活动;查询I_FreightSettlementDocument,获取“创建运费结算”“创建运费争议”和“发票已核验”等财务活动。
- 提取基于状态的活动:许多活动并非独立事件,而是主单据上的状态变更。对于“已分配承运商”“承运商已确认货运”和“货运已取消”等活动,查询I_TransportationOrder视图,并将相关状态字段对应的
LastChangeDateTime作为事件时间。此步骤需要仔细映射状态代码与业务活动。 - 合并并转换数据:将所有来源提取的数据整合为统一的事件日志结构。每项活动生成一行,包含ShipmentId、ActivityName和EventTime等必需列。确保该货运的基础查询中所有建议属性都出现在每一行中。此步骤在概念上相当于SQL的
UNION ALL操作。 - 处理复杂事件和外部事件:对于“海关放行”或“付款已处理”等活动,相关数据可能位于特定字段,甚至外部系统中。示例查询使用标准字段作为替代依据。您可能需要调整查询,关联海关专用CDS视图,或根据货运结算单号与单独提取的ERP付款数据进行匹配。
- 整理为ProcessMind所需格式:将最终整合的数据集保存为CSV文件。确保列标题符合上传要求,例如在工具设置中将
ShipmentId列映射到CaseId字段。确认时间戳格式一致,建议使用UTC格式(YYYY-MM-DDTHH:MM:SSZ)。
配置
- 核心CDS视图:提取主要依赖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视图中业务数据的访问权限。还必须在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,然后确认Shipment案例标识和Activity Name字段映射正确。
配置
- **核心源表:**使用/SCMTMS/D_TORROT获取运输订单或货运订单根数据,使用/SCMTMS/D_TOSTOP获取停靠点和里程碑数据。部署前,请在目标SAP TM系统中验证所有其他源对象。
- **案例标识:**使用稳定的货运或货运订单标识。示例查询使用TOR_ID作为ShipmentId。请确认该标识在计划、执行、结算和ERP付款记录中保持稳定。
- **活动映射:**为全部15项必需活动配置明确的源数据条件。每项活动都必须作为实际事件日志行输出。ProcessMind不会根据其他行推导活动。
- **日期范围:**从最近三至六个月的历史数据开始。尽可能在每个数据源分支中尽早使用EventTime条件。增量加载时,请使用受控的水位标记,并设置较短的重叠时间窗口,以捕获延迟更新。
- **业务筛选条件:**根据具体实施配置公司代码、采购组织、销售组织、单据类型、运输方式、承运商、工厂、地点和状态筛选条件。适用字段尚未验证时,请使用[Company code filter]等占位内容。
- **时间戳处理:**将源时间戳转换到统一时区。如果源数据将日期和时间分开存储,请使用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系统中的特定状态变更、创建事件或单据关联。例如,确定表示“货物已提取”的确切执行状态。
- 访问ABAP开发环境:登录SAP GUI,使用事务代码
SE38打开ABAP编辑器。为新程序输入名称,例如ZTM_PROCESS_EXTRACT,然后点击“创建”。填写标题,并将程序类型设为“可执行程序”。 - 创建选择屏幕:在程序中定义用户将看到的选择屏幕。屏幕应包含数据筛选参数,例如货运订单创建日期范围(
SO_CREDT),以及单据类型(SO_TYPE)或承运商(SO_CARR)的选择选项。 - 定义输出结构:定义与所需事件日志格式一致的内部表结构。结构应包含ShipmentId、ActivityName、EventTime、EndTime、CarrierName、RequestedDeliveryDate、ModeOfTransport、TotalFreightCost和IsOnTimeDelivery字段。
- 实现数据选择逻辑:编写ABAP主逻辑,为全部15项活动选择数据。通常需要查询多个SAP TM表。首先在指定日期范围内选择主要货运单据,例如货运订单。
- 提取计划和执行事件:针对每个选中的货运单据(如货运订单),查询相关表和业务对象,获取各项事件的时间戳。使用
/SCMTMS/D_TORROT表获取货运订单创建(“货运已计划”)、承运商分配(“已分配承运商”)以及对应“货物已提取”和“货物已送达”的执行状态变更。前序货运代理订单(/SCMTMS/D_TRQROT)的创建时间可作为“收到运输请求”的时间。 - 提取承运商确认和改道事件:查询与货运订单关联的状态表或变更文档(CDHDR/CDPOS),确定
CONFIRMATION状态的设置时间,以记录“承运商已确认货运”。同样,查找路线信息的重要变更,以记录“货运已改道”。 - 提取海关事件:如果使用SAP Global Trade Services(GTS)或类似模块,通常会通过关联单据跟踪海关事件(“已提交海关申报”“海关已放行”)。逻辑必须读取货运订单的单据流(
/SCMTMS/D_TORDOC),查找相关单据及其创建或状态变更时间。 - 提取结算和争议事件:查询货运结算单抬头表(
/SCMTMS/D_SFIRHD)及相关项目和状态,获取“创建运费结算”“创建运费争议”和“发票已核验”等事件。将这些事件关联回原始ShipmentId。 - 整合数据:为找到的每项事件在最终内部表中创建一条记录。将对应活动填入
ActivityName,将事件时间戳填入EventTime,并将货运订单或货运预订ID填入ShipmentId。从源单据中填充其他属性。 - 整理并导出文件:最终内部表填充完毕后,将数据整理为平面文件。使用
OPEN DATASET、LOOP AT... TRANSFER...和CLOSE DATASET命令,将内部表内容写入SAP应用服务器上的CSV或TXT文件(可通过事务代码AL11访问)。 - 安排运行并获取文件:可将ABAP程序设置为后台作业(事务代码SM36),自动提取数据。之后可使用事务代码
CG3Y将生成的文件从应用服务器下载到本地,以便上传到ProcessMind。
配置
- 日期范围:选择屏幕应包含核心运输单据(如货运订单)创建日期的必填范围。首次分析建议选择3至6个月的数据,以确保数据具有代表性,同时避免运行时间过长。
- 单据类型筛选:提供运输单据类型筛选条件(如货运订单、货运预订)。这对于聚焦公路货运或海运等特定流程至关重要。
- 承运商筛选:允许用户按特定承运商筛选,以便分析各物流合作伙伴的表现。
- 组织筛选:加入相关组织单元的筛选条件,如采购组织或公司代码,将提取范围限定在特定业务领域。
- 性能优化:处理大型数据集时,确保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%。
无需信用卡,几分钟即可完成设置。