SAP BAPI_GOODSMVT_CREATE收货时序列号传入

用到的是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…

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值