BAPI_GOODSMVT_CREATE (transfer, receipt, delivery, storage, return) BAPI

Some related transaction codes:

MB01 Goods movement by purchase order
MB31 Goods movement by production order
MB1A Goods Pickup (Work Order Return
MB1B transfer posting
MB1C other receipts
MB11 Goods movement
MB04 Post-Adjustment for “Material Supply” Consumption

Some related mobile logos:
Goods movement without reference (null)
B Goods movement by purchase order
F Goods movement related to production order
L Goods movement on delivery notification
K Goods Movement for Kanban Demand (WM – Internal only)
O “Supply Material” Subsequent Adjustments to Consumption
Subsequent adjustments to the W scale/product unit material

1. Transfer order (goods movement) ↓

FUNCTION zfunction.
*"---------------------------------------------- -----------------------
*"*"Local interface:
*" EXPORTING
*" VALUE(RSTYPE) TYPE XFELD
*" VALUE(RSMESG) TYPE STRING
*" VALUE(O_MBLNR) TYPE MBLNR
*" TABLES
*" ZMES_TORDER_REQ_I STRUCTURE ZMES_TORDER_REQ_I
*"---------------------------------------------- -----------------------
*Input table data: ZMES_TORDER_REQ_I (table structure)
* PSTNG_DATE type BUDAT posting date in document
* MATERIAL MATNR material number
* PLANT WERKS_D CHAR factory
* MOVE_PLANT UMWRK receiving/shipping plant
* STGE_LOC LGORT_D stock location
* MOVE_STLOC UMLGO Receipt/Shipment Stock Location
* ENTRY_QNT ERFMG Quantity in input units
* BATCH CHARG_D batch number
*"---------------------------------------------- -----------------------

  DATA: goodsmvt_header LIKE bapi2017_gm_head_01,
        itab TYPE TABLE OF bapi2017_gm_item_create WITH HEADER LINE,
        return LIKE TABLE OF bapiret2 WITH HEADER LINE,
        mat_doc LIKE bapi2017_gm_head_ret-mat_doc,
        req_i TYPE zmes_torder_req_i.


  CLEAR: goodsmvt_header.
  goodsmvt_header-doc_date = sy-datum. "The document date in the document
  goodsmvt_header-pr_uname = sy-datum. "username

  LOOP AT zmes_torder_req_i INTO req_i.
    MOVE-CORRESPONDING req_i TO itab.
    goodsmvt_header-pstng_date = req_i-pstng_date. "The posting date in the voucher
    IF req_i-plant = req_i-move_plant.
      itab-move_type = '311'. "Move Type (Stock Location <-> Stock Location)
    ELSE.
* itab-move_type = '301'. "Move Type (Factory<->Factory)
    ENDIF.
    APPEND itab.
    CLEAR itab.
  ENDLOOP.

  CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
    EXPORTING
      goodsmvt_header = goodsmvt_header
      goodsmvt_code = '04'
    IMPORTING
      materialdocument = mat_doc
    TABLES
      goodsmvt_item = itab
      return = return.
  READ TABLE return WITH KEY type = 'E'.
  IF sy-subrc = 0.
    rstype = 'E'.
    LOOP AT return WHERE type = 'E' .
      CONCATENATE rsmesg return-message ',' INTO rsmesg.
    ENDLOOP.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
    rstype = 'S'.
    o_mblnr = mat_doc.
  ENDIF.
ENDFUNCTION.

2. Work order delivery ↓

function zfunction.
*"---------------------------------------------- -----------------------
*"*"Local interface:
*" EXPORTING
*" VALUE(RSTYPE) TYPE XFELD
*" VALUE(RSMESG) TYPE STRING
*" VALUE(O_MBLNR) TYPE MBLNR
*" TABLES
*" ZMES_ORD_REQ_I STRUCTURE ZMES_ORD_REQ_I
*"---------------------------------------------- -----------------------
* Input table: ZMES_ORD_REQ_I (table structure)
* PLANT WERKS_D factory
* ORDERID AUFNR order number
* MATERIAL MATNR material number
* ENTRY_QNT ERFMG Quantity in input units
* STGE_LOC LGORT_D stock location
*"---------------------------------------------- -----------------------
  data:goodsmvt_header like bapi2017_gm_head_01,
        itab type table of bapi2017_gm_item_create with header line,
        return like table of bapiret2 with header line,
        mat_doc like bapi2017_gm_head_ret-mat_doc,
        req_i type zmes_ord_req_i.


  clear:goodsmvt_header.
  goodsmvt_header-doc_date = sy-datum. "The document date in the document
  goodsmvt_header-pstng_date = sy-datum. "posting date in the document
  goodsmvt_header-pr_uname = sy-datum. "username

  loop at zmes_ord_req_i into req_i.
    move-CORRESPONDING req_i to itab.
    itab-move_type = '261'. "Move Type (Inventory Management)
    append itab.
    clear itab.
  end loop.

  call function 'BAPI_GOODSMVT_CREATE'
  exporting
    goodsmvt_header = goodsmvt_header
    goodsmvt_code = '03'
  importing
    materialdocument = mat_doc
  tables
    goodsmvt_item = itab
    return = return.
  read table return with key type = 'E'.
  if sy-subrc = 0.
    rstype = 'E'.
    loop at return where type = 'E' .
      concatenate rsmesg return-message ',' into rsmesg.
    end loop.
    call function 'BAPI_TRANSACTION_ROLLBACK' .
  else.
    call function 'BAPI_TRANSACTION_COMMIT'
    exporting
      wait = 'X'.
    rstype = 'S'.
    o_mblnr = mat_doc.
  endif.
endfunction.

3. Work order return ↓

function zfunction.
*"---------------------------------------------- -----------------------
*"*"Local interface:
*" EXPORTING
*" VALUE(RSTYPE) TYPE XFELD
*" VALUE(RSMESG) TYPE STRING
*" VALUE(O_MBLNR) TYPE MBLNR
*" TABLES
*" ZMES_RT_ORDER_I STRUCTURE ZMES_RT_ORDER_I
*"---------------------------------------------- -----------------------
* Input table: ZMES_RT_ORDER_I (table structure)
* PLANT WERKS_D factory
* ORDERID AUFNR order number
* MATERIAL MATNR material number
* RESERV_NO RSNUM number of reservation/related requirement
* RES_ITEM RSPOS Reservation/Requirement Item Number
* ENTRY_QNT ERFMG Quantity in input units
* MOVE_REAS MB_GRBEW move reason
* STGE_LOC LGORT_D stock location
* BATCH CHARG_D batch number
*"---------------------------------------------- -----------------------
  data:goodsmvt_header like bapi2017_gm_head_01,
        itab type table of bapi2017_gm_item_create with header line,
        return like table of bapiret2 with header line,
        mat_doc like bapi2017_gm_head_ret-mat_doc,
        order_i type zmes_rt_order_i.

  clear:goodsmvt_header.
  goodsmvt_header-doc_date = sy-datum. "The document date in the document
  goodsmvt_header-pstng_date = sy-datum. "posting date in the document
  goodsmvt_header-pr_uname = sy-datum. "username

  loop at zmes_rt_order_i into order_i.
    move-corresponding order_i to itab.
    itab-move_type = '262'. "Move Type (Inventory Management)
    append itab.
    clear itab.
  end loop.

  call function 'BAPI_GOODSMVT_CREATE'
  exporting
    goodsmvt_header = goodsmvt_header
    goodsmvt_code = '03'
  importing
    materialdocument = mat_doc
  tables
    goodsmvt_item = itab
    return = return.
  read table return with key type = 'E'.
  if sy-subrc = 0.
    rstype = 'E'.
    loop at return where type = 'E' .
      concatenate rsmesg return-message ',' into rsmesg.
    end loop.
    call function 'BAPI_TRANSACTION_ROLLBACK' .
  else.
    call function 'BAPI_TRANSACTION_COMMIT'
    exporting
      wait = 'X'.
    rstype = 'S'.
    o_mblnr = mat_doc.
  endif.
endfunction.

4. Work order storage ↓

FUNCTION zfunction.
  FUNCTION zmes_order_in.
*"---------------------------------------------- -----------------------
*"*"Local interface:
*" EXPORTING
*" VALUE(RSTYPE) TYPE XFELD
*" VALUE(RSMESG) TYPE STRING
*" VALUE(O_MBLNR) TYPE MBLNR
*" TABLES
*" ZMES_ORDER_IN_I STRUCTURE ZMES_ORDER_IN_I
*"---------------------------------------------- -----------------------
*Input table: ZMES_ORDER_IN_I (table structure)
* PLANT WERKS_D factory
* ORDERID AUFNR order number
* ENTRY_QNT ERFMG Quantity in input units
* STGE_LOC LGORT_D stock location
* BATCH CHARG_D batch number
*"---------------------------------------------- -----------------------
    DATA: header LIKE bapi2017_gm_head_01,
          code LIKE bapi2017_gm_code,
          itab TYPE TABLE OF bapi2017_gm_item_create WITH HEADER LINE,
          return LIKE TABLE OF bapiret2 WITH HEADER LINE,
          mat_doc LIKE bapi2017_gm_head_ret-mat_doc,
          goodsmvt_serialnumber TYPE TABLE OF bapi2017_gm_serialnumber,
          order_in TYPE zmes_order_in_i.

    CLEAR: header, code.
    header-doc_date = sy-datum. "The document date in the document
    header-pstng_date = sy-datum. "posting date in the document
    header-pr_uname = sy-datum. "username

    code-gm_code = '01'.

    LOOP AT zmes_order_in_i INTO order_in.
      MOVE-CORRESPONDING order_in TO itab.
      itab-move_type = '101'. "Movement type
      itab-mvt_ind = 'F'. "Mobile ID
      APPEND itab.
      CLEAR itab.
    ENDLOOP.

    CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
      EXPORTING
        goodsmvt_header = header
        goodsmvt_code = code
      IMPORTING
        materialdocument = mat_doc
      TABLES
        goodsmvt_item = itab
        goodsmvt_serialnumber = goodsmvt_serialnumber
        return = return.
    READ TABLE return WITH KEY type = 'E'.
    IF sy-subrc = 0.
      rstype = 'E'.
      LOOP AT return WHERE type = 'E' .
        CONCATENATE rsmesg return-message ',' INTO rsmesg.
      ENDLOOP.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.
      rstype = 'S'.
      o_mblnr = mat_doc.
    ENDIF.
  END FUNCTION.
ENDFUNCTION.

5. PO returns ↓

FUNCTION zfunction.
*"---------------------------------------------- -----------------------
*"*"Local interface:
*" EXPORTING
*" VALUE(RSTYPE) TYPE XFELD
*" VALUE(RSMESG) TYPE STRING
*" VALUE(O_MBLNR) TYPE MBLNR
*" TABLES
*" ZMES_PO_STOCK_I STRUCTURE ZMES_PO_STOCK_I
*"---------------------------------------------- -----------------------
* Input table: ZMES_PO_STOCK_I (table structure)
* MOVE_TYPE BWART move type (inventory management)
* PO_NUMBER BSTNR Purchase order number
* PO_ITEM EBELP The item number of the purchasing document
* PLANT WERKS_D factory
* MATERIAL MATNR material number
* ENTRY_QNT ERFMG Quantity in input units
* STGE_LOC LGORT_D stock location
* MOVE_REAS MB_GRBEW move reason
* REF_DOC MBLNR material document number
* REF_DOC_IT LFPOS reference document item
*"---------------------------------------------- -----------------------
  DATA: header LIKE bapi2017_gm_head_01,
        itab TYPE TABLE OF bapi2017_gm_item_create WITH HEADER LINE,
        return LIKE TABLE OF bapiret2 WITH HEADER LINE,
        mat_doc LIKE bapi2017_gm_head_ret-mat_doc,
        stock_i TYPE zmes_po_stock_i.

  CLEAR: header.
  header-doc_date = sy-datum. "The document date in the document
  header-pstng_date = sy-datum. "posting date in the voucher
  header-pr_uname = sy-datum. "username

  LOOP AT zmes_po_stock_i INTO stock_i.
    MOVE-CORRESPONDING stock_i TO itab.
    itab-mvt_ind = 'B'. "Mobile ID
    CASE stock_i-move_type.
      WHEN '102'.
        itab-move_reas = ''. "Move reason
      WHEN '122'.
      WHEN '161'.
        itab-move_type = '101'. "Movement type
        itab-ref_doc = ''. "material document
        itab-ref_doc_it = ''. "Material document item
        itab-move_reas = ''. "Move reason
    ENDCASE.
    APPEND itab.
    CLEAR itab.
  ENDLOOP.

  CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
    EXPORTING
      goodsmvt_header = header
      goodsmvt_code = '01' "MB01 Goods movement by purchase order
    IMPORTING
      materialdocument = mat_doc
    TABLES
      goodsmvt_item = itab
      return = return.
  READ TABLE return WITH KEY type = 'E'.
  IF sy-subrc = 0.
    rstype = 'E'.
    LOOP AT return WHERE type = 'E' .
      CONCATENATE rsmesg return-message ',' INTO rsmesg.
    ENDLOOP.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
    rstype = 'S'.
    o_mblnr = mat_doc.
  ENDIF.
ENDFUNCTION.

6. Receive goods ↓

FUNCTION zfunction.
*"---------------------------------------------- -----------------------
*"*"Local interface:
*" EXPORTING
*" VALUE(RSTYPE) TYPE XFELD
*" VALUE(RSMESG) TYPE STRING
*" VALUE(O_MBLNR) TYPE MBLNR
*" TABLES
*" ZMES_PO_IN STRUCTURE ZMES_PO_IN
*"---------------------------------------------- -----------------------
* Input table: ZMES_PO_IN (table structure)
* REF_DOC_NO XBLNR Reference Document Number
* PLANT WERKS_D factory
* PO_NUMBER EBELN purchase document number
* PO_ITEM EBELP The item number of the purchasing document
* ETENS EETEN delivery schedule line counter
* MATERIAL MATNR material number
* STGE_LOC LGORT_D stock location
* ENTRY_QNT ERFMG Quantity in input units
* VENDOR ELIFN supplier account number
* BATCH CHARG_D batch number

*"---------------------------------------------- -----------------------
  DATA: header LIKE bapi2017_gm_head_01,
        code LIKE bapi2017_gm_code,
        itab TYPE TABLE OF bapi2017_gm_item_create WITH HEADER LINE,
        return LIKE TABLE OF bapiret2 WITH HEADER LINE,
        mat_doc LIKE bapi2017_gm_head_ret-mat_doc,
        po_in TYPE zmes_po_in.

  CLEAR: header, code.
  header-doc_date = sy-datum. "The document date in the document
  header-pstng_date = sy-datum. "posting date in the document
  header-pr_uname = sy-datum. "username
  header-ref_doc_no = zmes_po_in-ref_doc_no. "Outbound delivery note

  code-gm_code = '01'. "Assign transaction code 4500090063 for BAPI goods movement

  LOOP AT zmes_po_in INTO po_in.
    MOVE-CORRESPONDING po_in TO itab.
    itab-move_type = '101'. "Movement type
    itab-mvt_ind = 'B'. "Mobile ID
    APPEND itab.
    CLEAR itab.
  ENDLOOP.

  CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
    EXPORTING
      goodsmvt_header = header
      goodsmvt_code = code
    IMPORTING
      materialdocument = mat_doc
    TABLES
      goodsmvt_item = itab
      return = return.
  READ TABLE return WITH KEY type = 'E'.
  IF sy-subrc = 0.
    rstype = 'E'.
    LOOP AT return WHERE type = 'E' .
      CONCATENATE rsmesg return-message ',' INTO rsmesg.
    ENDLOOP.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
    rstype = 'S'.
    o_mblnr = mat_doc.
  ENDIF.
ENDFUNCTION.

7. IQC storage ↓

FUNCTION zfunction.
*"---------------------------------------------- -----------------------
*"*"Local interface:
*" EXPORTING
*" VALUE(RSTYPE) TYPE XFELD
*" VALUE(RSMESG) TYPE STRING
*" VALUE(O_MBLNR) TYPE MBLNR
*" TABLES
*" ZMES_PO_IQC_I STRUCTURE ZMES_PO_IQC_I
*"---------------------------------------------- -----------------------
* Input table: ZMES_PO_IQC_I (table structure)
* PLANT WERKS_D factory
* MATERIAL MATNR material number
* ENTRY_QNT ERFMG Quantity in input units
* STGE_LOC LGORT_D stock location
* BATCH CHARG_D batch number
*"---------------------------------------------- -----------------------
  DATA: header LIKE bapi2017_gm_head_01,
        itab TYPE TABLE OF bapi2017_gm_item_create WITH HEADER LINE,
        return LIKE TABLE OF bapiret2 WITH HEADER LINE,
        mat_doc LIKE bapi2017_gm_head_ret-mat_doc,
        goodsmvt_serialnumber TYPE TABLE OF bapi2017_gm_serialnumber,
        iqc_in TYPE zmes_po_iqc_i.

  CLEAR: header.
  header-doc_date = sy-datum. "The document date in the document
  header-pstng_date = sy-datum. "posting date in the document
  header-pr_uname = sy-datum. "username

  LOOP AT zmes_po_iqc_i INTO iqc_in.
    MOVE-CORRESPONDING iqc_in TO itab.
    itab-move_type = '321'. "Movement type
    APPEND itab.
    CLEAR itab.
  ENDLOOP.

  CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
    EXPORTING
      goodsmvt_header = header
      goodsmvt_code = '04' "Assign transaction code for BAPI goods movement (MB1B transfer posting)
    IMPORTING
      materialdocument = mat_doc
    TABLES
      goodsmvt_item = itab
      goodsmvt_serialnumber = goodsmvt_serialnumber
      return = return.
  READ TABLE return WITH KEY type = 'E'.
  IF sy-subrc = 0.
    rstype = 'E'.
    LOOP AT return WHERE type = 'E' .
      CONCATENATE rsmesg return-message ',' INTO rsmesg.
    ENDLOOP.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
    rstype = 'S'.
    o_mblnr = mat_doc.
  ENDIF.
ENDFUNCTION.

If there are incomplete or other errors, just leave a message in the comment area.