MIGO收货BAPI:
DATA:lt_zsdt008 TYPE TABLE OF zsdt008,
ls_zsdt008 LIKE LINE OF lt_zsdt008,
ls_zsdt008_2 LIKE LINE OF lt_zsdt008,
ls_zsdt014 TYPE zsdt014,
lt_zsdt014 TYPE TABLE OF zsdt014,
lt_zsdt013 TYPE TABLE OF zsdt013,
ls_zsdt013 LIKE LINE OF lt_zsdt013,
lt_zsdt013_2 TYPE TABLE OF zsdt013,
ls_zsdt013_2 LIKE LINE OF lt_zsdt013,
lt_zsdt012 TYPE TABLE OF zsdt012,
ls_zsdt012 LIKE LINE OF lt_zsdt012,
ls_ekpo TYPE ekpo,
lt_ekpo TYPE TABLE OF ekpo.
DATA:lv_ebeln TYPE ekko-ebeln,
lv_vbeln TYPE vbap-vbeln,
lv_tabix TYPE sy-tabix.
DATA:goodsmvt_header LIKE bapi2017_gm_head_01,
goodsmvt_item LIKE TABLE OF bapi2017_gm_item_create WITH HEADER LINE.
DATA:lv_zrfcid TYPE zsdt008-zrfcid.
DATA:lv_mjahr TYPE mjahr.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE lt_zsdt012
FROM zsdt012
WHERE zrfc_logid = i_id.
IF lt_zsdt012 IS INITIAL.
e_code = 'E'.
e_msg = '无可执行数据'.
RETURN.
ENDIF.
READ TABLE lt_zsdt012 INTO ls_zsdt012 INDEX 1.
SELECT SINGLE zrfcid INTO lv_zrfcid FROM zsdt008 WHERE objkey = ls_zsdt012-ebeln AND objtype = 'PO' AND canum = '0010'.
SELECT SINGLE *
FROM zsdt014
INTO ls_zsdt014
WHERE zrfcid = ls_zsdt012-zrfcid
AND canum = i_canum
AND zzrfcid = lv_zrfcid.
SORT lt_zsdt012 BY mblnr zeile.
LOOP AT lt_zsdt012 INTO ls_zsdt012.
CLEAR:ls_zsdt008,ls_zsdt008_2.
SELECT SINGLE *
FROM zsdt008
INTO ls_zsdt008"源头采购订单
WHERE objkey = ls_zsdt012-ebeln
AND zrfcid = ls_zsdt014-zzrfcid.
CHECK ls_zsdt008 IS NOT INITIAL.
SELECT SINGLE *
FROM zsdt008
INTO ls_zsdt008_2"当前采购订单
WHERE zrfc_logid = ls_zsdt008-zrfc_logid
AND canum = ls_zsdt014-zcanum.
SELECT SINGLE *
FROM ekpo
INTO ls_ekpo
WHERE ebeln = ls_zsdt008_2-objkey
AND ebelp = ls_zsdt012-ebelp.
goodsmvt_header-pstng_date = ls_zsdt012-budat."过帐日期.
goodsmvt_header-doc_date = ls_zsdt012-bldat."凭证日期.
goodsmvt_header-pr_uname = sy-uname."用户名
goodsmvt_header-ref_doc_no = ls_zsdt012-xblnr.
goodsmvt_item-material = ls_ekpo-matnr."物料
goodsmvt_item-plant = ls_ekpo-werks." 工厂
IF ls_ekpo-werks = '3189'.
goodsmvt_item-stge_loc = 'US01'.
ELSE.
goodsmvt_item-stge_loc = 'NX00'.
ENDIF.
* goodsmvt_item-entry_qnt = ls_zsdt012-zocdqty."数量
* goodsmvt_item-entry_qnt = ls_ekpo-menge."数量
SELECT SINGLE bstmg
INTO goodsmvt_item-entry_qnt
FROM mseg
WHERE mblnr = ls_zsdt012-mblnr
AND mjahr = ls_zsdt012-mjahr
AND zeile = ls_zsdt012-zeile.
SELECT COUNT(*)"启用批次
FROM marc
WHERE matnr = ls_ekpo-matnr
AND werks = ls_ekpo-werks
AND xchpf = 'X'.
SELECT SINGLE bsart INTO @DATA(lv_bsart) FROM ekko WHERE ebeln = @ls_zsdt008_2-objkey.
IF sy-subrc = 0.
goodsmvt_item-batch = ls_zsdt012-charg."批次
SELECT COUNT(*) FROM mcha
WHERE matnr = ls_ekpo-matnr
AND werks = ls_ekpo-werks
AND charg = ls_zsdt012-charg.
IF sy-subrc <> 0.
IF lv_bsart NE 'ZFAI' OR (
lv_bsart = 'ZFAI' AND
ls_zsdt012-charg NE '' ).
CALL FUNCTION 'Z_BATCH_A'
EXPORTING
zmatnr = ls_ekpo-matnr
zwerks = ls_ekpo-werks
zbatch = ls_zsdt012-charg
ztype = 'Y'
isrefbatch = 'Y'.
ENDIF.
ENDIF.
ENDIF.
goodsmvt_item-entry_uom = ls_ekpo-meins."单位
* goodsmvt_item-move_type = '101'. " 移动类型
SELECT SINGLE bwart INTO goodsmvt_item-move_type
FROM mseg
WHERE mblnr = ls_zsdt012-mblnr AND mjahr = ls_zsdt012-mjahr AND zeile = ls_zsdt012-zeile.
* GOODSMVT_ITEM-MOVE_REAS = LS_ZSDT012-GRUND."移动原因
goodsmvt_item-mvt_ind = 'B'."移动标识:B 按照PO进行的货物移动
goodsmvt_item-po_number = ls_zsdt008_2-objkey. "采购订单
goodsmvt_item-po_item = ls_zsdt012-ebelp. "行项目
SELECT SINGLE insmk
INTO goodsmvt_item-stck_type
FROM ekpo
WHERE ebeln = goodsmvt_item-po_number
AND ebelp = goodsmvt_item-po_item.
APPEND goodsmvt_item.
CLEAR goodsmvt_item.
lv_mjahr = ls_zsdt012-mjahr.
AT END OF mblnr.
ls_zsdt013_2-canum = i_canum.
ls_zsdt013_2-zzrfc_logid = ls_zsdt008_2-zrfc_logid.
ls_zsdt013_2-zcanum = ls_zsdt008_2-canum.
ls_zsdt013_2-objkey = ls_zsdt008_2-objkey.
ls_zsdt013_2-zrfcid = ls_zsdt014-zrfcid.
ls_zsdt013_2-zrfc_logid = i_id.
ls_zsdt013_2-mblnr = ls_zsdt012-mblnr.
ls_zsdt013_2-mjahr = lv_mjahr.
ls_zsdt013_2-zobjkey = ls_zsdt008-objkey.
ls_zsdt013_2-zobjtype = ls_zsdt008-objtype.
APPEND ls_zsdt013_2 TO lt_zsdt013_2.
ENDAT.
ENDLOOP.
PERFORM create_gr TABLES et_return goodsmvt_item lt_zsdt013_2 USING i_id i_canum goodsmvt_header ls_zsdt014 CHANGING e_code e_msg e_flow_end.
REFRESH:goodsmvt_item,lt_zsdt013_2.
FORM create_gr TABLES p_et_return STRUCTURE zrfct005
p_goodsmvt_item STRUCTURE bapi2017_gm_item_create
p_lt_zsdt013 STRUCTURE zsdt013
USING p_i_id TYPE zrfc_logid
p_i_canum TYPE canum
p_goodsmvt_header TYPE bapi2017_gm_head_01
p_ls_zsdt014 TYPE zsdt014
CHANGING p_e_code
p_e_msg
p_e_flow_end.
DATA:message TYPE c LENGTH 200,
lt_return LIKE TABLE OF bapiret2 WITH HEADER LINE,
goodsmvt_item LIKE bapi2017_gm_item_create,
materialdocument TYPE bapi2017_gm_head_ret-mat_doc.
DATA:ls_zrfct005 TYPE zrfct005.
DATA:ls_zrfct002 TYPE zrfct002.
DATA:lt_zsdt013 LIKE TABLE OF zsdt013,
ls_zsdt013 LIKE LINE OF lt_zsdt013.
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
goodsmvt_header = p_goodsmvt_header
goodsmvt_code = '01'
IMPORTING
materialdocument = materialdocument
TABLES
goodsmvt_item = p_goodsmvt_item[]
return = lt_return.
CLEAR:message.
LOOP AT lt_return WHERE type = 'A' OR type = 'E' .
CONCATENATE message lt_return-message INTO message SEPARATED BY '/'.
ENDLOOP.
IF sy-subrc <> '0'.
CALL METHOD zcl_rfc=>get_source
EXPORTING
i_id = p_i_id
i_canum = p_i_canum
IMPORTING
e_zrfct002 = ls_zrfct002.
* RECEIVING
* R_SOURCE = DATA(LS_SOURCE).
LOOP AT p_lt_zsdt013 INTO ls_zsdt013.
ls_zsdt013-objtype = ls_zrfct002-objtype_save.
ls_zsdt013-zmblnr = materialdocument.
MODIFY p_lt_zsdt013 FROM ls_zsdt013.
ENDLOOP.
MODIFY zsdt013 FROM TABLE p_lt_zsdt013.
* CLEAR LT_ZSDT013[].
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
p_e_code = 'S'.
CONCATENATE 'GR:' materialdocument '收货成功' INTO p_e_msg.
CLEAR:ls_zrfct005.
ls_zrfct005-status = '53'.
ls_zrfct005-msgty = p_e_code.
ls_zrfct005-msgid = '00'.
ls_zrfct005-msgno = '001'.
ls_zrfct005-msgv1 = p_e_msg.
ls_zrfct005-msgv4 = materialdocument.
APPEND ls_zrfct005 TO p_et_return.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
p_e_code = 'E'.
p_e_msg = message.
ENDIF.
ENDFORM. " CREATE_GR