资源描述
在SAP中用承诺项目出现金流量表(报表开发源代码)
可能使用到的外部数据 或 SAP数据表数据的格式、字段等:
fkrs 财务管理范围主记录表
fops 承诺项目主记录表
fmmp 现金预算管理行项目表
lfa1 供应商主记录表
kna1 客户主记录表
bsis 总帐未清项表
t001 公司代码主记录表
usr21 用户主记录表
adrp 用户地址表
bkpf 财务凭证抬头表
bseg 财务凭证行项目表
glt0 总帐科目期间余额表
直接法通过分析凭证的承诺项目来取数,SAP为该项功能定义了一个逻辑数据库C1F. 本程序
开始部分的逻辑数据库取数部分是SAP的标准程序,其功能是将与现金流量相关的数据装入内部表
G_T_FMMP, 这部分程序禁止修改。
直接法:
1、装入金流量表定义参数(FORM fill_item_direct)
该子程序将的现金流量表项和其对应的承诺项目装入内部表INT_CASHFLOW.
2、装入与现金流量相关的数据
这部分是逻辑数据库装入,属于SAP标准程序,数据关系比较复杂,建议不要做任何改动。
3、计算现金流量
计算的基本思路是对表G_T_FMMP进行循环,查找其中每条记录的承诺项目属于INT_CASHFLOW的
表项后,把其金额累计到相应表项。
REPORT zcmrp001 NO STANDARD PAGE HEADING LINE-SIZE 220.
TABLES: fkrs, fpos, fmmp, lfa1, kna1 ,bsis,
t001, usr21, adrp, bkpf, bseg, glt0.
DATA: BEGIN OF g_t_fmmp OCCURS 300,
fikrs LIKE fmmp-fikrs,
bukrs LIKE fmmp-bukrs,
fipos LIKE fmmp-fipos,
wrttp LIKE fmmp-wrttp,
gjahr LIKE fmmp-gjahr,
perio LIKE fmmp-perio,
zhldt LIKE fmmp-zhldt,
budat LIKE fmmp-budat,
gsber LIKE fmmp-gsber,
vo_saknr LIKE fmmp-vo_saknr,
lifnr LIKE fmmp-lifnr,
kunnr LIKE fmmp-kunnr,
fwaer LIKE fmmp-fwaer,
fkbtr LIKE fmsu-btr001,
zbelnr LIKE cooi-refbn,
zbuzei LIKE cooi-rfpos,
vo_bukrs LIKE fmmp-vo_bukrs,
vo_gjahr LIKE fmmp-vo_gjahr,
fitxt LIKE fkrs-fitxt,
fname LIKE ffnd-fname,
cname LIKE fctr-cname,
pname LIKE fpos-pname,
wtext LIKE fmmp-wtext,
END OF g_t_fmmp.
DATA: BEGIN OF g_t_fkrs OCCURS 20,
fikrs LIKE fkrs-fikrs,
fitxt LIKE fkrs-fitxt,
END OF g_t_fkrs.
DATA: BEGIN OF g_t_fpos OCCURS 200,
fipos LIKE fpos-fipos,
pname LIKE fpos-pname,
END OF g_t_fpos.
DATA: BEGIN OF g_t_lfa1 OCCURS 200,
lifnr LIKE lfa1-lifnr,
sortl LIKE lfa1-sortl,
END OF g_t_lfa1.
DATA: BEGIN OF g_t_kna1 OCCURS 200,
kunnr LIKE kna1-kunnr,
sortl LIKE kna1-sortl,
END OF g_t_kna1.
RANGES: r_kunnr FOR kna1-kunnr,
r_lifnr FOR lfa1-lifnr,
r_fipos FOR fmmp-fipos.
DATA: BEGIN OF int_cashflow OCCURS 100,
desc(66) TYPE c,
r_fipos(66) TYPE c,
com_fkbtr LIKE fmmp-fkbtr,
fi_fkbtr LIKE fmmp-fkbtr,
fi_fwaer LIKE fmmp-fwaer,
END OF int_cashflow.
DATA: BEGIN OF g_t_t001 OCCURS 300,
bukrs LIKE t001-bukrs,
butxt LIKE t001-butxt,
END OF g_t_t001.
DATA: pos TYPE i VALUE 0,
num_of_bukrs TYPE i VALUE 0.
DATA cashflow_detail.
DATA : min_budat LIKE fmmp-budat,
max_budat LIKE fmmp-budat,
z_min_budat LIKE sy-datum,
z_max_budat LIKE sy-datum,
z_bukrs LIKE fmmp-bukrs,
z_profit LIKE bseg-dmbtr, "净利润
z_bad_debit LIKE bseg-dmbtr, "坏帐准备及计提的资产减值准备
z_asset_dep LIKE bseg-dmbtr, "固定资产折旧
z_intang_dep LIKE bseg-dmbtr, "无形资产摊销
z_longpaid_dep LIKE bseg-dmbtr, "长期待摊费用摊销
z_paid_dec LIKE bseg-dmbtr, "待摊费用减少
z_accrul_inc LIKE bseg-dmbtr, "预提费用增加
z_asset_pro LIKE bseg-dmbtr, "固定资产,长期资产处置损失
z_asset_scr LIKE bseg-dmbtr, "固定资产报废损失
z_fi_expen LIKE bseg-dmbtr, "财务费用
z_invest_loss LIKE bseg-dmbtr, "投资损失
z_defer_tax LIKE bseg-dmbtr, "递延税款贷项
z_stock LIKE bseg-dmbtr, "存货减少
z_ar LIKE bseg-dmbtr, "经营性应收减少
z_ap LIKE bseg-dmbtr, "经营性应付增加
z_other LIKE bseg-dmbtr, "其他
z_production LIKE bseg-dmbtr, "经营活动产生的现金净额
z_loss LIKE bseg-dmbtr, "总公司下拨弥补亏损
z_asset_debit LIKE bseg-dmbtr, "以固定资产偿还债务
z_invest_debit LIKE bseg-dmbtr, "以投资偿还债务
z_asset_invest LIKE bseg-dmbtr, "以固定资产投资
z_stock_debit LIKE bseg-dmbtr, "以存货偿还债务
z_asset_rented LIKE bseg-dmbtr, "融资租赁固定资产
z_donation LIKE bseg-dmbtr, "接受捐赠非现金资产
z_debit_short LIKE bseg-dmbtr, "偿还的经营性债务
z_debit_equit LIKE bseg-dmbtr, "债务转为资本
z_bond_due LIKE bseg-dmbtr, "一年内到期的可转换公司债券
z_money_init LIKE bseg-dmbtr, "货币资金期初余额
z_money_end LIKE bseg-dmbtr, "货币资金期末余额
z_cashs_init LIKE bseg-dmbtr, "现金等价物期初余额
z_cashs_end LIKE bseg-dmbtr, "现金等价物期末余额
z_all_money LIKE bseg-dmbtr. "货币资金及现金等价物净变动
DATA: BEGIN OF itb0 OCCURS 0,
txt(70) TYPE c,
num LIKE bseg-dmbtr,
END OF itb0,
mtxt(70) TYPE c.
**INITIALIZATION.
PERFORM fill_item_direct.
*START-OF-SELECTION.
GET fkrs.
g_t_fkrs-fikrs = fkrs-fikrs.
g_t_fkrs-fitxt = fkrs-fitxt.
APPEND g_t_fkrs.
GET fpos.
g_t_fpos-fipos = fpos-fipos.
g_t_fpos-pname = fpos-pname.
COLLECT g_t_fpos.
GET fmmp.
MOVE-CORRESPONDING fmmp TO g_t_fmmp.
CASE fmmp-wrttp.
WHEN '50' OR '51'. " purchase order
g_t_fmmp-zbelnr = fmmp-ebeln.
g_t_fmmp-zbuzei = fmmp-ebelp.
WHEN '64'. " payment transfer
g_t_fmmp-zbelnr = fmmp-kblnr.
g_t_fmmp-zbuzei = fmmp-kblpos.
WHEN '65'. " funds commitments
g_t_fmmp-zbelnr = fmmp-kblnr.
g_t_fmmp-zbuzei = fmmp-kblpos.
WHEN OTHERS. " Fi documents
g_t_fmmp-zbelnr = fmmp-vo_belnr.
g_t_fmmp-zbuzei = fmmp-vo_buzei.
ENDCASE.
APPEND g_t_fmmp.
IF NOT fmmp-kunnr IS INITIAL.
r_kunnr-sign = 'I'.
r_kunnr-option = 'EQ'.
r_kunnr-low = fmmp-kunnr.
COLLECT r_kunnr.
ENDIF.
IF NOT fmmp-lifnr IS INITIAL.
r_lifnr-sign = 'I'.
r_lifnr-option = 'EQ'.
r_lifnr-low = fmmp-lifnr.
COLLECT r_lifnr.
ENDIF.
END-OF-SELECTION.
SORT g_t_fmmp BY fikrs bukrs fipos wrttp gjahr
perio zhldt zbelnr
zbuzei bukrs vo_saknr.
RANGES: lr_lifnr FOR lfa1-lifnr,
lr_kunnr FOR kna1-kunnr.
DATA: l_cnt_from LIKE sy-tabix VALUE 1,
l_cnt_to LIKE sy-tabix VALUE 50,
l_cnt_lines LIKE sy-tabix.
* "/ Lesen Kreditoren-Texte aus Stammdaten-Tabelle
IF NOT r_lifnr IS INITIAL.
LOOP AT r_lifnr WHERE low = '*'.
DELETE r_lifnr.
ENDLOOP.
DESCRIBE TABLE r_lifnr LINES l_cnt_lines. "<- insert
IF l_cnt_lines <= 50. "<- insert
* "/ Lieferanten-Kurztexte auf einmal einlesen "<- insert
SELECT lifnr sortl FROM lfa1
INTO CORRESPONDING FIELDS OF TABLE g_t_lfa1
WHERE lifnr IN r_lifnr.
ELSE. "<- insert
* "/ Lieferanten-Kurztexte in Bloecken einlesen "<- insert
DO. "<- insert
* "/ Bloecke zu je 50 Leferanten bilden "<- insert
REFRESH lr_lifnr. "<- insert
LOOP AT r_lifnr FROM l_cnt_from TO l_cnt_to. "<- insert
lr_lifnr = r_lifnr. "<- insert
APPEND lr_lifnr. "<- insert
ENDLOOP. "<- insert
IF sy-subrc NE 0. "<- insert
EXIT. "<- insert
ENDIF. "<- insert
l_cnt_from = l_cnt_to + 1. "<- insert
l_cnt_to = l_cnt_from + 50. "<- insert
* "/ Lieferanten-Kurztexte lesen "<- insert
SELECT lifnr sortl FROM lfa1 "<- insert
APPENDING CORRESPONDING FIELDS "<- insert
OF TABLE g_t_lfa1 "<- insert
WHERE lifnr IN lr_lifnr. "<- insert
ENDDO. "<- insert
ENDIF. "<- insert
ENDIF.
* "/ Lesen Debitoren-Texte aus Stammdaten-Tabelle
IF NOT r_kunnr IS INITIAL.
LOOP AT r_kunnr WHERE low = '*'.
DELETE r_kunnr.
ENDLOOP.
DESCRIBE TABLE r_kunnr LINES l_cnt_lines. "<- insert
IF l_cnt_lines <= 50. "<- insert
* "/ Kunden-Kurztexte auf einmal einlesen "<- insert
SELECT kunnr sortl FROM kna1
INTO CORRESPONDING FIELDS OF TABLE g_t_kna1
WHERE kunnr IN r_kunnr.
ELSE. "<- insert
* "/ Kunden-Kurztexte in Bloecken einlesen "<- insert
DO. "<- insert
* "/ Bloecke zu je 50 Kunden bilden "<- insert
REFRESH lr_kunnr. "<- insert
LOOP AT r_kunnr FROM l_cnt_from TO l_cnt_to. "<- insert
lr_kunnr = r_kunnr. "<- insert
APPEND lr_kunnr. "<- insert
ENDLOOP. "<- insert
IF sy-subrc NE 0. "<- insert
EXIT. "<- insert
ENDIF. "<- insert
l_cnt_from = l_cnt_to + 1. "<- insert
l_cnt_to = l_cnt_from + 50. "<- insert
* "/ Kunden-Kurztexte lesen "<- insert
SELECT kunnr sortl FROM kna1 "<- insert
APPENDING CORRESPONDING FIELDS "<- insert
OF TABLE g_t_kna1 "<- insert
WHERE kunnr IN lr_kunnr. "<- insert
ENDDO. "<- insert
ENDIF. "<- insert
ENDIF.
SELECT bukrs butxt FROM t001
INTO CORRESPONDING FIELDS OF TABLE g_t_t001.
DATA: l_sav_wrttp_text(30),
l_sav_fwaer LIKE fmmp-fwaer,
l_sav_butxt LIKE t001-butxt,
l_sav_hide_row_type(4).
num_of_bukrs = 0.
max_budat = 0.
min_budat = '99991231' .
LOOP AT g_t_fmmp.
IF min_budat > g_t_fmmp-budat .
min_budat = g_t_fmmp-budat .
ENDIF.
IF max_budat < g_t_fmmp-budat .
max_budat = g_t_fmmp-budat .
ENDIF.
l_sav_fwaer = g_t_fmmp-fwaer.
AT NEW fikrs.
LOOP AT int_cashflow.
CLEAR int_cashflow-fi_fkbtr.
MODIFY TABLE int_cashflow.
CLEAR int_cashflow.
ENDLOOP.
ENDAT.
AT NEW bukrs.
PERFORM read_bukrs_text USING g_t_fmmp-bukrs
CHANGING g_t_t001-butxt.
l_sav_butxt = g_t_t001-butxt.
LOOP AT int_cashflow.
CLEAR int_cashflow-com_fkbtr.
MODIFY TABLE int_cashflow.
CLEAR int_cashflow.
ENDLOOP.
ENDAT.
LOOP AT int_cashflow.
PERFORM input_range USING int_cashflow-r_fipos.
LOOP AT r_fipos.
IF r_fipos-option = 'EQ'.
IF r_fipos-low = g_t_fmmp-fipos.
int_cashflow-fi_fkbtr = int_cashflow-fi_fkbtr
+ g_t_fmmp-fkbtr.
int_cashflow-com_fkbtr = int_cashflow-com_fkbtr
+ g_t_fmmp-fkbtr.
ENDIF.
ENDIF.
IF r_fipos-option = 'BT'.
IF g_t_fmmp-fipos >= r_fipos-low AND
g_t_fmmp-fipos <= r_fipos-high.
int_cashflow-fi_fkbtr = int_cashflow-fi_fkbtr
+ g_t_fmmp-fkbtr.
int_cashflow-com_fkbtr = int_cashflow-com_fkbtr
+ g_t_fmmp-fkbtr.
ENDIF.
ENDIF.
ENDLOOP.
MODIFY TABLE int_cashflow.
CLEAR int_cashflow.
CLEAR r_fipos.
REFRESH r_fipos.
ENDLOOP .
AT END OF bukrs.
PERFORM cal_indirect USING g_t_fmmp-bukrs.
PERFORM output_info USING 'COM'.
num_of_bukrs = num_of_bukrs + 1.
ENDAT.
AT END OF fikrs.
IF num_of_bukrs NE 1.
CLEAR l_sav_butxt.
PERFORM output_info USING 'FI'.
ENDIF.
WRITE : / text-103.
ENDAT.
ENDLOOP.
TOP-OF-PAGE.
IF NOT ( s_budat-low IS INITIAL ).
min_budat = s_budat-low.
ENDIF.
IF NOT ( s_budat-high IS INITIAL ).
max_budat = s_budat-high.
ENDIF.
SKIP 2.
WRITE: /100 '现 金 流 量 表'.
WRITE: /.
WRITE: /210 '会年企03表'.
* IF min_budat(6) = max_budat(6).
* WRITE: /104 min_budat(4), '年', min_budat+4(2), '月',
* 202 '报表编号: 会商03表'.
* ELSE.
* WRITE: /097 '日期:',
* 103 min_budat, 113 '-' , 115 max_budat,
* 202 '报表编号: 会商03表'.
* ENDIF.
*
WRITE: /012 '编制单位: ', l_sav_butxt,
100 max_budat(4), '年', max_budat+4(2), '月',
max_budat+6(2), '日',
212 '单位: 元'.
WRITE: /011 sy-uline.
WRITE : /011 sy-vline, 040 ' 项 目',
085 sy-vline, 087 '行次', 093 sy-vline,
095 ' 金 额 ',
116 sy-vline, 148 '补充资料',
190 sy-vline, 192 '行次', 198 sy-vline,
' 金 额', 220 sy-vline.
WRITE: /011 sy-uline.
***********************************************************************
*
AT LINE-SELECTION.
CHECK l_sav_hide_row_type = 'EPOS'.
CALL FUNCTION 'FM_DOCUMENT_DISPLAY'
EXPORTING
i_wrttp = g_t_fmmp-wrttp
i_belnr = g_t_fmmp-zbelnr
i_blpos = g_t_fmmp-zbuzei
i_bukrs = g_t_fmmp-vo_bukrs
i_gjahr = g_t_fmmp-vo_gjahr.
***********************************************************************
*
AT USER-COMMAND.
CASE sy-ucomm.
WHEN 'SELE'.
SET PF-STATUS 'SELE'.
CALL FUNCTION 'FM_SELECTION_CRITERIA_PRINT'
EXPORTING
i_report_name = 'RFFMIEP5'
EXCEPTIONS
OTHERS = 1.
ENDCASE.
*&---------------------------------------------------------------------
*
*& Form READ_FIKRS_TEXT
*&---------------------------------------------------------------------
*
FORM read_fikrs_text USING u_fikrs
CHANGING c_fitxt.
g_t_fkrs = space.
g_t_fkrs-fikrs = u_fikrs.
READ TABLE g_t_fkrs.
IF sy-subrc = 0.
c_fitxt = g_t_
展开阅读全文