您的“账表到报告——期间关账与对账”data 模板
您的“账表到报告——期间关账与对账”data 模板
- 建议收集的属性
- 需要追踪的关键活动
- 提取指南
Record to Report - 期间结账与对账属性
| 名称 | 描述 | ||
|---|---|---|---|
| 财务期间 FinancialPeriod | 财务报告周期的唯一标识符,通常将会计年度和过账期间结合在一起。 | ||
| 描述 会计期间作为主要的案例标识符,将特定报告周期(如 2023 年 12 月的“2023-12”)中所有与结账和对账相关的活动归类。这支持对每个独立期间的完整结账流程进行从头到尾的全面分析。 在分析中,它可以跟踪每次结账的端到端周期,对比不同期间的绩效,并识别趋势或异常。通过将每个会计期间定义为唯一案例,可以实现流程效率、瓶颈和变体的可视化衡量。 为何重要 作为核心案例标识符,它是整个分析的基础,支持对结账周期、工作量和流程合规性进行跨期间对比。 获取方式 此属性通常通过连接财务凭证抬头(例如 BKPF 表)中的会计年度 (GJAHR) 和过账期间 (MONAT) 得出。 示例 2023-122024-032023-Q4 | |||
| Event 时间 EventTime | 指示某个活动或事件发生的时间戳。 | ||
| 描述 Event Time 提供了流程中每个活动的精确日期和时间,是分析的时间基础。它通常由凭证创建日期和时间组合而成。 该时间戳对于对事件进行正确排序以重构流程流向至关重要。它被用于计算所有基于持续时间的指标,包括活动间的周期时间、等待时间以及整体结账时长。分析时间戳有助于识别延迟并了解工作在时间上的分布情况。 为何重要 作为必填属性,它提供了 event 的按序排列,这对于计算周期时间和发现流程 bottleneck 至关重要。 获取方式 这通常源自财务凭证 BKPF 表中的凭证输入日期 (CPUDT) 和输入时间 (CPUTM)。 示例 2023-12-28T14:30:15Z2024-01-02T09:05:00Z2024-01-05T17:21:45Z | |||
| 最后数据更新 LastDataUpdate | 从源系统最后一次刷新或提取数据的时间戳。 | ||
| 描述 此属性显示所分析数据的实时性。它记录了数据流水线上次运行的日期和时间,为流程洞察的及时性提供参考。 对于仪表板,尤其是那些跟踪实时进度的仪表板,此时间戳对于用户判断其看到的是最新信息还是前一天的数据至关重要。它能管理用户预期,并对正确解读分析结果起到关键作用。 为何重要 向用户显示数据的实时性,这对于确保分析结果和仪表板具有时效性与参考价值至关重要。 获取方式 此 timestamp 由 data 提取或 ETL 工具在每次 data 加载过程结束时生成并添加。 示例 2024-05-21T04:00:00Z2024-05-20T04:00:00Z2024-05-19T04:00:00Z | |||
| 活动 ActivityName | 期间结账流程中所执行的具体业务事件或任务的名称。 | ||
| 描述 此属性记录了 Record to Report 周期中执行的具体步骤,如“调整日记账分录已过账”或“财务报表已生成”。它构成了流程图的骨架,展示了组成期间结账的事件序列。 分析活动是流程挖掘的基础。它有助于可视化流程流向、识别任务序列、发现流程变体并衡量每一步的频率和时长。这对于定位瓶颈、非标准路径以及寻找标准化或自动化机会至关重要。 为何重要 此属性是构建流程图的必选项,支持对结账任务序列进行可视化分析。 获取方式 这来源于 SAP 事务码 (TCODE)、凭证类型 (BLART) 或特定程序执行(如用于外币重估的 FAGL_FCV)的组合。 示例 调整会计分录已过账账户对账已开始期间已关闭过账 | |||
| 源系统 SourceSystem | 提取数据的源系统的标识符。 | ||
| 描述 此属性指定事件数据的来源,例如具体的 SAP ECC 实例名称或 ID。在拥有多个 ERP 或财务系统的组织中,此字段对于区分不同来源的数据至关重要。 即使在单一系统环境中,它也是数据治理、审计和故障排除的关键元数据。它确认了数据的出处,这对于建立分析信任并确保数据血缘清晰度至关重要。 为何重要 提供关键的数据血缘,确认数据来源以满足治理需求。在多系统环境中,这对于区分不同流程至关重要。 获取方式 这通常是在数据提取过程中添加的静态值,用于标识特定的 SAP 客户端和系统 ID(例如,来自表 T000)。 示例 ECC_PROD_100SAP_E74_200ECC_FINANCE | |||
| 以本币计的金额 DMBTR | 交易行项目的财务价值,以公司代码的本位币表示。 | ||
| 描述 此属性代表与财务过账关联的货币价值。它是衡量交易对总账影响的核心量化指标。 分析金额对于确定问题的优先级和理解财务风险至关重要。例如,“调整分录数量分析”仪表板在能够区分“大量小额调整”和“少量大额调整”时会变得更加高效。它能帮助将注意力集中在具有财务重要性的交易上。 为何重要 量化交易的财务影响,支持基于重要性水平的分析,例如识别高金额的调整分录。 获取方式 可从单据行项目表 BSEG (DMBTR) 中获取。 示例 1500.75-25000.00123456.00 | |||
| 公司代码 BUKRS | 代表法律实体的组织单位,用于生成财务报表。 | ||
| 描述 公司代码是 SAP 财务模块中的基本组织单位。它代表一个拥有独立会计核算体系的实体。所有财务交易都在公司代码级别过账。 在流程挖掘中,按公司代码进行过滤对于对比集团内不同法律实体的期间结账流程至关重要。这有助于识别高绩效实体的最佳实践,并定位那些面临延迟、大额调整或流程偏差的实体。它是细分分析的关键维度。 为何重要 支持对不同法定实体的期间结账绩效和合规性进行比较,这对于集团层面的财务分析至关重要。 获取方式 此字段存在于 SAP 的几乎所有财务凭证表中,主要是 BKPF(抬头)和 BSEG(行项目)。 示例 10002000US01DE01 | |||
| 凭证号码 BELNR | 会计年度和公司代码内财务凭证的唯一标识符。 | ||
| 描述 会计凭证编号是 SAP 财务过账的主键。每个日记账分录、发票或付款凭证都会被分配一个唯一编号。 虽然凭证编号通常不用于高层级的流程分析,但它对于穿透式钻取分析极具价值。在流程挖掘仪表板中,分析师可以利用凭证编号直接跳转到 SAP 中的特定交易,以便对异常情况(如大额调整分录或延迟对账项)进行详细调查。它提供了从洞察到原始交易的直接链路。 为何重要 提供指向 SAP 原始交易的直接链接,支持从流程视图深入钻取到具体的会计分录。 获取方式 位于 BKPF 表 (BELNR) 中,作为主键。 示例 100000456719000001233000008901 | |||
| 凭证类型 BLART | 对不同类型会计单据进行分类的代码。 | ||
| 描述 在 SAP 中,凭证类型用于区分不同的业务交易,例如供应商发票 (KR)、客户付款 (DZ) 和总账过账 (SA)。它还控制凭证编号范围等属性。 对于期末结账分析,凭证类型是一个强大的过滤器。它可以用于隔离特定类型的活动,如应计项目、计提或冲销分录。这有助于分析各种结账相关交易的数量和财务影响,并可用于定义流程模型中的特定活动。 为何重要 有助于对交易进行分类和过滤,从而支持隔离并分析特定活动,如应计、冲销或公司间过账。 获取方式 位于凭证抬头表 BKPF (BLART) 中。 示例 SAABKR | |||
| 总账分录类型 JournalEntryType | 会计分录的分类,例如“标准”、“调整”、“应计”或“冲销”。 | ||
| 描述 这是一个派生属性,根据财务凭证在结账流程中的业务用途进行分类。通常由凭证类型 (BLART)、冲销原因 (STGRD) 或所使用的特定总账账号组合判定。 此分类是“调整分录数量分析”仪表板和相关 KPI 的基础。通过明确识别调整或应计分录,分析师可以衡量其数量和价值、跟踪时间趋势,并调查其产生的根本原因。它有助于区分常规业务过账与期末调整。 为何重要 对过账进行分类以进行针对性分析,从而支持对调整和应计等关键分录类型进行追踪和衡量,这些都是流程健康状况的指标。 获取方式 这是一个派生字段。需要根据业务规则定义逻辑,通常使用来自 BKPF 的凭证类型 (BLART) 等字段。 示例 调整中预提/应计冲销标准 | |||
| 总账科目 HKONT | 行项目过账到的总账账号编号。 | ||
| 描述 总账 (GL) 账号是财务中用于对交易进行分类的核心主数据。每笔财务过账都会分配到一个或多个总账账号。 在结账分析中,按总账账号分析活动对于“账号对账瓶颈”和“调整分录数量分析”仪表板至关重要。这有助于识别哪些账号最难对账、哪些账号需要的调整最多,以及哪里存在最高的重要错报风险。这种聚焦能让团队优先处理有问题的账号。 为何重要 支持对对账和调整分录进行针对性分析,有助于识别导致延迟或需要频繁更正的问题账户。 获取方式 可从财务单据行项目表 BSEG (HKONT) 中获取。 示例 113100400500750000 | |||
| 负责人 USNAM | 创建或执行该交易的用户的 SAP 用户 ID。 | ||
| 描述 此字段获取过账凭证、运行报表或执行结账相关程序的用户。它识别了负责某项具体活动的个人。 按用户分析对于了解工作量分布、识别培训需求和调查流程偏差至关重要。显示每个用户活动情况的仪表板可以突出超负荷的团队成员,或可能未遵循标准程序的个人。它还有助于财务团队内的绩效管理和资源分配。 为何重要 支持分析工作量分配、团队绩效,并识别与特定人员相关的流程偏差。 获取方式 可从单据创建的 BKPF 表 (USNAM) 中获取。对于批处理作业,可以在 TBTCO (SDLUNAME) 中找到。 示例 JSMITHRDOE财务管理 | |||
| 会计年度 GJAHR | 交易过账所在的会计年度。 | ||
| 描述 会计年度是组织财务数据的基本元素。它是会计期间案例 ID 的关键组成部分,并为所有交易提供必要背景。 虽然会计年度通常是案例 ID 的一部分,但将其作为独立属性对于长期趋势分析非常有用。它支持对结账周期、调整量或其他 KPI 进行年度对比,从而识别多年来绩效的改善或下滑。 为何重要 提供关键的时间维度背景,支持对结账流程进行年度绩效同比分析。 获取方式 可从单据抬头表 BKPF (GJAHR) 中获取。 示例 202320242022 | |||
| 冲销原因 ReversalReason | 指示财务单据被冲销原因的代码。 | ||
| 描述 在 SAP 中冲销凭证时,可以分配一个原因代码来解释冲销目的,例如“当前期间冲销”或“输入错误”。 该属性为返工发生的原因提供了关键背景。分析冲销原因有助于识别错误模式(如 data 录入错误或日期错误)。这些洞察可用于实施预防措施、改进培训或增强系统控制,从而减少错误和后续冲销,实现更高效的关账。 为何重要 直接洞察错误和返工的根本原因,有助于发现流程改进和错误预防的机会。 获取方式 位于凭证抬头表 BKPF (STGRD) 中。 示例 010205 | |||
| 对账状态 ReconciliationStatus | 账号对账的当前状态,例如“未开始”、“复核中”或“已批准”。 | ||
| 描述 此属性跟踪账号对账在其工作流中的状态。它指示对账是已开始、已提交复核、已批准还是已拒绝。 这是实时监控对账活动进度的关键属性。它有助于识别哪些对账环节停滞以及停滞了多久,从而支持“账号对账周期”等 KPI。它提升了审批流程的透明度,对于跟踪对账瓶颈和团队工作量的仪表板至关重要。 为何重要 提升对账工作流的透明度,支持跟踪进度、识别瓶颈以及衡量复核与审批耗时。 获取方式 此类信息通常存在于独立的对账工具(如 BlackLine 的 SAP 账号证明与自动化)或自定义状态字段中。它通常不是 BKPF/BSEG 中的标准字段。 示例 未开始进行中已批准已驳回 | |||
| 是否已自动化 IsAutomated | 一个标记,用于指示活动是由人工用户还是由自动化系统执行的。 | ||
| 描述 此布尔属性区分手动任务和由系统自动执行的任务,例如外币重估的计划批处理作业或录入经常性分录的机器人。这通常通过分析与交易关联的用户名称(如“BATCHUSER”)来确定。 了解自动化程度是寻找效率提升机会的关键。分析此属性有助于可视化流程中哪些部分是手动的,以及哪些环节具备自动化潜力。同时,通过排除系统生成的活动,可以更准确地评估人员的实际工作量。 为何重要 区分人工和系统驱动的活动,这对于识别自动化机会和准确衡量人工工作量至关重要。 获取方式 这是一个派生属性。逻辑通常基于用户名 (USNAM),其中已知系统或批处理用户 ID 列表指示该任务为自动化任务。 示例 truefalse | |||
| 是否返工 IsRework | 一个计算标记,用于识别代表返工的活动,例如冲销或被拒绝的对账。 | ||
| 描述 此布尔属性标记暗示流程中存在低效循环或更正的事件序列。例如,在同一个账号上,先进行了“对账已复核”,随后又录入了“调整日记账分录”,这就可以被标记为返工。 该属性对于量化流程浪费至关重要,并支持“对账返工案例”仪表板和“对账返工率”KPI。通过隔离返工活动,团队可以调查根本原因,衡量其对周期的影响,并跟踪旨在“一次性做对”的流程改进计划的有效性。 为何重要 通过标记更正或重复性活动来量化流程的低效程度,帮助衡量并减少不必要的精力浪费。 获取方式 这是一个计算属性。其逻辑在流程挖掘工具中根据特定的活动序列(如循环)或属性(如 ReversalReason 不为空)定义。 示例 truefalse | |||
| 是否逾期 IsOverdue | 一个计算标记,用于指示活动是否在计划的目标日期之后完成。 | ||
| 描述 此布尔属性将活动的实际完成时间 (EventTime) 与计划截止日期 (TargetCompletionDate) 进行对比。如果实际时间晚于计划时间,则标记为 true。 该属性直接支持“结账合规与逾期任务”仪表板和“按时结账率”KPI。它提供了进度偏差的清晰、即时信号,让管理人员能够快速识别逾期任务,了解其对整体时间线的影响,并督促团队按时完成。 为何重要 提供进度违规的清晰指标,帮助快速识别逾期任务并衡量按时完成率。 获取方式 这是一个计算属性,在流程挖掘工具中通过对比 EventTime 与 TargetCompletionDate 计算得出。 示例 truefalse | |||
| 期间结账周期 PeriodCloseCycleTime | 单个会计期间从结账开始到结束所经历的总时长。 | ||
| 描述 此计算指标衡量单个会计期间完整结账流程的端到端时长。通常计算为该期间内第一个和最后一个记录活动之间的时间差。 这是 Record to Report 流程的核心绩效指标 (KPI)。它从宏观角度衡量结账的整体效率。通过仪表板将该指标随时间的变化可视化,对于跟踪“加速结账”等战略目标的进展至关重要。 为何重要 这是一个关键 KPI,用于衡量财务结账的整体效率和速度,直接支持缩短结账周期的战略目标。 获取方式 这是一个计算指标,在流程挖掘工具内通过计算每个会计期间 (CaseId) 的最大与最小 EventTime 之差得出。 示例 5 天 4 小时 30 分钟6.2 天120.5 小时 | |||
| 目标完成日期 TargetCompletionDate | 某项活动或整个期间结账的计划截止日期。 | ||
| 描述 计划完成日期是衡量结账进度的基准时间表。它是特定里程碑或最终结账必须完成的截止期限。 该属性对于任何绩效或合规性相关的分析都不可或缺。它被用于计算“按时结账率”KPI,并驱动“结账合规与逾期任务”仪表板。通过对比实际发生时间与此计划日期,系统可以判定任务是按进度进行、已逾期还是存在逾期风险,从而实现对结账流程的主动管理。 为何重要 通过提供衡量结账活动是否按时完成的基准,支持合规性和绩效监控,从而支撑准时交付 KPI。 获取方式 这通常是维护在独立日历、结账工作台工具(如 SAP Financial Closing cockpit)或电子表格中的主数据,不属于交易型 data。 示例 2023-12-29T23:59:59Z2024-01-03T17:00:00Z2024-01-02T12:00:00Z | |||
| 贸易伙伴 VBUND | 涉及内部往来交易的关联集团公司的标识符。 | ||
| 描述 贸易伙伴 ID 用于识别参与内部往来交易的另一方公司代码。这对于关联实体间的对账至关重要。 该属性直接支持“内部往来对账流”仪表板和“内部往来对账周期”KPI。通过过滤存在贸易伙伴的交易,分析可以专门聚焦于内部往来对账流程的效率和及时性,这通常是结账过程中的一大痛点。 为何重要 专门识别内部往来交易,支持对通常复杂且耗时的内部往来对账流程进行重点分析。 获取方式 可在单据行项目表 BSEG (VBUND) 中找到。 示例 1000US013000 | |||
| 部门 Department | 负责该活动或交易的业务部门或成本中心。 | ||
| 描述 此属性识别与交易关联的业务部门,如“财务”、“销售”或“物流”。通常来源于与过账关联的成本中心主数据或用户主数据。 按部门分析支持“结账团队工作量分布”仪表板。这有助于了解不同业务职能对期末工作量的影响,特别是那些可能在后期需要调整或对账的初始交易。它能突出显示核心财务团队之外对结账流程产生影响的领域。 为何重要 有助于分析不同业务部门的工作负载和流程遵循情况,揭示各部门如何影响财务结账的效率。 获取方式 通常来源于 BSEG 中的成本中心 (KOSTL) 或负责用户的 HR 主数据。这可能需要关联多张表。 示例 集团财务应付账款财务计划与分析 | |||
Record to Report - 期间结账与对账活动
| 活动 | 描述 | ||
|---|---|---|---|
| 外币评估运行 | 这代表执行一个程序,使用期末汇率对以外币记录的未清项和余额进行重估。这通常作为期末关账步骤中的批处理作业运行。 | ||
| 为何重要 这是确保跨国组织财务报告准确性的关键步骤。分析其执行时间和持续时间有助于发现自动化和绩效优化的机会。 获取方式 从外币评估程序(如 FAGL_FCV 或 F.05)的执行日志中捕获。来自 TBTCO 和 TBTCP 等表的批处理作业详情提供了执行 timestamps。 捕获 来自程序 FAGL_FC_VALUATION 或 SAPF100 的批处理作业日志(表 TBTCO)。 事件类型 explicit | |||
| 期间已关闭过账 | 代表过账期间的正规结账,这会阻止进一步录入业务日记账。此操作确保了已结期间财务数据的完整性,且属于明确的配置变更。 | ||
| 为何重要 这是期间关账流程的明确结束 event。它对于准确计算总期间关账周期(Period Close Cycle Time)以及衡量按时完成率至关重要。 获取方式 记录了通过事务码 OB52 进行的期间结账。这些变更可以通过分析配置表 T001B 的变更文档(表 CDHDR 和 CDPOS)来查找。 捕获 从表 T001B 的更改单据 (CDHDR/CDPOS) 中提取。 事件类型 explicit | |||
| 期间已打开过账 | 这标志着会计期间的正式开启,允许将交易过账到总账。这通常是由授权用户执行的显式配置更改,旨在开启一个或多个公司代码的特定期间过账。 | ||
| 为何重要 此活动作为结账流程案例的明确开始事件。分析从这一时间点开始的时长有助于了解会计期间的完整生命周期。 获取方式 通过事务 OB52 对过账期间所做的更改会被记录。这些更改可以通过分析底层配置表 T001B 的更改单据来提取,通常使用 CDHDR 和 CDPOS 表。 捕获 从表 T001B 的更改单据 (CDHDR/CDPOS) 中提取。 事件类型 explicit | |||
| 调整会计分录已过账 | 在期间初始交易处理完成后,过账调整会计分录以修正账户余额。此 event 作为 SAP 中的标准财务单据过账被捕获。 | ||
| 为何重要 这对“调整分录数量分析”至关重要。大量的调整说明上游流程的准确性存在问题,是流程改进计划的关键目标。 获取方式 可在 BKPF 和 BSEG 表中找到。这些分录通常通过专用于调整的特定单据类型 (BKPF-BLART) 识别,或者是由于在 13 至 16 等特殊结账期间过账而被识别。 捕获 过滤 BKPF 中在特殊期间过账或具有调整单据类型的单据。 事件类型 explicit | |||
| 财务报表已生成 | 这代表生成正式财务报表(如损益表和资产负债表)的时间点。该活动通常通过跟踪特定报表程序的执行来捕获。 | ||
| 为何重要 这是一个重大里程碑,标志着数据处理的结束以及最终复核与审批阶段的开始。从该事件到获得批准的时间是一个关键 KPI。 获取方式 根据记录财务报表生成程序(最常见的是事务 F.01)执行情况的系统审计日志(如 STAD)推断。 捕获 来自追踪财务报表事务 F.01 执行情况的系统日志 (STAD)。 事件类型 inferred | |||
| 账户对账已开始 | 代表该期间一组总账账号对账流程的开始。在标准 SAP ECC 中,这并非一个独立事件,通常通过相关活动(如首次运行关键报表)推断得出。 | ||
| 为何重要 此活动建立了一个关键里程碑,用于衡量整个对账阶段的持续时间。了解对账何时开始对于“账号对账周期”KPI 至关重要。 获取方式 此事件不会明确记录。必须从其他数据源推断,例如系统审计日志(事务码 STAD)中针对 FAGLB03 或 FS10N 等余额显示报表的首次执行记录。 捕获 根据系统日志中相关报表事务(如 FAGLB03)的首次运行情况进行推断。 事件类型 inferred | |||
| GR/IR 清账运行已执行 | 执行收货/发票收到 (GR/IR) 账号的自动清账程序。该程序将相应的收货和发票收据进行匹配并相互清账。 | ||
| 为何重要 GR/IR 账号是对账问题的频发点。监控此活动可确保自动清账程序正确运行,并帮助量化需要人工跟进的异常数量。 获取方式 执行情况记录在批处理作业日志中(事务 SM37)。程序通常是 SAPF124,通过事务 F.13 执行。作业日志表(如 TBTCO)提供了必要的 timestamps。 捕获 来自清账程序 SAPF124 的批处理作业日志(表 TBTCO)。 事件类型 explicit | |||
| 内部往来凭证已清账 | 此活动标志着两个不同公司代码之间未清项的清账,表示内部往来交易已结算或已对账。这在 SAP 中记录为明确的财务过账,通常是清账凭证。 | ||
| 为何重要 公司间项目清账的延迟是结账流程中常见的 bottleneck。追踪此活动对于衡量和改进公司间对账周期时间至关重要。 获取方式 从 BKPF 和 BSEG 中的财务单据中识别。清账单据联接并关闭未清项目,其清账日期 (BSEG-AUGDT) 用作 event timestamp。公司间交易通过贸易伙伴字段识别。 捕获 在 BKPF/BSEG 中识别涉及贸易伙伴项目的清账单据。 事件类型 explicit | |||
| 冲销分录已过账 | 此活动记录了对先前录入的日记账分录进行冲销的凭证过账,通常是为了纠错。SAP 会在冲销凭证与原始凭证之间建立明确的链接。 | ||
| 为何重要 大量的冲销表明 data 输入准确性或流程控制可能存在问题。通过追踪这些 event,有助于衡量“一次性成功率”并识别需要改进的领域。 获取方式 冲销凭证记录在 BKPF 表中。通常通过事务码 FB08 创建,并在 BKPF-STBLG 字段中包含对被冲销凭证编号的引用。 捕获 识别已填充 BKPF-STBLG 字段或通过冲销 T-code 创建的单据。 事件类型 explicit | |||
| 对账已复核 | 指示特定账户或账户组的对账已完成审核并确认。在标准 SAP ECC 中,这并非明确记录的 event,通常通过线下控制或自定义方案进行管理。 | ||
| 为何重要 跟踪审核时间对于了解关账流程中监控和监督阶段的瓶颈非常重要。它能揭示由管理层可用性或返工导致的延迟。 获取方式 此信息在标准 ECC 表中不可用。它需要自定义解决方案,例如自定义 Z 表中的状态字段、简单的工作流,或与专门的第三方对账工具集成。 捕获 如果已实施,则从自定义 workflow 或 Z 表中获取状态变更。 事件类型 inferred | |||
| 已生成试算平衡表 | 标志着运行报表以生成试算平衡表。这是在创建正式财务报表之前,验证借贷总额是否平衡的关键步骤。 | ||
| 为何重要 这是最终报告前的关键质量关口。重复运行此报表可能表明底层数据问题正在被发现和纠正,这可能会导致延迟。 获取方式 根据系统审计日志(如事务 STAD)推断,该日志可记录试算平衡表报告事务(如 S_ALR_87012277 或 F.01)的执行情况。 捕获 来自追踪报表事务代码执行情况的系统日志 (STAD)。 事件类型 inferred | |||
| 应计或计提已过账 | 这代表记录待摊预提或准备金的日记账分录,通常在期末过账。这在 SAP 中不是一个独立的 event 类型,而是通过识别特定日记账分录的特征推断出来的。 | ||
| 为何重要 隔离这些分录有助于分析预估管理子流程。大量或频繁的应计项目调整通常意味着该流程存在改进空间。 获取方式 来源于财务凭证表 BKPF 和 BSEG。可以通过过滤特定凭证类型 (BKPF-BLART)、唯一总账账号 (BSEG-HKONT) 或抬头文本中的关键字 (BKPF-BKTXT) 来识别分录。 捕获 基于单据类型、特定总账科目或文本字段过滤 BKPF/BSEG 表。 事件类型 inferred | |||
提取指南
步骤
- 访问 SAP 查询工具:登录您的 SAP ECC 系统。进入事务代码
SQVI(QuickViewer)。 2. 创建新查询:输入查询名称,例如Z_R2R_PERIOD_CLOSE,然后点击“创建”。在弹出窗口中提供描述性标题,如“R2R 期间结账提取”。在“数据源”中选择“表联接”。 3. 定义表联接:添加主表BKPF(会计单据抬头)。然后添加表BSEG(会计单据行项目)。SAP 会自动建议联接条件(MANDT、BUKRS、BELNR、GJAHR),您应当验证并接受。对于期间开启和关闭活动,您需要联接CDHDR和CDPOS的另一个查询。 4. 选择输出字段(列表字段):导航至“列表字段选择”选项卡。从可用表中选择 event 日志所需的字段。包括BKPF-BUKRS、BKPF-BELNR、BKPF-GJAHR、BKPF-MONAT、BKPF-CPUDT、BKPF-CPUTM、BKPF-USNAM、BKPF-BLART、BSEG-HKONT、BSEG-DMBTR以及其他所需字段。 5. 定义输入参数(筛选字段):导航至“筛选字段”选项卡。选择执行期间用于过滤 data 的字段。最重要的字段是BKPF-BUKRS(公司代码)和BKPF-GJAHR(会计年度)。您也可以添加BKPF-MONAT(过账期间)和BKPF-BLART(单据类型)。 6. 为每个活动创建变式:由于 SQVI 无法合并不同的 data 选择(如 SQL UNION),您必须多次运行查询。对于每个活动(如“应计或计提已过账”),执行查询并在筛选界面输入特定的过滤值,例如与应计相关的单据类型列表。将这组选择条件保存为“变式”。为每个可提取的活动重复此过程。 7. 执行并提取 data:为您创建的每个变式执行查询。这将使用该活动的特定过滤器运行查询。 8. 导出结果:在结果屏幕中,将 data 导出到本地文件。最常用的格式是“电子表格”。为每个变式重复导出。 9. 合并与转换 data:在电子表格软件中打开导出的文件,或使用脚本工具。手动将所有文件的 data 合并为一个主文件。 10. 添加常量和计算列:在合并后的文件中,添加并非直接从 SAP 表中提取的列。包括ActivityName(根据 data 来源变式手动设置)、FinancialPeriod(通过拼接会计年度和期间生成)、EventTime(通过合并日期和时间字段生成)、SourceSystem以及LastDataUpdate。 11. 格式化以供上传:确保最终文件以 CSV 或 Excel 格式保存,并带有流程挖掘工具所需的正确列标题。在上传前验证 data 类型和格式。
配置
- 数据源:SAP Query (SQVI) 中的表联接。关键表包括 BKPF、BSEG、CDHDR 和 CDPOS。* 日期范围:建议提取至少 3 到 6 个完整财务期间的 data 以识别模式。在
BKPF-GJAHR(会计年度)和BKPF-MONAT(期间)上设置过滤器。* 公司代码过滤器:务必通过BKPF-BUKRS(公司代码)进行过滤,以限制 data 量并将分析重点放在特定的法定实体上。不建议一次性提取所有公司代码。* 单据类型过滤器:使用BKPF-BLART(单据类型)过滤器来隔离特定活动,如应计、调整或冲销。您需要获取所在组织的对应单据类型。* 前提条件:运行提取的用户需要获得使用SQVI事务的权限,以及对相关财务表的显示权限(例如权限对象 S_TABU_DIS)。* 性能注意事项:联接 BKPF 和 BSEG 可能会消耗大量资源。请在非高峰时段运行提取。避免使用过大的日期范围或保持公司代码过滤器为空,否则可能导致内存问题或超时。
a 查询示例 config
/*
LOGICAL REPRESENTATION FOR SAP QUERY (SQVI)
This is not a single executable script. Due to limitations in SQVI, you must create a base query joining BKPF and BSEG, then run it multiple times using different selection screen variants to extract each activity below. The results must be combined manually.
A separate query joining CDHDR and CDPOS is needed for period open/close activities.
*/
-- Activity 1: Period Opened For Posting
-- Required Query: Join CDHDR and CDPOS in SQVI.
SELECT
CONCAT(T001B.VONJ1, T001B.POPER) AS FinancialPeriod,
'Period Opened For Posting' AS ActivityName,
TO_TIMESTAMP(CONCAT(CDHDR.UDATE, CDHDR.UTIME), 'YYYYMMDDHH24MISS') AS EventTime,
'[SAP ECC SID]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
T001B.BUKRS AS BUKRS,
NULL AS BELNR,
CDHDR.USERNAME AS USNAM,
NULL AS HKONT,
NULL AS BLART,
NULL AS DMBTR,
NULL AS JournalEntryType
FROM CDHDR
JOIN CDPOS ON CDHDR.CHANGENR = CDPOS.CHANGENR
JOIN T001B ON SUBSTRING(CDPOS.TABKEY, 4, 4) = T001B.BUKRS
WHERE CDHDR.OBJECTCLAS = 'DEBI_BUKRS' AND CDPOS.TABNAME = 'T001B' AND CDPOS.FNAME = 'OFPER' AND CDPOS.VALUE_NEW > CDPOS.VALUE_OLD;
UNION ALL
-- Activity 2: Accrual Or Provision Posted
SELECT
CONCAT(BKPF.GJAHR, BKPF.MONAT) AS FinancialPeriod,
'Accrual Or Provision Posted' AS ActivityName,
TO_TIMESTAMP(CONCAT(BKPF.CPUDT, BKPF.CPUTM), 'YYYYMMDDHH24MISS') AS EventTime,
'[SAP ECC SID]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
BKPF.BUKRS AS BUKRS,
BKPF.BELNR AS BELNR,
BKPF.USNAM AS USNAM,
BSEG.HKONT AS HKONT,
BKPF.BLART AS BLART,
BSEG.DMBTR AS DMBTR,
'Accrual' AS JournalEntryType
FROM BKPF
JOIN BSEG ON BKPF.BUKRS = BSEG.BUKRS AND BKPF.BELNR = BSEG.BELNR AND BKPF.GJAHR = BSEG.GJAHR
WHERE BKPF.BLART IN ('SA', '[Your Accrual Doc Type]'); -- Filter by document types used for accruals
UNION ALL
-- Activity 3: Intercompany Document Cleared
SELECT
CONCAT(BKPF.GJAHR, BKPF.MONAT) AS FinancialPeriod,
'Intercompany Document Cleared' AS ActivityName,
TO_TIMESTAMP(CONCAT(BKPF.CPUDT, BKPF.CPUTM), 'YYYYMMDDHH24MISS') AS EventTime,
'[SAP ECC SID]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
BKPF.BUKRS AS BUKRS,
BKPF.AUGBL AS BELNR, -- The clearing document number
BKPF.USNAM AS USNAM,
BSEG.HKONT AS HKONT,
BKPF.BLART AS BLART,
BSEG.DMBTR AS DMBTR,
'Clearing' AS JournalEntryType
FROM BKPF
JOIN BSEG ON BKPF.BUKRS = BSEG.BUKRS AND BKPF.BELNR = BSEG.BELNR AND BKPF.GJAHR = BSEG.GJAHR
WHERE BSEG.AUGBL IS NOT NULL AND BSEG.VBUND IS NOT NULL; -- Identify cleared items with an intercompany trading partner
UNION ALL
-- Activity 4: Foreign Currency Valuation Run
SELECT
CONCAT(BKPF.GJAHR, BKPF.MONAT) AS FinancialPeriod,
'Foreign Currency Valuation Run' AS ActivityName,
TO_TIMESTAMP(CONCAT(BKPF.CPUDT, BKPF.CPUTM), 'YYYYMMDDHH24MISS') AS EventTime,
'[SAP ECC SID]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
BKPF.BUKRS AS BUKRS,
BKPF.BELNR AS BELNR,
BKPF.USNAM AS USNAM,
BSEG.HKONT AS HKONT,
BKPF.BLART AS BLART,
BSEG.DMBTR AS DMBTR,
'Valuation' AS JournalEntryType
FROM BKPF
JOIN BSEG ON BKPF.BUKRS = BSEG.BUKRS AND BKPF.BELNR = BSEG.BELNR AND BKPF.GJAHR = BSEG.GJAHR
WHERE BKPF.TCODE IN ('FAGL_FCV', 'FBB1'); -- Filter by FCV transaction code
UNION ALL
-- Activity 5: GR/IR Clearing Run Executed
SELECT
CONCAT(BKPF.GJAHR, BKPF.MONAT) AS FinancialPeriod,
'GR/IR Clearing Run Executed' AS ActivityName,
TO_TIMESTAMP(CONCAT(BKPF.CPUDT, BKPF.CPUTM), 'YYYYMMDDHH24MISS') AS EventTime,
'[SAP ECC SID]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
BKPF.BUKRS AS BUKRS,
BKPF.BELNR AS BELNR,
BKPF.USNAM AS USNAM,
BSEG.HKONT AS HKONT,
BKPF.BLART AS BLART,
BSEG.DMBTR AS DMBTR,
'Clearing' AS JournalEntryType
FROM BKPF
JOIN BSEG ON BKPF.BUKRS = BSEG.BUKRS AND BKPF.BELNR = BSEG.BELNR AND BKPF.GJAHR = BSEG.GJAHR
WHERE BKPF.TCODE IN ('F.13', 'F13E'); -- Filter by automated clearing transaction codes
UNION ALL
-- Activity 6: Account Reconciliation Started (Proxy)
-- This is a proxy. It takes the earliest adjusting journal entry timestamp for the period.
SELECT
A.FinancialPeriod,
'Account Reconciliation Started' AS ActivityName,
MIN(A.EventTime) AS EventTime,
'[SAP ECC SID]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
A.BUKRS,
NULL AS BELNR,
NULL AS USNAM,
NULL AS HKONT,
NULL AS BLART,
NULL AS DMBTR,
NULL AS JournalEntryType
FROM (
SELECT CONCAT(BKPF.GJAHR, BKPF.MONAT) AS FinancialPeriod,
TO_TIMESTAMP(CONCAT(BKPF.CPUDT, BKPF.CPUTM), 'YYYYMMDDHH24MISS') AS EventTime,
BKPF.BUKRS
FROM BKPF
WHERE BKPF.BLART IN ('AB', '[Your Adjusting Doc Type]')
) AS A
GROUP BY A.FinancialPeriod, A.BUKRS;
UNION ALL
-- Activity 7: Adjusting Journal Entry Posted
SELECT
CONCAT(BKPF.GJAHR, BKPF.MONAT) AS FinancialPeriod,
'Adjusting Journal Entry Posted' AS ActivityName,
TO_TIMESTAMP(CONCAT(BKPF.CPUDT, BKPF.CPUTM), 'YYYYMMDDHH24MISS') AS EventTime,
'[SAP ECC SID]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
BKPF.BUKRS AS BUKRS,
BKPF.BELNR AS BELNR,
BKPF.USNAM AS USNAM,
BSEG.HKONT AS HKONT,
BKPF.BLART AS BLART,
BSEG.DMBTR AS DMBTR,
'Adjusting' AS JournalEntryType
FROM BKPF
JOIN BSEG ON BKPF.BUKRS = BSEG.BUKRS AND BKPF.BELNR = BSEG.BELNR AND BKPF.GJAHR = BSEG.GJAHR
WHERE BKPF.BLART IN ('AB', '[Your Adjusting Doc Type]'); -- Filter by document types for adjustments
UNION ALL
-- Activity 8: Reversal Entry Posted
SELECT
CONCAT(BKPF.GJAHR, BKPF.MONAT) AS FinancialPeriod,
'Reversal Entry Posted' AS ActivityName,
TO_TIMESTAMP(CONCAT(BKPF.CPUDT, BKPF.CPUTM), 'YYYYMMDDHH24MISS') AS EventTime,
'[SAP ECC SID]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
BKPF.BUKRS AS BUKRS,
BKPF.BELNR AS BELNR,
BKPF.USNAM AS USNAM,
BSEG.HKONT AS HKONT,
BKPF.BLART AS BLART,
BSEG.DMBTR AS DMBTR,
'Reversal' AS JournalEntryType
FROM BKPF
JOIN BSEG ON BKPF.BUKRS = BSEG.BUKRS AND BKPF.BELNR = BSEG.BELNR AND BKPF.GJAHR = BSEG.GJAHR
WHERE BKPF.STBLG IS NOT NULL; -- STBLG (Reversed Document Number) is populated for reversals
UNION ALL
-- Activity 9: Period Closed For Posting
-- Required Query: Join CDHDR and CDPOS in SQVI.
SELECT
CONCAT(T001B.VONJ1, T001B.POPER) AS FinancialPeriod,
'Period Closed For Posting' AS ActivityName,
TO_TIMESTAMP(CONCAT(CDHDR.UDATE, CDHDR.UTIME), 'YYYYMMDDHH24MISS') AS EventTime,
'[SAP ECC SID]' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
T001B.BUKRS AS BUKRS,
NULL AS BELNR,
CDHDR.USERNAME AS USNAM,
NULL AS HKONT,
NULL AS BLART,
NULL AS DMBTR,
NULL AS JournalEntryType
FROM CDHDR
JOIN CDPOS ON CDHDR.CHANGENR = CDPOS.CHANGENR
JOIN T001B ON SUBSTRING(CDPOS.TABKEY, 4, 4) = T001B.BUKRS
WHERE CDHDR.OBJECTCLAS = 'DEBI_BUKRS' AND CDPOS.TABNAME = 'T001B' AND CDPOS.FNAME = 'OFPER' AND CDPOS.VALUE_NEW < CDPOS.VALUE_OLD;
/*
-- Activities Not Extractable via this Method
-- The following activities are not data postings and cannot be reliably extracted by querying finance tables BKPF/BSEG.
-- Extraction would require analyzing application logs (SLG1), system logs (STAT), or custom-built logging solutions.
-- Activity: Trial Balance Report Generated
-- Activity: Financial Statements Generated
-- Activity: Reconciliation Reviewed
*/ 步骤
- 程序范围界定与设计:定义识别 12 项所需活动中每一项的具体逻辑。咨询业务流程负责人和 SAP 功能分析师,确认您特定 SAP ECC 环境中与期末结账活动相关的单据类型、总账科目和程序名称。
- 创建 ABAP 程序:使用事务
SE38(ABAP 编辑器) 创建一个新的可执行程序,例如Z_PM_R2R_EXTRACTION。提供描述性标题并将程序类型设置为“可执行程序”。 - 定义筛选界面:在程序中,使用
PARAMETERS和SELECT-OPTIONS定义筛选界面。该界面将允许用户指定提取范围,包括公司代码 (BUKRS)、会计年度 (GJAHR) 和过账期间 (MONAT)。这对于控制 data 量至关重要。 - 声明 data 结构:定义一个内表结构,用于存放最终的 event 日志 data。该结构必须包含所有必需和推荐的属性:
FinancialPeriod、ActivityName、EventTime、SourceSystem、LastDataUpdate、BUKRS、BELNR、USNAM、HKONT、BLART、DMBTR和JournalEntryType。 - 实现 data 提取逻辑:编写核心 ABAP 逻辑以选择 12 项活动中每一项的 data。对于每项活动,查询相关的 SAP 表(如 BKPF、BSEG、TBTCO、CDHDR)并填充中间内表。参考随附 ABAP 查询部分提供的逻辑作为模板。
- 识别推断活动:对于标准 SAP 中未明确记录的活动(如“账户对账已开始”或“对账已审核”),实施约定的推断逻辑。这可能涉及检查特定报告的首次运行记录,或在存在自定义“Z 表”时进行查询。
- 合并 event data:在提取完所有单项活动的 data 后,将各中间表的记录附加到最终合并的内表中。确保
EventTime字段根据相关的源字段(如单据过账日期/时间或作业开始日期/时间)正确填充。 - 标准化与格式化 data:在输出前标准化关键字段。将会计年度和期间合并为
FinancialPeriod标识符。为SourceSystem和LastDataUpdate设置静态值。确保 timestamps 采用一致格式。 - 开发输出功能:为程序添加导出最终内表的功能。最常用的方法是使用
OPEN DATASET将 data 写入 SAP 应用服务器上的 CSV 或制表符分隔文件,或者允许用户使用函数模块GUI_DOWNLOAD直接下载到本地机器。 - 测试与验证:使用覆盖多个公司代码和期间的代表性数据集对程序进行彻底测试。使用验证步骤确保 data 的准确性和完整性。根据功能专家的反馈完善选择逻辑。
- 计划执行(可选):通过验证后,可以通过事务
SM36将程序安排为后台作业运行。这样可以实现 event 日志的自动化、定期提取,无需人工干预。
配置
- 筛选条件:程序应配备筛选界面以过滤 data。关键过滤器包括:
Company Code (BUKRS):必填项,用于将范围限制在相关的法定实体内。Fiscal Year (GJAHR):必填项,用于定义提取的主年份。Posting Period (MONAT):必填项,用于选择特定的财务期间。
- 特定活动配置:许多选项取决于您的具体 SAP 配置。这些应作为程序内的参数或常量进行配置:
Accrual/Provision Document Types:用于识别应计和计提过账的单据类型 (BLART) 列表。Adjusting Entry Document Types:用于识别调整分录的单据类型列表。Background Job/Program Names:用于外币评估(如FAGL_FCV)、GR/IR 清账(如SAPF124)、试算平衡表报告和财务报表生成(如RFBILA00)的程序技术名称。
- 日期范围:虽然主要按会计年度和期间进行选择,但底层逻辑应考虑 event 的完整日期和时间。对于初步分析,建议提取最近 3 到 6 个已完成财务期间的 data。
- 性能:对于大型 SAP 环境,程序的性能至关重要。确保数据库选择使用索引字段,特别是
BKPF和BSEG等表。避免选择所有字段 (SELECT *),并在必要时分批次处理 data。 - 权限:运行此程序的本地用户或服务账户需要访问所有查询表(
BKPF、BSEG、TBTCO、TBTCP、CDHDR、CDPOS)的权限,以及执行SE38(用于开发)和SM37/SM36(用于调度和监控)等事务的权限。
a 查询示例 abap
REPORT Z_PM_R2R_EXTRACTION.
" ====================================================================
" DATA DECLARATIONS
" ====================================================================
TYPES: BEGIN OF ty_event_log,
FinancialPeriod TYPE string,
ActivityName TYPE string,
EventTime TYPE timestamp,
SourceSystem TYPE string,
LastDataUpdate TYPE timestamp,
BUKRS TYPE bukrs,
BELNR TYPE belnr_d,
USNAM TYPE usnam,
HKONT TYPE hkont,
BLART TYPE blart,
DMBTR TYPE dmbtr,
JournalEntryType TYPE string,
END OF ty_event_log.
DATA: lt_final_log TYPE STANDARD TABLE OF ty_event_log,
ls_log_entry LIKE LINE OF lt_final_log.
DATA: lv_source_system TYPE string VALUE 'SAP ECC'.
GET TIME STAMP FIELD ls_log_entry-LastDataUpdate.
" ====================================================================
" SELECTION SCREEN
" ====================================================================
SELECT-OPTIONS: s_bukrs FOR ls_log_entry-bukrs OBLIGATORY,
s_gjahr FOR bkpf-gjahr OBLIGATORY,
s_monat FOR bkpf-monat OBLIGATORY.
PARAMETERS: p_accrl TYPE blart DEFAULT 'SA', " Example Doc Type for Accruals
p_adjst TYPE blart DEFAULT 'AJ', " Example Doc Type for Adjustments
p_fcv TYPE btcjob DEFAULT 'FAGL_FCV*', " Program for FC Valuation
p_grir TYPE btcjob DEFAULT 'SAPF124*', " Program for GR/IR Clearing
p_fs TYPE btcjob DEFAULT 'RFBILA00'. " Program for Fin. Statements
" ====================================================================
" MAIN LOGIC
" ====================================================================
START-OF-SELECTION.
" --- 1. Period Opened For Posting ---
" Note: This is complex. This example queries change documents for posting period config (T001B).
SELECT h~objectid, h~udate, h~utime, h~username
INTO TABLE @DATA(lt_period_open)
FROM cdhdr AS h
WHERE h~objectclas = 'V_T001B' AND h~change_ind = 'U'.
LOOP AT lt_period_open INTO DATA(ls_period_open).
" Further logic needed to parse OBJECTID and check CDPOS for opening a period.
" This is a simplified placeholder for a complex logic.
ls_log_entry-ActivityName = 'Period Opened For Posting'.
" Populate other fields... append to lt_final_log
ENDLOOP.
" --- 2. Accrual Or Provision Posted ---
SELECT h~bukrs, h~belnr, h~gjahr, h~monat, h~blart, h~usnam, h~cputm, h~cpudt, i~hkont, i~dmbtr
FROM bkpf AS h JOIN bseg AS i ON h~belnr = i~belnr AND h~bukrs = i~bukrs AND h~gjahr = i~gjahr
INTO CORRESPONDING FIELDS OF TABLE @DATA(lt_accrual)
WHERE h~bukrs IN @s_bukrs AND h~gjahr IN @s_gjahr AND h~monat IN @s_monat AND h~blart = @p_accrl.
LOOP AT lt_accrual INTO DATA(ls_accrual).
CLEAR ls_log_entry.
CONVERT DATE ls_accrual-cpudt TIME ls_accrual-cputm INTO TIME STAMP ls_log_entry-EventTime TIME ZONE sy-zonlo.
CONCATENATE ls_accrual-gjahr ls_accrual-monat INTO ls_log_entry-FinancialPeriod.
ls_log_entry-ActivityName = 'Accrual Or Provision Posted'.
ls_log_entry-BUKRS = ls_accrual-bukrs.
ls_log_entry-BELNR = ls_accrual-belnr.
ls_log_entry-USNAM = ls_accrual-usnam.
ls_log_entry-HKONT = ls_accrual-hkont.
ls_log_entry-BLART = ls_accrual-blart.
ls_log_entry-DMBTR = ls_accrual-dmbtr.
ls_log_entry-JournalEntryType = 'Accrual'.
GET TIME STAMP FIELD ls_log_entry-LastDataUpdate.
ls_log_entry-SourceSystem = lv_source_system.
APPEND ls_log_entry TO lt_final_log.
ENDLOOP.
" --- 3. Intercompany Document Cleared ---
SELECT h~bukrs, h~belnr, h~gjahr, h~monat, h~blart, h~usnam, h~cputm, h~cpudt, i~hkont, i~dmbtr
FROM bkpf AS h JOIN bseg AS i ON h~belnr = i~belnr AND h~bukrs = i~bukrs AND h~gjahr = i~gjahr
INTO CORRESPONDING FIELDS OF TABLE @DATA(lt_ic_clear)
WHERE h~bukrs IN @s_bukrs AND h~gjahr IN @s_gjahr AND h~monat IN @s_monat
AND h~blart = 'AB' AND i~vbund <> space.
LOOP AT lt_ic_clear INTO DATA(ls_ic_clear).
" Populate ls_log_entry and append to lt_final_log, setting ActivityName = 'Intercompany Document Cleared'
ENDLOOP.
" --- 4. Foreign Currency Valuation Run ---
SELECT j~jobname, j~sdlstrtda, j~sdlstrttm, j~sdluname
INTO TABLE @DATA(lt_fcv_jobs)
FROM tbtco AS j
WHERE j~jobname LIKE @p_fcv AND j~status = 'F'. " F = Finished
LOOP AT lt_fcv_jobs INTO DATA(ls_fcv_job).
" Populate ls_log_entry, deriving FinancialPeriod from date, setting ActivityName = 'Foreign Currency Valuation Run'
ENDLOOP.
" --- 5. GR/IR Clearing Run Executed ---
SELECT j~jobname, j~sdlstrtda, j~sdlstrttm, j~sdluname
INTO TABLE @DATA(lt_grir_jobs)
FROM tbtco AS j
WHERE j~jobname LIKE @p_grir AND j~status = 'F'.
LOOP AT lt_grir_jobs INTO DATA(ls_grir_job).
" Populate ls_log_entry, deriving FinancialPeriod from date, setting ActivityName = 'GR/IR Clearing Run Executed'
ENDLOOP.
" --- 6. Account Reconciliation Started (Inferred) ---
" Note: Inferring this by first run of a report, e.g., FAGLB03. Requires custom logging or complex logic.
" Placeholder: Query a custom log table if available.
" SELECT ... FROM zreco_log ...
" --- 7. Adjusting Journal Entry Posted ---
SELECT h~bukrs, h~belnr, h~gjahr, h~monat, h~blart, h~usnam, h~cputm, h~cpudt, i~hkont, i~dmbtr
FROM bkpf AS h JOIN bseg AS i ON h~belnr = i~belnr AND h~bukrs = i~bukrs AND h~gjahr = i~gjahr
INTO CORRESPONDING FIELDS OF TABLE @DATA(lt_adjust)
WHERE h~bukrs IN @s_bukrs AND h~gjahr IN @s_gjahr AND h~monat IN @s_monat AND h~blart = @p_adjst.
LOOP AT lt_adjust INTO DATA(ls_adjust).
" Populate ls_log_entry and append, setting ActivityName = 'Adjusting Journal Entry Posted', JournalEntryType = 'Adjusting'
ENDLOOP.
" --- 8. Reversal Entry Posted ---
SELECT h~bukrs, h~belnr, h~gjahr, h~monat, h~blart, h~usnam, h~cputm, h~cpudt, i~hkont, i~dmbtr
FROM bkpf AS h JOIN bseg AS i ON h~belnr = i~belnr AND h~bukrs = i~bukrs AND h~gjahr = i~gjahr
INTO CORRESPONDING FIELDS OF TABLE @DATA(lt_reversal)
WHERE h~bukrs IN @s_bukrs AND h~gjahr IN @s_gjahr AND h~monat IN @s_monat AND h~stblg <> space.
LOOP AT lt_reversal INTO DATA(ls_reversal).
" Populate ls_log_entry and append, setting ActivityName = 'Reversal Entry Posted', JournalEntryType = 'Reversal'
ENDLOOP.
" --- 9. Trial Balance Report Generated (Inferred from Job) ---
" Similar to other jobs, query TBTCO for Trial Balance report programs.
" SELECT ... FROM tbtco ... WHERE jobname LIKE '[Your Trial Balance Program]'.
" --- 10. Financial Statements Generated ---
SELECT j~jobname, j~sdlstrtda, j~sdlstrttm, j~sdluname
INTO TABLE @DATA(lt_fs_jobs)
FROM tbtco AS j
WHERE j~jobname LIKE @p_fs AND j~status = 'F'.
LOOP AT lt_fs_jobs INTO DATA(ls_fs_job).
" Populate ls_log_entry, deriving FinancialPeriod from date, setting ActivityName = 'Financial Statements Generated'
ENDLOOP.
" --- 11. Reconciliation Reviewed (Inferred) ---
" Note: This activity is almost always managed outside of SAP or in a custom solution.
" Placeholder: Query a custom approval/log table if available.
" SELECT ... FROM zreco_approval ...
" --- 12. Period Closed For Posting ---
" Note: Similar to 'Period Opened', this is very complex. Query change documents for T001B.
SELECT h~objectid, h~udate, h~utime, h~username
INTO TABLE @DATA(lt_period_close)
FROM cdhdr AS h
WHERE h~objectclas = 'V_T001B' AND h~change_ind = 'U'.
LOOP AT lt_period_close INTO DATA(ls_period_close).
" Further logic needed to parse OBJECTID and check CDPOS for closing a period.
ls_log_entry-ActivityName = 'Period Closed For Posting'.
" Populate other fields... append to lt_final_log
ENDLOOP.
" ... Code to display or download the lt_final_log internal table ...
ENDFORMS. 步骤
- 准备前提条件:获取底层 SAP ECC 数据库的只读访问凭据。确定正确的数据库模式(Schema),通常为
SAPSR3或数据库管理员提供的类似名称。 - 确定系统配置:咨询您的 SAP 财务团队,确定需要分析的特定“公司代码” (BUKRS) 和财务期间。关键在于识别系统中用于“应计或计提已过账”、“调整会计分录已过账”和“公司间”交易的特定“单据类型” (BLART)。
- 验证程序和作业名称:确认关键批处理作业的程序名称,如外币评估(如
FAGL_FCV)、GR/IR 清账(如SAPF124)、试算平衡报告(如RFBILA00)和财务报表生成(如RFBILA00)。这些可以在事务SM37的计划作业中找到。 - 自定义 SQL 查询:将提供的 SQL 查询复制到文本编辑器或 SQL 客户端中。将占位符变量
{{start_date}}、{{end_date}}和{{company_codes}}替换为分析所需的实际值。根据前几步收集的信息更新单据类型和程序名称列表。 - 连接数据库:使用标准的 SQL 客户端工具(如 DBeaver、SQL Server Management Studio 或 Oracle SQL Developer),利用获取的凭据连接到 SAP 数据库。
- 执行查询:针对数据库运行自定义 SQL 查询。根据日期范围和财务表的大小,此查询可能需要较长时间才能完成。
- 审核初步结果:查询完成后,对输出进行快速检查。核对行数是否合理,确保所有列都已存在,并验证结果中是否包含不同的
ActivityName值。 - 导出 data:将 SQL 客户端的完整结果集导出为 CSV 文件。确保文件以 UTF-8 编码保存,以防止字符乱码。
- 上传准备:在上传到流程挖掘工具之前,确认 CSV 文件中的列标题与所需的属性名称(
FinancialPeriod、ActivityName、EventTime等)完全匹配。同时,验证EventTime列是否采用一致的 timestamp 格式,例如YYYY-MM-DD HH:MI:SS。
配置
- 数据库凭据:需要一个具有核心 SAP 财务和系统表访问权限的只读数据库用户。这包括
BKPF、BSEG、TBTCO、CDHDR和CDPOS等表。 - 日期范围:我们建议提取至少 3 到 6 个完整财务期间的 data,以捕捉有意义的流程变异。请注意,较大的日期范围将显著增加查询执行时间。
- 公司代码 (
BUKRS):务必按特定的公司代码列表进行过滤。在大型系统上为所有公司代码运行查询是不可行的,且很可能导致性能问题。 - 单据类型 (
BLART):会计分录类型(如应计和调整)的识别完全取决于您组织的特定 SAP 配置。您必须在查询的WHERE子句中提供正确的单据类型代码,以进行准确的活动分类。 - 程序和作业名称:该查询使用通用程序名称来识别自动结账步骤。您的系统可能使用自定义包装程序或不同的作业名称。请在事务
SM37中验证这些名称并相应更新查询。 - 性能注意事项:此查询访问非常庞大的表,特别是
BSEG和CDPOS。强烈建议在非营业时间运行此提取,以避免影响系统性能。应用窄日期和公司代码过滤器是管理执行时间最有效的方法。
a 查询示例 sql
SELECT
CONCAT(CAST(b.GJAHR AS VARCHAR(4)), '-', RIGHT(CONCAT('00', b.MONAT), 2)) AS FinancialPeriod,
'Period Opened For Posting' AS ActivityName,
c.UDATE + c.UTIME AS EventTime,
'SAP_ECC' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
p.TABKEY AS CompanyCode,
NULL AS DocumentNumber,
c.USERNAME AS ResponsibleUser,
NULL AS GLAccount,
NULL AS DocumentType,
NULL AS AmountInLocalCurrency,
NULL AS JournalEntryType
FROM CDHDR c
JOIN CDPOS p ON c.OBJECTCLAS = p.OBJECTCLAS AND c.OBJECTID = p.OBJECTID AND c.CHANGENR = p.CHANGENR
WHERE c.OBJECTCLAS = 'V_T001B'
AND p.TABNAME = 'T001B'
AND p.FNAME = 'FRPE1'
AND c.UDATE BETWEEN '{{start_date}}' AND '{{end_date}}'
UNION ALL
SELECT
CONCAT(CAST(b.GJAHR AS VARCHAR(4)), '-', RIGHT(CONCAT('00', b.MONAT), 2)) AS FinancialPeriod,
'Period Closed For Posting' AS ActivityName,
c.UDATE + c.UTIME AS EventTime,
'SAP_ECC' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
p.TABKEY AS CompanyCode,
NULL AS DocumentNumber,
c.USERNAME AS ResponsibleUser,
NULL AS GLAccount,
NULL AS DocumentType,
NULL AS AmountInLocalCurrency,
NULL AS JournalEntryType
FROM CDHDR c
JOIN CDPOS p ON c.OBJECTCLAS = p.OBJECTCLAS AND c.OBJECTID = p.OBJECTID AND c.CHANGENR = p.CHANGENR
WHERE c.OBJECTCLAS = 'V_T001B'
AND p.TABNAME = 'T001B'
AND p.FNAME = 'TOPE1'
AND c.UDATE BETWEEN '{{start_date}}' AND '{{end_date}}'
UNION ALL
SELECT
CONCAT(CAST(h.GJAHR AS VARCHAR(4)), '-', RIGHT(CONCAT('00', h.MONAT), 2)) AS FinancialPeriod,
'Accrual Or Provision Posted' AS ActivityName,
h.CPUDT + h.CPUTM AS EventTime,
'SAP_ECC' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
h.BUKRS AS CompanyCode,
h.BELNR AS DocumentNumber,
h.USNAM AS ResponsibleUser,
d.HKONT AS GLAccount,
h.BLART AS DocumentType,
d.DMBTR AS AmountInLocalCurrency,
'Accrual' AS JournalEntryType
FROM BKPF h
JOIN BSEG d ON h.MANDT = d.MANDT AND h.BUKRS = d.BUKRS AND h.BELNR = d.BELNR AND h.GJAHR = d.GJAHR
WHERE h.BUDAT BETWEEN '{{start_date}}' AND '{{end_date}}'
AND h.BUKRS IN ({{company_codes}})
AND h.BLART IN ('SA', '[Your Accrual Doc Type]')
UNION ALL
SELECT
CONCAT(CAST(h.GJAHR AS VARCHAR(4)), '-', RIGHT(CONCAT('00', h.MONAT), 2)) AS FinancialPeriod,
'Intercompany Document Cleared' AS ActivityName,
h.AUGDT AS EventTime, -- Clearing Date
'SAP_ECC' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
h.BUKRS AS CompanyCode,
h.BELNR AS DocumentNumber,
h.USNAM AS ResponsibleUser,
d.HKONT AS GLAccount,
h.BLART AS DocumentType,
d.DMBTR AS AmountInLocalCurrency,
'Clearing' AS JournalEntryType
FROM BKPF h
JOIN BSEG d ON h.MANDT = d.MANDT AND h.BUKRS = d.BUKRS AND h.BELNR = d.BELNR AND h.GJAHR = d.GJAHR
WHERE h.AUGDT BETWEEN '{{start_date}}' AND '{{end_date}}'
AND h.BUKRS IN ({{company_codes}})
AND h.BLART IN ('[Your Intercompany Doc Type]')
AND h.AUGBL IS NOT NULL
UNION ALL
SELECT
CONCAT(CAST(YEAR(j.SDLSTRTDT) AS VARCHAR(4)), '-', RIGHT(CONCAT('00', MONTH(j.SDLSTRTDT)), 2)) AS FinancialPeriod,
'Foreign Currency Valuation Run' AS ActivityName,
j.SDLSTRTDT + j.SDLSTRTTM AS EventTime,
'SAP_ECC' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
NULL AS CompanyCode,
j.JOBNAME AS DocumentNumber,
j.SDLUNAME AS ResponsibleUser,
NULL AS GLAccount,
NULL AS DocumentType,
NULL AS AmountInLocalCurrency,
NULL AS JournalEntryType
FROM TBTCO j
JOIN TBTCP p ON j.JOBNAME = p.JOBNAME AND j.JOBCOUNT = p.JOBCOUNT
WHERE p.PROGNAME = 'FAGL_FCV' OR p.PROGNAME = 'SAPF100'
AND j.SDLSTRTDT BETWEEN '{{start_date}}' AND '{{end_date}}'
AND j.STATUS = 'F' -- Finished
UNION ALL
SELECT
CONCAT(CAST(YEAR(j.SDLSTRTDT) AS VARCHAR(4)), '-', RIGHT(CONCAT('00', MONTH(j.SDLSTRTDT)), 2)) AS FinancialPeriod,
'GR/IR Clearing Run Executed' AS ActivityName,
j.SDLSTRTDT + j.SDLSTRTTM AS EventTime,
'SAP_ECC' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
NULL AS CompanyCode,
j.JOBNAME AS DocumentNumber,
j.SDLUNAME AS ResponsibleUser,
NULL AS GLAccount,
NULL AS DocumentType,
NULL AS AmountInLocalCurrency,
NULL AS JournalEntryType
FROM TBTCO j
JOIN TBTCP p ON j.JOBNAME = p.JOBNAME AND j.JOBCOUNT = p.JOBCOUNT
WHERE p.PROGNAME = 'SAPF124' -- Program for F.13
AND j.SDLSTRTDT BETWEEN '{{start_date}}' AND '{{end_date}}'
AND j.STATUS = 'F'
UNION ALL
SELECT
CONCAT(CAST(YEAR(j.SDLSTRTDT) AS VARCHAR(4)), '-', RIGHT(CONCAT('00', MONTH(j.SDLSTRTDT)), 2)) AS FinancialPeriod,
'Account Reconciliation Started' AS ActivityName, -- Proxy event
j.SDLSTRTDT + j.SDLSTRTTM AS EventTime,
'SAP_ECC' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
NULL AS CompanyCode,
j.JOBNAME AS DocumentNumber,
j.SDLUNAME AS ResponsibleUser,
NULL AS GLAccount,
NULL AS DocumentType,
NULL AS AmountInLocalCurrency,
NULL AS JournalEntryType
FROM TBTCO j
JOIN TBTCP p ON j.JOBNAME = p.JOBNAME AND j.JOBCOUNT = p.JOBCOUNT
WHERE p.PROGNAME IN ('FAGLL03', 'FBL3N') -- Common reconciliation reports
AND j.SDLSTRTDT BETWEEN '{{start_date}}' AND '{{end_date}}'
AND j.STATUS = 'F'
UNION ALL
SELECT
CONCAT(CAST(h.GJAHR AS VARCHAR(4)), '-', RIGHT(CONCAT('00', h.MONAT), 2)) AS FinancialPeriod,
'Adjusting Journal Entry Posted' AS ActivityName,
h.CPUDT + h.CPUTM AS EventTime,
'SAP_ECC' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
h.BUKRS AS CompanyCode,
h.BELNR AS DocumentNumber,
h.USNAM AS ResponsibleUser,
d.HKONT AS GLAccount,
h.BLART AS DocumentType,
d.DMBTR AS AmountInLocalCurrency,
'Adjusting' AS JournalEntryType
FROM BKPF h
JOIN BSEG d ON h.MANDT = d.MANDT AND h.BUKRS = d.BUKRS AND h.BELNR = d.BELNR AND h.GJAHR = d.GJAHR
WHERE h.BUDAT BETWEEN '{{start_date}}' AND '{{end_date}}'
AND h.BUKRS IN ({{company_codes}})
AND h.BLART IN ('[Your Adjusting Doc Type]')
UNION ALL
SELECT
CONCAT(CAST(h.GJAHR AS VARCHAR(4)), '-', RIGHT(CONCAT('00', h.MONAT), 2)) AS FinancialPeriod,
'Reversal Entry Posted' AS ActivityName,
h.CPUDT + h.CPUTM AS EventTime,
'SAP_ECC' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
h.BUKRS AS CompanyCode,
h.BELNR AS DocumentNumber,
h.USNAM AS ResponsibleUser,
d.HKONT AS GLAccount,
h.BLART AS DocumentType,
d.DMBTR AS AmountInLocalCurrency,
'Reversal' AS JournalEntryType
FROM BKPF h
JOIN BSEG d ON h.MANDT = d.MANDT AND h.BUKRS = d.BUKRS AND h.BELNR = d.BELNR AND h.GJAHR = d.GJAHR
WHERE h.BUDAT BETWEEN '{{start_date}}' AND '{{end_date}}'
AND h.BUKRS IN ({{company_codes}})
AND h.STBLG IS NOT NULL -- STBLG links to the reversed document
UNION ALL
SELECT
CONCAT(CAST(YEAR(j.SDLSTRTDT) AS VARCHAR(4)), '-', RIGHT(CONCAT('00', MONTH(j.SDLSTRTDT)), 2)) AS FinancialPeriod,
'Trial Balance Report Generated' AS ActivityName,
j.SDLSTRTDT + j.SDLSTRTTM AS EventTime,
'SAP_ECC' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
NULL AS CompanyCode,
j.JOBNAME AS DocumentNumber,
j.SDLUNAME AS ResponsibleUser,
NULL AS GLAccount,
NULL AS DocumentType,
NULL AS AmountInLocalCurrency,
NULL AS JournalEntryType
FROM TBTCO j
JOIN TBTCP p ON j.JOBNAME = p.JOBNAME AND j.JOBCOUNT = p.JOBCOUNT
WHERE p.PROGNAME IN ('RFSSLD00', 'S_ALR_87012310')
AND j.SDLSTRTDT BETWEEN '{{start_date}}' AND '{{end_date}}'
AND j.STATUS = 'F'
UNION ALL
SELECT
CONCAT(CAST(YEAR(j.SDLSTRTDT) AS VARCHAR(4)), '-', RIGHT(CONCAT('00', MONTH(j.SDLSTRTDT)), 2)) AS FinancialPeriod,
'Financial Statements Generated' AS ActivityName,
j.SDLSTRTDT + j.SDLSTRTTM AS EventTime,
'SAP_ECC' AS SourceSystem,
CURRENT_TIMESTAMP AS LastDataUpdate,
NULL AS CompanyCode,
j.JOBNAME AS DocumentNumber,
j.SDLUNAME AS ResponsibleUser,
NULL AS GLAccount,
NULL AS DocumentType,
NULL AS AmountInLocalCurrency,
NULL AS JournalEntryType
FROM TBTCO j
JOIN TBTCP p ON j.JOBNAME = p.JOBNAME AND j.JOBCOUNT = p.JOBCOUNT
WHERE p.PROGNAME = 'RFBILA00' -- Program for F.01
AND j.SDLSTRTDT BETWEEN '{{start_date}}' AND '{{end_date}}'
AND j.STATUS = 'F'
-- UNION ALL
-- Note: 'Reconciliation Reviewed' is typically not a standard, logged event in SAP ECC.
-- This activity often happens offline or in a custom tool.
-- The following is a placeholder to be adapted if a custom (Z-table) log exists.
-- SELECT
-- CONCAT(CAST(YEAR(z.REVIEW_DATE) AS VARCHAR(4)), '-', RIGHT(CONCAT('00', MONTH(z.REVIEW_DATE)), 2)) AS FinancialPeriod,
-- 'Reconciliation Reviewed' AS ActivityName,
-- z.REVIEW_DATE AS EventTime,
-- 'SAP_ECC' AS SourceSystem,
-- CURRENT_TIMESTAMP AS LastDataUpdate,
-- z.BUKRS AS CompanyCode,
-- z.HKONT AS DocumentNumber, -- Using GL Account as a proxy identifier
-- z.REVIEWER_USER AS ResponsibleUser,
-- z.HKONT AS GLAccount,
-- NULL AS DocumentType,
-- NULL AS AmountInLocalCurrency,
-- NULL AS JournalEntryType
-- FROM ZRECON_LOG z -- Replace with your custom table for reconciliation status
-- WHERE z.REVIEW_DATE BETWEEN '{{start_date}}' AND '{{end_date}}'
-- AND z.STATUS = 'Reviewed'
;