草庐IT

闲人闲谈PS之三十九——项目财务报表设计

SAP闲人 2023-04-05 原文

惯例闲话:最近群友们一直在讨论SAP顾问的方向和出路。从目前国企和央企的方向来看,SAP被国产化替代是不可逆转趋势,对此很多朋友感觉到了失业危机。对此,闲人的看法是,趋势不可逆,但SAP产品在不久的将来,会以另外一种形式出现并全面铺开。而目前所看到的,并没有一个能替代的产品出现,依葫芦画瓢的也看到过,但总结一句话,东施效颦。所以,闲人对此持乐观态度,机会总是会给准备的人,而目前这一行,能潜心研究工业信息化底层业务架构的同行,还凤毛麟角。所以未来10年之内,对SAP从业者而言,是挑战也是机会,大浪淘沙,真金不怕火炼,希望各位好运。
闲话到此为止,今天聊聊项目财务报表设计

项目财务报表问题

PS模块和财务的关联更为紧密,WBS是重要成本对象之一,常见的财务凭证表BSEG,ACDOCA,COSP,COSS等表,是常用的项目成本报表取数来源,和后勤的用法不一样的是,财务表中的WBS通常体现为对象号OBJNR,通过对象号关联WBS。这些都是非常基本的应用。但是按照常规的方法,会存在一个共同的问题,项目财务报表的效率问题,没有任何例外,根本原因是,所有的项目制企业,都是按项目全周期来分析成本,随着上线后持续的财务凭证生成,必然产生效率问题。因此在项目财务分析的设计中,效率成为一个影响方案落地的问题。

RPSCO表分析


图 业务对象的余额汇算过程
SAP考虑到这个问题,如上图,PS的财务底表中,RPSCO表是一个具有重要意义的表,这个表包含了PS模块产生绝大部分财务相关的数据,成本计划、计划收入、预算、承诺、实际成本、实际收入以及结果分析等等, 系统将实时WBS的余额保存到RPSCO表中,有了这个实时累计数,在很多需要计算累计金额的场景中,效率问题通过RPSCO可以迎刃而解。
首先分析RPSCO表重要的组成字段:
1、OBJNR:成本对象号,PS的成本对象分为WBS、网络头、网络活动三种:
WBS对象类型PR,和PRPS-OBJNR关联;
网络头对象类型NP,和AUFK-OBJNR关联:
网络活动对象号NV,和AFVC-OBJNR关联:

图 ACDOCA表ACCASTY成本对象类型

为了减少报表中的联查逻辑,提高效率,一般的做法是,用WBS成本对象来归集成本,建议不要将网络作为成本对象,这样会大大增加报表的查询负荷。在配置上实践,如下图OPT1对于项目网络发货,将移动类型配置为221。这样配置后,MIGO发货后,在网络上不会产生余额,余额转嫁到网络归属的WBS,而这种结果也是我们所需要的,直接取PR对象的余额。

图 网络发货移动类型配置

2、LEDNR 预算/计划分类帐,成本对象货币和控制范围货币不同时,按汇率自动换算。这个字段通常用于选择不同货币时,作为关键条件选择。如下图,WBS 1520000099-01的对象货币CNY对应0002,控制范围货币HKD对应0003。这里的规律是,控制范围货币的LEDNR编码排在对象货币的编码之后。取数时候按需要排序。

图 WBS对象货币和控制范围货币换算

3、WRTTP 值类型 /VORGA预算类型预算/计划,这个2个字段组合在一起,区分成本计划、预算、承诺、实际的关键字段,几种常用的类型组合解析如下:
4、 BELTP 借类,表示成本和收入。
和WBS结构设计存在关系,这里强烈建议计成本和收入时,归集收入和成本的WBS区分开,这和符合多数项目制企业的记账习惯,一般首层WBS项目层,记收入。下层记成本,这样收入凭证就不会影响直接取数。如果同一个WBS成本收入和计入,那么RPSCO表中的成本会被收入抵消一部分,这样就失去了利用RPSCO表的意义。
5、VERSN,版本,使用成本计划时,需要用VERSN判断对应的成本。

6、WLP01~WLP16,当月的余额。在使用中需要将截止月份余额,需要将月份余额累加起来。从16列开始到31列的金额累加,计算WBS累计成本的参考逻辑如下:
LOOP AT LT_RPSCO INTO LS_RPSCO
WHERE OBJNR = LS_WBSRPSCO-OBJNR
AND WRTTP = ‘04’
AND ( VORGA = ‘COIN’ OR
VORGA = ‘COIE’ OR
VORGA = ‘RKIB’ OR
VORGA = ‘RKIV’ OR
VORGA = ‘KOAO’ OR
VORGA = ‘KOAR’)
AND VERSN = ‘000’
AND LEDNR = ‘0003’
AND GJAHR LE I_DATE+0(4)
AND BELTP = ‘1’."成本和贷方支付
ASSIGN LS_RPSCO TO ."将工作区赋值给指针区
LV_TIMES = 16 ."从16列开始取数
IF LS_RPSCO-GJAHR < LV_GJAHR.
DO 16 TIMES."循环16次累加
ASSIGN COMPONENT LV_TIMES OF STRUCTURE TO .
LS_WBSRPSCO-ACTUAL = LS_WBSRPSCO-ACTUAL + .
LV_TIMES = LV_TIMES + 1.
ENDDO.
ELSEIF LS_RPSCO-GJAHR = LV_GJAHR.
DO LV_MONAT TIMES.
ASSIGN COMPONENT LV_TIMES OF STRUCTURE TO .
LS_WBSRPSCO-ACTUAL = LS_WBSRPSCO-ACTUAL + .
LV_TIMES = LV_TIMES + 1.
ENDDO.
ENDIF.
ENDLOOP.
CLEAR LS_RPSCO.
这段逻辑的结果,如下图,将这些字段累计。

图 累加字段
以上是RPSCO表中关键字段的解读,理解以上字段的意义是掌握这个表基础。这个表也是大部分S_ALR*表的取数源头。

应用举例

某公司是一家建筑机电设备安装工程公司,组织架构按照公司法人/事业部/项目层层分解,每月财务需要根据每个项目的预算成本、实际成本、实际收入、变更追加成本等数据监控公司运营状况,分析每个责任主体绩效。

图 项目分析组织架构
公司年产值40亿,单个项目WBS结构达到1800+数量级别,逻辑不复杂每个项目数据获取后,按事业部、公司汇总。分析了三种方案:
方案A:常规ABAP直接开发,直接根据需求定制化开发报表。
1、优势为开发速度相对较快。
2、报表的通用性不强,由于管理报表逻辑复杂,对运维的要求较高。
3、报表实时读取,效率也较低。
方案B:参考BW的理念,指标模块化开发。
1、建立统一的分析维度和查询标准,将项目营收报表、项目试算表的分析指标模块化分解。
2、定期将数据保存在定制表中,实现快速查询
3、分析指标模块化,在统一按项目+时间的维度下,可根据不同的实现报表拼接生成新的管理报表。
4、具有较大的灵活性,方便运维
5、开发周期相对A,略长
本方案可简单理解是基于方案CBI理念下+业务模块化思想的简化应用
方案C:上BI系统。SAP专项解决方案,专门为企业SAP上线后,建立分析决策模型,快速抽取数据形成报表。BI的实施一般在SAP稳定运行,积累一定的数据量基础上进行。需一定的时间周期沉淀。
如果按照方案A,程序必然出现超时DUMP问题,方案A毫无疑问舍弃。由于客户对SAP项目预算有限和实施周期,方案C不具备实施条件。最终选定了方案B。

设计过程

1、确定汇总层级。如上图,项目->事业部->公司法人
2、确定分析指标,需要有期间分析功能。指标预算、承诺、累计成本、累计收入、开票、回款等核心财务数据。最大的效率瓶颈在这个环节。其中成本、收入、回款、承诺是跨整个项目全生命周期是最大难点。
3、利用RPSCO表将指标模块化,化整为零,独立存表,称之为模块子表。如下表:

4、模块子表的主键统一为项目定义/年度/更新日期,这一步是十分关键,和财务总监确定后,设计表结构。下表为部分子表举例

子表名 字段名 字段描述 主键 说明
ZTPS_0001 MANDT 客户端 X SAP客制表默认字段
ZTPS_0001 PSPID 项目定义 X  
ZTPS_0001 POSID WBS X  
ZTPS_0001 BUDAT 更新日期 X  
ZTPS_0001 STUFE 层级    
ZTPS_0001 PLFAZ 项目基本_合同开工日期    
ZTPS_0001 PLSEZ 项目基本_合同竣工日期    
ZTPS_0001 SPROG 项目基本_实际开工日期    
ZTPS_0001 EPROG 项目基本_实际竣工日期    
ZTPS_0001 POST1 项目基本_描述    
ZTPS_0001 S_TXT04 项目基本_项目状态_上年    
ZTPS_0001 B_TXT04 项目基本_项目状态_本年    
ZTPS_0001 Z_SNXXJD 截止上年末业主确认的形象进度    
ZTPS_0001 Z_BNXXJD 截止本年末业主确认的形象进度    
ZTOA_0003 MANDT 客户端 X SAP客制表默认字段
ZTOA_0003 PSPID 项目定义 X  
ZTOA_0003 POSID WBS X  
ZTOA_0003 BUDAT 更新日期 X  
ZTOA_0003 ZBGWTQ 变更Y2_未提请金额    
ZTOA_0003 ZBGYTQ 变更Y2_已提请金额    
ZTOA_0003 ZBGYQR 变更Y2_已确认金额    
ZTOA_0003 ZBGYHT 变更Y2_已转化为合同金额

表 表结构设计
4、指标计算逻辑。最核心的取数逻辑,详细见上RPSCO表分析,逻辑编写不复杂,前提是掌握RPSCO表的更新逻辑。将项目各项指标计算封装成函数,如图ZPS_FM_WBSRPSCO_GET,获取到数据后,做汇算逻辑。和常规方法最大的区别,非凭证级别,而是余额的汇算,效率大为提高,理论上,每个WBS只需要一次循环,即可算出当期余额。

5、按客户财务总监要求,数据实时性定为24小时,每天晚上1点,系统资源空闲的时候,进行计算汇总,存入子表。如果个别项目需要最新数据,则人工执行一次即可刷新表数据。

6、项目综合营收报表测试,毫无疑问,效果在预料之内,可以达到秒内速度


图 项目综合报表执行结果

小结:这个案例在项目制企业非常典型,在以往的项目实践中,项目报表出不来或者数据不准,是很多实施项目的遗憾。从以上过程总结几个重要的启示:
1、财务分析要在蓝图设计阶段今早规划,以此作为方向定功能基础;
2、业务层面的索引条件标准化,统一了统计和查询口径。
3、SAP标准功能价值最大化,对RPSCO表的利用。
4、财务数据时效性口径。随着系统数据海量增长,做到完全实时几乎不可能就需要约定时效性,一般24小时。

有关闲人闲谈PS之三十九——项目财务报表设计的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  4. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  5. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  6. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  7. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  8. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  9. ruby-on-rails - 设计注册确认 - 2

    我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:

  10. ruby - 如何在 Ruby 字符串中插入项目符号字符? - 2

    我正在尝试创建一个带有项目符号字符的Ruby1.9.3字符串。str="•"+"helloworld"但是,当我输入它时,我收到有关非ASCII字符的语法错误。我该怎么做? 最佳答案 你可以把Unicode字符放在那里。str="\u2022"+"helloworld" 关于ruby-如何在Ruby字符串中插入项目符号字符?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1195

随机推荐