用到的是MIGO对应的BAPI:BAPI_GOODSMVT_CREATE
序列号是通过创建物料凭证时,BAPI下的GOODSMVT_SERIALNUMBER结构传入。
对应前台的界面如下:
代码如下:
DATA: LS_GOODSMVT_HEADER TYPE BAPI2017_GM_HEAD_01,
LS_GOODSMVT_CODE TYPE BAPI2017_GM_CODE,
LV_TESTRUN TYPE BAPI2017_GM_GEN-TESTRUN,
LT_GOODSMVT_ITEM LIKE TABLE OF BAPI2017_GM_ITEM_CREATE,
LS_GOODSMVT_ITEM LIKE LINE OF LT_GOODSMVT_ITEM,
LT_GOODSMVT_SERIALNUMBER LIKE TABLE OF BAPI2017_GM_SERIALNUMBER,
LS_GOODSMVT_SERIALNUMBER LIKE LINE OF LT_GOODSMVT_SERIALNUMBER,
LT_RETURN TYPE TABLE OF BAPIRET2,
LS_RETURN LIKE LINE OF LT_RETURN.
"输出参数
DATA:LS_GOODSMVT_HEADRET TYPE BAPI2017_GM_HEAD_RET,
LV_MBLNR TYPE BAPI2017_GM_HEAD_RET-MAT_DOC,
LV_YEAR TYPE BAPI2017_GM_HEAD_RET-DOC_YEAR.
DATA: LV_MSG TYPE STRING.
DATA: LT_BAPI TYPE TABLE OF TY_OUTPUT,
LS_BAPI TYPE TY_OUTPUT.
DATA: LT_EKPO TYPE TABLE OF EKPO.
LT_BAPI[] = GT_OUTPUT[].
DELETE LT_BAPI WHERE SLBOX EQ ''.
SORT LT_BAPI BY ZZSO EBELN.
DELETE ADJACENT DUPLICATES FROM LT_BAPI COMPARING ZZSO EBELN.
"根据采购订单来进行收货入库,一个采购订单只做一次操作
"根据采购订单进行收货入库,那么需要根据采购订单取出采购订单的行项目
IF LT_BAPI IS NOT INITIAL .
SELECT *
INTO CORRESPONDING FIELDS OF TABLE LT_EKPO
FROM EKPO
FOR ALL ENTRIES IN LT_BAPI
WHERE EBELN EQ LT_BAPI-EBELN.
ENDIF.
LOOP AT LT_BAPI ASSIGNING FIELD-SYMBOL(<FW_BAPI>).
IF <FW_BAPI>-MBLNR IS NOT INITIAL.
CLEAR GS_OUTPUT.
GS_OUTPUT-LIGHT = ICON_RED_LIGHT.
GS_OUTPUT-MESSAGE = '该采购订单已入库,请不要重复操作'.
MODIFY GT_OUTPUT FROM GS_OUTPUT TRANSPORTING LIGHT MESSAGE
WHERE EBELN EQ <FW_BAPI>-EBELN.
CONTINUE.
ENDIF.
"HEAD
LS_GOODSMVT_HEADER-PSTNG_DATE = SY-DATUM."凭证中的过帐日期
LS_GOODSMVT_HEADER-DOC_DATE = SY-DATUM."凭证中的凭证日期
LS_GOODSMVT_HEADER-PR_UNAME = SY-UNAME.
LS_GOODSMVT_CODE-GM_CODE = '01'.
LOOP AT LT_EKPO ASSIGNING FIELD-SYMBOL(<LW_EKPO>) WHERE EBELN EQ <FW_BAPI>-EBELN.
"ITEM
LS_GOODSMVT_ITEM-MATERIAL_LONG = <LW_EKPO>-MATNR. "物料
LS_GOODSMVT_ITEM-PLANT = <LW_EKPO>-WERKS. "工厂
LS_GOODSMVT_ITEM-STGE_LOC = <LW_EKPO>-LGORT. "库存地点
LS_GOODSMVT_ITEM-MVT_IND = 'B'.
* LS_GOODSMVT_ITEM-ITEM_TEXT = <LW_EKPO>-SGTXT."文本
LS_GOODSMVT_ITEM-ENTRY_QNT = <LW_EKPO>-MENGE."数量
LS_GOODSMVT_ITEM-MOVE_TYPE = '101'. "移动类型
LS_GOODSMVT_ITEM-PO_NUMBER = <LW_EKPO>-EBELN. "采购订单
LS_GOODSMVT_ITEM-PO_ITEM = <LW_EKPO>-EBELP. "采购订单行项目
"单位
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
INPUT = <LW_EKPO>-MEINS
* LANGUAGE = SY-LANGU
IMPORTING
OUTPUT = LS_GOODSMVT_ITEM-ENTRY_UOM
EXCEPTIONS
UNIT_NOT_FOUND = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
APPEND LS_GOODSMVT_ITEM TO LT_GOODSMVT_ITEM.
CLEAR: LS_GOODSMVT_ITEM.
CLEAR LS_GOODSMVT_SERIALNUMBER.
LS_GOODSMVT_SERIALNUMBER-MATDOC_ITM = <LW_EKPO>-EBELP.
CLEAR GS_OUTPUT.
LOOP AT GT_OUTPUT INTO GS_OUTPUT WHERE EBELN = <LW_EKPO>-EBELN
AND MATNR = <LW_EKPO>-MATNR
AND KBET1 = <LW_EKPO>-NETPR.
LS_GOODSMVT_SERIALNUMBER-SERIALNO = GS_OUTPUT-SERNR. "传入序列号
APPEND LS_GOODSMVT_SERIALNUMBER TO LT_GOODSMVT_SERIALNUMBER.
ENDLOOP.
ENDLOOP.
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
GOODSMVT_HEADER = LS_GOODSMVT_HEADER
GOODSMVT_CODE = LS_GOODSMVT_CODE
* TESTRUN = ' '
* GOODSMVT_REF_EWM =
IMPORTING
GOODSMVT_HEADRET = LS_GOODSMVT_HEADRET
MATERIALDOCUMENT = LV_MBLNR
MATDOCUMENTYEAR = LV_YEAR
TABLES
GOODSMVT_ITEM = LT_GOODSMVT_ITEM
GOODSMVT_SERIALNUMBER = LT_GOODSMVT_SERIALNUMBER
RETURN = LT_RETURN
* GOODSMVT_SERV_PART_DATA =
* EXTENSIONIN =
.
READ TABLE LT_RETURN INTO LS_RETURN WITH KEY TYPE = 'E'.
IF SY-SUBRC = 0."说明有错误
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
CLEAR LV_MSG.
LOOP AT LT_RETURN INTO LS_RETURN WHERE TYPE = 'E'.
LV_MSG = LV_MSG && LS_RETURN-MESSAGE.
ENDLOOP.
CLEAR GS_OUTPUT.
GS_OUTPUT-LIGHT = ICON_RED_LIGHT.
GS_OUTPUT-MESSAGE = '收货入库失败:' && LV_MSG.
MODIFY GT_OUTPUT FROM GS_OUTPUT TRANSPORTING LIGHT MESSAGE
WHERE EBELN EQ <FW_BAPI>-EBELN.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
"更新alv消息与字段
CLEAR GS_OUTPUT.
GS_OUTPUT-MBLNR = LV_MBLNR.
GS_OUTPUT-LIGHT = ICON_GREEN_LIGHT.
GS_OUTPUT-MESSAGE = '收货入库成功:' && LV_MBLNR.
MODIFY GT_OUTPUT FROM GS_OUTPUT TRANSPORTING LIGHT MESSAGE MBLNR
WHERE EBELN EQ <FW_BAPI>-EBELN.
ENDIF.
CLEAR: LS_GOODSMVT_HEADER,
LS_GOODSMVT_CODE,
LV_TESTRUN,
LS_GOODSMVT_ITEM,LT_GOODSMVT_ITEM,
LS_GOODSMVT_SERIALNUMBER,LT_GOODSMVT_SERIALNUMBER,
LS_RETURN,LT_RETURN,
LS_GOODSMVT_HEADRET,
LV_MBLNR,
LV_YEAR.
ENDLOOP.
OVER…