外向交货BAPI

文章目录

1. Introduce

The bapi is used cross company.

2. code

  " 采购订单创建交货单BAPI使用的参数定义
  DATA:
    L_DELIVERY           TYPE VBELN_VL,
    L_NUM_DELIVERIES     TYPE VBNUM,
    LT_STOCK_TRANS_ITEMS TYPE STANDARD TABLE OF BAPIDLVREFTOSTO,
    LT_DELIVERIES        TYPE STANDARD TABLE OF BAPISHPDELIVNUMB,
    LT_CREATED_ITEMS     TYPE STANDARD TABLE OF BAPIDLVITEMCREATED,
    LT_RETURN            TYPE STANDARD TABLE OF BAPIRET2,
    WA_RETURN            LIKE BAPIRET2,

    LT_PROT              TYPE STANDARD TABLE OF PROTT,
    LT_BAPIOBDLVITEMCHG   LIKE STANDARD TABLE OF BAPIOBDLVITEMCHG WITH HEADER LINE,
    LT_BAPIOBDLVITEMCHG_C LIKE STANDARD TABLE OF  BAPIOBDLVITEMCTRLCHG WITH HEADER LINE,
    LT_ITEM_DATA_SPL      TYPE STANDARD TABLE OF /SPE/BAPIOBDLVITEMCHG.
  DATA:
    WA_HEADER_DATA       TYPE BAPIOBDLVHDRCHG,
    WA_HEADER_CONTROL    TYPE BAPIOBDLVHDRCTRLCHG,
    WA_ITEM_DATA_SPL     TYPE /SPE/BAPIOBDLVITEMCHG,
    WA_STOCK_TRANS_ITEMS TYPE BAPIDLVREFTOSTO,
    WA_CREATED_ITEMS     TYPE BAPIDLVITEMCREATED,
    WA_DELIVERIES        TYPE BAPISHPDELIVNUMB,
    WA_VBKOK             TYPE VBKOK,
    L_EF_ERROR_ANY_0     TYPE XFELD.
 "第一步:根据采购订单创建交货单
  SORT IMP_TAB by EBELN EBELP.
  LOOP at IMP_TAB.
    SELECT SINGLE meins INTO lv_meins
      FROM mara
      WHERE matnr = IMP_TAB-MATNR.
    WA_STOCK_TRANS_ITEMS-DLV_QTY    = IMP_TAB-MENGE.    "采购订单数量
    WA_STOCK_TRANS_ITEMS-REF_DOC    = IMP_TAB-EBELN.    "采购凭证号
    WA_STOCK_TRANS_ITEMS-REF_ITEM   = IMP_TAB-EBELP.    "采购凭证的项目编号
    WA_STOCK_TRANS_ITEMS-SALES_UNIT = lv_meins.          "销售单位
    APPEND WA_STOCK_TRANS_ITEMS TO LT_STOCK_TRANS_ITEMS.
    CLEAR:WA_STOCK_TRANS_ITEMS,lv_meins.
  ENDLOOP.
 "根据采购订单创建交货单
  CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_STO'
*     EXPORTING
*       SHIP_POINT              =
*       DUE_DATE                =
*       DEBUG_FLG               =
    IMPORTING
      DELIVERY                = L_DELIVERY
      NUM_DELIVERIES          = L_NUM_DELIVERIES
    TABLES
      STOCK_TRANS_ITEMS       = LT_STOCK_TRANS_ITEMS
*    SERIAL_NUMBERS          =
*    EXTENSION_IN            =
      DELIVERIES              = LT_DELIVERIES
      CREATED_ITEMS           = LT_CREATED_ITEMS
*    EXTENSION_OUT           =
      RETURN                  = LT_RETURN.
  "执行结果判断
  CLEAR WA_RETURN.
  LOOP AT LT_RETURN INTO WA_RETURN WHERE TYPE = 'E' OR ( TYPE = 'W' AND NUMBER = '030').
    EXIT.
  ENDLOOP.
  IF SY-SUBRC <> 0 AND LINES( LT_STOCK_TRANS_ITEMS ) = LINES( LT_CREATED_ITEMS ) .
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'.

      EXP_DATA-VBELN = L_DELIVERY."交货单号
      CONCATENATE EXP_DATA-MSG '交货单DN创建成功->' INTO EXP_DATA-MSG.
     "更新日志
     CLEAR:GW_ZTMES003.
     LOOP at GT_ZTMES003 INTO GW_ZTMES003.
      GW_ZTMES003-VBELN = L_DELIVERY."交货单号
      GW_ZTMES003-ID1  = 'S'.
      GW_ZTMES003-MSG1  = '交货单DN创建成功'.
      MODIFY GT_ZTMES003 FROM GW_ZTMES003.
      CLEAR:GW_ZTMES003.
     ENDLOOP.
      MODIFY ZTMES003 FROM TABLE GT_ZTMES003[].

  "第二步:更新交货单库位
        WA_HEADER_DATA-DELIV_NUMB    = L_DELIVERY.
        WA_HEADER_CONTROL-DELIV_NUMB = L_DELIVERY.
      CLEAR:GW_ZSMES006.
      READ TABLE IMP_TAB INTO GW_ZSMES006 INDEX 1.
      LOOP AT LT_CREATED_ITEMS INTO WA_CREATED_ITEMS.
        LT_BAPIOBDLVITEMCHG-DELIV_NUMB      = L_DELIVERY.
        LT_BAPIOBDLVITEMCHG-DELIV_ITEM      = WA_CREATED_ITEMS-DELIV_ITEM. "交货单行项目.
        LT_BAPIOBDLVITEMCHG-FACT_UNIT_NOM   = 1.
        LT_BAPIOBDLVITEMCHG-FACT_UNIT_DENOM = 1.
        LT_BAPIOBDLVITEMCHG-MATERIAL        = WA_CREATED_ITEMS-MATERIAL.
        APPEND LT_BAPIOBDLVITEMCHG.
        CLEAR LT_BAPIOBDLVITEMCHG.

        LT_BAPIOBDLVITEMCHG_C-DELIV_NUMB  = L_DELIVERY.
        LT_BAPIOBDLVITEMCHG_C-DELIV_ITEM  = WA_CREATED_ITEMS-DELIV_ITEM.  "交货项目
        APPEND LT_BAPIOBDLVITEMCHG_C.
        CLEAR LT_BAPIOBDLVITEMCHG_C.

        WA_ITEM_DATA_SPL-DELIV_NUMB  = L_DELIVERY.   "交货
        WA_ITEM_DATA_SPL-DELIV_ITEM  = WA_CREATED_ITEMS-DELIV_ITEM.  "交货项目
        WA_ITEM_DATA_SPL-PICK_DENIAL = 'X'.          "拣配拒绝标记

        WA_ITEM_DATA_SPL-STGE_LOC    = GW_ZSMES006-OLGORT."库存地点 都相同
        APPEND WA_ITEM_DATA_SPL TO LT_ITEM_DATA_SPL.
      ENDLOOP.
      "交货单库位更新
      CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
        EXPORTING
          HEADER_DATA                   = WA_HEADER_DATA
          HEADER_CONTROL                = WA_HEADER_CONTROL
          DELIVERY                      = L_DELIVERY
        TABLES
          ITEM_DATA                     = LT_BAPIOBDLVITEMCHG[]
          ITEM_CONTROL                  = LT_BAPIOBDLVITEMCHG_C[]
          RETURN                        = LT_RETURN
          ITEM_DATA_SPL                 = LT_ITEM_DATA_SPL  .

      READ TABLE LT_RETURN INTO WA_RETURN WITH KEY TYPE  = 'E'.
      IF SY-SUBRC <> 0.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
          WAIT = 'X'.
        CONCATENATE EXP_DATA-MSG 'DN库位更新成功->' INTO EXP_DATA-MSG.
        "更新日志
        CLEAR:GW_ZTMES003.
        LOOP at GT_ZTMES003 INTO GW_ZTMES003.
          GW_ZTMES003-ID2  = 'S'.
          GW_ZTMES003-MSG2 = 'DN库位更新成功' .
          MODIFY GT_ZTMES003 FROM GW_ZTMES003.
          CLEAR:GW_ZTMES003.
        ENDLOOP.
        MODIFY ZTMES003 FROM TABLE GT_ZTMES003[].

      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        CONCATENATE EXP_DATA-MSG 'DN库位更新失败!' INTO EXP_DATA-MSG.
        "更新日志
        CLEAR:GW_ZTMES003.
        LOOP at GT_ZTMES003 INTO GW_ZTMES003.
          GW_ZTMES003-ID2  = 'E'.
          CONCATENATE 'DN库位更新失败:' WA_RETURN-MESSAGE INTO GW_ZTMES003-MSG2.
          MODIFY GT_ZTMES003 FROM GW_ZTMES003.
          CLEAR:GW_ZTMES003.
        ENDLOOP.
        MODIFY ZTMES003 FROM TABLE GT_ZTMES003[].

     "删除交货单
      CLEAR:WA_HEADER_DATA,WA_HEADER_CONTROL,LT_BAPIOBDLVITEMCHG[],
          LT_BAPIOBDLVITEMCHG_C[],LT_RETURN, LT_ITEM_DATA_SPL.
      WA_HEADER_DATA-DELIV_NUMB    = L_DELIVERY.
      WA_HEADER_CONTROL-DELIV_NUMB = L_DELIVERY.
      WA_HEADER_CONTROL-DLV_DEL = 'X' ."删除
      CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
        EXPORTING
          HEADER_DATA                   = WA_HEADER_DATA
          HEADER_CONTROL                = WA_HEADER_CONTROL
          DELIVERY                      = L_DELIVERY
        TABLES
          ITEM_DATA                     = LT_BAPIOBDLVITEMCHG[]
          ITEM_CONTROL                  = LT_BAPIOBDLVITEMCHG_C[]
          RETURN                        = LT_RETURN
          ITEM_DATA_SPL                 = LT_ITEM_DATA_SPL .
        READ TABLE LT_RETURN INTO WA_RETURN WITH KEY TYPE  = 'E'.
        IF SY-SUBRC <> 0.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
            WAIT = 'X'.
        ENDIF.
      endif.
  ELSE.
  "创建交货单出错
   CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
   CONCATENATE EXP_DATA-MSG '交货单DN创建失败:' WA_RETURN-MESSAGE INTO EXP_DATA-MSG.
  "更新日志
   CLEAR: GW_ZTMES003.
   LOOP at GT_ZTMES003 INTO GW_ZTMES003.
     GW_ZTMES003-ID1  = 'E'.
     CONCATENATE '交货单DN创建失败:' WA_RETURN-MESSAGE INTO GW_ZTMES003-MSG1.
     MODIFY GT_ZTMES003 FROM GW_ZTMES003.
     CLEAR:GW_ZTMES003.
   ENDLOOP.

   MODIFY ZTMES003 FROM TABLE GT_ZTMES003[].
   EXIT.
  ENDIF.

  CLEAR:GW_ZTMES003.
  READ TABLE GT_ZTMES003 INTO GW_ZTMES003 INDEX 1.

  "检查交货单数量
  lv_dn = L_DELIVERY.
  add_pre_zero:lv_dn.
  IF GW_ZTMES003-ID1 = 'S' or GW_ZTMES003-ID2 = 'S'.
    SELECT sum( LFIMG ) into lv_LFIMG
      from LIPS
      where VBELN = lv_dn.
    if lv_menge <> lv_LFIMG.

      "删除交货单
      CLEAR:WA_HEADER_DATA,WA_HEADER_CONTROL,LT_BAPIOBDLVITEMCHG[],
          LT_BAPIOBDLVITEMCHG_C[],LT_RETURN, LT_ITEM_DATA_SPL.
      WA_HEADER_DATA-DELIV_NUMB    = L_DELIVERY.
      WA_HEADER_CONTROL-DELIV_NUMB = L_DELIVERY.
      WA_HEADER_CONTROL-DLV_DEL = 'X' ."删除
      CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
        EXPORTING
          HEADER_DATA                   = WA_HEADER_DATA
          HEADER_CONTROL                = WA_HEADER_CONTROL
          DELIVERY                      = L_DELIVERY
        TABLES
          ITEM_DATA                     = LT_BAPIOBDLVITEMCHG[]
          ITEM_CONTROL                  = LT_BAPIOBDLVITEMCHG_C[]
          RETURN                        = LT_RETURN
          ITEM_DATA_SPL                 = LT_ITEM_DATA_SPL .
        READ TABLE LT_RETURN INTO WA_RETURN WITH KEY TYPE  = 'E'.
        IF SY-SUBRC <> 0.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
            WAIT = 'X'.
        ENDIF.
          "更新日志
        CLEAR:GW_ZTMES003.
        LOOP at GT_ZTMES003 INTO GW_ZTMES003.
          GW_ZTMES003-ID2  = 'E'.
          CONCATENATE  EXP_DATA-MSG 'SAP创建的交货单数量不正确'  INTO GW_ZTMES003-MSG2.
          MODIFY GT_ZTMES003 FROM GW_ZTMES003.
          CLEAR:GW_ZTMES003.
        ENDLOOP.
        MODIFY ZTMES003 FROM TABLE GT_ZTMES003[].
      EXP_DATA-ID = 'E'.
      EXP_DATA-MSG = 'SAP创建的交货单数量不正确,需重传'.
    endif.
  endif.

  CLEAR:GW_ZTMES003.
  READ TABLE GT_ZTMES003 INTO GW_ZTMES003 INDEX 1.
  IF GW_ZTMES003-ID1 = 'E' or GW_ZTMES003-ID2 = 'E'.
    EXIT.
  ENDIF.


  "第三步:交货单交货过账产生物料凭证
  WA_VBKOK-WADAT_IST = SY-DATUM."过账日期
  WA_VBKOK-VBELN_VL = L_DELIVERY.  "交货单
  WA_VBKOK-WABUC = 'X'.                          "自动过帐货物移动
  CALL FUNCTION 'WS_DELIVERY_UPDATE'
    EXPORTING
      VBKOK_WA                 = WA_VBKOK
      DELIVERY                 = L_DELIVERY
      UPDATE_PICKING           = 'X'
      IF_DATABASE_UPDATE       = '1'             "COMMIT = 'X' 异步更新
      IF_ERROR_MESSAGES_SEND_0 = 'X'
    IMPORTING
      EF_ERROR_ANY_0           = L_EF_ERROR_ANY_0
    TABLES
      PROT                     = LT_PROT
    EXCEPTIONS
      ERROR_MESSAGE            = 1
      OTHERS                   = 2.

   "结果判断
   IF SY-SUBRC = 0 AND LT_PROT[] IS INITIAL.
     COMMIT WORK AND WAIT.
     SELECT SINGLE MAX( VBELN )
                INTO GW_ZTMES003-VBELN3  "过账凭证
               FROM VBFA
               WHERE VBELV = WA_VBKOK-VBELN_VL "交货单
               AND VBTYP_N = 'R'
               AND PLMIN = '+'.

      EXP_DATA-MBLNR3 =  GW_ZTMES003-VBELN3.
      CONCATENATE EXP_DATA-MSG 'DN发货成功。' INTO EXP_DATA-MSG.
     "更新日志
      CLEAR: GW_ZTMES003.
      LOOP at GT_ZTMES003 INTO GW_ZTMES003.
        GW_ZTMES003-ID3  = 'S'.
        GW_ZTMES003-MSG3 = 'DN发货成功' .
        MODIFY GT_ZTMES003 FROM GW_ZTMES003.
        CLEAR:GW_ZTMES003.
      ENDLOOP.
      MODIFY ZTMES003 FROM TABLE GT_ZTMES003[].
   ELSE.
     CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
     CONCATENATE EXP_DATA-MSG 'DN发货失败!' INTO EXP_DATA-MSG.
     "更新日志
      CLEAR: GW_ZTMES003.
      LOOP at GT_ZTMES003 INTO GW_ZTMES003.
        GW_ZTMES003-ID3  = 'E'.
        GW_ZTMES003-MSG3 = 'DN发货失败' .
        MODIFY GT_ZTMES003 FROM GW_ZTMES003.
        CLEAR:GW_ZTMES003.
      ENDLOOP.
      MODIFY ZTMES003 FROM TABLE GT_ZTMES003[].
     "删除交货单
      CLEAR:WA_HEADER_DATA,WA_HEADER_CONTROL,LT_BAPIOBDLVITEMCHG[],
          LT_BAPIOBDLVITEMCHG_C[],LT_RETURN, LT_ITEM_DATA_SPL.
      WA_HEADER_DATA-DELIV_NUMB    = L_DELIVERY.
      WA_HEADER_CONTROL-DELIV_NUMB = L_DELIVERY.
      WA_HEADER_CONTROL-DLV_DEL = 'X' ."删除
      CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
        EXPORTING
          HEADER_DATA                   = WA_HEADER_DATA
          HEADER_CONTROL                = WA_HEADER_CONTROL
          DELIVERY                      = L_DELIVERY
        TABLES
          ITEM_DATA                     = LT_BAPIOBDLVITEMCHG[]
          ITEM_CONTROL                  = LT_BAPIOBDLVITEMCHG_C[]
          RETURN                        = LT_RETURN
          ITEM_DATA_SPL                 = LT_ITEM_DATA_SPL .
        READ TABLE LT_RETURN INTO WA_RETURN WITH KEY TYPE  = 'E'.
        IF SY-SUBRC <> 0.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
            WAIT = 'X'.
        ENDIF.
     EXIT.
   ENDIF.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值