您的退货与退款处理数据模板
您的退货与退款处理数据模板
- 建议收集的属性
- 需要跟踪的关键活动
- 数据提取指南
退货与退款处理属性
| 名称 | 说明 | ||
|---|---|---|---|
| 事件时间 EventTime | 活动发生的准确日期和时间。 | ||
| 说明 此时间戳记录业务事件发生的准确时刻。流程中的每项活动都会记录该时间,从而呈现案例内事件的先后顺序。 事件时间是所有基于时间的分析的关键数据,包括计算活动间的周期时间、识别等待时间较长的瓶颈,以及衡量案例总耗时。它还支持绩效分析和服务级别协议(SLA)的一致性检查。 重要性 此时间戳是计算各类耗时、分析流程绩效、识别瓶颈和了解每个退货案例时间线的基础。 获取途径 数据取自SAP各表中的日期和时间字段。创建事件通常使用ERDAT和ERZET字段(例如VBAK中的字段);更改事件则使用CDHDR表中的UDATE和UTIME字段。 示例 2023-04-15T10:22:05Z2023-04-16T14:01:30Z2023-04-18T09:15:00Z | |||
| 活动名称 ActivityName | 退货流程中发生的具体业务事件或步骤的名称。 | ||
| 说明 此属性描述退货生命周期中的单个具体操作或状态变更,例如“退货订单已创建”“收货已过账”或“贷项通知单已创建”。这些活动构成流程图的基本要素。 分析活动的顺序和频率,有助于识别最常见的流程路径、偏差和返工循环。了解案例中发生了什么以及先后顺序至关重要,也是所有流程挖掘分析的基础。 重要性 活动定义了流程中的各个步骤。分析其顺序、耗时和频率,是流程挖掘的核心,有助于了解工作实际如何开展。 获取途径 数据来源包括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。 | ||
| 说明 此属性记录负责执行特定流程步骤的人员用户名,例如创建退货订单或过账收货。该用户通常对应“更改者”或“创建者”。 按处理人员分析有助于绩效管理和资源分析。您可以据此识别表现突出的人员、可能需要额外培训的人员,以及团队内的工作量分布。此属性也用于“退货处理人员绩效”仪表板,以比较周期时间和处理量。 重要性 跟踪用户参与情况,便于分析团队绩效和工作量分布,并识别培训需求或最佳实践。 获取途径 通常可在VBAK、LIKP、VBRK等抬头表的ERNAM(创建者)或AENAM(更改者)字段中找到。对于更改事件,用户名记录在CDHDR表的USERNAME字段中。 示例 CBURNSDSCRANTONJHALPERT | |||
| 实际退款金额 ActualRefundAmount | 财务凭证中记录并最终贷记给客户的金额。 | ||
| 说明 此属性表示已处理并记入会计系统的最终确认退款金额。由于补货费、根据商品状况进行的调整或其他政策规定,该金额可能与申请金额不同。 此属性是“退款金额差异跟踪”仪表板的重要指标。将其与申请金额比较,有助于发现退款计算和审批流程中的系统性问题,确保财务数据准确。 重要性 表示退货的最终财务结果。与申请金额比较,有助于确保金额准确并发现财务流失。 获取途径 数据取自与贷项通知单关联的财务凭证。通常位于BSEG表(会计凭证分段)的WRBTR字段(凭证货币金额),对应相关总账科目过账记录。 示例 150.0045.001200.75 | |||
| 物料编号 MaterialNumber | 用于唯一标识退货产品的编号。 | ||
| 说明 物料编号(SKU)用于标识退货涉及的具体商品,可支持产品级别的详细分析。 按物料编号分析退货情况,企业可以识别退货率较高的产品,这可能反映质量问题、商品描述不准确或制造缺陷。此属性对于“退货对库存的影响”等仪表板,以及了解不同产品在退货流程中的处理情况都很重要。 重要性 标识退货产品,帮助发现潜在的质量控制问题或不准确的商品描述。 获取途径 位于销售凭证项目表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术语中的“售达方”),并将退货交易与客户主数据关联。 按客户ID分析有助于识别频繁退货的客户,这可能反映客户不满或退货政策被滥用。结合客户细分数据,还可了解不同客户群体的退货行为或流程体验是否存在差异。 重要性 将退货与具体客户关联,便于分析客户行为、识别重复退货客户以及了解退货对客户关系的影响。 获取途径 位于销售凭证抬头表VBAK的KUNNR字段(售达方)。 示例 CUST-100432CUST-203991CUST-831102 | |||
| 工厂 Plant | 接收和处理退货商品的实体地点或设施。 | ||
| 说明 SAP中的工厂代表处理货物的实体地点,例如仓库或配送中心。对于退货,通常指接收和检验商品的地点。 按工厂分析流程,有助于识别不同设施之间的绩效差异。例如,可了解哪些仓库的商品检验效率更高或处理量更大,为“商品检验处理量与效率”仪表板提供支持。 重要性 标识处理退货的实体地点,便于比较不同仓库或配送中心的绩效。 获取途径 位于退货订单项目级别的VBAP表WERKS字段。 示例 PL01WH02DC05 | |||
| 是否符合SLA IsSLACompliant | 用于标记退款是否在约定的服务级别协议(SLA)时限内处理。 | ||
| 说明 这是一个计算得出的布尔属性,用于比较“退款已处理”活动的实际日期与“退款SLA目标日期”。按时完成退款时结果为true,否则为false。 此属性为每个案例的SLA绩效提供清晰的二元结果,简化分析和报告。它用于计算整体“退款处理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 | |||
| 已创建贷项凭证 | 系统会生成账单凭证(贷项通知单),以批准向客户退款。这是用于确认退款金额的正式财务凭证。 | ||
| 重要性 这是流程中的重要财务节点。分析贷项通知单的创建耗时,有助于发现收货和检验后财务凭证处理中的延误。 获取途径 这是VBRK表(账单凭证抬头)中明确记录的事件。创建日期字段为VBRK-ERDAT。贷项通知单通过单据流与退货订单或贷项通知单请求关联。 采集 使用VBRK表中相关账单凭证的创建时间戳(ERDAT)。 事件类型 explicit | |||
| 已创建退货订单 | 客户申请退货时,退货流程由此开始。在SAP ECC中创建类型为“退货”(例如RE)的新销售凭证时,系统会记录此活动。 | ||
| 重要性 这是退货流程的主要开始事件。分析此活动与其他活动之间的时间,有助于衡量总周期时间并发现初始处理延误。 获取途径 这是记录在VBAK表(销售凭证抬头)中的明确事件。对于订单类型VBAK-AUART = 'RE'的相应销售凭证号(VBAK-VBELN),创建时间戳存储在VBAK-ERDAT和VBAK-ERZET中。 采集 对于销售凭证类型“RE”,使用VBAK表中的创建时间戳(ERDAT、ERZET)。 事件类型 explicit | |||
| 已过账收货 | 仓库或处理中心收到退回的实物商品时,会发生此活动。系统通过针对退货交货单过账货物移动凭证来记录此活动。 | ||
| 重要性 这是一个重要里程碑,表示公司已接收退回商品。它是实物检验的起点,也会影响库存准确性。 获取途径 可根据VBUP表中退货交货单项目的货物移动状态推断此事件(例如WBSTA = 'C')。确切时间戳位于对应收货的物料凭证抬头(MKPF-BUDAT)中。 采集 在MKPF表中查找与退货交货单关联的物料凭证过账日期(BUDAT)。 事件类型 inferred | |||
| 贷项通知单过账至FI | 贷项通知单会转入财务会计,成为正式的应收账款过账记录。此步骤会触发实际的客户退款流程。 | ||
| 重要性 此活动标志着公司在财务上确认退款。贷项通知单创建与过账之间的延误,可能导致客户实际收到退款的时间推迟。 获取途径 这是根据账单凭证抬头中的过账状态(VBRK-RFBSK)更新为“C”(过账凭证已创建)推断出的事件。实际会计凭证的创建日期记录在BKPF表中。 采集 确定VBRK-RFBSK设为“C”的时间戳,或使用关联BKPF会计凭证的创建日期(CPUDT)。 事件类型 inferred | |||
| 退货订单已完成 | 从销售与分销角度看,此活动标志着退货流程结束。退货订单中的所有行项目均已处理完毕并关闭后,即视为完成。 | ||
| 重要性 这是流程的主要结束事件。从“退货订单已创建”到此活动的耗时,即为退货案例的端到端周期时间。 获取途径 这是根据状态表推断出的事件。当销售凭证抬头的总体状态(VBUK-GBSTK)更新为“C”(已完全处理)时,即记录此事件。 采集 在更改凭证(CDHDR/CDPOS)中,查找抬头状态字段VBUK-GBSTK变为“C”的时间戳。 事件类型 inferred | |||
| 已创建贷项凭证申请 | 系统会创建贷项凭证申请,正式记录退款需求。在许多配置中,退货订单本身就作为贷项凭证申请。 | ||
| 重要性 这是退货流程中财务结算阶段的正式起点,为后续财务审批和凭证创建提供触发条件。 获取途径 这可以是VBAK中类型为“贷项凭证申请”(例如CR)的销售凭证明确记录的事件;如果订单类型配置为按订单开票,也可以与“已创建退货订单”是同一事件。 采集 对于凭证类型“CR”,使用VBAK中的创建时间戳(ERDAT),或沿用退货订单创建事件。 事件类型 explicit | |||
| 已创建退货交货单 | 系统会生成交货凭证,以管理退回商品的实物收货。此事件表示退货物流流程已启动。 | ||
| 重要性 此活动记录了流程从行政处理转入实物物流的节点。此处发生延误会影响仓库计划和整体退货周期时间。 获取途径 这是记录在LIKP表(交货单抬头)中的明确事件。创建时间戳位于LIKP-ERDAT。与源退货订单的关联可在LIPS表(LIPS-VGBEL)中找到。 采集 使用LIKP表中与退货订单关联的交货单创建时间戳(ERDAT)。 事件类型 explicit | |||
| 已移除退货订单冻结 | 表示退货申请已获批准,可以进入下一阶段。通常通过凭证状态变更,或交货冻结、开票冻结解除来记录。 | ||
| 重要性 这是一个关键审批里程碑。衡量到达此步骤所需的时间,有助于发现退货授权和审批流程中的瓶颈。 获取途径 这是根据销售凭证变更日志推断出的事件。请检查CDHDR和CDPOS表中VBAK或VBAP冻结字段的变更,或VBUK/VBUP中的状态字段变更。 采集 在变更凭证表(CDHDR/CDPOS)中查找相关冻结状态解除时的时间戳。 事件类型 inferred | |||
| 贷项通知单已清账 | 应收账款中的未清贷项通常通过向客户付款完成清账。此事件标志着退款的最终财务结清。 | ||
| 重要性 此活动确认款项已付出,完成流程的财务环节。从客户角度看,这才是退款流程的真正终点。 获取途径 这是FI模块中明确记录的事件。相关客户行项目的会计凭证清账日期存储在BSEG表的BSEG-AUGDT字段中。 采集 使用BSEG表或BSAD表中的清账日期(AUGDT),对应的会计凭证需与贷项通知单关联。 事件类型 explicit | |||
| 退货订单项目已完成 | 退货订单中的某个行项目被标记为已全部处理。通常,这表示该项目相关的所有物流和财务后续凭证均已完成。 | ||
| 重要性 按项目跟踪有助于识别哪些产品或退货原因导致延误最长,也能更细致地了解流程完成情况。 获取途径 这是根据状态表推断出的事件。当销售凭证项目的总体状态(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。 - 实现输出功能:添加功能,以便通过
REUSE_ALV_GRID_DISPLAY等函数模块在ALV网格(SAP List Viewer)中显示结果,供在线分析使用。提供选项,将最终内表下载为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)模块中的表。您需要使用合适的SQL客户端工具连接数据库,例如DBeaver、SAP HANA Studio或Oracle SQL Developer。
- 确认系统信息:运行查询前,您必须确认组织中用于退货的具体单据类型。查询中使用了占位符
[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%。立即开始。
无需信用卡,几分钟即可完成设置