SAP XI常用的TCODE

现金流量表

 

用户输入:会计年度,会计期间,公司的代码。

显示现金流量表

 

程序逻辑:

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 显示数据。

 

 

执行效果

运行

运行2

 

程序代码

*&---------------------------------------------------------------------*
*& 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: '   销售商品,提供劳务收到的现金'   'A01',
                            收到的税费返还'   'A02',
                           '   收到其他与经营活动相关的现金'   '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:      '经营活动现金入小计'    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:   'TXT20'  '项目',
        'ROW'  '行次',
        'WRBTR'  '本年利润',
        '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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值