前言
使用BDC可能会遇到错误无法报出,转而使用BAPI
KE21N创建凭证BAPI及范例
使用到的BAPI:
BAPI_COPAACTUALS_POSTCOSTDATA
一、范例代码
DATA:lv_num TYPE int4,
lv_op TYPE bapi0017-op_concern,
lt_pa_data TYPE STANDARD TABLE OF bapi_copa_data WITH HEADER LINE,
lt_field TYPE STANDARD TABLE OF bapi_copa_field WITH HEADER LINE,
lt_return TYPE STANDARD TABLE OF bapiret2 WITH HEADER LINE,
ls_return TYPE bapiret2,
l_perio TYPE jahrper,
l_flag TYPE char01.
lv_op = '1100'.
lv_num = 1.
LOOP AT i_cwf_in.
CLEAR ls_ztslot_fee_int.
MOVE-CORRESPONDING i_cwf_in TO ls_ztslot_fee_int.
IF i_type IS INITIAL OR i_type = '0' OR i_type = 'A'.
* * 外部接口调用时, 因为前面变过一次符号。 存表时,按着原始数据存储。
ls_ztslot_fee_int-inttbunkchg = 0 - i_cwf_in-inttbunkchg.
ls_ztslot_fee_int-loadchg = 0 - i_cwf_in-loadchg.
ls_ztslot_fee_int-trfchg = 0 - i_cwf_in-trfchg.
ls_ztslot_fee_int-feetype = '1'.
ENDIF.
* BAPI方式POST
CLEAR:lt_pa_data[],lt_pa_data,lt_field[],lt_field,l_flag.
* 记录类型
PERFORM frm_add_pa_data USING lv_num 'VRGAR' 'B' '' CHANGING lt_pa_data[] lt_field[].
* 记账日期
PERFORM frm_add_pa_data USING lv_num 'BUDAT' i_budat '' CHANGING lt_pa_data[] lt_field[].
* 年度期间
CONCATENATE i_budat+0(4) '0' i_budat+4(2) INTO l_perio.
PERFORM frm_add_pa_data USING lv_num 'PERIO' l_perio '' CHANGING lt_pa_data[] lt_field[].
* 用户名
PERFORM frm_add_pa_data USING lv_num 'USNAM' sy-uname '' CHANGING lt_pa_data[] lt_field[].
* 年度
PERFORM frm_add_pa_data USING lv_num 'GJAHR' i_budat+0(4) '' CHANGING lt_pa_data[] lt_field[].
* 期间
PERFORM frm_add_pa_data USING lv_num 'PERDE' i_budat+4(2) '' CHANGING lt_pa_data[] lt_field[].
* 公司代码
PERFORM frm_add_pa_data USING lv_num 'BUKRS' i_cwf_in-comcd '' CHANGING lt_pa_data[] lt_field[].
* 航次
PERFORM frm_add_pa_data USING lv_num 'WWD34' i_cwf_in-voy '' CHANGING lt_pa_data[] lt_field[].
* 船名
PERFORM frm_add_pa_data USING lv_num 'WWD36' i_cwf_in-vslcd '' CHANGING lt_pa_data[] lt_field[].
* 航向
PERFORM frm_add_pa_data USING lv_num 'WWD37' i_cwf_in-leg '' CHANGING lt_pa_data[] lt_field[].
* 挂港
PERFORM frm_add_pa_data USING lv_num 'WWD42' i_cwf_in-tmpport '' CHANGING lt_pa_data[] lt_field[].
* 航线
PERFORM frm_add_pa_data USING lv_num 'WWD03' i_cwf_in-service '' CHANGING lt_pa_data[] lt_field[].
* 收入成本属性
PERFORM frm_add_pa_data USING lv_num 'WWD28' i_cwf_in-arc '' CHANGING lt_pa_data[] lt_field[].
* 币种
PERFORM frm_add_pa_data USING lv_num 'FRWAE' i_cwf_in-curr '' CHANGING lt_pa_data[] lt_field[].
* 汇率
PERFORM frm_add_pa_data USING lv_num 'KURSF' i_cwf_in-exchgr '' CHANGING lt_pa_data[] lt_field[].
* 中转费
PERFORM frm_add_pa_data USING lv_num 'VVC07' i_cwf_in-trfchg i_cwf_in-curr CHANGING lt_pa_data[] lt_field[].
* 内部交易舱位费
PERFORM frm_add_pa_data USING lv_num 'VVA04' i_cwf_in-inttbunkchg i_cwf_in-curr CHANGING lt_pa_data[] lt_field[].
* 装卸费
PERFORM frm_add_pa_data USING lv_num 'VVC03' i_cwf_in-loadchg i_cwf_in-curr CHANGING lt_pa_data[] lt_field[].
REFRESH lt_return.
* POST
CALL FUNCTION 'BAPI_COPAACTUALS_POSTCOSTDATA'
EXPORTING
operatingconcern = lv_op
testrun = ''
TABLES
inputdata = lt_pa_data
fieldlist = lt_field
return = lt_return.
READ TABLE lt_return WITH KEY type = 'E' .
IF sy-subrc = 0.
l_flag = 'X'.
ENDIF.
READ TABLE lt_return WITH KEY type = 'A'.
IF sy-subrc = 0.
l_flag = 'X'.
ENDIF.
IF l_flag = 'X'."FAIL
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .
lv_message = '生成失败!'.
LOOP AT lt_return[] INTO ls_return.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = ls_return-id
msgnr = ls_return-number
msgv1 = ls_return-message_v1
msgv2 = ls_return-message_v2
msgv3 = ls_return-message_v3
msgv4 = ls_return-message_v4
IMPORTING
message_text_output = lv_message.
CONCATENATE lv_message ls_ztslot_fee_int-message INTO ls_ztslot_fee_int-message SEPARATED BY '/'.
ENDLOOP.
IF i_type = 'A'.
ls_ztslot_fee_int-status = 'A'.
ELSE.
ls_ztslot_fee_int-status = '0'.
ENDIF.
ELSE. "SEC
wmsg-msgtyp = 'S'.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
lv_message = '生成成功!'.
READ TABLE lt_return[] INTO ls_return INDEX 1.
IF sy-subrc EQ 0.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = ls_return-id
msgnr = ls_return-number
msgv1 = ls_return-message_v1
msgv2 = ls_return-message_v2
msgv3 = ls_return-message_v3
msgv4 = ls_return-message_v4
IMPORTING
message_text_output = lv_message.
CONCATENATE lv_message ls_ztslot_fee_int-message INTO ls_ztslot_fee_int-message SEPARATED BY '/'.
ENDIF.
IF i_type = 'A'.
ls_ztslot_fee_int-status = 'S'.
ls_ztslot_fee_int-ke21ndoc3 = ls_return-message_v1.
ELSE.
ls_ztslot_fee_int-status = '0'.
ls_ztslot_fee_int-ke21ndoc1 = ls_return-message_v1.
ENDIF.
ENDIF.
* END ADD
ls_ztslot_fee_int-budat = i_budat.
ls_ztslot_fee_int-upd_time = sy-uzeit.
ls_ztslot_fee_int-upd_date = sy-datum.
MODIFY ztslot_fee_int FROM ls_ztslot_fee_int.
IF sy-subrc = 0.
COMMIT WORK.
ELSE.
ROLLBACK WORK.
ENDIF.
MOVE-CORRESPONDING i_cwf_in TO ls_fee_internal_ret.
IF wmsg-msgtyp <> 'S'.
ls_fee_internal_ret-status = 'E'.
ELSE.
ls_fee_internal_ret-status = 'S'.
ENDIF.
ls_fee_internal_ret-message = ls_ztslot_fee_int-message.
APPEND ls_fee_internal_ret TO e_fee_internal.
CLEAR ls_fee_internal_ret.
ENDLOOP.
FORM frm_add_pa_data USING iv_num
iv_fieldname
iv_value
iv_currency
CHANGING ct_pa_data LIKE pa_data
ct_field LIKE pa_field.
DATA:ls_data TYPE bapi_copa_data,
ls_field TYPE bapi_copa_field.
ls_data-record_id = iv_num.
ls_data-fieldname = iv_fieldname.
ls_data-value = iv_value.
ls_data-currency = iv_currency.
APPEND ls_data TO ct_pa_data.
ls_field-fieldname = iv_fieldname.
APPEND ls_field TO ct_field.
ENDFORM.
二、获取凭证号
使用这个BAPI会有一个问题 成功以后不会返回凭证编号
RETURN内表也为空
如果需要凭证号,得去做增强
有两种方法 具体可参照传送门
https://community.sap.com/t5/application-development-blog-posts/to-get-copa-document-number-returned-by-quot-bapi-copaactuals-postcostdata/ba-p/13249862
总结
以上。