欢迎来到萧静默的博客

书山有路勤为径,学海无涯苦作舟。

SAP货物移动BAPI BAPI_GOODSMVT_CREATE 详解

此函数重要参数给参,虽然S4已经都使用MIGO了,但是这个参数还是是根据老的功能进行实现的。

code-gm_code取值:

01 MB01 按采购订单的货物移动
02 MB31 按生产订单的货物移动
03 MB1A 货物提取(工单发料)
04 MB1B 转移过帐
05 MB1C 其他收货
06 MB11 货物移动
07 MB04 "物料供应"消耗的事后调整

itab-mvt_ind = 'B'. "移动标识
 无参考的货物移动(空)
B 按采购订单的货物移动
F 有关生产单的货物移动 
L 有关交货通知的货物移动
K 看板需求的货物移动(WM-仅限内部)
O "提供物料"消耗的后续调整
W 比例的后续调整/产品单位物料

 

入库/收货101

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
*"----------------------------------------------------------------------
*输入表:ZMES_ORDER_IN_I(表结构)
*    PLANT  WERKS_D       工厂
*    ORDERID  AUFNR       订单号
*    ENTRY_QNT  ERFMG     以输入单位计的数量
*    STGE_LOC    LGORT_D      库存地点
*    BATCH  CHARG_D       批号
*"----------------------------------------------------------------------
    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.    "凭证中的凭证日期
    header-pstng_date = sy-datum.  "凭证中的过帐日期
    header-pr_uname = sy-datum.    "用户名

    code-gm_code = '01'.

    LOOP AT zmes_order_in_i INTO order_in.
      MOVE-CORRESPONDING order_in TO itab.
      itab-move_type = '101'.             "移动类型
      itab-mvt_ind = 'F'.  "收货的话改为B               "移动标识
      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.
  ENDFUNCTION.
ENDFUNCTION.

退货

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
*"----------------------------------------------------------------------
*输入表:ZMES_PO_STOCK_I(表结构)
*  MOVE_TYPE  BWART   移动类型(库存管理)
*  PO_NUMBER  BSTNR   采购订单编号
*  PO_ITEM  EBELP     采购凭证的项目编号
*  PLANT  WERKS_D     工厂
*  MATERIAL    MATNR      物料号
*  ENTRY_QNT  ERFMG   以输入单位计的数量
*  STGE_LOC LGORT_D       库存地点
*  MOVE_REAS  MB_GRBEW      移动原因
*  REF_DOC  MBLNR           物料凭证编号
*  REF_DOC_IT LFPOS       参考凭证项目
*"----------------------------------------------------------------------
  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.    "凭证中的凭证日期
  header-pstng_date = sy-datum.  "凭证中的过帐日期
  header-pr_uname = sy-datum.    "用户名

  LOOP AT zmes_po_stock_i INTO stock_i.
    MOVE-CORRESPONDING stock_i TO itab.
    itab-mvt_ind = 'B'.                 "移动标识
    CASE stock_i-move_type.
      WHEN '102'.
        itab-move_reas = ''.            "移动原因
      WHEN '122'.
      WHEN '161'.
        itab-move_type = '101'.        "移动类型
        itab-ref_doc = ''.             "物料凭证
        itab-ref_doc_it = ''.          "物料凭证项目
        itab-move_reas = ''.           "移动原因
    ENDCASE.
    APPEND itab.
    CLEAR itab.
  ENDLOOP.

  CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
    EXPORTING
      goodsmvt_header  = header
      goodsmvt_code    = '01'          "MB01 按采购订单的货物移动
    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.

也可以直接冲销原入库收货凭证

FUNCTION zmm1.
data : goodsmvt_header      type bapi2017_gm_head_01,
       goodsmvt_code        type bapi2017_gm_code,
       goodsmvt_headret     type bapi2017_gm_head_ret,
       materialdocument     type bapi2017_gm_head_ret-mat_doc,
       matdocumentyear      type bapi2017_gm_head_ret-doc_year,
       gs_goodsmvt_item     type bapi2017_gm_item_create,
       gs_return            type bapiret2,
       bapi2017_gm_head_ret type bapi2017_gm_head_ret,
       goodsmvt_item        type standard table of bapi2017_gm_item_create,
       return               type standard table of bapiret2.
data : gt_return type standard table of bapiret2.
自己写写一下时间的参数 CLEAR bapi2017_gm_head_ret . REFRESH return . CALL FUNCTION 'BAPI_GOODSMVT_CANCEL' EXPORTING materialdocument = it_tbgz-mblnr matdocumentyear = it_tbgz-mjahr GOODSMVT_PSTNG_DATE = s_budat * GOODSMVT_PR_UNAME = * DOCUMENTHEADER_TEXT = IMPORTING goodsmvt_headret = bapi2017_gm_head_ret TABLES return = return * GOODSMVT_MATDOCITEM = . READ TABLE return WITH KEY type = 'E' TRANSPORTING NO FIELDS . IF sy-subrc <> 0 . CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X' * IMPORTING * RETURN = . e_mblnr = bapi2017_gm_head_ret-mat_doc . e_mjahr = bapi2017_gm_head_ret-doc_year . e_succ = 'S' . e_message = '凭证反记账成功!' . ***更新后台表 ELSE . e_succ = 'E' . LOOP AT return ASSIGNING FIELD-SYMBOL(<fs_return>) WHERE type = 'E' OR type = 'A' OR type = 'I' . e_message = e_message && <fs_return>-message . ENDLOOP . . CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' * IMPORTING * RETURN = . ENDIF . ENDFUNCTION.

其他参考https://www.cnblogs.com/freeandeasy/p/12212800.html

另外一个https://blog.csdn.net/hugh_lee/article/details/76240021#

posted @ 2025-04-17 18:49  萧静默  阅读(1680)  评论(0)    收藏  举报