您的退货与退款处理数据模板
您的退货与退款处理数据模板
- 建议收集的属性
- 需要追踪的关键活动
- 提取指南
退货与退款处理属性
| 名称 | 描述 | ||
|---|---|---|---|
| Event 时间 EventTime | 活动发生的精确日期和时间。 | ||
| 描述 此时间戳标记业务事件发生的精确时刻。流程中的每个活动都会记录该时间戳,从而提供 case 内事件的时间顺序。 事件时间对于所有基于时间的分析至关重要,包括计算活动间的周期时间、识别耗时等待的瓶颈以及衡量 case 总时长。它还支持绩效分析以及针对服务水平协议 (SLA) 的合规性检查。 为何重要 此时间戳对于计算所有时长、分析流程绩效、识别瓶颈以及了解每个退货案例的时间线至关重要。 获取方式 源自 SAP 各表中的日期和时间字段。对于创建事件,通常是 ERDAT 和 ERZET 字段(如 VBAK 表);对于更改事件,则是 CDHDR 表中的 UDATE 和 UTIME。 示例 2023-04-15T10:22:05Z2023-04-16T14:01:30Z2023-04-18T09:15:00Z | |||
| 活动名称 ActivityName | 退货流程中发生的具体业务事件或步骤的名称。 | ||
| 描述 此属性描述退货生命周期中的单个独立动作或状态变更,例如“退货订单已创建”、“收货已过账”或“贷记凭证已创建”。这些活动构成了流程图的基石。 分析这些活动的顺序和频率有助于识别最常见的流程路径、偏离情况和返工循环。这对于了解 case 内发生的情况及顺序至关重要,是所有流程挖掘分析的基础。 为何重要 活动定义了流程中的步骤。分析其顺序、时长和频率是流程挖掘的核心,揭示了工作的真实开展方式。 获取方式 源自 VBUK/VBUP 等表中的状态变更、单据创建事件(如 VBAK、LIKP、VBRK)或 CDHDR/CDPOS 表中的修改日志。 示例 退货订单已创建收货过账完成贷项通知单已创建退货订单项已完成 | |||
| 退货案例 ID ReturnCaseId | 客户退货请求的唯一标识符,关联所有相关活动和单据。 | ||
| 描述 退货案例 ID 是跟踪从发起至关闭的整个退货流程生命周期的主键。每个 ID 对应一笔具体的客户退货,涵盖所有相关事件,如订单创建、交货、检验和贷记凭证处理。 在流程分析中,此属性是构建流程图的基础。它允许系统将单个事件组合成端到端的 case 旅程,从而分析每个独立退货实例的流程变体、周期时间和瓶颈。 为何重要 这是连接退货旅程所有步骤的关键 case 标识符,使分析端到端流程流转和绩效成为可能。 获取方式 这通常是来自销售与分销 (SD) 模块的退货订单编号。位于 VBAK 表(销售凭证抬头数据)的 VBELN 字段中,其中凭证类别 (VBAK-VBTYP) 为 'H'(退货)。 示例 600001236000045660000789 | |||
| 最后数据更新 LastDataUpdate | 指示该流程 data 上次刷新时间的 timestamp。 | ||
| 描述 此属性记录最近一次 data 提取或更新的日期和时间。它让分析数据的时效性变得透明。 在分析中,这对于了解洞察的及时性非常重要。用户可以看到数据的更新程度,这会影响发现的相关性,尤其是在监控正在进行的运营活动时。 为何重要 指示数据的实时性,确保用户了解流程分析的新旧程度以及下次更新的时间。 获取方式 这是一个元数据属性,填充了 data 提取作业的执行时间戳。 示例 2023-05-20T02:00:00Z2023-05-21T02:00:00Z | |||
| 源系统 SourceSystem | 数据提取来源系统。 | ||
| 描述 此属性标识 data 的来源,这在多系统环境中至关重要。它提供背景信息并有助于确保数据血缘和完整性。 在分析中,当合并来自不同源系统的流程时,它用于细分或筛选数据。它确认事件确实来自预期的应用程序,在本例中即为 SAP ECC。 为何重要 识别数据来源,这对于数据治理以及跨多个企业系统的分析至关重要。 获取方式 这是在 data 提取期间定义的静态值,用于标识特定的 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 | 退货发起的渠道,例如线上、门店或呼叫中心。 | ||
| 描述 此属性指定退货请求的来源或接收方式。它有助于区分通过 Web 门户、实体店或客户服务代表发起的退货。 按退货渠道对流程进行细分,对于了解运营差异和资源分配至关重要。例如,与线上退货相比,门店退货的检验时间可能更快,但单据步骤不同。这是“退货流程吞吐量趋势”仪表板的一个关键维度。 为何重要 区分退货的发起方式,这通常会影响不同渠道的流程流向、资源需求和周期时间。 获取方式 这通常不是 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。 该属性通过为每个 case 的 SLA 表现提供清晰的二元结果,简化了分析和报告工作。它被用于计算整体“退款处理 SLA 合规率”,并支持轻松筛选以隔离并分析违规案例。 为何重要 为每个 case 提供清晰的 SLA 达标与否指标,简化合规监控和报告工作。 获取方式 这是一个计算属性。逻辑为:“退款已处理”的事件时间 <= 退款 SLA 截止日期。 示例 truefalse | |||
| 端到端周期时间 EndToEndCycleTime | 一个退货案例从第一个活动到最后一个活动所经历的总时长。 | ||
| 描述 这是一个 case 层级的指标,计算为第一个事件(如“退货订单已创建”)与最后一个事件(如“退货订单已完成”或“贷记凭证已清账”)之间的时间间隔。它代表了退货在流程中花费的总时间。 这是衡量整体流程效率的首要关键绩效指标。它被用于趋势分析和标杆对照,以跟踪随时间推移的改进情况。分析该指标的分布有助于识别与解决时间长短相关的因素(如产品类型或退货原因)。 为何重要 衡量退货流程的总时长,提供流程整体效率和客户体验的关键指标。 获取方式 这是一个计算指标。它是 case 中最后一个活动的时间戳减去第一个活动的时间戳。 示例 5 天 4 小时12天8小时3天2小时 | |||
| 贷项通知单号 CreditMemoNumber | 为退款开具的贷记凭证单据的唯一标识符。 | ||
| 描述 贷记凭证是 SAP 中的正式开票单据,用于确定支付给客户的退款。此编号唯一标识该财务凭证。 此属性对于财务对账以及跟踪从业务退货到财务结算的整个流程至关重要。它是流程中的关键里程碑,用于查找“实际退款金额”等属性相关的会计单据。 为何重要 提供授权客户退款的财务凭证直接链接,这对于财务审计和对账至关重要。 获取方式 贷记凭证是一种开票单据。其编号位于 VBRK 表(开票单据:抬头数据)的 VBELN 字段中。可通过退货订单的凭证流找到该链接。 示例 900011229000334490005566 | |||
| 退款 SLA 截止日期 RefundSLATargetDate | 根据服务水平协议 (SLA) 预计处理退款的日期。 | ||
| 描述 此属性定义了给定退货案例完成退款处理的截止日期。通常根据业务规则计算,例如“收货后 5 个工作日内”。 此目标日期是衡量实际绩效的基准。它是“退款处理 SLA 合规性”仪表板的核心组件,使企业能够监控对客户承诺的履行情况,并识别存在 SLA 违约风险的案例。 为何重要 设定退款处理的绩效目标,使企业能够衡量并报告 SLA 合规情况,并优先处理逾期案例。 获取方式 这通常不是标准的 SAP 字段,需要基于业务规则推导。它可以从关键日期字段(如 MKPF 中的收货日期)加上配置的时长计算得出。请参考 SAP ECC 文档或业务需求。 示例 2023-04-25T23:59:59Z2023-04-28T23:59:59Z2023-05-02T23:59:59Z | |||
| 退款金额差异 RefundAmountDiscrepancy | 实际退款金额与申请退款金额之间的计算差额。 | ||
| 描述 此计算指标量化了退货订单中最初申请的金额与贷记凭证中最终开具的金额之间的货币差异。正值可能表示部分退款,而负值虽然不寻常,但可能表示多付了款项。 此属性是“退款金额差异跟踪”仪表板的关键衡量指标。它有助于快速识别并分析存在财务偏差的案例(原因可能是商品状况评估、重新上架费或错误)。监控此项指标有助于确保财务控制和政策合规。 为何重要 直接衡量退款流程中的财务偏差,有助于识别违反政策的情况、处理错误或财务漏洞。 获取方式 计算字段:实际退款金额 - 申请退款金额。 示例 0.00-4.99-50.00 | |||
| 退货政策遵守度 ReturnPolicyAdherence | 标识该退货是否符合所有定义的业务规则和政策。 | ||
| 描述 此计算得出的布尔属性标志着退货案例是否遵循了公司规定的标准政策。其逻辑可能涉及检查多个条件,例如退货是否在允许的时限内发起、原因代码对该产品是否有效,或者例外情况是否获得了经理批准。 此属性驱动“退货审批政策合规性”仪表板。它支持直接衡量合规率,并帮助识别哪些政策最常被绕过,从而实现有针对性的流程改进或培训。 为何重要 衡量对业务规则的遵循情况,有助于一致地执行政策,并识别需要特殊审查或审批的案例。 获取方式 这是一个基于一组业务规则的衍生属性。例如:(退货发起日期 - 原始购买日期) <= 30 天 且 退货原因不为空。 示例 truefalse | |||
| 退货订单状态 ReturnOrderStatus | 退货订单 case 的整体处理状态。 | ||
| 描述 此属性提供退货案例当前状态的快照,例如“未结”、“进行中”或“已完成”。它源自销售凭证抬头或行项目层级的状态组合。 在分析中,此属性可用于筛选 case,以便专注于活跃或已完成的退货。它可以帮助监控整体工作负荷和未结案例的进度,并为每个退货旅程提供高层级的结果视图。 为何重要 提供 case 生命周期的全局视角,支持对未结、进行中或已关闭的退货进行筛选和分析。 获取方式 源自表 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 | |||
| 贷项通知单已过账至财务 | 贷记凭证已释放至财务会计,成为正式的应收账款过账。此步骤会触发向客户支付实际退款的流程。 | ||
| 为何重要 此活动标志着公司在财务上确认退款。贷记凭证创建与过账之间的延迟可能会拖慢向客户实际退款的速度。 获取方式 这是一个推导事件,在开票凭证抬头 (VBRK-RFBSK) 中的过账状态更新为 'C'(已创建过账单据)时识别。实际的会计凭证创建日期位于 BKPF 表中。 捕获 识别 VBRK-RFBSK 设置为“C”的时间戳,或使用关联的 BKPF 会计凭证中的创建日期 (CPUDT)。 事件类型 inferred | |||
| 退货订单已创建 | 此活动标志着客户请求退货时流程的启动。当在 SAP ECC 中创建类型为“退货”(如 RE)的新销售凭证时,系统会捕获此活动。 | ||
| 为何重要 这是退货流程的主要起始事件。分析从该活动到其他活动的时间,有助于衡量总周期时间并识别初始处理延迟。 获取方式 这是记录在 VBAK 表(销售凭证抬头)中的显性事件。对于单据类型为 'RE' (VBAK-AUART = 'RE') 的销售凭证号 (VBAK-VBELN),创建时间戳存储在 VBAK-ERDAT 和 VBAK-ERZET 中。 捕获 对于销售凭证类型 'RE',使用 VBAK 表中的创建时间戳 (ERDAT, ERZET)。 事件类型 explicit | |||
| 退货订单已完成 | 从销售和分销的角度来看,此活动标志着退货流程的结束。当退货订单上的所有行项目都已处理完毕并关闭时,即发生此活动。 | ||
| 为何重要 这是流程的主要结束事件。衡量从“退货订单已创建”到此活动的时间,即可得出退货案例的端到端周期时间。 获取方式 这是一个从状态表推导出的事件。当销售凭证抬头 (VBUK-GBSTK) 的总体状态更新为 'C'(已完全处理)时,系统会捕获此事件。 捕获 当抬头状态字段 VBUK-GBSTK 变为“C”时,从修改凭证 (CDHDR/CDPOS) 中识别时间戳。 事件类型 inferred | |||
| 已创建退货交货 | 生成交货单据以管理退回商品的实物接收。此事件标志着退货物流流程已启动。 | ||
| 为何重要 跟踪从行政处理到物理物流的过渡。此处的延迟可能会影响仓库规划和整体退货周期时间。 获取方式 这是记录在 LIKP 表(交货抬头)中的显性事件。创建时间戳位于 LIKP-ERDAT。与源退货订单的链接可在 LIPS 表 (LIPS-VGBEL) 中找到。 捕获 对于与退货订单相关的交货单,使用 LIKP 表中的创建时间戳 (ERDAT)。 事件类型 explicit | |||
| 贷项通知单已清账 | 应收账款中的未结贷项被清账,通常通过向客户付款完成。此事件标志着退款在财务上的最终结案。 | ||
| 为何重要 此活动确认了出账事件,并完成了流程的财务端。从客户角度来看,这是退款旅程真正的终点。 获取方式 这是来自财务 (FI) 模块的一个显性事件。会计凭证的清账日期存储在对应客户行项目的 BSEG 表 (BSEG-AUGDT) 中。 捕获 对于与贷记凭证关联的会计凭证,使用 BSEG 或 BSAD 表中的清账日期 (AUGDT)。 事件类型 explicit | |||
| 贷项通知单请求已创建 | 创建贷项通知单请求,正式记录退款需求。在许多配置中,退货订单本身即充当贷项通知单请求。 | ||
| 为何重要 这是退货流程中财务结算部分的正式开始。它为后续的财务审批和单据创建提供了触发点。 获取方式 这可以是 VBAK 表中类型为“贷记凭证请求”(如 CR)的销售单据的一个显性事件;如果订单类型配置为相关开票,它也可以与“退货订单已创建”为同一个事件。 捕获 对于单据类型 'CR',使用 VBAK 中的创建时间戳 (ERDAT),或者复用退货订单创建事件。 事件类型 explicit | |||
| 退货订单冻结已取消 | 代表退货请求已获批准,允许进入下一阶段。这通常通过单据状态的更改或取消交货/开票冻结来体现。 | ||
| 为何重要 此活动是一个关键的审批里程碑。衡量到达这一步所需的时间有助于识别退货授权和审批流程中的瓶颈。 获取方式 这是一个推导事件,源自销售凭证的更改日志。请检查 CDHDR 和 CDPOS 表,查看 VBAK 或 VBAP 中的冻结字段,或 VBUK/VBUP 中的状态字段的更改。 捕获 当相关的冻结状态被移除时,从修改凭证表 (CDHDR/CDPOS) 中识别时间戳。 事件类型 inferred | |||
| 退货订单项已完成 | 退货订单中的单个行项目被标记为处理完成。通常在完成该项目的所有物流和财务后续单据后发生。 | ||
| 为何重要 在行项目层级进行跟踪有助于识别哪些产品或退货原因导致了最长的延迟。它提供了关于流程完成情况的更细颗粒度视图。 获取方式 这是一个从状态表推导出的事件。当销售凭证行项目 (VBUP-GBSTK) 的总体状态更新为 'C'(已完全处理)时,系统会捕获此事件。 捕获 当行项目状态字段 VBUP-GBSTK 变为“C”时,从修改凭证 (CDHDR/CDPOS) 中识别时间戳。 事件类型 inferred | |||
| 退货订单项已拒绝 | 在初步审查或质检后,退货订单中的特定行项目被拒绝。这意味着该项目将不再进行后续处理(如退款)。 | ||
| 为何重要 分析拒绝情况有助于识别无效的退货请求,并为完善客户政策沟通提供依据。这是流程中不产生退款的关键路径。 获取方式 这是一个推导事件。通常是通过在 VBAP 表 (VBAP-ABGRU) 中为行项目设置唯一的“拒绝原因”代码来捕获的。时间戳必须源自更改日志。 捕获 当退货行项目的 VBAP-ABGRU 字段被填充时,从修改凭证 (CDHDR/CDPOS) 中识别时间戳。 事件类型 inferred | |||
提取指南
步骤
- 创建 ABAP 程序:使用事务代码
SE38创建一个新的可执行 ABAP 程序,例如Z_PM_RETURN_EXTRACTION。提供描述性标题,并将其保存为本地对象或开发包中。 - 定义选择屏幕:在程序中定义选择屏幕以允许用户过滤数据。关键过滤器包括退货订单的创建日期范围(
S_ERDAT)、退货的销售单据类型(S_AUART,例如“RE”)和公司代码(P_BUKRS)。 - 定义数据结构:创建一个符合所需事件日志格式的本地结构类型。该结构应包含
ReturnCaseId、ActivityName、EventTime、SourceSystem、LastDataUpdate、ProcessingAgent、ReturnReason以及其他所需属性字段。 - 实现数据选择逻辑:编写核心 ABAP 逻辑以提取 12 个所需活动的数据。这涉及查询各种 SAP 表,如 VBAK、VBAP、LIKP、VBRK、BKPF、CDHDR 和 CDPOS。使用单据流表(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 列表查看器)中显示结果,以便在线分析。提供将最终内表作为 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”。 - 准备查询:将“查询”部分提供的完整 SQL 查询复制到您的 SQL 客户端中。
- 配置参数:定位查询开头名为
BaseReturnOrders的公共表表达式 (CTE)。通过替换[START_DATE]和[END_DATE]修改WHERE子句以指定所需的日期范围。更新退货订单类型列表,如有必要,按特定公司代码 (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;