您的退货与退款处理数据模板
您的退货与退款处理数据模板
- 建议收集的属性
- 需要跟踪的关键活动
- 提取指南
退货与退款处理属性
| 名称 | 说明 | ||
|---|---|---|---|
| 事件时间 EventTime | 活动发生的准确日期和时间。 | ||
| 说明 该时间戳标记业务事件发生的准确时刻。流程中的每项活动都会记录该时间戳,为案例内的事件提供时间顺序。 事件时间对于所有基于时间的分析都至关重要,包括计算活动之间的周期时间、识别因等待而耗时的瓶颈,以及衡量案例总体时长。它支持绩效分析,并可根据服务级别协议(SLA)执行一致性检查。 为什么重要 该时间戳对于计算所有时长、分析流程绩效、识别瓶颈以及了解每个退货案例的时间线至关重要。 获取位置 数据来源于SAP各表中的不同日期和时间字段。对于创建事件,通常使用ERDAT和ERZET字段(例如VBAK中的字段);对于变更事件,则使用CDHDR表中的UDATE和UTIME。 示例 2023-04-15T10:22:05Z2023-04-16T14:01:30Z2023-04-18T09:15:00Z | |||
| 活动名称 ActivityName | 退货流程中发生的特定业务事件或步骤的名称。 | ||
| 说明 该属性描述退货生命周期中的单个独立操作或状态变更,例如“Return Order Created”“Goods Receipt Posted”或“Credit Memo Created”。这些活动构成流程图的基本组成部分。 分析活动的顺序和频率,有助于识别最常见的流程路径、偏差和返工循环。它对于了解案例中发生了什么以及发生顺序至关重要,也是所有流程挖掘分析的基础。 为什么重要 活动定义流程中的步骤。分析活动的顺序、持续时间和频率,是流程挖掘的核心,可揭示实际工作的执行方式。 获取位置 来源包括VBUK/VBUP等表中的状态变更、凭证创建事件(例如VBAK、LIKP、VBRK中的事件),或CDHDR/CDPOS表中的变更日志。 示例 退货订单已创建货物收货已过账贷项凭证已创建退货订单项目已完成 | |||
| 退货案例ID ReturnCaseId | 客户退货请求的唯一标识符,用于关联所有相关活动和凭证。 | ||
| 说明 退货案例ID是跟踪退货流程从发起到关闭整个生命周期的主键。每个ID对应一次具体的客户退货,涵盖订单创建、交货、检验和贷项凭证处理等所有相关事件。 在流程分析中,该属性是构建流程图的基础。系统可以据此将单个事件归入端到端案例旅程,从而分析每个退货实例的流程变体、周期时间和瓶颈。 为什么重要 这是连接退货流程所有步骤的核心案例标识符,可用于分析端到端流程和性能。 获取位置 通常是销售与分销(SD)模块中的退货订单号。该字段位于VBAK表(销售凭证抬头数据)的VBELN中;对于退货,凭证类别(VBAK-VBTYP)为“H”。 示例 600001236000045660000789 | |||
| 上次数据更新 LastDataUpdate | 表示该流程数据最近一次刷新的时间戳。 | ||
| 说明 该属性记录最近一次数据提取或更新的日期和时间,帮助您了解当前分析数据的新鲜度。 在分析中,这对于判断洞察的时效性非常重要。您可以查看数据的最新状态,从而评估分析结果的相关性,尤其是在监控持续运行的业务时。 为什么重要 表示数据的新鲜度,帮助您了解流程分析的时效性以及预计下一次更新的时间。 获取位置 这是一个元数据属性,填入数据提取作业的执行时间戳。 示例 2023-05-20T02:00:00Z2023-05-21T02:00:00Z | |||
| 源系统 SourceSystem | 提取数据的系统。 | ||
| 说明 该属性用于标识数据来源,在多系统环境中尤为重要。它提供上下文,有助于确保数据血缘和完整性。 在分析中,将不同源系统的流程合并后,可使用该属性对数据进行分段或筛选。它还能确认事件来自预期应用,在本例中即SAP ECC。 为什么重要 标识数据来源,对于数据治理以及跨多个企业系统的分析至关重要。 获取位置 这是在数据提取期间定义的静态值,用于标识具体的SAP ECC实例(例如“ECC_PROD_100”)。 示例 SAP_ECC_PRODSAPECC_FINANCE_200 | |||
| 处理人员 ProcessingAgent | 执行该活动的员工用户ID。 | ||
| 说明 该属性记录负责执行具体流程步骤的人员用户名,例如创建退货订单或货物收货过账的人员。通常也称为“Changed By”或“Created By”用户。 按处理人员分析对于绩效管理和资源分析至关重要。它有助于识别高绩效人员、可能需要额外培训的人员,以及团队内的工作量分配情况。该属性用于“Agent Return Processing Performance”等仪表板,以比较周期时间和处理量。 为什么重要 跟踪用户参与情况,支持分析团队绩效、工作量分配,并识别培训需求或最佳实践。 获取位置 通常位于VBAK、LIKP、VBRK等抬头表的ERNAM(创建人)或AENAM(变更人)字段中。对于变更事件,则位于CDHDR的USERNAME字段中。 示例 CBURNSDSCRANTONJHALPERT | |||
| 实际退款金额 ActualRefundAmount | 已记入客户账户的最终金额,以财务凭证中的过账金额为准。 | ||
| 说明 此属性表示已在会计系统中处理并过账的最终确认退款金额。由于补货费、根据商品状况进行的调整或其他政策适用情况,该金额可能与申请金额不同。 这是“退款金额差异跟踪”仪表板的关键属性。将其与申请金额进行比较,有助于识别退款计算和审批流程中的系统性问题,确保财务准确性。 为什么重要 表示退货的最终财务结果。将其与申请金额比较,有助于确保金额准确并识别财务损失。 获取位置 来源于与贷项凭证关联的财务凭证。对于相关总账科目过账,通常位于BSEG(会计凭证分段)表的WRBTR字段(凭证货币金额)。 示例 150.0045.001200.75 | |||
| 物料编号 MaterialNumber | 退回商品的唯一标识符。 | ||
| 说明 物料编号,即SKU,用于指定退货涉及的确切商品,支持在商品层面开展详细分析。 按物料编号分析退货,企业可以识别高退货率商品,这可能表明存在质量问题、商品描述不准确或制造缺陷。该属性对于“Inventory Impact of Returns”等仪表板至关重要,也有助于了解不同商品在退货流程中的流转情况。 为什么重要 识别哪些商品被退回,突出潜在的质量控制问题或不准确的商品描述。 获取位置 位于销售凭证项目表VBAP的MATNR字段。 示例 RM-1025FG-2050-BACC-5591 | |||
| 申请退款金额 RequestedRefundAmount | 预计退款金额,通常根据退回商品的净值确定。 | ||
| 说明 此属性表示退货订单中记录的初始退货金额,是财务分析和对账的基准。 该金额会与“实际退款金额”进行比较,用于跟踪差异,这是“退款金额差异跟踪”仪表板的关键指标。分析此值有助于监控退货的财务影响,并识别定价或贷项计算中的潜在问题。 为什么重要 确定退货的初始财务价值,对于跟踪财务差异和了解退回商品总价值至关重要。 获取位置 通常为退货订单项目层级的净值,位于VBAP表的NETWR字段。 示例 150.0049.991250.75 | |||
| 退货原因 ReturnReason | 客户为退回商品提供的原因代码。 | ||
| 说明 该属性表示商品退回的原因,使用SAP中预先定义的原因代码。例如“运输途中损坏”“发错商品”或“不合身”。 这是根因分析的重要维度。按退货原因筛选流程图或KPI,分析人员可以识别某些原因是否与更长的处理时间、更高的检验失败率或特定流程偏差相关。这些洞察可推动产品质量、物流或销售流程改进。 为什么重要 说明退货发生的原因,支持根因分析,通过解决产品质量、运输或商品描述问题来降低退货率。 获取位置 位于销售凭证项目表VBAP的ABGRU字段(销售凭证拒绝原因)。 示例 001,产品损坏002,产品错误005,到货过晚 | |||
| 退货渠道 ReturnChannel | 发起退货的渠道,例如在线、门店或呼叫中心。 | ||
| 说明 此属性用于说明退货请求的来源或受理方式,帮助区分通过网页门户、实体门店或客户服务代表发起的退货。 按退货渠道细分流程,对于了解运营差异和分配资源至关重要。例如,与在线退货相比,门店退货的检验时间可能更短,但所需的单据步骤不同。这是“退货流程吞吐量趋势”仪表板的重要分析维度。 为什么重要 用于区分退货的发起方式,这通常会影响不同渠道的流程、资源需求和周期时间。 获取位置 这通常不是SAP ECC中的标准字段,可能需要从自定义字段(例如VBAK中的字段)获取,或根据销售组织(VKORG)、分销渠道(VTWEG)等其他数据推断。具体实现请参阅SAP ECC文档。 示例 在线门户门店呼叫中心 | |||
| 公司代码 CompanyCode | 负责该交易的法人实体或公司。 | ||
| 说明 公司代码代表SAP中的独立会计核算单位。包括退货和退款在内的所有财务交易,都会过账到特定公司代码。 此属性对于财务报告以及跨国或多实体组织的流程细分至关重要。按公司代码分析,可以比较企业内不同法人实体的退货流程绩效。 为什么重要 支持在组织内不同法人实体之间筛选和比较退货流程,对于财务分析至关重要。 获取位置 位于销售凭证抬头表VBAK的BUKRS_VF字段(开票公司代码)。 示例 10002000US01 | |||
| 原始销售凭证 OriginalSalesDocument | 发起退货所对应的原始销售订单编号。 | ||
| 说明 此属性可直接追溯到客户最初的购买记录,是连接退货与原始交易详情的参考凭证。 这一关联对于深入分析非常有价值。分析人员可以调查特定订单中的商品为何被退回,核对原始价格和条款,并了解客户从下单到退货的完整生命周期。还可以分析通过特定营销活动或渠道销售的商品是否具有更高的退货率。 为什么重要 将退货关联到原始销售,实现客户交易的完整链路视图,并支持更深入的根因分析。 获取位置 此参考信息存储在退货订单的项目层级,位于VBAP表的VGBEL字段(参考凭证的凭证编号)。 示例 100034561000987110012345 | |||
| 客户ID CustomerId | 发起退货的客户的唯一标识符。 | ||
| 说明 此属性用于识别退回产品的具体客户,即SAP术语中的“Sold-to Party”。它将退货交易关联到客户主数据。 按客户ID分析有助于识别频繁退货的客户,这可能表明客户不满意或存在滥用退货政策的风险。结合客户细分数据,还可以了解不同客户群体是否存在不同的退货行为或流程体验。 为什么重要 将退货关联到具体客户,从而分析客户行为、识别重复退货客户,并评估其对客户关系的影响。 获取位置 位于销售凭证抬头表VBAK的KUNNR字段(Sold-to party)。 示例 CUST-100432CUST-203991CUST-831102 | |||
| 工厂 Plant | 接收和处理退回商品的实际地点或设施。 | ||
| 说明 在SAP中,工厂代表仓库或配送中心等处理货物的实际地点。对于退货,通常指接收和检验商品的地点。 按工厂分析流程,有助于识别不同设施之间的绩效差异,并发现哪些仓库的商品检验效率更高或吞吐量更大,为“商品检验吞吐量与效率”仪表板提供支持。 为什么重要 识别处理退货的实际地点,从而比较不同仓库或配送中心的绩效。 获取位置 位于退货订单的项目层级,即VBAP表的WERKS字段。 示例 PL01WH02DC05 | |||
| 是否符合SLA IsSLACompliant | 用于标识退款是否在约定的服务级别协议(SLA)期限内完成处理。 | ||
| 说明 这是一个计算得出的布尔属性,用于比较“退款已处理”活动的实际日期与“退款SLA目标日期”。如果退款按时完成,则结果为true,否则为false。 此属性为每个案例的SLA绩效提供清晰的二元结果,简化分析和报告。它用于计算整体“退款处理SLA合规率”,也便于筛选和分析不合规案例。 为什么重要 为每个案例提供清晰的二元SLA绩效指标,简化合规监控和报告。 获取位置 这是一个计算属性。逻辑为:“退款已处理”EventTime <= RefundSLATargetDate。 示例 truefalse | |||
| 贷项凭证编号 CreditMemoNumber | 为退款签发的贷项凭证的唯一标识。 | ||
| 说明 贷项凭证是SAP中正式确认应向客户退款的开票凭证。该编号用于唯一标识这份财务凭证。 此属性对于财务对账以及跟踪从运营退货到财务结算的全过程至关重要。它是流程中的关键里程碑,也用于查找“实际退款金额”等属性所关联的会计凭证。 为什么重要 直接关联授权客户退款的财务凭证,对于财务审计和对账至关重要。 获取位置 贷项凭证属于开票凭证,其编号位于VBRK表(开票凭证:抬头数据)的VBELN字段。该关联通过退货订单的凭证流建立。 示例 900011229000334490005566 | |||
| 退款SLA目标日期 RefundSLATargetDate | 根据服务级别协议,预计完成退款处理的日期。 | ||
| 说明 此属性定义特定退货案例完成退款流程的截止日期。通常根据业务规则计算,例如“收货后5个工作日内”。 该目标日期是衡量实际绩效的基准,也是“退款处理SLA合规率”仪表板的核心组成部分。业务人员可以据此监控客户承诺的履行情况,并识别可能违反SLA的案例。 为什么重要 设定退款处理的绩效目标,支持业务衡量和报告SLA合规情况,并优先处理逾期案例。 获取位置 这通常不是SAP中的标准字段,需要根据业务规则推导。可以将关键日期字段(例如来自MKPF的收货日期)加上配置的时长进行计算。请参阅SAP ECC文档或业务需求。 示例 2023-04-25T23:59:59Z2023-04-28T23:59:59Z2023-05-02T23:59:59Z | |||
| 退款金额差异 RefundAmountDiscrepancy | 实际退款金额与申请退款金额之间的计算差值。 | ||
| 说明 此计算指标量化退货订单中最初申请的金额与贷项凭证中最终发放金额之间的货币差异。正值可能表示部分退款,负值较为少见,但可能表示超额付款。 此属性是“退款金额差异跟踪”仪表板的核心指标,有助于快速识别和分析存在财务偏差的案例。偏差可能源于商品状况评估、补货费或处理错误。持续监控有助于确保财务控制和政策执行。 为什么重要 直接衡量退款流程中的财务偏差,帮助识别政策不合规、处理错误或财务损失。 获取位置 计算字段:ActualRefundAmount - RequestedRefundAmount。 示例 0.00-4.99-50.00 | |||
| 退货政策遵循情况 ReturnPolicyAdherence | 用于标识退货是否符合所有既定业务规则和政策。 | ||
| 说明 这是一个计算得出的布尔属性,用于判断退货案例是否遵循公司规定的标准政策。逻辑可能包括多个条件,例如退货是否在允许期限内发起、原因代码是否适用于该商品,或例外情况是否获得经理批准。 此属性为“退货审批政策合规”仪表板提供支持,可直接衡量合规率,并识别最常被绕过的政策,从而开展有针对性的流程改进或培训。 为什么重要 衡量业务规则的合规情况,帮助持续执行政策,并识别需要特别审核或批准的案例。 获取位置 这是根据一组业务规则推导出的属性。例如:(退货发起日期-原始购买日期)<= 30天且ReturnReason IS NOT NULL。 示例 truefalse | |||
| 退货订单状态 ReturnOrderStatus | 退货订单案例的整体处理状态。 | ||
| 说明 此属性用于概览退货案例的当前状态,例如“开放”“处理中”或“已完成”。它由销售凭证抬头层级或项目层级的状态组合得出。 在分析中,此属性可用于筛选案例,聚焦于进行中或已完成的退货。它有助于监控开放案例的整体工作量和进度,并为每次退货旅程提供高层级结果。 为什么重要 概览案例所处的生命周期阶段,支持筛选和分析开放、处理中的或已关闭的退货。 获取位置 根据VBUK表(抬头状态)和VBUP表(项目状态)中的状态字段得出。例如,VBUK-GBSTK表示凭证的整体处理状态。 示例 已开启处理中已完成 | |||
退货与退款处理活动
| 活动 | 说明 | ||
|---|---|---|---|
| 已作出使用决策 | 检验完成后,质量工程师或检验员会正式判断退回商品的状况。该决定将确定后续流程,例如重新入库、报废或维修。 | ||
| 为什么重要 该活动对于了解检验效率及其结果至关重要。该决定会直接影响退款金额和库存管理。 获取位置 如果使用SAP QM,这是QAVE表(检验处理使用决策)中记录的明确事件。决策时间存储在QAVE-VDATUM中。交货单关联信息位于QALS表中。 采集 使用QAVE表中的使用决策日期(VDATUM),通过检验批(QALS-PRUEFLOS)关联。 事件类型 explicit | |||
| 货物收货已过账 | 当退回的实物商品在仓库或处理中心被接收时,该活动发生。系统通过针对退货交货单过账货物移动凭证来记录此活动。 | ||
| 为什么重要 这是表明企业已接收退回商品的关键里程碑,也是实物检验的起点,并会影响库存准确性。 获取位置 该事件可根据VBUP表中退货交货单项目的货物移动状态推断得出(例如WBSTA = “C”)。确切时间戳位于相应收货凭证的物料凭证抬头(MKPF-BUDAT)中。 采集 从MKPF表中查找与退货交货单关联的物料凭证过账日期(BUDAT)。 事件类型 inferred | |||
| 贷项凭证已创建 | 系统生成开票凭证(贷项凭证),用于授权向客户提供财务抵扣。这是正式确定退款金额的财务凭证。 | ||
| 为什么重要 这是流程中的重要财务里程碑。分析贷项凭证创建所需的时间,有助于识别收货和检验完成后的财务凭证处理延迟。 获取位置 这是VBRK表(开票凭证抬头)中记录的明确事件。创建日期为VBRK-ERDAT。贷项凭证通过凭证流与退货订单或贷项凭证请求关联。 采集 使用VBRK表中相关开票凭证的创建时间戳(ERDAT)。 事件类型 explicit | |||
| 贷项凭证已过账至FI | 贷项凭证已释放至财务会计,成为正式的应收账款过账记录。此步骤会触发向客户实际退款的支付流程。 | ||
| 为什么重要 该活动标志着企业在财务上确认退款。贷项凭证创建与过账之间的延迟,可能导致客户实际收到退款的时间推迟。 获取位置 这是一个推断事件:当开票凭证抬头中的过账状态(VBRK-RFBSK)更新为“C”(过账凭证已创建)时即可识别。实际会计凭证的创建日期位于BKPF表中。 采集 确定VBRK-RFBSK设置为“C”时的时间戳,或使用关联BKPF会计凭证中的创建日期(CPUDT)。 事件类型 inferred | |||
| 退货订单已创建 | 当客户申请退货时,该活动标志着退货流程启动。在SAP ECC中创建类型为“Return”的新销售凭证(例如RE)时,系统会记录此活动。 | ||
| 为什么重要 这是退货流程的主要开始事件。分析该活动与其他活动之间的时间,有助于衡量总周期时间并识别初始处理延迟。 获取位置 这是VBAK表(销售凭证抬头)中记录的明确事件。对于订单类型VBAK-AUART = “RE”的相应销售凭证编号(VBAK-VBELN),创建时间戳存储在VBAK-ERDAT和VBAK-ERZET中。 采集 使用VBAK表中销售凭证类型“RE”的创建时间戳(ERDAT、ERZET)。 事件类型 explicit | |||
| 退货订单已完成 | 该活动标志着从销售和分销角度看退货流程的结束。当退货订单中的所有行项目均已完全处理并关闭时发生。 | ||
| 为什么重要 这是流程的主要结束事件。衡量从“Return Order Created”到该活动的时间,即可得到退货案例的端到端周期时间。 获取位置 这是根据状态表推断出的事件。当销售凭证抬头的总体状态(VBUK-GBSTK)更新为“C”(已完全处理)时记录。 采集 从变更凭证(CDHDR/CDPOS)中确定抬头状态字段VBUK-GBSTK变为“C”时的时间戳。 事件类型 inferred | |||
| 贷项凭证已清账 | 应收账款中的未清贷项通常通过向客户付款完成清账。该事件标志着退款的最终财务结算。 | ||
| 为什么重要 该活动确认资金已付出,完成流程的财务部分。从客户角度看,这是退款流程真正的终点。 获取位置 这是FI模块中的明确事件。相应客户行项目会计凭证的清账日期存储在BSEG表(BSEG-AUGDT)中。 采集 使用BSEG或BSAD表中与贷项凭证关联的会计凭证清账日期(AUGDT)。 事件类型 explicit | |||
| 贷项凭证请求已创建 | 系统创建贷项凭证请求,用于正式记录退款需求。在许多配置中,退货订单本身就作为贷项凭证请求。 | ||
| 为什么重要 这是退货流程中财务结算部分的正式起点,并为后续财务审批和凭证创建提供触发条件。 获取位置 这可以是VBAK中类型为“Credit Memo Request”的销售凭证明确事件(例如CR);如果订单类型配置为按订单开票,也可以与“Return Order Created”使用同一事件。 采集 对于凭证类型“CR”,使用VBAK中的创建时间戳(ERDAT);否则复用退货订单创建事件。 事件类型 explicit | |||
| 退货交货单已创建 | 系统生成交货凭证,用于管理退回货物的实物接收。该事件表示退货物流流程已经启动。 | ||
| 为什么重要 跟踪从行政处理到实物物流的转换。此处的延迟可能影响仓库计划和整体退货周期时间。 获取位置 这是LIKP表(交货单抬头)中记录的明确事件。创建时间戳位于LIKP-ERDAT。源退货订单的关联信息位于LIPS表(LIPS-VGBEL)。 采集 使用LIKP表中与退货订单关联的交货单创建时间戳(ERDAT)。 事件类型 explicit | |||
| 退货订单已解除冻结 | 表示退货请求已获批准,可以进入下一阶段。通常通过凭证状态变化,或交货冻结、开票冻结被移除来记录。 | ||
| 为什么重要 这是关键的审批里程碑。衡量到达该步骤所需的时间,有助于识别退货授权和审批流程中的瓶颈。 获取位置 这是一个推断事件,根据销售凭证的变更日志得出。请检查CDHDR和CDPOS表中VBAK或VBAP冻结字段的变更,或VBUK/VBUP状态字段的变更。 采集 从变更凭证表(CDHDR/CDPOS)中确定相关冻结状态被移除时的时间戳。 事件类型 inferred | |||
| 退货订单项目已完成 | 退货订单中的单个行项目被标记为已完全处理。通常在该项目的所有物流和财务后续凭证完成后发生。 | ||
| 为什么重要 按项目跟踪有助于识别导致最长延迟的商品或退货原因,从更细粒度的层面了解流程完成情况。 获取位置 这是根据状态表推断出的事件。当销售凭证项目的总体状态(VBUP-GBSTK)更新为“C”(已完全处理)时记录。 采集 从变更凭证(CDHDR/CDPOS)中确定项目状态字段VBUP-GBSTK变为“C”时的时间戳。 事件类型 inferred | |||
| 退货订单项目已拒绝 | 退货订单中的特定项目在初审期间或检验后被拒绝。这意味着该项目不会继续处理,也不会获得退款。 | ||
| 为什么重要 分析拒绝情况有助于识别无效退货请求,并为客户政策沟通提供依据。这是不会导向退款的关键流程路径。 获取位置 这是一个推断事件。通常通过VBAP表中为项目设置唯一的“拒绝原因”代码(VBAP-ABGRU)来记录。时间戳必须从变更日志中获取。 采集 从变更凭证(CDHDR/CDPOS)中确定退货项目VBAP-ABGRU字段被填入时的时间戳。 事件类型 inferred | |||
提取指南
步骤
- 创建ABAP程序:使用事务代码
SE38创建新的可执行ABAP程序,例如Z_PM_RETURN_EXTRACTION。填写描述性标题,并将其保存为本地对象或开发包中的对象。 - 定义选择屏幕:在程序中定义选择屏幕,允许用户筛选数据。关键筛选条件包括退货订单创建日期范围(
S_ERDAT)、退货销售凭证类型(S_AUART,例如'Re')以及公司代码(P_BUKRS)。 - 定义数据结构:创建与所需事件日志格式匹配的本地结构类型。该结构应包含
ReturnCaseId、ActivityName、EventTime、SourceSystem、LastDataUpdate、ProcessingAgent、ReturnReason及其他所需属性。 - 实现数据选择逻辑:编写ABAP核心逻辑,为12项必需活动选择数据。这需要查询VBAK、VBAP、LIKP、VBRK、BKPF、CDHDR和CDPOS等SAP表。使用凭证流表(VBFA)将交货单、贷项凭证等相关凭证关联回原始退货订单。
- 提取“退货订单已创建”:根据选择屏幕条件,从
VBAK和VBAP表中选择记录。销售凭证号(VBAK-VBELN)将作为ReturnCaseId。 - 提取状态变更和关键事件:对于“退货订单冻结已解除”或“退货订单项目已拒绝”等活动,查询更改凭证表(
CDHDR、CDPOS)或VBAP(ABGRU)等表中的状态字段。对于物流和财务后续活动,从LIKP、MKPF、VBRK和BKPF等表中选择数据,并使用VBFA确保这些数据与初始退货订单集合关联。 - 填充事件日志表:针对提取的每项活动,在按事件日志结构定义的内表中创建新记录。将源SAP表中的数据映射到对应字段,例如将
VBAK-ERNAM映射到ProcessingAgent,将VBAK-ERDAT和VBAK-ERZET映射到EventTime。 - 合并活动数据:确保每项活动的SELECT语句都将结果追加到同一个主内表中,从而生成最终的扁平文件结构,每行代表一个事件。
- 处理时间戳和系统信息:使用系统字段
SY-DATUM和SY-UZEIT为每行填充LastDataUpdate时间戳。使用SY-SYSID填充SourceSystem。 - 实现输出功能:添加功能,通过ALV网格(SAP List Viewer)使用
REUSE_ALV_GRID_DISPLAY等函数模块在线分析结果。提供将最终内表下载为CSV或纯文本文件到用户本地计算机的选项。 - 执行并导出:通过
SE38运行程序。输入所需选择条件并执行。数据显示或处理完成后,使用程序的导出功能保存事件日志文件。确保文件格式与ProcessMind兼容,通常为带表头的CSV。
配置
- 日期范围:在选择屏幕中指定退货订单创建日期范围。初次分析建议选择3至6个月,以平衡数据量和流程洞察。
- 退货凭证类型:按系统中用于退货的具体销售凭证类型筛选,例如'Re'表示退货,'CR'表示贷项凭证请求。这是隔离正确流程的关键筛选条件。请在
S_AUART选择选项中输入这些值。 - 公司代码:指定相关公司代码(
P_BUKRS),将数据限制在特定法人实体范围内。在多公司环境中,这一步尤为重要。 - 前提条件:执行程序的用户需要具备
SE38(程序执行)权限,以及访问底层SD、MM和FI表的权限(例如VBAK、LIKP、VBRK、BKPF、CDHDR)。开发工作需要ABAP开发人员角色。 - 性能:对于跨越多年的超大数据集,程序可能运行时间较长。可考虑将其作为后台作业(
SM36)运行,并将输出写入应用服务器文件系统,而不是在线显示。
a 示例查询 abap
REPORT Z_PM_RETURN_EXTRACTION.
" =======================================================================
" DATA DECLARATIONS
" =======================================================================
TYPES: BEGIN OF ty_event_log,
returncaseid TYPE vbeln_va,
activityname TYPE string,
eventtime TYPE timestamp,
sourcesystem TYPE sysysid,
lastdataupdate TYPE timestamp,
processingagent TYPE ernam,
returnreason TYPE augru,
materialnumber TYPE matnr,
returnchannel TYPE string, " Placeholder, needs custom logic
requestedrefundamount TYPE netwr,
actualrefundamount TYPE netwr,
END OF ty_event_log.
DATA: lt_event_log TYPE TABLE OF ty_event_log,
ls_event_log TYPE ty_event_log.
DATA: lv_timestamp TYPE timestamp,
lv_last_update TYPE timestamp.
" =======================================================================
" SELECTION SCREEN
" =======================================================================
SELECT-OPTIONS: s_erdat FOR sy-datum OBLIGATORY,
s_auart FOR vbak-auart.
PARAMETERS: p_bukrs TYPE bukrs OBLIGATORY.
" =======================================================================
" MAIN LOGIC
" =======================================================================
START-OF-SELECTION.
" Set static values for the extraction run
GET TIME STAMP FIELD lv_last_update.
" 1. Return Order Created & 6. Credit Memo Request Created
" Note: In many SAP standard processes, the Return Order itself acts as the Credit Memo Request.
SELECT h~vbeln, h~erdat, h~erzet, h~ernam, h~augru, i~matnr, i~netwr
INTO TABLE @DATA(lt_return_orders)
FROM vbak AS h
INNER JOIN vbap AS i ON h~vbeln = i~vbeln
WHERE h~erdat IN @s_erdat
AND h~auart IN @s_auart
AND h~bukrs_vf = @p_bukrs.
LOOP AT lt_return_orders INTO DATA(ls_return_order).
" Activity: Return Order Created
ls_event_log-returncaseid = ls_return_order-vbeln.
ls_event_log-activityname = 'Return Order Created'.
CONVERT DATE ls_return_order-erdat TIME ls_return_order-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_return_order-ernam.
ls_event_log-returnreason = ls_return_order-augru.
ls_event_log-materialnumber = ls_return_order-matnr.
ls_event_log-requestedrefundamount = ls_return_order-netwr.
APPEND ls_event_log TO lt_event_log.
" Activity: Credit Memo Request Created
ls_event_log-activityname = 'Credit Memo Request Created'.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
IF lt_return_orders IS NOT INITIAL.
" 2. Return Order Block Removed (Example for Delivery Block)
SELECT objectid, udate, utime, username
FROM cdhdr
INTO TABLE @DATA(lt_block_changes)
FOR ALL ENTRIES IN @lt_return_orders
WHERE objectclas = 'VERKBELEG'
AND objectid = @lt_return_orders-vbeln
AND tcode = 'VA02'.
IF sy-subrc = 0.
SELECT objectid, fname, value_new
INTO TABLE @DATA(lt_cdpos_block)
FROM cdpos
FOR ALL ENTRIES IN @lt_block_changes
WHERE objectclas = @lt_block_changes-objectclas
AND objectid = @lt_block_changes-objectid
AND changenr = @lt_block_changes-changenr
AND tabname = 'VBAK'
AND fname = 'LIFSK' " Delivery Block field
AND value_new = ''.
LOOP AT lt_cdpos_block INTO DATA(ls_cdpos_block).
READ TABLE lt_block_changes INTO DATA(ls_block_change) WITH KEY objectid = ls_cdpos_block-objectid.
IF sy-subrc = 0.
ls_event_log-returncaseid = ls_cdpos_block-objectid.
ls_event_log-activityname = 'Return Order Block Removed'.
CONVERT DATE ls_block_change-udate TIME ls_block_change-utime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_block_change-username.
CLEAR: ls_event_log-returnreason, ls_event_log-materialnumber, ls_event_log-requestedrefundamount, ls_event_log-actualrefundamount.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
ENDIF.
" Get subsequent documents from flow
SELECT vbelv, vbtyp_n, vbeln, rfbsk
INTO TABLE @DATA(lt_doc_flow)
FROM vbfa
FOR ALL ENTRIES IN @lt_return_orders
WHERE vbelv = @lt_return_orders-vbeln
AND vbtyp_n IN ('J', 'R', 'M'). " J=Delivery, R=Goods Mvmt, M=Invoice
" 3. Return Delivery Created
SELECT vbeln, erdat, erzet, ernam FROM likp
INTO TABLE @DATA(lt_deliveries)
FOR ALL ENTRIES IN @lt_doc_flow
WHERE vbeln = @lt_doc_flow-vbeln AND @lt_doc_flow-vbtyp_n = 'J'.
LOOP AT lt_deliveries INTO DATA(ls_delivery).
READ TABLE lt_doc_flow INTO DATA(ls_doc_flow_del) WITH KEY vbeln = ls_delivery-vbeln.
ls_event_log-returncaseid = ls_doc_flow_del-vbelv.
ls_event_log-activityname = 'Return Delivery Created'.
CONVERT DATE ls_delivery-erdat TIME ls_delivery-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_delivery-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" 4. Goods Receipt Posted
SELECT mblnr, mjahr, budat, cputm, usnam FROM mkpf
INTO TABLE @DATA(lt_goods_receipt)
FOR ALL ENTRIES IN @lt_doc_flow
WHERE xblnr = @lt_doc_flow-vbeln AND @lt_doc_flow-vbtyp_n = 'R'.
LOOP AT lt_goods_receipt INTO DATA(ls_goods_receipt).
READ TABLE lt_doc_flow INTO DATA(ls_doc_flow_gr) WITH KEY vbeln = ls_goods_receipt-mblnr.
ls_event_log-returncaseid = ls_doc_flow_gr-vbelv.
ls_event_log-activityname = 'Goods Receipt Posted'.
CONVERT DATE ls_goods_receipt-budat TIME ls_goods_receipt-cputm INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_goods_receipt-usnam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" 5. Usage Decision Made (Requires QM Module implementation)
SELECT q~prueflos, q~vdatu, q~vzeit, q~vname
FROM qals AS q
INNER JOIN qave AS v ON q~prueflos = v~prueflos
INTO TABLE @DATA(lt_usage_decisions)
FOR ALL ENTRIES IN @lt_deliveries
WHERE q~kdauf = @lt_deliveries-vbeln.
LOOP AT lt_usage_decisions INTO DATA(ls_ud).
SELECT SINGLE vbelv FROM vbfa INTO @DATA(lv_vbelv_ud) WHERE vbeln = @ls_ud-prueflos.
ls_event_log-returncaseid = lv_vbelv_ud.
ls_event_log-activityname = 'Usage Decision Made'.
CONVERT DATE ls_ud-vdatu TIME ls_ud-vzeit INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_ud-vname.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" 7. Credit Memo Created
SELECT h~vbeln, h~erdat, h~erzet, h~ernam, i~netwr, i~vgbel
INTO TABLE @DATA(lt_cred_memos)
FROM vbrk AS h
INNER JOIN vbrp AS i ON h~vbeln = i~vbeln
FOR ALL ENTRIES IN @lt_doc_flow
WHERE h~vbeln = @lt_doc_flow-vbeln AND @lt_doc_flow-vbtyp_n = 'M'.
LOOP AT lt_cred_memos INTO DATA(ls_cred_memo).
ls_event_log-returncaseid = ls_cred_memo-vgbel.
ls_event_log-activityname = 'Credit Memo Created'.
CONVERT DATE ls_cred_memo-erdat TIME ls_cred_memo-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_cred_memo-ernam.
ls_event_log-actualrefundamount = ls_cred_memo-netwr.
APPEND ls_event_log TO lt_event_log.
" 8. Credit Memo Posted To FI
SELECT SINGLE budat, cputime, usnam FROM bkpf
INTO @DATA(ls_bkpf_post)
WHERE awkey = @ls_cred_memo-vbeln AND awtyp = 'VBRK'.
IF sy-subrc = 0.
ls_event_log-activityname = 'Credit Memo Posted To FI'.
CONVERT DATE ls_bkpf_post-budat TIME ls_bkpf_post-cputime INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-processingagent = ls_bkpf_post-usnam.
APPEND ls_event_log TO lt_event_log.
ENDIF.
" 12. Credit Memo Cleared
SELECT SINGLE augdt FROM bseg
INTO @DATA(lv_augdt)
WHERE bukrs = @p_bukrs
AND belnr = @ls_cred_memo-vbeln
AND augdt IS NOT NULL.
IF sy-subrc = 0 AND lv_augdt IS NOT INITIAL.
ls_event_log-activityname = 'Credit Memo Cleared'.
CONVERT DATE lv_augdt INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
CLEAR: ls_event_log-processingagent.
APPEND ls_event_log TO lt_event_log.
ENDIF.
ENDLOOP.
" 9. Return Order Item Completed
SELECT vbeln, erdat, erzet, ernam, abgru FROM vbap
INTO TABLE @DATA(lt_items_completed)
FOR ALL ENTRIES IN @lt_return_orders
WHERE vbeln = @lt_return_orders-vbeln
AND gbsta = 'C'.
LOOP AT lt_items_completed INTO DATA(ls_item_completed).
ls_event_log-returncaseid = ls_item_completed-vbeln.
ls_event_log-activityname = 'Return Order Item Completed'.
CONVERT DATE ls_item_completed-erdat TIME ls_item_completed-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_item_completed-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" 10. Return Order Completed
SELECT vbeln, erdat, erzet, ernam FROM vbak
INTO TABLE @DATA(lt_orders_completed)
FOR ALL ENTRIES IN @lt_return_orders
WHERE vbeln = @lt_return_orders-vbeln
AND gbsta = 'C'.
LOOP AT lt_orders_completed INTO DATA(ls_order_completed).
ls_event_log-returncaseid = ls_order_completed-vbeln.
ls_event_log-activityname = 'Return Order Completed'.
CONVERT DATE ls_order_completed-erdat TIME ls_order_completed-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_order_completed-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
" 11. Return Order Item Rejected
SELECT vbeln, erdat, erzet, ernam FROM vbap
INTO TABLE @DATA(lt_items_rejected)
FOR ALL ENTRIES IN @lt_return_orders
WHERE vbeln = @lt_return_orders-vbeln
AND abgru IS NOT NULL AND abgru <> ''.
LOOP AT lt_items_rejected INTO DATA(ls_item_rejected).
ls_event_log-returncaseid = ls_item_rejected-vbeln.
ls_event_log-activityname = 'Return Order Item Rejected'.
CONVERT DATE ls_item_rejected-erdat TIME ls_item_rejected-erzet INTO TIME STAMP ls_event_log-eventtime TIME ZONE sy-zonlo.
ls_event_log-sourcesystem = sy-sysid.
ls_event_log-lastdataupdate = lv_last_update.
ls_event_log-processingagent = ls_item_rejected-ernam.
APPEND ls_event_log TO lt_event_log.
ENDLOOP.
ENDIF.
" =======================================================================
" OUTPUT
" =======================================================================
cl_salv_table=>factory(
IMPORTING
r_salv_table = DATA(lo_alv)
CHANGING
t_table = lt_event_log ).
lo_alv->display( ). 步骤
- 前提条件:确保您拥有可读取所需SAP ECC表的数据库用户。这些表包括销售与分销(SD)、物料管理(MM)和财务会计(FI)模块中的表。您还需要使用DBeaver、SAP HANA Studio或Oracle SQL Developer等合适的SQL客户端工具连接数据库。
- 确认系统信息:运行查询前,必须确认组织中用于退货的具体凭证类型。查询使用占位符
[YOUR_RETURN_ORDER_TYPES],请将其替换为实际值,例如标准退货类型'Re'。 - 准备查询:将“query”部分提供的完整SQL查询复制到您的SQL客户端中。
- 配置参数:找到查询开头名为
BaseReturnOrders的公用表表达式(CTE)。修改WHERE子句,将[START_DATE]和[END_DATE]替换为所需日期范围。更新退货订单类型列表,并在需要时按特定公司代码(BUKRS_VF)筛选。 - 执行查询:在SAP ECC数据库中运行修改后的查询。执行时间可能因所选日期范围和数据库规模而异。
- 检查原始数据:查询完成后,快速检查输出结果。确认
ReturnCaseId、ActivityName和EventTime列已填充,并且多个活动均有数据。 - 导出为CSV:从SQL客户端将完整结果集导出为CSV文件。使用UTF-8编码,确保所有字符正确保留。
- 准备上传:打开CSV文件,确认列标题与所需属性完全一致:
ReturnCaseId、ActivityName、EventTime、SourceSystem等。如SQL客户端在导出时修改了标题,请进行调整。 - 最终上传:将整理后的CSV文件上传到ProcessMind平台进行分析。
配置
- 退货凭证类型:必须使用SAP系统中代表退货订单的具体销售凭证类型配置查询。请替换
[YOUR_RETURN_ORDER_TYPES]占位符,常见示例包括'Re'或自定义'Z'类型。 - 日期范围:为提取数据定义合适的日期范围至关重要。初次分析通常建议使用3至6个月的数据。请使用
[START_DATE]和[END_DATE]占位符进行设置,格式为'YYYYMMDD'。 - 公司代码:对于拥有多个公司代码的组织,筛选数据对于聚焦分析必不可少。您可以在初始CTE中添加
VBAK.BUKRS_VF = '[YOUR_COMPANY_CODE]'等筛选条件,限制分析范围。 - 数据库方言:所提供的查询使用通用SQL函数。不过,日期和时间转换(如
TO_TIMESTAMP)以及字符串拼接(CONCAT)可能需要根据底层数据库系统(如Oracle、HANA、DB2)进行少量语法调整。 - 所需权限:数据库用户需要具备以下关键表的读取权限:VBAK、VBAP、VBFA、LIKP、LIPS、VBRK、VBRP、MKPF、MSEG、BKPF、BSAD、QALS、QAVE、CDHDR和CDPOS。
a 示例查询 sql
WITH BaseReturnOrders AS (
SELECT
VBAK.VBELN AS ReturnOrderNumber,
VBAP.POSNR AS ReturnOrderItemNumber
FROM VBAK
JOIN VBAP ON VBAK.VBELN = VBAP.VBELN
WHERE VBAK.AUART IN ('[YOUR_RETURN_ORDER_TYPES]') -- e.g., 'RE'
AND VBAK.ERDAT BETWEEN '[START_DATE]' AND '[END_DATE]' -- e.g., '20230101' and '20231231'
)
-- 1. Return Order Created
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Return Order Created' AS "ActivityName",
TO_TIMESTAMP(CONCAT(VBAK.ERDAT, VBAK.ERZET), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
VBAK.ERNAM AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
UNION ALL
-- 2. Return Order Block Removed
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Return Order Block Removed' AS "ActivityName",
TO_TIMESTAMP(CONCAT(CDHDR.UDATE, CDHDR.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
CDHDR.USERNAME AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN CDHDR ON B.ReturnOrderNumber = CDHDR.OBJECTID
JOIN CDPOS ON CDHDR.OBJECTCLAS = CDPOS.OBJECTCLAS AND CDHDR.OBJECTID = CDPOS.OBJECTID AND CDHDR.CHANGENR = CDPOS.CHANGENR
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
WHERE CDHDR.OBJECTCLAS = 'VERKBELEG'
AND CDPOS.TABNAME = 'VBAK'
AND CDPOS.FNAME IN ('LIFSK', 'FAKSK')
AND CDPOS.VALUE_NEW = ''
AND CDPOS.VALUE_OLD <> ''
UNION ALL
-- 3. Return Delivery Created
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Return Delivery Created' AS "ActivityName",
TO_TIMESTAMP(CONCAT(LIKP.ERDAT, LIKP.ERZET), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
LIKP.ERNAM AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
JOIN VBFA ON B.ReturnOrderNumber = VBFA.VBELV AND B.ReturnOrderItemNumber = VBFA.POSNV AND VBFA.VBTYP_N = 'J'
JOIN LIKP ON VBFA.VBELN = LIKP.VBELN
UNION ALL
-- 4. Goods Receipt Posted
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Goods Receipt Posted' AS "ActivityName",
TO_TIMESTAMP(CONCAT(MKPF.CPUDT, MKPF.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
MKPF.USNAM AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
JOIN VBFA ON B.ReturnOrderNumber = VBFA.VBELV AND B.ReturnOrderItemNumber = VBFA.POSNV AND VBFA.VBTYP_N = 'J'
JOIN LIPS ON VBFA.VBELN = LIPS.VBELN AND VBFA.POSNN = LIPS.POSNR
JOIN MSEG ON LIPS.VBELN = MSEG.LFBNR AND LIPS.POSNR = MSEG.LFPOS
JOIN MKPF ON MSEG.MBLNR = MKPF.MBLNR AND MSEG.MJAHR = MKPF.MJAHR
WHERE MSEG.BWART IN ('651', '653', '655') -- Standard returns movement types
UNION ALL
-- 5. Usage Decision Made
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Usage Decision Made' AS "ActivityName",
TO_TIMESTAMP(CONCAT(QAVE.ADAT, QAVE.ATIM), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
QAVE.AENAME AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
JOIN VBFA ON B.ReturnOrderNumber = VBFA.VBELV AND B.ReturnOrderItemNumber = VBFA.POSNV AND VBFA.VBTYP_N = 'J'
JOIN QALS ON VBFA.VBELN = QALS.VBELN AND VBFA.POSNN = QALS.POSNR -- Linking inspection lot to delivery item
JOIN QAVE ON QALS.PRUEFLOS = QAVE.PRUEFLOS
UNION ALL
-- 6. Credit Memo Request Created (assumes a separate doc, or can be the return order itself)
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Credit Memo Request Created' AS "ActivityName",
TO_TIMESTAMP(CONCAT(CMR_VBAK.ERDAT, CMR_VBAK.ERZET), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
CMR_VBAK.ERNAM AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
JOIN VBFA ON B.ReturnOrderNumber = VBFA.VBELV AND B.ReturnOrderItemNumber = VBFA.POSNV AND VBFA.VBTYP_N = 'K' -- 'K' is Credit Memo Request
JOIN VBAK AS CMR_VBAK ON VBFA.VBELN = CMR_VBAK.VBELN
UNION ALL
-- 7. Credit Memo Created
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Credit Memo Created' AS "ActivityName",
TO_TIMESTAMP(CONCAT(VBRK.ERDAT, VBRK.ERZET), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
VBRK.ERNAM AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
VBRP.NETWR AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
JOIN VBFA ON B.ReturnOrderNumber = VBFA.VBELV AND B.ReturnOrderItemNumber = VBFA.POSNV AND VBFA.VBTYP_N = 'M'
JOIN VBRK ON VBFA.VBELN = VBRK.VBELN
JOIN VBRP ON VBRK.VBELN = VBRP.VBELN AND VBFA.POSNN = VBRP.POSNR
WHERE VBRK.FKART IN ('[YOUR_CREDIT_MEMO_TYPES]') -- e.g., 'G2'
UNION ALL
-- 8. Credit Memo Posted To FI
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Credit Memo Posted To FI' AS "ActivityName",
TO_TIMESTAMP(CONCAT(BKPF.CPUDT, BKPF.CPUTM), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
BKPF.USNAM AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
VBRP.NETWR AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
JOIN VBFA ON B.ReturnOrderNumber = VBFA.VBELV AND B.ReturnOrderItemNumber = VBFA.POSNV AND VBFA.VBTYP_N = 'M'
JOIN VBRK ON VBFA.VBELN = VBRK.VBELN
JOIN VBRP ON VBRK.VBELN = VBRP.VBELN AND VBFA.POSNN = VBRP.POSNR
JOIN BKPF ON VBRK.VBELN = BKPF.AWKEY AND BKPF.AWTYP = 'VBRK'
UNION ALL
-- 9. Return Order Item Completed
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Return Order Item Completed' AS "ActivityName",
TO_TIMESTAMP(CONCAT(CDHDR.UDATE, CDHDR.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
CDHDR.USERNAME AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN CDHDR ON CONCAT(B.ReturnOrderNumber, LPAD(B.ReturnOrderItemNumber, 6, '0')) = CDHDR.OBJECTID
JOIN CDPOS ON CDHDR.OBJECTCLAS = CDPOS.OBJECTCLAS AND CDHDR.OBJECTID = CDPOS.OBJECTID AND CDHDR.CHANGENR = CDPOS.CHANGENR
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
WHERE CDHDR.OBJECTCLAS = 'VERKBELEG'
AND CDPOS.TABNAME = 'VBUP'
AND CDPOS.FNAME = 'GBSTA'
AND CDPOS.VALUE_NEW = 'C'
UNION ALL
-- 10. Return Order Completed
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Return Order Completed' AS "ActivityName",
TO_TIMESTAMP(CONCAT(CDHDR.UDATE, CDHDR.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
CDHDR.USERNAME AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN CDHDR ON B.ReturnOrderNumber = CDHDR.OBJECTID
JOIN CDPOS ON CDHDR.OBJECTCLAS = CDPOS.OBJECTCLAS AND CDHDR.OBJECTID = CDPOS.OBJECTID AND CDHDR.CHANGENR = CDPOS.CHANGENR
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
WHERE CDHDR.OBJECTCLAS = 'VERKBELEG'
AND CDPOS.TABNAME = 'VBUK'
AND CDPOS.FNAME = 'GBSTK'
AND CDPOS.VALUE_NEW = 'C'
UNION ALL
-- 11. Return Order Item Rejected
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Return Order Item Rejected' AS "ActivityName",
TO_TIMESTAMP(CONCAT(CDHDR.UDATE, CDHDR.UTIME), 'YYYYMMDDHH24MISS') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
CDHDR.USERNAME AS "ProcessingAgent",
CDPOS.VALUE_NEW AS "ReturnReason", -- Using rejection reason for this specific event
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
NULL AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN CDHDR ON CONCAT(B.ReturnOrderNumber, LPAD(B.ReturnOrderItemNumber, 6, '0')) = CDHDR.OBJECTID
JOIN CDPOS ON CDHDR.OBJECTCLAS = CDPOS.OBJECTCLAS AND CDHDR.OBJECTID = CDPOS.OBJECTID AND CDHDR.CHANGENR = CDPOS.CHANGENR
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
WHERE CDHDR.OBJECTCLAS = 'VERKBELEG'
AND CDPOS.TABNAME = 'VBAP'
AND CDPOS.FNAME = 'ABGRU'
AND CDPOS.VALUE_NEW <> ''
UNION ALL
-- 12. Credit Memo Cleared
SELECT
CONCAT(B.ReturnOrderNumber, '-', B.ReturnOrderItemNumber) AS "ReturnCaseId",
'Credit Memo Cleared' AS "ActivityName",
TO_TIMESTAMP(BSAD.AUGDT, 'YYYYMMDD') AS "EventTime",
'SAP ECC' AS "SourceSystem",
CURRENT_TIMESTAMP AS "LastDataUpdate",
CLEAR_DOC.USNAM AS "ProcessingAgent",
VBAK.AUGRU AS "ReturnReason",
VBAP.MATNR AS "MaterialNumber",
VBAK.VTWEG AS "ReturnChannel",
VBAP.NETWR AS "RequestedRefundAmount",
VBRP.NETWR AS "ActualRefundAmount"
FROM BaseReturnOrders B
JOIN VBAK ON B.ReturnOrderNumber = VBAK.VBELN
JOIN VBAP ON B.ReturnOrderNumber = VBAP.VBELN AND B.ReturnOrderItemNumber = VBAP.POSNR
JOIN VBFA ON B.ReturnOrderNumber = VBFA.VBELV AND B.ReturnOrderItemNumber = VBFA.POSNV AND VBFA.VBTYP_N = 'M'
JOIN VBRK ON VBFA.VBELN = VBRK.VBELN
JOIN VBRP ON VBRK.VBELN = VBRP.VBELN AND VBFA.POSNN = VBRP.POSNR
JOIN BSAD ON VBRK.VBELN = BSAD.VBELN
JOIN BKPF AS CLEAR_DOC ON BSAD.AUGBL = CLEAR_DOC.BELNR AND BSAD.BUKRS = CLEAR_DOC.BUKRS AND BSAD.GJAHR_AUGL = CLEAR_DOC.GJAHR; 立即优化退货与退款处理
简化SAP ECC退货流程,将周期时间缩短30%,立即开始。
无需信用卡,几分钟即可完成设置