1.批量修改会计凭证抬头文本
CALL FUNCTION 'FI_DOCUMENT_CHANGE'
经测试该函数有些凭证没有起作用
通过BDC录屏实现
DATA:BEGIN OF gs_out_tab,
gjahr TYPE bseg-gjahr, "年度
bukrs TYPE bseg-bukrs, "公司
belnr TYPE bseg-belnr, "凭证
bktxt TYPE bkpf-bktxt, "抬头文本
sgtxt TYPE bseg-sgtxt, "项目文本
END OF gs_out_tab.
DATA: bdcdata LIKE bdcdata OCCURS 0 WITH HEADER LINE,
messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
DATA: gv_msg TYPE char100.
*修改抬头文本
PERFORM fm_bktxt.
FORM fm_bktxt.
"调用BDC需改凭证抬头
CLEAR: bdcdata[],messtab[].
PERFORM bdc_dynpro USING 'SAPMF05L' '0100'.
PERFORM bdc_field USING 'BDC_CURSOR'
'RF05L-BELNR'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'.
PERFORM bdc_field USING 'RF05L-BELNR'
gs_out_tab-belnr.
PERFORM bdc_field USING 'RF05L-BUKRS'
gs_out_tab-bukrs.
PERFORM bdc_field USING 'RF05L-GJAHR'
gs_out_tab-gjahr.
PERFORM bdc_dynpro USING 'SAPMF05L' '0700'.
PERFORM bdc_field USING 'BDC_CURSOR'
'BKPF-BELNR'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=VK'.
PERFORM bdc_dynpro USING 'SAPMF05L' '1710'.
PERFORM bdc_field USING 'BDC_CURSOR'
'BKPF-BKTXT'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=ENTR'.
PERFORM bdc_field USING 'BKPF-BKTXT'
gs_out_tab-bktxt.
PERFORM bdc_dynpro USING 'SAPMF05L' '0700'.
PERFORM bdc_field USING 'BDC_CURSOR'
'BKPF-BELNR'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=AE'.
CALL TRANSACTION 'FB02' USING bdcdata
MODE 'N'
UPDATE 'S'
MESSAGES INTO messtab.
LOOP AT messtab WHERE msgtyp = 'E' OR msgtyp = 'A'.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = messtab-msgid
msgnr = messtab-msgnr
msgv1 = messtab-msgv1
msgv2 = messtab-msgv2
msgv3 = messtab-msgv3
msgv4 = messtab-msgv4
IMPORTING
message_text_output = gv_msg.
ENDLOOP.
ENDFORM.
FORM bdc_dynpro USING program dynpro.
CLEAR bdcdata.
bdcdata-program = program.
bdcdata-dynpro = dynpro.
bdcdata-dynbegin = 'X'.
APPEND bdcdata.
ENDFORM.
FORM bdc_field USING fnam fval.
CLEAR bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = fval.
CONDENSE bdcdata-fval."去除空格
APPEND bdcdata.
ENDFORM.
2.批量修改会计凭证项目文本
CALL FUNCTION 'FI_ITEMS_MASS_CHANGE'
该函数实际也是调用BDC实现
注意:一个凭证有多行时需要检验凭证是否锁定
*修改项目文本
PERFORM fm_sgtxt.
FORM fm_sgtxt.
DATA:ls_bseg TYPE bseg,
lt_bseg TYPE TABLE OF bseg,
ls_buztab TYPE tpit_buztab,
lt_buztab TYPE TABLE OF tpit_buztab,
ls_fldtab TYPE tpit_fname,
lt_fldtab TYPE TABLE OF tpit_fname,
lt_return TYPE TABLE OF tpit_errdoc,
ls_return TYPE tpit_errdoc.
DATA:lt_seqg3 LIKE TABLE OF seqg3 WITH HEADER LINE,
lv_garg LIKE lt_seqg3-garg.
lv_garg = sy-mandt && gs_out_tab-bukrs && gs_out_tab-belnr && gs_out_tab-gjahr.
"获取会计凭证数据
SELECT *
INTO TABLE lt_bseg
FROM bseg
WHERE gjahr = gs_out_tab-gjahr
AND bukrs = gs_out_tab-bukrs
AND belnr = gs_out_tab-belnr.
LOOP AT lt_bseg INTO ls_bseg.
ls_bseg-sgtxt = gs_out_tab-sgtxt.
CLEAR:ls_buztab,lt_buztab,ls_fldtab,lt_fldtab,ls_return,lt_return.
MOVE-CORRESPONDING ls_bseg TO ls_buztab.
APPEND ls_buztab TO lt_buztab.
ls_fldtab-fname = 'SGTXT'.
ls_fldtab-aenkz = 'X'.
APPEND ls_fldtab TO lt_fldtab.
"校验解锁
DO.
CALL FUNCTION 'ENQUEUE_READ'
EXPORTING
guname = sy-uname
TABLES
enq = lt_seqg3.
READ TABLE lt_seqg3 WITH KEY gname = 'BKPF' garg = lv_garg.
IF sy-subrc NE 0.
EXIT.
ENDIF.
ENDDO.
"调取BAPI更改文本
CALL FUNCTION 'FI_ITEMS_MASS_CHANGE'
EXPORTING
s_bseg = ls_bseg
IMPORTING
errtab = lt_return
TABLES
it_buztab = lt_buztab
it_fldtab = lt_fldtab
EXCEPTIONS
bdc_errors = 1
OTHERS = 2.
IF lt_return IS NOT INITIAL.
READ TABLE lt_return INTO ls_return INDEX 1.
CLEAR gv_msg.
CALL FUNCTION 'FORMAT_MESSAGE'
EXPORTING
id = ls_return-err-msgid
no = ls_return-err-msgnr
v1 = ls_return-err-msgv1
v2 = ls_return-err-msgv2
v3 = ls_return-err-msgv3
v4 = ls_return-err-msgv4
IMPORTING
msg = gv_msg
EXCEPTIONS
not_found = 1
OTHERS = 2.
gv_msg = ls_bseg-buzei && gv_msg.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
ENDLOOP.
ENDFORM.