现金流量表
用户输入:会计年度,会计期间,公司的代码。
显示现金流量表
程序逻辑:
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