系统定义了一套会计科目,但是出总账分类账的时候要用到另外一套财务报表版本,如下:
这个可以通过标准程序RFGSBSTR输入版本号即可得到这个关系,但是程序如何做这样的转换了?有两个函数非常好用FI_IMPORT_BALANCE_SHEET_TEXT 和FI_IMPORT_BALANCE_SHEET_POS 一个读文本一个保存二者之间的关系。我写了一个仅限于获取一级科目的函数,如下:
DATA: l_idcn_cdea TYPE idcn_cdea,
l_idcn_cflea TYPE idcn_cflea.
"获取文本用
DATA: lt_rf011q TYPE STANDARD TABLE OF rf011q,
ls_rf011q TYPE rf011q.
"获取转换科目用
DATA: lt_rf011z TYPE STANDARD TABLE OF rf011z,
ls_rf011z TYPE rf011z.
"获取文本信息
CALL FUNCTION 'FI_IMPORT_BALANCE_SHEET_TEXT'
EXPORTING
sprache = '1'
version = i_version
TABLES
x011q = lt_rf011q
* TSTAMP_TAB =
* EXCEPTIONS
* TEXT_NOT_FOUND = 1
* OTHERS = 2
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
SELECT SINGLE idcn_cflea
FROM idcn_detail_ea
INTO l_idcn_cflea
WHERE idcn_cdea IN ( SELECT idcn_cdea
FROM idcn_map_eas
WHERE saknr = i_racct AND fkber = i_rfarea ).
"判断是否有功能范围
IF sy-subrc = 0.
"科目编号
e_racct = l_idcn_cflea+0(4).
"获取文本
READ TABLE lt_rf011q INTO ls_rf011q WITH KEY ergsl = l_idcn_cflea BINARY SEARCH.
e_txt = ls_rf011q-txt45.
* "没有功能范围转换为对应的一级科目和文本
ELSE.
CALL FUNCTION 'FI_IMPORT_BALANCE_SHEET_POS'
EXPORTING
version = i_version
TABLES
i011z = lt_rf011z
* X011P =
* X011S =
* X011V =
* X011F =
* EXCEPTIONS
* NEW_BALANCE_SHEET = 1
* OTHERS = 2
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDIF.
"找到对应的科目
LOOP AT lt_rf011z INTO ls_rf011z.
IF ls_rf011z-bilkt >= i_racct AND ls_rf011z-vonkt <= i_racct.
exit.
ENDIF.
ENDLOOP.
READ TABLE lt_rf011q INTO ls_rf011q WITH KEY ergsl = ls_rf011z-ERGSO+0(4) BINARY SEARCH.
e_txt = ls_rf011q-txt45.
自己以前写这类财务的东西,通常自建表,个人觉得达到了可配置的目的。但是毕竟还是没有标准的好,以后都不需要去维护代码了,只需要维护标准的东西即可。这个思路非常好。