BAPI委外订单入库相比普通入库要多加三个字段,line_id、parent_id 、line_depth。
委外订单的上层只需要line_id,下层需要line_id、parent_id 、line_depth。
line_id唯一不重复,下层的parent_id 要等于上层的line_id,line_depth = ‘01’。
字段定义
DATA: BEGIN OF wa_bapi_header.
INCLUDE STRUCTURE bapi2017_gm_head_01.
DATA: END OF wa_bapi_header.
DATA: BEGIN OF wa_goodsmvt_code.
INCLUDE STRUCTURE bapi2017_gm_code.
DATA: END OF wa_goodsmvt_code.
DATA: BEGIN OF it_bapi_item OCCURS 0.
INCLUDE STRUCTURE bapi2017_gm_item_create.
DATA: END OF it_bapi_item.
DATA: BEGIN OF it_cmtmsg OCCURS 0.
INCLUDE STRUCTURE bapiret2.
DATA: END OF it_cmtmsg.
DATA:wa_ekpo LIKE ekpo.
DATA:g_mblnr LIKE mseg-mblnr,
g_mjahr LIKE mseg-mjahr,
g_bamng LIKE ekbe-bamng,
g_msg(100) TYPE c.
DATA:l_line_id TYPE mseg-line_id VALUE '000000',
l_parent_id TYPE mseg-parent_id VALUE '000000',
l_line_depth TYPE mseg-line_depth VALUE '00'.
内表赋值,调用BAPI
"抬头信息
* wa_bapi_header-pstng_date = sy-datum. "凭证中的凭证日期
wa_bapi_header-doc_date = p_budat.
IF wa_bapi_header-doc_date IS INITIAL.
wa_bapi_header-doc_date = sy-datum. "凭证记帐日期
ENDIF.
wa_bapi_header-pstng_date = p_budat.
IF wa_bapi_header-pstng_date IS INITIAL.
wa_bapi_header-pstng_date = sy-datum. "凭证记帐日期
ENDIF.
wa_bapi_header-header_txt = p_bktxt. "凭证抬头文本
wa_goodsmvt_code-gm_code = '01'. "GM CODE
"明细信息
LOOP AT it_out2 INTO wa_out WHERE check = 'X'." AND wtmng > 0 AND rsnum = ''.
SELECT SINGLE *
INTO wa_ekpo
FROM ekpo
WHERE ebeln = wa_out-ebeln
AND ebelp = wa_out-ebelp.
IF wa_out-rspos = ''.
it_bapi_item-move_type = '101'.
ELSE.
it_bapi_item-move_type = '543'.
ENDIF.
it_bapi_item-plant = wa_ekpo-werks.
it_bapi_item-stge_loc = wa_out-lgort.
it_bapi_item-po_number = wa_out-ebeln.
it_bapi_item-po_item = wa_out-ebelp.
it_bapi_item-entry_qnt = wa_out-wtmng.
it_bapi_item-entry_uom = wa_out-meins.
it_bapi_item-mvt_ind = 'B'.
IF wa_out-rsnum NE ''.
IF wa_out-rspos = ''.
l_line_id = l_line_id + 1.
l_parent_id = l_line_id.
it_bapi_item-line_id = l_line_id.
ELSE.
it_bapi_item-parent_id = l_parent_id.
l_line_id = l_line_id + 1.
it_bapi_item-line_id = l_line_id.
it_bapi_item-line_depth = '01'.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = wa_out-vbeln
IMPORTING
output = it_bapi_item-val_sales_ord.
it_bapi_item-val_s_ord_item = wa_out-vbelp.
ENDIF.
ENDIF.
IF wa_out-wtmng <= 0.
MESSAGE '此次收货数量必须大于0' TYPE 'S'.
EXIT.
ENDIF.
"补前导零
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = wa_out-matnr
IMPORTING
output = wa_out-matnr.
it_bapi_item-material = wa_out-matnr.
APPEND it_bapi_item.
CLEAR:it_bapi_item,wa_ekpo.
ENDLOOP.
IF it_bapi_item[] IS NOT INITIAL.
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
goodsmvt_header = wa_bapi_header
goodsmvt_code = wa_goodsmvt_code
IMPORTING
materialdocument = g_mblnr
matdocumentyear = g_mjahr
TABLES
goodsmvt_item = it_bapi_item
return = it_cmtmsg.
IF g_mblnr IS NOT INITIAL.
"提交
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
"删除已经过账的数据
DELETE it_out WHERE check = 'X' AND wtmng > 0 .
CONCATENATE '物料凭证:' g_mblnr '已经创建.' INTO g_msg.
MESSAGE g_msg TYPE 'S'.
ELSE.
"回滚
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
READ TABLE it_cmtmsg WITH KEY type = 'E'.
CONCATENATE '入库过账失败!' it_cmtmsg-message INTO g_msg.
MESSAGE g_msg TYPE 'E'.
EXIT.
ENDIF.
ENDIF.
CLEAR:wa_bapi_header,it_bapi_item,p_bktxt.
FREE:it_bapi_item.