1 背景:业务要求需要创建一个批量冲销会计凭证的FM,包括多种会计凭证,但是MRKO产生的凭证并没有标准事务进行冲销。
2 实现:
2.1 创建FM入参:
2.2 代码范例:
DATA: wa_bapidochdrr TYPE bapiacrev,
lt_return TYPE TABLE OF bapiret2 WITH HEADER LINE.
DATA l_obj_key TYPE bapiacrev-obj_key .
DATA l_error TYPE char1 ."错误标志位
DATA ls_bkpf TYPE bkpf .
DATA l_belnr TYPE bkpf-belnr .
DATA l_bukrs TYPE bkpf-bukrs .
DATA l_belnr_cx TYPE bkpf-belnr .
CHECK pt_table[] IS NOT INITIAL .
LOOP AT pt_table .
CLEAR : wa_bapidochdrr , lt_return[] , l_error , ls_bkpf , l_belnr , l_bukrs , l_belnr_cx ,l_obj_key .
l_belnr = pt_table-belnr .
l_bukrs = pt_table-bukrs .
"前导0
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = l_belnr
IMPORTING
output = l_belnr.
SELECT SINGLE * FROM bkpf INTO ls_bkpf
WHERE bukrs = l_bukrs
AND belnr = l_belnr
AND gjahr = pt_table-gjahr .
IF sy-subrc <> 0 .
pt_table-status = 'E' . "
pt_table-message = '未找到凭证:' && pt_table-belnr.
MODIFY pt_table .
CONTINUE .
ENDIF.
* 给 BAPI 函数相应的参数赋值
wa_bapidochdrr-obj_type = ls_bkpf-awtyp.
wa_bapidochdrr-obj_key = ls_bkpf-awkey.
wa_bapidochdrr-obj_key_r = ls_bkpf-awkey.
wa_bapidochdrr-pstng_date = pt_table-budat.
wa_bapidochdrr-fis_period = pt_table-budat+4(2).
wa_bapidochdrr-comp_code = ls_bkpf-bukrs.
IF ls_bkpf-awtyp = 'BKPFF'.
wa_bapidochdrr-ac_doc_no = '$'. "OBJ_KEY字段已经包含了需要冲销凭证编号 ,所以不需要
ENDIF.
wa_bapidochdrr-reason_rev = pt_table-stgrd."冲销原因
* 取得系统 LOGICAL SYSTEM
CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
IMPORTING
own_logical_system = wa_bapidochdrr-obj_sys.
* 调用 BAPI 函数,冲销会计凭证
CALL FUNCTION 'BAPI_ACC_DOCUMENT_REV_POST'
EXPORTING
reversal = wa_bapidochdrr
bus_act = ls_bkpf-glvor
IMPORTING
obj_key = l_obj_key
TABLES
return = lt_return.
READ TABLE lt_return WITH KEY type = 'S' id = 'RW' number = '605' .
IF sy-subrc = 0.
* 提交凭证过账
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
IF ls_bkpf-awtyp = 'BKPFF'.
l_belnr_cx = l_obj_key(10).
ELSE.
SELECT SINGLE stblg INTO l_belnr_cx
FROM bkpf
WHERE bukrs = l_bukrs
AND belnr = l_belnr
AND gjahr = pt_table-gjahr .
ENDIF.
IF i_type = 'V'.
UPDATE rkwa SET status = '00'
belnr = ''
gjahr = '0000'
buzei = '000000'
WHERE bukrs = l_bukrs
AND belnr = l_belnr
AND gjahr = pt_table-gjahr .
COMMIT WORK AND WAIT .
ENDIF.
pt_table-stblg = l_belnr_cx ..
pt_table-status = 'S' . "
pt_table-message = '冲销成功!'.
ELSE.
l_error = 'X'.
ENDIF.
* 将返回信息添加到结果
IF l_error = 'X'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
SORT lt_return BY message .
DELETE ADJACENT DUPLICATES FROM lt_return COMPARING message .
LOOP AT lt_return WHERE type CA 'AEX' .
IF lt_return-id = 'RW'.
IF lt_return-number = 609 OR lt_return-number = 632 .
CONTINUE .
ENDIF.
ENDIF.
pt_table-status = 'E' .
pt_table-message = pt_table-message && ' ' && lt_return-id &&
lt_return-number && '/' && lt_return-message .
ENDLOOP.
ENDIF.
MODIFY pt_table .
ENDLOOP.