现金流量表
用户输入:会计年度,会计期间,公司的代码。
显示现金流量表
程序逻辑:
1、 根据会计年度,会计期间,公司代码在透明表bkpf选出凭证号放入itab_bkpf 内表里面
2、 根据会计年度,公司代码在透明表bseg选出凭证号、原因码、会计科目放入itab_bseg内表里面
3、 循环itab_bseg ,在循环里面以itab_bseg-belnr(凭证号) 查找itab_bkpf 如果没有则在itab_bseg里面删除该行(如果itab_bkpf 没有的凭证号,则在itab_bseg里面删除,因为透明表里面没有会计期间,通过赛选,能完成用户会计期间的限定)。
4、 通过循环itab_bseg 完成对有原因代码科目的赛选。循环itab_bseg ,如果itab_bseg里面原因代码为空,则删除该行。这时剩下的数据这为用户选定范围内有原因代码的数据了。
5、 循环itab_bseg ,利用函数将相同原因代码的会计科目的起初余额,与期末余额累加后放入内表itab. 循环结束后itab里面则为有原因代码,原因代码在用户选择范围内的起初与期末余额。
6、 现金流量表的显示,利用原因码查询itab 然后得出起初与期末余额放入alv现实内表itab_alv. 设置alv显示控制,调用函数reuse_alv_first_display 显示数据。
执行效果
程序代码
*&---------------------------------------------------------------------**& Report ZFIXIANJINLIULIANG*&*&---------------------------------------------------------------------**&*&*&---------------------------------------------------------------------*
REPORT ZFIXIANJINLIULIANG.TYPE-POOLS: slis.DATA: fieldcates TYPE slis_t_fieldcat_alv, fieldcate LIKE LINE OF fieldcates.DATA: gs_layout TYPE slis_layout_alv.data: bapi_tab type table of BAPI3006_4 with header line.TABLES: bseg ,bkpf.data curr_type like BAPI3006_5-CURR_TYPE value '10'.DATA: BEGIN OF itab_bkpf OCCURS 0 , bukrs TYPE bseg-bukrs , belnr TYPE bseg-belnr , gjahr TYPE bseg-gjahr , monat TYPE bkpf-monat, END OF itab_bkpf.DATA: itab_bkpf1 LIKE TABLE OF itab_bkpf.DATA: BEGIN OF itab OCCURS 0 , bukrs TYPE bseg-bukrs , belnr TYPE bseg-belnr , gjahr TYPE bseg-gjahr , rstgr TYPE bseg-rstgr , txt20 TYPE t053s-txt20 , wrbtr TYPE bseg-wrbtr, shkzg type bseg-SHKZG, END OF itab.DATA: BEGIN OF itab_alv OCCURS 0, rstgr TYPE bseg-rstgr , wrbtr1 TYPE c length 13, wrbtr TYPE c length 13, txt20 TYPE t053s-txt20, row TYPE i VALUE 1, END OF itab_alv.
DATA: BEGIN OF itab_lang OCCURS 0, rstgr TYPE t053s-rstgr, txt20 TYPE t053s-txt20, END OF itab_lang.DATA: itab1 LIKE TABLE OF itab, gjahrs LIKE bseg-gjahr.
* 科目计算data: begin of itab_saknr occurs 0 , saknr type ska1-saknr, end of itab_saknr.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.PARAMETER s_bukrs type bseg-bukrs.SELECT-OPTIONS: s_monat FOR bkpf-monat.PARAMETER s_gjahr TYPE bseg-gjahr.
SELECTION-SCREEN END OF BLOCK b1.
START-OF-SELECTION.*获取会计区间数据* 本年数据free: itab_bkpf[], itab_bkpf1, itab[], itab1. SELECT * FROM bkpf INTO CORRESPONDING FIELDS OF TABLE itab_bkpf WHERE bukrs = s_bukrs AND gjahr = s_gjahr AND monat IN s_monat. SORT itab_bkpf. DELETE ADJACENT DUPLICATES FROM itab_bkpf.* 上年数据 gjahrs = s_gjahr - 1. SELECT * FROM bkpf INTO CORRESPONDING FIELDS OF TABLE itab_bkpf1 WHERE bukrs = s_bukrs AND gjahr = gjahrs AND monat IN s_monat. SORT itab_bkpf1 . DELETE ADJACENT DUPLICATES FROM itab_bkpf1 .
*获取显示数据* 本年数据 SELECT a~bukrs a~gjahr a~belnr a~wrbtr a~rstgr a~shkzg FROM bseg AS a INTO CORRESPONDING FIELDS OF TABLE itab WHERE bukrs = S_bukrs AND gjahr = s_gjahr . .* 上年数据
SELECT a~bukrs a~gjahr a~belnr a~wrbtr a~rstgr a~shkzg FROM bseg AS a INTO CORRESPONDING FIELDS OF TABLE itab1 WHERE bukrs = s_bukrs AND gjahr = gjahrs .
* 获取项目描述 SELECT * FROM t053s INTO CORRESPONDING FIELDS OF TABLE itab_lang FOR ALL ENTRIES IN itab WHERE rstgr = itab-rstgr AND bukrs = itab-bukrs AND spras = sy-langu.* 对数据进行处理
*获得科目数据 select saknr from ska1 into corresponding fields of table itab_saknr where KTOPL = 'BONK' and SAKNR like '1001%' or saknr like '1002%' .
sort itab_saknr.delete adjacent duplicates from itab_saknr.
SORT: itab . SORT itab1. DELETE ADJACENT DUPLICATES FROM itab1 . DELETE ADJACENT DUPLICATES FROM itab .
LOOP AT itab. READ TABLE itab_lang WITH KEY rstgr = itab-rstgr. IF sy-subrc = 0 . itab-txt20 = itab_lang-txt20. MODIFY itab. ELSE . DELETE itab. ENDIF. read table itab_bkpf with key belnr = itab-belnr. if sy-subrc <> 0. delete itab. endif.
ENDLOOP.
LOOP AT itab1 INTO itab. READ TABLE itab_lang WITH KEY rstgr = itab-rstgr. IF sy-subrc = 0 . itab-txt20 = itab_lang-txt20. MODIFY itab1 FROM itab. ELSE . DELETE itab1 where rstgr = itab-rstgr. ENDIF.
read table itab_bkpf with key belnr = itab-belnr. if sy-subrc <> 0. delete itab1 where belnr = itab-belnr. endif. ENDLOOP.
*设置插入marco DEFINE hong1. clear itab_alv. itab_alv-wrbtr = &1. itab_alv-wrbtr1 = &2. itab_alv-txt20 = &3 . itab_alv-row = &4 . append itab_alv. END-OF-DEFINITION.
* 设置科目 hong1: '' '' '一、经营活动生产的现金流量' 1 , '' '' '二、投资活动产生的现金流量:' 12 , '' '' '三、筹资活动产生的现金流量:' 25 , '0' '0' '四、汇率变动对现金的影响' 35 .
PERFORM getdata USING: ' 销售商品,提供劳务收到的现金' 2 'A01', ' 收到的税费返还' 3 'A02', ' 收到其他与经营活动相关的现金' 4 'A03', '购买商品、接受劳务支付的现金' 6 'A04', '支付给职工以及为职工支付的现金' 7 'A05', '支付的各项税费' 8 'A06', '支付其他与经营活动有关的现金' 9 'A07', '收回投资收到的现金' 13 'B01', '取得投资收益收到的现金' 14 'B03', '处置固定资产、无形资产和其他长期资产收回的现金净额' 15 'B04', '处置子公司及其他营业单位收到的现金净额' 16 'B02', '收到其他与投资活动有关的现金' 17 'B05', '购建固定资产、无形资产和其他长期资产支付的现金' 19 'B06', '投资支付的现金' 20 'B07', '取得子公司及其他营业单位支付的现金净额' 21 'B08', '支付其他与投资活动有关的现金' 22 'B09',
'取得借款收到的现金' 27 'C03', '收到其他与筹资活动有关的现金' 28 'C04', '偿还债务支付的现金' 30 'C05', '分配股利、利润或偿付利息支付的现金' 31 'C06', '支付其他与筹资活动有关的现金' 32 'C08'.
PERFORM getsum USING: '经营活动现金入小计' 5 2 4 ,
'经营活动现金流出小计' 10 6 9 , '投资活动现金流入小计' 18 13 17, '投资活动现金流出小计' 23 19 22, '筹资活动现金流入小计' 29 26 28 , '筹资活动现金流出小计' 33 30 32 .* '' '' ,* '' '' ,* '' '' ,
perform remove using: '经营活动产生的现金流量净额' 11 5 10 , '投资活动产生的现金流量净额' 24 18 23, '筹资活动产生的现金流量净额' 34 29 33.
* 特殊处理
* '吸收投资收到的现金' 26 'C01',perform getc12.perform do36.perform do37.PERFORM getsum USING: '六、期末现金及现金等价物余额' 38 36 37 .
*alv书设置 DEFINE hong. fieldcate-col_pos = &1. fieldcate-fieldname = &2. fieldcate-seltext_m = &3. append fieldcate to fieldcates.END-OF-DEFINITION.hong: 1 'TXT20' '项目', 2 'ROW' '行次', 3 'WRBTR' '本年利润', 4 'WRBTR1' '上年利润'.
gs_layout-colwidth_optimize = 'X'.gs_layout-zebra = 'X'.sort itab_alv by row.CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING it_fieldcat = fieldcates is_layout = gs_layout TABLES t_outtab = itab_alv.
*&---------------------------------------------------------------------**& Form getdata*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** -->FNAME text* -->POS text* -->F_RSTGR text*----------------------------------------------------------------------*FORM getdata USING fname TYPE c pos TYPE i f_rstgr TYPE bseg-rstgr.
DATA: wrbtr_j TYPE bseg-wrbtr VALUE 0 , wrbtr_d TYPE bseg-wrbtr VALUE 0 ,
wrbtr1_j TYPE bseg-wrbtr VALUE 0 , wrbtr1_d TYPE bseg-wrbtr VALUE 0. CLEAR itab_alv.
LOOP AT itab WHERE rstgr = f_rstgr. if itab-shkzg = 'S'. wrbtr_j = wrbtr_j + itab-wrbtr. elseif itab-shkzg = 'H'. wrbtr_d = wrbtr_d = itab-wrbtr. endif. ENDLOOP.
LOOP AT itab1 INTO itab WHERE rstgr = f_rstgr. if itab-shkzg = 'S'. wrbtr1_j = wrbtr1_j + itab-wrbtr. elseif itab-shkzg = 'H'. wrbtr1_d = wrbtr1_d = itab-wrbtr. endif. ENDLOOP.
itab_alv-wrbtr = wrbtr_j - wrbtr_d . itab_alv-wrbtr1 = wrbtr1_j - wrbtr1_d. itab_alv-txt20 = fname. itab_alv-row = pos. APPEND itab_alv.ENDFORM. "getdata
*&---------------------------------------------------------------------**& Form getsun*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** -->FNAME text* -->POS text* -->LOW text* -->HIGHT text*----------------------------------------------------------------------*FORM getsum USING fname TYPE c pos TYPE i low TYPE i hight TYPE i. DATA: wrbtr TYPE bseg-wrbtr VALUE 0 , wrbtr1 TYPE bseg-wrbtr VALUE 0. data: count type i, count_loop type i.
count = hight - low + 1 . count_loop = low. do count times. read table itab_alv with key row = count_loop. if sy-subrc = 0 . wrbtr = wrbtr + itab_alv-wrbtr. wrbtr1 = wrbtr1 + itab_alv-wrbtr1. endif. count_loop = count_loop + 1. enddo.
itab_alv-wrbtr = wrbtr. itab_alv-wrbtr1 = wrbtr1. itab_alv-txt20 = fname. itab_alv-row = pos. APPEND itab_alv.ENDFORM. "getsun
FORM remove USING fname TYPE c pos TYPE i low TYPE i hight TYPE i. DATA: max TYPE bseg-wrbtr, max1 TYPE bseg-wrbtr, min like max, min1 like max.
read table itab_alv with key row = low. if sy-subrc = 0 . max = itab_alv-wrbtr . max1 = itab_alv-wrbtr1. endif.
read table itab_alv with key row = hight. if sy-subrc = 0 . min = itab_alv-wrbtr . min1 = itab_alv-wrbtr1. endif.
itab_alv-wrbtr = max - min. itab_alv-wrbtr1 = max1 - min1. itab_alv-txt20 = fname. itab_alv-row = pos. APPEND itab_alv.endform.
form getc12. DATA: wrbtr TYPE bseg-wrbtr VALUE 0 , wrbtr1 TYPE bseg-wrbtr VALUE 0. CLEAR itab_alv.
LOOP AT itab WHERE rstgr = 'C01' or rstgr = 'C02'. wrbtr = wrbtr + itab-wrbtr. ENDLOOP.
LOOP AT itab1 INTO itab WHERE rstgr = 'C01' or rstgr = 'C02'. wrbtr1 = wrbtr1 + itab-wrbtr. ENDLOOP.
itab_alv-wrbtr = wrbtr. itab_alv-wrbtr1 = wrbtr1. itab_alv-txt20 = '吸收投资收到的现金'. itab_alv-row = 26. APPEND itab_alv.
endform.
form do36.
DATA: sum TYPE bseg-wrbtr, sum1 TYPE bseg-wrbtr.
loop at itab_alv where row = 11 or row = 24 or row = 34 or row = 35.
* write: itab_alv-row. sum = sum + itab_alv-wrbtr . sum1 = sum1 + itab_alv-wrbtr1.
endloop.
itab_alv-wrbtr = sum . itab_alv-wrbtr1 = sum1. itab_alv-txt20 = '五、现金及现金等价物净增加额'. itab_alv-row = 36. APPEND itab_alv.
endform.
form do37. data: yu type bseg-wrbtr, yu_s like yu, pos type i, wa_monat like line of s_monat. sort s_monat by low descending.
read table s_monat into wa_monat index 1. if sy-subrc <> 0. pos = 1. else. pos = wa_monat-low - 1 . endif. data: t_gjahr like s_gjahr, t_gjahr1 like s_gjahr. t_gjahr = s_gjahr. if pos = 0. t_gjahr = t_gjahr - 1. pos = 16. endif. t_gjahr1 = t_gjahr - 1.loop at itab_saknr.free bapi_tab[].
CALL FUNCTION 'BAPI_GL_ACC_GETPERIODBALANCES' EXPORTING companycode = s_bukrs glacct = itab_saknr-saknr fiscalyear = t_gjahr currencytype = curr_type* IMPORTING* BALANCE_CARRIED_FORWARD =* RETURN = tables account_balances = bapi_tab[] .
sort bapi_tab by FIS_PERIOD. read table bapi_tab with key FIS_PERIOD = pos. if sy-subrc = 0. yu = yu + bapi_tab-PER_SALES. endif.
free bapi_tab[]. CALL FUNCTION 'BAPI_GL_ACC_GETPERIODBALANCES' EXPORTING companycode = s_bukrs glacct = itab_saknr-saknr fiscalyear = t_gjahr1 currencytype = curr_type* IMPORTING* BALANCE_CARRIED_FORWARD =* RETURN = tables account_balances = bapi_tab[] .
read table bapi_tab with key FIS_PERIOD = pos . if sy-subrc = 0. yu_s = yu_s + bapi_tab-PER_SALES. endif.
endloop. itab_alv-wrbtr = yu . itab_alv-wrbtr1 = yu_s. itab_alv-txt20 = '加:期初现金及现金等价物余额'. itab_alv-row = 37. APPEND itab_alv.
endform.
*
*&---------------------------------------------------------------------**& Form do38*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** --> p1 text* <-- p2 text*----------------------------------------------------------------------*form do38 .
endform. " do38