记录到报告流程:期间结账与对账数据模板
记录到报告流程:期间结账与对账数据模板
- 建议收集的属性
- 建议跟踪的关键活动
- 数据提取指南
记录到报告流程:期间结账与对账属性
| 名称 | 说明 | ||
|---|---|---|---|
| 财务期间 FinancialPeriod | 财务报告周期的唯一标识符,通常由财年和过账期间组成。 | ||
| 说明 财务期间是主要案例标识符,用于汇总特定报告周期内与账户结账和对账相关的所有活动,例如表示2023年12月的“2023-12”。这样,您就可以从头到尾全面分析每个期间的结账流程。 在分析中,财务期间可用于跟踪每次结账的端到端周期时间、比较不同期间的表现,并发现趋势或异常。将每个财务期间定义为唯一案例后,您便可以直观呈现并衡量结账流程随时间变化的效率、瓶颈和差异。 重要性 这是分析所需的关键案例标识符,可用于比较不同期间的结账周期时间、工作量和流程合规情况。 获取途径 此属性通常由财务凭证抬头中的财年(GJAHR)和过账期间(MONAT)拼接而成,例如从BKPF表中获取。 示例 2023-122024-032023年第四季度 | |||
| 事件时间 EventTime | 表示活动或事件发生时间的时间戳。 | ||
| 说明 事件时间为流程中的每项活动提供准确的日期和时间,是分析的时间顺序基础。通常由凭证创建日期和时间组成。 此时间戳对于按正确顺序排列事件、还原流程至关重要。它用于计算所有基于时长的指标,包括活动间周期时间、等待时间和期间结账总时长。分析时间戳有助于发现延迟并了解工作的时间分布。 重要性 此必备属性提供事件的时间顺序,是计算周期时间和发现流程瓶颈的基础。 获取途径 通常取自BKPF表中财务凭证的录入日期(CPUDT)和录入时间(CPUTM)。 示例 2023-12-28T14:30:15Z2024-01-02T09:05:00Z2024-01-05T17:21:45Z | |||
| 数据上次更新时间 LastDataUpdate | 数据上次从源系统刷新或提取的时间戳。 | ||
| 说明 此属性用于说明所分析数据的新鲜度,显示数据管道上次运行的日期和时间,帮助您了解流程分析结果的时效性。 对于仪表板,尤其是跟踪实时进度的仪表板,此时间戳能帮助您判断当前查看的是最新信息,还是前一天的数据。它有助于管理预期,并确保正确解读分析结果。 重要性 此属性可说明数据的新鲜度,确保分析结果和仪表板内容及时且相关。 获取途径 每次数据加载完成后,数据提取工具或ETL工具都会生成并添加此时间戳。 示例 2024-05-21T04:00:00Z2024-05-20T04:00:00Z2024-05-19T04:00:00Z | |||
| 活动 ActivityName | 期间结账流程中执行的具体业务事件或任务名称。 | ||
| 说明 此属性记录记录到报告周期中执行的各个步骤,例如“调整分录已过账”或“财务报表已生成”。它构成流程图的基础,展示期间结账所包含事件的先后顺序。 分析活动是流程挖掘的基础,有助于直观呈现流程顺序、发现流程差异,并衡量各步骤的频率和持续时间。这对于定位瓶颈、非标准流程路径以及标准化或自动化机会至关重要。 重要性 此属性是构建流程图的必备项,可用于直观呈现和分析期间结账中各任务的先后顺序。 获取途径 此属性由SAP事务代码(TCODE)、凭证类型(BLART)或特定程序的执行记录(如用于外币评估的FAGL_FCV)组合推导得出。 示例 调整分录已过账账户对账已开始过账期间已关闭 | |||
| 源系统 SourceSystem | 提取数据的源系统标识符。 | ||
| 说明 此属性用于标明事件数据的来源,例如特定SAP ECC实例的名称或ID。对于使用多个ERP或财务系统的组织,此字段对于区分不同来源的数据至关重要。 即使只有一个系统,它也是数据治理、审计和故障排查所需的重要元数据。它可以确认数据来源,帮助建立对分析结果的信任,并确保数据沿袭清晰可查。 重要性 此属性可追溯数据来源,为数据治理提供依据;在多系统环境中,它对于区分不同流程至关重要。 获取途径 通常在数据提取过程中添加固定值,用于标识特定SAP客户端和系统ID(例如取自T000表)。 示例 ECC_PROD_100SAP_E74_200ECC_FINANCE | |||
| 公司代码 BUKRS | 代表一个法律实体、用于生成财务报表的组织单位。 | ||
| 说明 公司代码是SAP财务管理中的基本组织单位,代表拥有独立平衡账簿的公司。所有财务交易都按公司代码过账。 在流程挖掘中,按公司代码筛选对于比较集团内不同法律实体的期间结账流程至关重要。这样可以发现表现较好的实体所采用的最佳实践,并找出在延迟、调整分录数量或流程偏差方面存在问题的实体。公司代码是细分分析的重要维度。 重要性 可比较不同法律实体的期间结账表现和合规情况,为集团层面的财务分析提供重要依据。 获取途径 SAP几乎所有财务凭证表中都有此字段,主要包括BKPF(抬头)和BSEG(行项目)。 示例 10002000US01DE01 | |||
| 凭证类型 BLART | 用于区分不同会计凭证类型的代码。 | ||
| 说明 SAP使用凭证类型区分不同业务交易,例如供应商发票(KR)、客户付款(DZ)和总账过账(SA)。凭证类型还控制凭证编号范围等属性。 在期末结账分析中,凭证类型是重要的筛选条件,可用于单独查看应计、准备金或冲销分录等活动。这样有助于分析不同结账相关交易的数量和财务影响,也可用于在流程模型中定义特定活动。 重要性 有助于对交易进行分类和筛选,从而单独查看并分析应计、冲销或公司间过账等特定活动。 获取途径 位于凭证抬头表BKPF(BLART)中。 示例 SAABKR | |||
| 凭证编号 BELNR | 财年和公司代码范围内会计凭证的唯一标识符。 | ||
| 说明 会计凭证编号是SAP财务过账的主要键。每笔日记账分录、发票或付款凭证都有唯一编号。 凭证编号通常不用于高层流程分析,但对于下钻分析非常有用。分析人员可以从流程挖掘仪表板直接跳转到SAP中的具体交易,详细调查异常情况,例如金额较大的调整分录或延迟处理的对账项目。它将分析发现与源交易直接关联起来。 重要性 可直接关联到SAP中的源交易,支持从流程视图下钻到具体会计分录进行详细分析。 获取途径 位于BKPF表(BELNR),是主键。 示例 100000456719000001233000008901 | |||
| 总账科目 HKONT | 行项目过账到的总账科目编号。 | ||
| 说明 总账科目是财务核心主数据,用于对交易进行分类。每笔财务过账都会分配到一个或多个总账科目。 在期间结账分析中,按总账科目分析活动对于“账户对账瓶颈”和“调整分录数量分析”仪表板至关重要。它有助于发现哪些科目最难对账、哪些科目需要最多调整,以及哪些科目的重大错报风险可能最高。团队可以据此优先处理问题科目。 重要性 可针对对账和调整分录开展分析,帮助发现造成延迟或需要频繁更正的问题科目。 获取途径 位于财务凭证行项目表BSEG(HKONT)中。 示例 113100400500750000 | |||
| 日记账分录类型 JournalEntryType | 日记账分录的分类,例如“标准”“调整”“应计”或“冲销”。 | ||
| 说明 此属性根据财务凭证在结账流程中的业务用途进行分类,属于推导属性。通常结合凭证类型(BLART)、冲销原因(STGRD)或所用特定总账科目来确定。 此分类是“调整分录数量分析”仪表板及相关KPI的基础。明确识别调整或应计分录后,分析人员即可衡量其数量和金额、跟踪变化趋势,并调查产生这些分录的根本原因。这有助于区分日常运营过账和期末调整。 重要性 对过账进行分类,支持有针对性的分析,并跟踪和衡量调整、应计等关键分录类型,这些类型可反映流程健康度。 获取途径 此字段为推导字段。需要根据业务规则定义逻辑,通常使用BKPF中的凭证类型(BLART)等字段。 示例 调整应计冲销标准 | |||
| 本币金额 DMBTR | 以公司代码本币表示的交易行项目金额。 | ||
| 说明 此属性表示财务过账涉及的金额,是衡量交易对总账影响的核心定量指标。 分析金额对于确定问题处理优先级和了解财务风险至关重要。例如,“调整分录数量分析”仪表板可以区分大量小额调整和少量大额调整,从而提供更有价值的信息,帮助您重点关注对财务有重大影响的交易。 重要性 量化交易的财务影响,支持按重要性开展分析,例如识别金额较大的调整分录。 获取途径 位于凭证行项目表BSEG(DMBTR)中。 示例 1500.75-25000.00123456.00 | |||
| 负责人用户 USNAM | 创建或执行交易的人员所使用的SAP用户ID。 | ||
| 说明 此字段记录过账凭证、运行报表或执行结账相关程序的用户,用于识别负责相应活动的人员。 按用户分析对于了解工作量分配、发现培训需求和调查流程偏差至关重要。按用户展示活动的仪表板可以帮助发现工作负荷过重的团队成员,或未遵循标准流程的人员。它也有助于财务团队进行绩效管理和资源分配。 重要性 可用于分析工作量分配和团队表现,并发现与特定人员相关的流程偏差。 获取途径 凭证创建用户可在BKPF表(USNAM)中查找。批处理作业用户可在TBTCO表(SDLUNAME)中查找。 示例 JSMITHRDOEFIN_ADMIN | |||
| 冲销原因 ReversalReason | 用于说明财务凭证冲销原因的代码。 | ||
| 说明 在SAP中冲销凭证时,可以分配原因代码说明冲销目的,例如“在当前期间冲销”或“录入错误”。 此属性有助于了解返工的原因。分析冲销原因可以发现错误模式,例如数据录入错误或日期错误。根据这些发现,您可以采取预防措施、改进培训或加强系统控制,减少错误和后续冲销,让结账流程更加高效。 重要性 直接揭示错误和返工的根本原因,帮助发现流程改进和预防错误的机会。 获取途径 位于凭证抬头表BKPF(STGRD)中。 示例 010205 | |||
| 对账状态 ReconciliationStatus | 账户对账的当前状态,例如“未开始”“审核中”或“已批准”。 | ||
| 说明 此属性跟踪账户对账在工作流中的状态,包括是否已启动、已提交审核、已批准或已拒绝。 此属性是实时监控对账进度的关键依据。它有助于发现哪些对账停滞以及停滞时长,并支持“账户对账周期时间”等KPI。它还能展示审批流程进度,是跟踪对账瓶颈和团队工作量的仪表板的重要数据。 重要性 展示对账工作流的进度,支持跟踪进展、发现瓶颈并衡量审核和批准所需时间。 获取途径 此信息通常记录在单独的对账工具(如BlackLine的SAP Account Substantiation and Automation)或自定义状态字段中,通常不是BKPF/BSEG中的标准字段。 示例 未开始进行中已批准已拒绝 | |||
| 是否自动执行 IsAutomated | 用于标记活动由人工用户还是自动化系统执行。 | ||
| 说明 此布尔属性用于区分人工任务与系统自动执行的任务,例如外币估值的计划批处理作业,或机器人过账经常性分录。通常可通过分析交易关联的用户名来判断(如“BATCHUSER”)。 了解自动化程度有助于发现提升效率的机会。分析此属性可以直观呈现流程中哪些环节由人工处理,以及哪些环节适合自动化。它还有助于准确评估人工工作量,排除系统生成的活动。 重要性 区分人工活动与系统驱动的活动,这对于发现自动化机会和准确衡量人工工作量至关重要。 获取途径 这是一个派生属性,通常根据用户名(USNAM)确定:已知的系统用户或批处理用户ID列表可用于识别自动化任务。 示例 truefalse | |||
| 是否返工 IsRework | 用于标记代表返工的活动,例如冲销或被拒绝的对账。 | ||
| 说明 此布尔属性用于标记表明流程存在低效循环或更正的事件或事件序列。例如,同一账户先发生“对账已审核”,随后又发生“调整分录已过账”,即可标记为返工。 此属性对于量化流程浪费至关重要,可支持“对账返工次数”仪表板和“对账返工率”KPI。通过单独识别返工,团队可以调查根本原因、衡量其对周期时间的影响,并跟踪旨在一次做对的流程改进措施是否有效。 重要性 通过标记更正或重复活动来量化流程低效,帮助衡量并减少无效工作。 获取途径 这是一个计算属性,由流程挖掘工具根据特定活动序列(如循环)或属性(如ReversalReason不为空)定义计算逻辑。 示例 truefalse | |||
| 是否逾期 IsOverdue | 用于标记活动是否在计划目标日期之后完成。 | ||
| 说明 此布尔属性会比较活动的实际完成时间(EventTime)与计划截止日期(TargetCompletionDate)。如果事件时间晚于目标日期,该标记将设为true。 此属性直接支持“结账合规与逾期任务”仪表板和“按时完成期间结账率”KPI。它能清晰、及时地提示进度偏差,帮助管理者快速识别逾期任务、了解其对整体时间安排的影响,并督促团队按时完成任务。 重要性 清晰标示未按计划完成的情况,便于快速识别逾期任务并衡量按时完成情况。 获取途径 这是一个计算属性,由流程挖掘工具比较EventTime与TargetCompletionDate得出。 示例 truefalse | |||
| 目标完成日期 TargetCompletionDate | 活动或整个期间结账计划完成的截止日期。 | ||
| 说明 目标完成日期是衡量期间结账进度的计划依据,也是各项里程碑或最终结账应完成的期限。 这一属性对于绩效或合规分析至关重要,可用于计算“按时完成期间结账率”KPI,并支持“结账合规与逾期任务”仪表板。系统会将实际事件时间与目标日期进行比较,判断任务是否按计划进行、是否已逾期,或是否可能逾期,从而帮助您主动管理结账流程。 重要性 为衡量结账活动是否按时完成提供基准,支持合规与绩效监控及按时交付KPI。 获取途径 这通常是保存在单独日历、结账驾驶舱工具(如SAP Financial Closing cockpit)或电子表格中的主数据,不属于交易数据。 示例 2023-12-29T23:59:59Z2024-01-03T17:00:00Z2024-01-02T12:00:00Z | |||
| 财年 GJAHR | 交易过账所在的财年。 | ||
| 说明 财年是整理财务数据的基本要素,也是财务期间案例ID的重要组成部分,为所有交易提供必要背景。 财年通常包含在案例ID中,但将其作为单独属性也有助于长期趋势分析。您可以按年比较结账周期时间、调整量及其他KPI,从而识别多年间绩效的改善或下降。 重要性 提供必要的时间背景,便于逐年比较结账流程的绩效。 获取途径 可在凭证抬头表BKPF(GJAHR)中获取。 示例 202320242022 | |||
| 贸易伙伴 VBUND | 参与公司间交易的关联集团公司的标识符。 | ||
| 说明 贸易伙伴ID用于识别参与公司间交易的另一公司代码,是关联法律实体之间账户对账的重要依据。 此属性直接支持“公司间对账流程”仪表板和“公司间对账周期时间”KPI。筛选存在贸易伙伴的交易后,分析即可聚焦于公司间对账流程的效率和及时性。该流程往往是期间结账中的主要难点。 重要性 用于明确识别公司间交易,支持针对通常复杂且耗时的公司间对账流程开展分析。 获取途径 位于凭证行项目表BSEG(VBUND)中。 示例 1000US013000 | |||
| 部门 Department | 负责相关活动或交易的职能部门或成本中心。 | ||
| 说明 此属性用于标识与交易相关的业务部门,例如“财务”“销售”或“物流”。通常根据过账关联的成本中心主数据或用户主数据推导得出。 按部门分析有助于支持“结账团队工作量分布”仪表板,了解不同业务职能如何影响期末工作量,尤其是哪些部门发起的交易可能需要后续调整或对账。此分析还能发现核心财务团队以外影响结账流程的环节。 重要性 有助于分析不同业务职能的工作量和流程执行情况,了解各部门如何影响财务结账效率。 获取途径 通常根据BSEG中的成本中心(KOSTL)或负责用户的人力资源主数据推导得出,可能需要联接多个表。 示例 企业财务应付账款财务规划与分析 | |||
记录到报告流程:期间结账与对账活动
| 活动 | 说明 | ||
|---|---|---|---|
| 外币评估程序已运行 | 此事件表示运行程序,按期末汇率重新评估以外币记录的未清项和余额。通常会在期末结账步骤中以批处理作业的形式运行。 | ||
| 重要性 这是确保跨国组织财务报告准确的重要步骤。分析运行时间和持续时长,有助于发现自动化和性能优化机会。 获取途径 从外币评估程序(如FAGL_FCV或F.05)的执行日志中获取。TBTCO和TBTCP等表中的批处理作业详情可提供执行时间戳。 采集 从程序FAGL_FC_VALUATION或SAPF100的批处理作业日志(表TBTCO)中获取。 事件类型 explicit | |||
| 期间已开放过账 | 这标志着财务期间正式开始,允许将交易过账到总账。这是授权用户执行的明确配置变更,用于开放一个或多个公司代码的特定期间以供过账。 | ||
| 重要性 此活动是期间结账流程案例的明确开始事件。分析从此时起的时间,有助于了解整个财务期间的生命周期。 获取途径 通过事务代码OB52更改过账期间时,系统会记录相关变更。分析底层配置表T001B的变更凭证即可提取这些记录,通常会用到CDHDR和CDPOS表。 采集 从表T001B的变更凭证(CDHDR/CDPOS)中提取。 事件类型 explicit | |||
| 调整分录已过账 | 期间的初始交易处理完成后,会过账调整分录以更正账户余额。SAP会将此事件记录为标准财务凭证过账。 | ||
| 重要性 此事件是调整分录数量分析的关键依据。调整分录数量较多,可能说明上游流程的准确性存在问题,也是流程改进的重点。 获取途径 可在BKPF和BSEG表中查找。通常通过专用于调整的特定凭证类型(BKPF-BLART)识别,也可根据是否在第13至16等特殊结账期间过账来识别。 采集 筛选BKPF中在特殊期间过账或使用调整类凭证类型的凭证。 事件类型 explicit | |||
| 财务报表已生成 | 表示生成正式财务报表(如损益表和资产负债表)的时间点。通常通过跟踪特定报表程序的执行情况来记录此活动。 | ||
| 重要性 这是一个重要里程碑,标志着数据处理结束,最终审核和批准阶段开始。从此事件到批准所需的时间是一项关键KPI。 获取途径 根据系统审计日志(如STAD)推断。此类日志会记录财务报表生成程序的执行情况,最常见的是事务代码F.01。 采集 根据系统日志(STAD)中财务报表事务F.01的执行记录获取。 事件类型 inferred | |||
| 账户对账已开始 | 表示某一期间一组总账科目对账流程的开始。在标准SAP ECC中,这不是一个独立事件,通常需要根据相关活动推断,例如首次运行关键报表。 | ||
| 重要性 此活动提供了衡量整个对账阶段时长的重要里程碑。了解对账何时开始,是计算账户对账周期时间KPI的关键。 获取途径 系统不会明确记录此事件。必须从其他数据源推断,例如通过系统审计日志(事务代码STAD)查找首次运行余额显示报表(如FAGLB03或FS10N)的记录。 采集 根据系统日志中首次运行相关报表事务(如FAGLB03)的记录推断。 事件类型 inferred | |||
| 过账期间已关闭 | 表示正式关闭过账期间,阻止后续运营日记账分录过账。这有助于确保已关闭期间的财务数据完整性,并通过明确的配置变更实现。 | ||
| 重要性 这是期间结账流程的明确结束事件,对于准确计算期间结账周期时间总值和衡量是否按时完成至关重要。 获取途径 通过事务代码OB52关闭期间时,系统会记录相关操作。分析配置表T001B的变更凭证(CDHDR和CDPOS表)即可查找这些记录。 采集 从表T001B的变更凭证(CDHDR/CDPOS)中提取。 事件类型 explicit | |||
| GR/IR清账程序已运行 | 运行货物收货/发票收货(GR/IR)科目的自动清账程序。该程序会匹配相应的货物收货和发票收货记录,并相互清账。 | ||
| 重要性 GR/IR科目经常引发对账问题。监控此活动可确认自动步骤是否正常运行,并统计需要人工跟进的异常数量。 获取途径 执行记录保存在批处理作业日志中(事务代码SM37)。通常通过事务代码F.13运行程序SAPF124。TBTCO等作业日志表可提供所需的时间戳。 采集 从清账程序SAPF124的批处理作业日志(表TBTCO)中获取。 事件类型 explicit | |||
| 公司间凭证已清账 | 此活动表示两个不同公司代码之间的未清项已清账,说明公司间交易已结算或对账。在SAP中,这会作为明确的财务过账记录,通常对应一张清账凭证。 | ||
| 重要性 公司间未清项清账延迟是结账流程中的常见瓶颈。跟踪此活动对于衡量和改善公司间对账周期时间至关重要。 获取途径 根据BKPF和BSEG中的财务凭证识别。清账凭证会关联并结清未清项,其清账日期(BSEG-AUGDT)用作事件时间戳。可通过贸易伙伴字段识别公司间交易。 采集 在BKPF/BSEG中识别涉及贸易伙伴项目的清账凭证。 事件类型 explicit | |||
| 冲销分录已过账 | 此活动记录冲销先前已过账日记账分录的凭证,通常用于更正错误。SAP会在冲销凭证与原始凭证之间建立明确关联。 | ||
| 重要性 冲销数量较多,可能说明数据录入准确性或流程控制存在问题。跟踪这些事件有助于衡量一次做对率,并发现需要改进的环节。 获取途径 冲销凭证可在BKPF表中查找,通常通过事务代码FB08创建,并在BKPF-STBLG字段中引用被冲销的凭证编号。 采集 识别BKPF-STBLG字段有值或通过冲销事务代码创建的凭证。 事件类型 explicit | |||
| 对账已审核 | 表示某个账户或一组账户的对账已审核并确认。在标准SAP ECC中,系统不会明确记录此事件,通常通过线下控制或定制方案管理。 | ||
| 重要性 跟踪审核时间有助于了解结账流程控制和监督阶段的瓶颈,也能发现因管理人员无法及时参与或返工造成的延迟。 获取途径 标准ECC表中没有此信息。需要通过定制方案获取,例如在自定义Z表中添加状态字段、使用简单工作流,或集成专用的第三方对账工具。 采集 如已实施,可从自定义工作流或Z表中获取状态变更记录。 事件类型 inferred | |||
| 应计或准备金已过账 | 此事件表示已记录应计、递延或准备金的日记账分录,这类分录通常在期间末过账。SAP中没有专门的事件类型表示此操作,通常需要根据日记账分录的特征进行识别。 | ||
| 重要性 单独识别这些分录,有助于分析估算管理子流程。应计项目数量较多或频繁调整,可能表明流程仍有改进空间。 获取途径 根据财务凭证表BKPF和BSEG推断。可通过特定凭证类型(BKPF-BLART)、特定总账科目(BSEG-HKONT)或抬头文本中的关键词(BKPF-BKTXT)识别相关分录。 采集 按凭证类型、特定总账科目或文本字段筛选BKPF/BSEG表。 事件类型 inferred | |||
| 试算平衡表报表已生成 | 表示已运行报表以生成试算平衡表。这是创建正式财务报表前的重要步骤,用于确认借方总额等于贷方总额。 | ||
| 重要性 这是最终报告前的重要质量关口。反复运行此报表,可能说明发现并更正了底层数据问题,从而导致延迟。 获取途径 根据系统审计日志推断,例如事务代码STAD记录的试算平衡表报表事务执行情况,包括S_ALR_87012277或F.01。 采集 根据系统日志(STAD)中报表事务代码的执行记录获取。 事件类型 inferred | |||
数据提取指南
步骤
- 访问SAP Query工具:登录SAP ECC系统,运行事务代码
SQVI(QuickViewer)。2. 创建新查询:输入查询名称,例如Z_R2R_PERIOD_CLOSE,然后点击“创建”。在弹出窗口中填写描述性标题,例如“记录到报告期间结账数据提取”。在“数据源”中选择“表连接”。3. 定义表连接:添加主表BKPF(会计凭证抬头),再添加表BSEG(会计凭证分录)。SAP会自动建议连接条件(MANDT、BUKRS、BELNR、GJAHR),请核对并确认。期间开始和结账活动需要另建一个连接CDHDR与CDPOS的查询。4. 选择输出字段(列表字段):打开“列表字段选择”选项卡,从可用表中选择事件日志所需字段,包括BKPF-BUKRS、BKPF-BELNR、BKPF-GJAHR、BKPF-MONAT、BKPF-CPUDT、BKPF-CPUTM、BKPF-USNAM、BKPF-BLART、BSEG-HKONT、BSEG-DMBTR等。5. 定义输入参数(选择字段):打开“选择字段”选项卡,选择运行时用于筛选数据的字段。最重要的字段是BKPF-BUKRS(公司代码)和BKPF-GJAHR(财年)。您也可以添加BKPF-MONAT(过账期间)和BKPF-BLART(凭证类型)。6. 为各项活动创建变式:由于SQVI无法合并不同的数据选择(例如SQL UNION),您必须多次运行查询。针对每项活动(如“应计或准备金已过账”)运行查询,并在选择屏幕中输入特定筛选值,例如与应计项目相关的凭证类型列表。将这组选择条件保存为变式。对每项可提取的活动重复此操作。7. 运行查询并提取数据:针对创建的每个变式运行查询,系统将按该活动对应的筛选条件执行查询。8. 导出结果:在结果屏幕中将数据导出到本地文件。最常用的格式是“电子表格”。针对每个变式重复导出。9. 合并和转换数据:在电子表格程序中打开导出文件,或使用脚本工具处理。将所有文件中的数据手动合并到一个主文件中。10. 添加常量列和计算列:在合并后的文件中添加无法直接从SAP表中提取的列,包括ActivityName(根据数据所属变式手动填写)、FinancialPeriod(拼接财年和期间)、EventTime(组合日期和时间字段)、SourceSystem和LastDataUpdate。11. 设置上传格式:确保最终文件以CSV或Excel格式保存,并使用流程挖掘工具要求的列标题。上传前请核对数据类型和格式。
配置
- 数据源:SAP Query(SQVI)中的表连接。主要数据表包括BKPF、BSEG、CDHDR和CDPOS。* 日期范围:建议提取至少3至6个完整财务期间的数据,以便识别规律。按
BKPF-GJAHR(财年)和BKPF-MONAT(期间)设置筛选条件。* 公司代码筛选:始终按BKPF-BUKRS(公司代码)筛选数据,以控制数据量并聚焦特定法人实体。不建议一次提取所有公司代码的数据。* 凭证类型筛选:使用BKPF-BLART(凭证类型)筛选应计、调整或冲销等特定活动。您需要确认组织使用的相关凭证类型。* 前提条件:执行提取的用户需要有权使用SQVI事务,并具有相关财务表的显示权限(例如授权对象S_TABU_DIS)。* 性能注意事项:连接BKPF和BSEG可能占用大量资源。请在业务低峰时段运行提取。避免设置过宽的日期范围或不限制公司代码,否则可能导致内存问题或超时。
查询示例 sql
/*
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)。这对于控制数据量至关重要。 - 声明数据结构:定义用于存放最终事件日志数据的内表结构。该结构必须包含所有必需和建议的属性:
FinancialPeriod、ActivityName、EventTime、SourceSystem、LastDataUpdate、BUKRS、BELNR、USNAM、HKONT、BLART、DMBTR和JournalEntryType。 - 实现数据提取逻辑:编写核心ABAP逻辑,提取12项活动的数据。针对每项活动查询相关SAP表(如BKPF、BSEG、TBTCO、CDHDR),并填充中间内表。可参考随附ABAP查询部分提供的逻辑。
- 识别推断活动:对于SAP标准日志中没有明确记录的活动,例如“账户对账已开始”或“对账已审核”,实现商定的推断逻辑。可检查特定报表是否首次运行,或查询现有的自定义“Z表”。
- 汇总事件数据:提取所有单项活动的数据后,将各中间表中的记录追加到最终汇总内表。确保根据相关源字段(如凭证过账日期和时间,或作业开始日期和时间)正确填充
EventTime字段。 - 统一数据格式:输出前统一关键字段格式。将财年和期间合并为
FinancialPeriod标识符。为SourceSystem和LastDataUpdate设置固定值,并确保时间戳格式一致。 - 开发输出功能:为程序添加导出最终内表的功能。常见做法是使用
OPEN DATASET将数据写入SAP应用服务器上的CSV或制表符分隔文件,或使用函数模块GUI_DOWNLOAD供用户直接下载到本地计算机。 - 测试和验证:使用涵盖多个公司代码和期间的代表性数据集,全面测试程序。按照验证步骤检查数据的准确性和完整性,并根据功能专家的反馈完善选择逻辑。
- 安排执行(可选):验证通过后,可通过事务
SM36将程序设为后台作业。这样无需人工干预,即可定期自动提取事件日志。
配置
- 选择条件:程序应提供用于筛选数据的选择屏幕,主要筛选项包括:
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)的程序技术名称。
- 日期范围:主要按财年和期间筛选,但底层逻辑应考虑事件的完整日期和时间。首次分析建议提取最近3至6个已完成财务期间的数据。
- 性能:对于大型SAP环境,程序性能至关重要。确保数据库查询使用索引字段,尤其是BKPF和BSEG等表。避免选择所有字段(
SELECT *),必要时分批处理数据。 - 授权:运行程序的用户或服务账户必须有权访问所有查询表(
BKPF、BSEG、TBTCO、TBTCP、CDHDR、CDPOS),并有权执行SE38(开发)和SM37/SM36(计划与监控)等事务。
查询示例 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数据库的只读访问凭据,并确认正确的数据库架构。架构通常为
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值。 - 导出数据:从SQL客户端将完整结果集导出为CSV文件。请使用UTF-8编码保存,以避免字符显示问题。
- 准备上传:上传到流程挖掘工具前,请确认CSV文件的列标题与所需属性名称完全一致(如
FinancialPeriod、ActivityName、EventTime等)。同时检查EventTime列的时间戳格式是否统一,例如YYYY-MM-DD HH:MI:SS。
配置
- 数据库凭据:需要具有核心SAP财务表和系统表访问权限的只读数据库用户,包括
BKPF、BSEG、TBTCO、CDHDR和CDPOS等表。 - 日期范围:建议至少提取3至6个完整财务期间的数据,以捕捉有意义的流程差异。请注意,日期范围越大,查询执行时间也会显著增加。
- 公司代码(
BUKRS):始终按指定的公司代码列表筛选。在大型系统中对所有公司代码运行查询并不可行,还可能导致性能问题。 - 凭证类型(
BLART):应计和调整等会计分录类型完全取决于组织的SAP配置。为准确分类活动,必须在查询的WHERE子句中提供正确的凭证类型代码。 - 程序和作业名称:查询使用了自动结账步骤常见的程序名称。您的系统可能使用自定义封装程序或不同的作业名称。请在事务
SM37中核实,并相应更新查询。 - 性能注意事项:此查询会访问非常大的表,尤其是
BSEG和CDPOS。强烈建议在非工作时间运行提取,以免影响系统性能。缩小日期范围并限定公司代码,是控制执行时间最有效的方法。
查询示例 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'
; 优化记录到报告结账流程,立即缩短周期时间
消除瓶颈,将记录到报告结账周期缩短30%。
无需信用卡。立即开始14天免费试用。