系列文章目录
文章目录
- 系列文章目录
- 前言
- 一、现金流量表
- 二、现金流量表的数据表结构
- 1、核心数据表
- 2、内部数据结构
- 三、现金流量表的取数逻辑
- 1、获取用户输入
- 2、获取数据
- 3、处理数据
- 总结
前言
承接上篇财务三大报表_2-进阶(利润表-数据表结构、取数逻辑),本篇继续详细介绍现金流量表的相关数据表结构、取数逻辑等(事实上,两个报表的逻辑、处理顺序都是一致的)
写的不周到的地方还请大家批评指正,互相学习
一、现金流量表
TCODE:ZFIR004
选择公司代码、会计年度、期间,即可看到该公司在某一会计年度某一期间的详细现金流量表,如下:
可看到行项目主要包括:经营活动产生的现金流量(营业活动现金流入、营业活动现金流出)、投资活动产生的现金流量(投资活动现金流入、投资活动现金流出)、筹资活动产生的现金流量(筹资活动现金流入、筹资活动现金流出)
二、现金流量表的数据表结构
1、核心数据表
- faglflext:是SAP中的通用财务数据表,用于存储总账科目的财务数据,这里主要用于用于提取期初现金及现金等价物余额等关键数据
关键字段包括:科目代码racct,借贷方向drcrk,期末数和年初数的余额hsl01、hslvt - zfit009:是自定义的表,是财务三大报表存储表,存储了现金流量表的配置信息
关键字段包括:公司代码bukrs,报表类型ztype(IS是利润表),列标识zcolumn(用于区分不同的列),行标识zrow,借方标识和贷方标识zjfbs、zdfbs,计算公式formula,正负反转reversal# 三、现金流量表的取数逻辑 - bkpf:会计核算凭证标题(财务凭证抬头表),包含凭证的抬头信息
- bseg:会计核算凭证段(财务凭证行项目表),包含凭证的详细信息
- acdoca:通用日记账分录行项目,存储会计文档的总账行项目数
2、内部数据结构
- 5个结构体类型typ_bkpf,typ_bseg,typ_dmbtr,typ_dmbtr1,typ_fag,typ_zc
- gt_bkpf、gtu_bkpf、gsu_bkpf、gs_bkpf:与财务凭证抬头(bkpf)相关的数据表,用于存储和处理凭证抬头信息
- gt_bseg、gtu_bseg、gs_bseg:与财务凭证行项目(bseg)相关的数据表,用于存储和处理凭证行项目信息。
- gt_fit001、gs_fit001:存储从zfit009表中读取的现金流量表配置信息
- gt_zc、gs_zc:可能用于存储特定于现金流量表的其他配置或计算数据
- gt_dmbtr、gs_dmbtr:用于存储和处理现金流量表中的金额数据
三、现金流量表的取数逻辑
1、获取用户输入
通过选择屏幕获取用户输入的公司代码、会计年度和月份
2、获取数据
子例程sub_get_data:
- 设置筛选条件
设定凭证状态(r_bstat)的范围,只包括特定的凭证状态(如’D’、‘S’、‘V’、‘W’、'Z’等)(即:只取设定的凭证状态下的所有凭证 来计算现金流量),设定现金类科目的范围(r_hkont)
DATA: tp_gjahr TYPE bkpf-gjahr,t_lines TYPE i,count TYPE i,l_mod TYPE i.
* DATA: lt_bseg TYPE STANDARD TABLE OF typ_bseg .RANGES: r_bstat FOR bkpf-bstat .RANGES: r_hkont FOR bseg-hkont .RANGES: r_belnr FOR bkpf-belnr .CLEAR: r_bstat,r_bstat[] . "只取下列对应的凭证状态的所有凭证 来计算现金流量r_bstat(3) = 'IEQ' .r_bstat-low = 'D' .APPEND r_bstat .r_bstat-low = 'L' .APPEND r_bstat .r_bstat-low = 'M' .APPEND r_bstat .r_bstat-low = 'S' .APPEND r_bstat .r_bstat-low = 'V' .APPEND r_bstat .r_bstat-low = 'W' .APPEND r_bstat .r_bstat-low = 'Z' .APPEND r_bstat .
CLEAR:r_hkont,r_hkont[] . "现金类科目范围CLEAR:r_hkont .r_hkont(3) = 'IBT' .r_hkont-low = '0010010000' .r_hkont-high = '0010029999'."change by dxy at 12.01.2024 19:35:41APPEND r_hkont.
- 获取数据
select语句- 从faglflext表中获取期初现金及现金等价物余额等数据(即获取该公司代码下所有科目的发生额数据),并存储在gt_fag 表中;
SELECT (tp_cond) "获取该公司代码下所有科目的发生额数据INTO CORRESPONDING FIELDS OF TABLE gt_fag "FROM faglflextWHERE rbukrs IN p_bukrsAND ryear = tp_yearAND rldnr = '0L'" AND prctr IN s_prctrAND racct IN r_saknr..FIELD-SYMBOLS: <hsl> TYPE any .
- 从bseg表取出所有的满足现金流量表的计算条件的凭证行项目,并存储在gt_bseg表中;同时,从acdoca表中选取满足条件的数据,特别是当凭证状态为’U’时(连续两年小于等于当前期间的凭证–凭证状态不为U),并关联到bkpf表。将acdoca表中的数据(如果有)追加到bseg表中
CLEAR:gt_bseg[] ."取出所有的满足现金流量表的计算条件的凭证行项目SELECT bukrs gjahr belnr buzeihkont rstgr shkzg dmbtrINTO TABLE gt_bsegFROM bseg
*** WHERE bukrs = p_bukrsWHERE bukrs IN p_bukrsAND gjahr = p_gjahrAND hkont IN r_hkont
** AND belnr IN ( SELECT belnr FROM bkpf WHERE bukrs = p_bukrs "连续两年小于等于当前期间的凭证--凭证状态不为UAND belnr IN ( SELECT belnr FROM bkpf WHERE bukrs IN p_bukrs "连续两年小于等于当前期间的凭证--凭证状态不为UAND gjahr = p_gjahrAND bstat NE 'U'AND monat <= p_monat )%_HINTS HDB 'dbsl_add_stmt with hint (USE_OLAP_PLAN)'.SELECT acdoca~rbukrs AS bukrsacdoca~gjahracdoca~belnracdoca~buzeiacdoca~racct AS hkontacdoca~drcrk AS shkzgacdoca~hsl AS dmbtrAPPENDING CORRESPONDING FIELDS OF TABLE gt_bsegFROM acdocaINNER JOIN bkpf ON bkpf~bukrs = acdoca~rbukrs AND bkpf~belnr = acdoca~belnrAND bkpf~gjahr = acdoca~gjahr
*** WHERE bkpf~bukrs = p_bukrsWHERE bkpf~bukrs IN p_bukrsAND bkpf~gjahr = p_gjahrAND bkpf~bstat = 'U'AND bkpf~monat <= p_monatAND acdoca~racct IN r_hkontAND acdoca~bstat = 'U'.
- 根据配置表zfit009中的信息,确定需要获取哪些科目的数据
SELECT *INTO CORRESPONDING FIELDS OF TABLE gt_fit001FROM zfit009WHERE bukrs = ''AND ztype = 'CF'AND langu = sy-langu .SORT gt_fit001 BY bukrs ztype zcolumn zrow zsnum .SORT gt_fit001 BY ztype zcolumn zrow .
3、处理数据
子例程sub_deal_data:
处理获取的数据,计算现金流量表的各项累计值
- 循环遍历配置数据(gt_fit001),根据配置表中的配置的各项中的现金流量码,整合所有的凭证数据,计算出对应各项的累计值
- 如果配置项指定了特定的现金流量码(zrow = ‘034’),则直接设置本月累计(nmhsl)和本年累计(nyhsl)。
- 如果配置项不是通过公式计算(formula = ‘’),则根据配置项中的条件(借贷标志、科目范围等)筛选bseg表中的记录,并计算累计值。
筛选条件包括借贷标志(shkzg)、科目范围(rstgr)、借贷方标志(zjfbs和zdfbs)。
根据筛选出的记录,分别计算当月、当年、上月、上年的累计值。如果配置项指定了反转(reversal = ‘X’),则对累计值进行反转处理。 - 如果配置项是通过公式计算,则调用caculate_results子程序进行计算,该子程序具体实现逻辑和利润表、资产负债表逻辑一致,具体可看前两篇
RANGES: r_shkzg FOR bseg-shkzg .CLEAR: gt_dmbtr[].
*--------Add by JT-BAI at 20220511 begin----------------IF lines( p_bukrs ) > 1 OR p_bukrs-high IS NOT INITIAL.DATA(lv_bukrs) = CONV char4('合并').ELSE.lv_bukrs = p_bukrs-low.ENDIF.
*--------Add by JT-BAI at 20220511 end------------------LOOP AT gt_fit001 ASSIGNING <gs_fit001> . "根据配置表中的配置的各项中的现金流量码 整合所有的凭证数据"计算出对应各项的累计值CLEAR: gs_dmbtr .MOVE-CORRESPONDING <gs_fit001> TO gs_dmbtr .IF gs_dmbtr-zrow = '034'.gs_dmbtr-nmhsl = gv_dmbtr . "本月累计gs_dmbtr-nyhsl = gv_hslvt . "本年累计ENDIF.IF <gs_fit001>-formula = '' . "不是通过公式计算IF ( ( <gs_fit001>-rstgr <> '' ) AND ( <gs_fit001>-zjfbs <> '' OR <gs_fit001>-zdfbs <> '' ) ) .
*-----------------------------------------------------------------------------
*---组织整合条件
*-----------------------------------------------------------------------------
*-----------------------------------------------------------------------*”借贷标识CLEAR:r_shkzg,r_shkzg[] .IF <gs_fit001>-zjfbs = 'X' .r_shkzg(3) = 'IEQ' .r_shkzg-low = 'S' .APPEND r_shkzg .ENDIF .IF <gs_fit001>-zdfbs = 'X'.r_shkzg(3) = 'IEQ' .r_shkzg-low = 'H' .APPEND r_shkzg .ENDIF.
*-----------------------------------------------------------------------*LOOP AT gt_bseg INTO gs_bseg WHERE rstgr = <gs_fit001>-rstgr AND shkzg IN r_shkzg ."因为ACDOCA读取出来的数据有正负,而BSEG读取出来的数据有借贷gs_bseg-dmbtr = abs( gs_bseg-dmbtr ).IF gs_bseg-gjahr = p_gjahr . "当年IF gs_bseg-shkzg = 'S'.IF gs_bseg-monat = p_monat .ADD gs_bseg-dmbtr TO gs_dmbtr-nmhsl .ENDIF.ADD gs_bseg-dmbtr TO gs_dmbtr-nyhsl .ELSEIF gs_bseg-shkzg = 'H' .IF gs_bseg-monat = p_monat .SUBTRACT gs_bseg-dmbtr FROM gs_dmbtr-nmhsl .ENDIF .SUBTRACT gs_bseg-dmbtr FROM gs_dmbtr-nyhsl .ENDIF.ELSE . "上年IF gs_bseg-shkzg = 'S' .IF gs_bseg-monat = p_monat .ADD gs_bseg-dmbtr TO gs_dmbtr-lmhsl .ENDIF.ADD gs_bseg-dmbtr TO gs_dmbtr-lyhsl .ELSEIF gs_bseg-shkzg = 'H' .IF gs_bseg-monat = p_monat .SUBTRACT gs_bseg-dmbtr FROM gs_dmbtr-lmhsl .ENDIF .SUBTRACT gs_bseg-dmbtr FROM gs_dmbtr-lyhsl .ENDIF.ENDIF .ENDLOOP.IF <gs_fit001>-reversal = 'X'.gs_dmbtr-nmhsl = 0 - gs_dmbtr-nmhsl.gs_dmbtr-lmhsl = 0 - gs_dmbtr-lmhsl.gs_dmbtr-nyhsl = 0 - gs_dmbtr-nyhsl.gs_dmbtr-lyhsl = 0 - gs_dmbtr-lyhsl. "ADD BY ZHANGCS 20180709ENDIF.COLLECT gs_dmbtr INTO gt_dmbtr .ELSE .COLLECT gs_dmbtr INTO gt_dmbtr .
*** PERFORM sub_get_balance USING <gs_fit001>-zrow. "直接获取余额ENDIF.ELSE . "公式计算项PERFORM caculate_results CHANGING <gs_fit001>-formula gs_dmbtr-lmhsl gs_dmbtr-lyhsl "公式计算和资产负债表的相同 参考资产负债表注释各项gs_dmbtr-nmhsl gs_dmbtr-nyhsl . "有计算公式的行没有分科目号段照成多行的问题COLLECT gs_dmbtr INTO gt_dmbtr .ENDIF .
- 处理结果存储
将处理后的数据gs_dmbtr收集到gt_dmbtr内表中