您的记录到报告:期末结账与对账数据模板
您的记录到报告:期末结账与对账数据模板
- 建议收集的属性
- 需要跟踪的关键活动
- 提取指南
记录到报告-期间结账与对账属性
| 名称 | 说明 | ||
|---|---|---|---|
| 财务期间 FinancialPeriod | 财务报告周期的唯一标识符,通常由会计年度和过账期间组合而成。 | ||
| 说明 财务期间是主要案例标识符,用于汇总特定报告周期内与结账和科目对账相关的所有活动,例如“2023-12”表示2023年12月。这样可以针对每个独立期间,从开始到结束全面分析整个期间结账流程。 在分析中,它支持跟踪每次结账的端到端周期时间、比较不同期间的绩效,以及识别趋势或异常。将每个财务期间定义为唯一案例后,便可直观呈现并衡量结账流程随时间变化的效率、瓶颈和差异。 为什么重要 这是界定分析范围的核心案例标识符,可用于比较不同期间的结账周期时间、工作量和流程合规情况。 获取位置 通常通过拼接财务凭证抬头中的会计年度(GJAHR)和过账期间(MONAT)生成,例如来自BKPF表。 示例 2023-122024-032023-Q4 | |||
| 事件时间 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 | |||
| 交易伙伴 VBUND | 参与公司间交易的关联集团公司的标识符。 | ||
| 说明 交易伙伴ID用于识别参与公司间交易的另一公司代码,是关联法律实体之间进行科目对账的基础。 此属性直接支持“公司间对账流程”仪表板和“公司间对账周期时间”KPI。筛选存在交易伙伴的交易后,分析可以专注于公司间对账流程的效率和及时性,而这通常是期间结账中的主要难点。 为什么重要 专门识别公司间交易,支持聚焦分析通常复杂且耗时的公司间对账流程。 获取位置 位于凭证行项目表BSEG(VBUND)中。 示例 1000US013000 | |||
| 冲销原因 ReversalReason | 说明财务凭证被冲销原因的代码。 | ||
| 说明 在SAP中冲销凭证时,可以分配原因代码说明冲销目的,例如“当期冲销”或“错误录入”。 此属性为返工原因提供关键背景。分析冲销原因有助于识别错误模式,例如数据录入错误或日期错误。利用这些洞察可以采取预防措施、改进培训或加强系统控制,减少错误及后续冲销,提高结账效率。 为什么重要 直接揭示错误和返工的根本原因,帮助识别流程改进和错误预防机会。 获取位置 位于凭证抬头表BKPF(STGRD)中。 示例 010205 | |||
| 对账状态 ReconciliationStatus | 账户对账当前所处的状态,例如“未开始”“审核中”或“已批准”。 | ||
| 说明 此属性跟踪账户对账在工作流中的状态变化,表示对账是否已开始、已提交审核、已批准或已拒绝。 这是实时监控对账进展的关键属性。它有助于识别哪些对账停滞以及停滞时长,并支持“账户对账周期时间”等KPI。它让审批流程更加透明,对于跟踪对账瓶颈和团队工作量的仪表板至关重要。 为什么重要 提升对账工作流的可见性,支持跟踪进展、识别瓶颈,以及衡量审核和审批时间。 获取位置 此信息通常位于独立的对账工具中,例如BlackLine提供的SAP Account Substantiation and Automation,或位于自定义状态字段中。BKPF/BSEG中通常没有标准字段。 示例 未开始进行中已批准已拒绝 | |||
| 是否自动执行 IsAutomated | 用于标识某项活动由人工用户还是自动化系统执行。 | ||
| 说明 该布尔属性用于区分手动任务和系统自动执行的任务,例如外币估值的计划批处理作业,或由机器人过账的周期性分录。通常可通过分析与交易关联的用户名来确定,例如“BATCHUSER”。 了解自动化程度是发现效率提升机会的关键。分析该属性有助于直观呈现流程中哪些环节依赖人工、哪些环节适合自动化。同时,通过排除系统生成的活动,还能更准确地评估人工工作量。 为什么重要 区分人工活动和系统驱动活动,对于发现自动化机会并准确衡量人工工作量至关重要。 获取位置 这是一个派生属性。其逻辑通常基于User Name(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 | 交易过账所在的财年。 | ||
| 说明 财年是组织财务数据的基础要素,也是Financial Period案例ID的重要组成部分,为所有交易提供必要的时间背景。 虽然财年通常已包含在案例ID中,但将其作为独立属性仍有助于开展长期趋势分析。您可以按年度比较结账周期时间、调整数量及其他KPI,从而识别多年间绩效的改善或恶化趋势。 为什么重要 提供必要的时间背景,并支持按年度比较结账流程的绩效。 获取位置 可在凭证抬头表BKPF(GJAHR)中获取。 示例 202320242022 | |||
| 部门 Department | 负责相关活动或交易的职能部门或成本中心。 | ||
| 说明 此属性用于识别与交易相关的业务部门,例如“财务”“销售”或“物流”。通常根据与过账关联的成本中心主数据或用户主数据派生。 按部门分析支持“结账团队工作量分配”仪表板,有助于了解不同业务职能如何参与期末工作,尤其是哪些职能发起的交易可能在后续需要调整或对账。它还能突出核心财务团队以外影响结账流程的环节。 为什么重要 帮助分析不同业务职能的工作量和流程遵循情况,揭示各部门如何影响财务结账效率。 获取位置 通常根据BSEG中的成本中心(KOSTL)或责任用户的HR主数据派生,可能需要关联多个表。 示例 企业财务应付账款财务计划与分析 | |||
记录到报告-期间结账与对账活动
| 活动 | 说明 | ||
|---|---|---|---|
| 外币评估运行 | 这表示执行一个程序,使用期间末汇率重新评估以外币记录的未清项目和余额。作为期末结账步骤的一部分,该程序通常以批处理作业方式运行。 | ||
| 为什么重要 这是确保跨国组织财务报告准确性的关键步骤。分析其运行时间和持续时间,有助于发现自动化和性能优化机会。 获取位置 从外币评估程序的执行日志中获取,例如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科目经常引发对账问题。监控此活动可确保自动步骤正常运行,并帮助量化需要人工跟进的异常数量。 获取位置 执行记录在批处理作业日志中(事务SM37)。程序通常为SAPF124,通过事务F.13执行。TBTCO等作业日志表可提供所需时间戳。 采集 来自清账程序SAPF124的批处理作业日志(表TBTCO)。 事件类型 explicit | |||
| 公司间凭证已清账 | 此活动标志着两个不同公司代码之间未清项目的清账,表示公司间交易已结算或完成对账。在SAP中,这通常以明确的财务过账记录,通常为清账凭证。 | ||
| 为什么重要 公司间项目清账延迟是结账流程中的常见瓶颈。跟踪此活动对于衡量和改善公司间对账周期时间至关重要。 获取位置 根据BKPF和BSEG中的财务凭证识别。清账凭证会关联并关闭未清项目,其清账日期(BSEG-AUGDT)作为事件时间戳。公司间交易通过交易伙伴字段识别。 采集 识别BKPF/BSEG中涉及交易伙伴项目的清账凭证。 事件类型 explicit | |||
| 冲销分录已过账 | 此活动记录一笔用于冲销先前日记账分录的凭证过账,通常用于纠正错误。SAP会在冲销凭证与原凭证之间建立明确关联。 | ||
| 为什么重要 冲销数量较多,可能表明数据录入准确性或流程控制存在问题。跟踪这些事件有助于衡量一次通过率,并识别需要改进的环节。 获取位置 冲销凭证位于BKPF表中。它们通常通过事务FB08创建,并在BKPF-STBLG字段中包含被冲销凭证编号的引用。 采集 识别BKPF-STBLG已填充或通过冲销T-code创建的凭证。 事件类型 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)中执行Table Join。关键表包括BKPF、BSEG、CDHDR和CDPOS。* 日期范围:建议提取至少3至6个完整财务期间的数据,以识别模式。在
BKPF-GJAHR(Fiscal Year)和BKPF-MONAT(Period)上设置筛选条件。* 公司代码筛选:始终按BKPF-BUKRS(Company Code)筛选,以限制数据量,并将分析聚焦于特定法人实体。不建议一次提取所有公司代码的数据。* 凭证类型筛选:使用BKPF-BLART(Document Type)筛选,以隔离应计、调整或冲销等特定活动。您需要先获取适用于本组织的相关凭证类型。* 前提条件:执行提取的用户需要有权使用SQVI事务,并拥有相关财务表的显示权限,例如授权对象S_TABU_DIS。* 性能注意事项:连接BKPF和BSEG可能消耗大量资源。请在业务低峰期执行提取。避免使用过大的日期范围或不设置公司代码筛选,否则可能导致内存问题或超时。
a 示例查询 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(调度和监控)等事务。
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数据库的只读访问凭据。确认正确的数据库架构,通常为
SAPSR3或数据库管理员提供的类似名称。 - 确认系统配置:与SAP财务团队确认需要分析的公司代码(BUKRS)和财务期间。尤其要确认系统中用于“应计或预计负债已过账”“调整日记账分录已过账”和“公司间”交易的具体凭证类型(BLART)。
- 核实程序和作业名称:确认关键批处理作业的程序名称,例如外币估值(如
FAGL_FCV)、GR/IR清账(如SAPF124)、试算平衡表报告(如RFBILA00)和财务报表生成(如RFBILA00)。可通过事务SM37检查已调度作业。 - 定制SQL查询:将提供的SQL查询复制到文本编辑器或SQL客户端中。将占位符变量
{{start_date}}、{{end_date}}和{{company_codes}}替换为实际分析值,并根据前一步收集的信息更新凭证类型和程序名称列表。 - 连接数据库:使用DBeaver、SQL Server Management Studio或Oracle SQL Developer等标准SQL客户端工具,凭借已获取的凭据连接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。强烈建议在非工作时间执行提取,以免影响系统性能。缩小日期范围并限定公司代码,是控制执行时间最有效的方法。
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'
; 优化记录到报告结账流程,立即缩短周期时间
消除瓶颈,将记录到报告结账周期缩短30%。
无需信用卡,即可开始14天免费试用。