ABAP 拆分交货单批次的方法

35 篇文章 1 订阅

以下代码是创建完交货单,根据传入的数据,拆分交货单行项目的批次.

  DATA: LT_LIPS        TYPE TABLE OF LIPS,
        LS_LIPS        TYPE LIPS,
        LS_DLVR        TYPE TY_DGTRK,
        LV_POSNR       TYPE POSNR_VL,
        CV_POSNR       TYPE POSNR_VL,
        LV_BATVH       TYPE LIPS-CHARG,

        HEADER_DATA    LIKE  BAPIOBDLVHDRCHG,  "Delivery header
        HEADER_CONTROL LIKE  BAPIOBDLVHDRCTRLCHG, "delivery header control
        I_DELIVERY_NO  LIKE  BAPIOBDLVHDRCHG-DELIV_NUMB,  "deliver number
        TECHN_CONTROL  LIKE  BAPIDLVCONTROL,  "TECHN_CONTROL

        ITEM_DATA      LIKE  BAPIOBDLVITEMCHG  OCCURS 0 WITH HEADER LINE , "ITEM_DATA delivery item
        ITEM_CONTROL   LIKE  BAPIOBDLVITEMCTRLCHG  OCCURS 0 WITH HEADER LINE, "ITEM_CONTROL
        ITEM_DATA_SPL  LIKE  /SPE/BAPIOBDLVITEMCHG OCCURS 0 WITH HEADER LINE,
        LT_RETURN      LIKE  BAPIRET2  OCCURS 0 WITH HEADER LINE .  "Return

  SELECT SINGLE VERUR
    FROM LIKP
    INTO @DATA(LV_VERUR)
   WHERE VBELN = @P_VBELN.
  SELECT
         VBELN,
         POSNR,
         CHARG,
         MATNR,
         LFIMG,
         UMVKZ,
         UMVKN
    INTO TABLE @DATA(LG_LIPS)
    FROM LIPS
    WHERE VBELN = @P_VBELN
    AND POSNR LIKE '9%'.
  REFRESH LT_RETURN.
*  检查是否已经拆分批次,如果已经拆分批次,跳过此步骤
  IF LG_LIPS IS INITIAL.
    REFRESH:ITEM_DATA,ITEM_CONTROL.
*Set Delivery Header data
    I_DELIVERY_NO             = P_VBELN .
    HEADER_DATA-DELIV_NUMB    = P_VBELN.
    TECHN_CONTROL-UPD_IND     =  'U' .
    HEADER_CONTROL-DELIV_NUMB = P_VBELN.

    SELECT * FROM LIPS INTO TABLE LT_LIPS WHERE VBELN = P_VBELN.
    LOOP AT LT_LIPS INTO LS_LIPS.
      ITEM_DATA-DELIV_NUMB      = LS_LIPS-VBELN.
      ITEM_DATA-DELIV_ITEM      = LS_LIPS-POSNR.  "原行项目
      ITEM_DATA-HIERARITEM      = LS_LIPS-POSNR.
      ITEM_DATA-MATERIAL        = LS_LIPS-MATNR.

      ITEM_DATA-DLV_QTY         = 0 .
      ITEM_DATA-DLV_QTY_IMUNIT  = 0.
      ITEM_DATA-BASE_UOM        = LS_LIPS-MEINS.
      ITEM_DATA-SALES_UNIT      = LS_LIPS-VRKME.
      ITEM_DATA-FACT_UNIT_NOM   = LS_LIPS-UMVKZ.
      ITEM_DATA-FACT_UNIT_DENOM = LS_LIPS-UMVKN.
      APPEND  ITEM_DATA.
      CLEAR  ITEM_DATA.

      ITEM_CONTROL-DELIV_NUMB   = LS_LIPS-VBELN.
      ITEM_CONTROL-DELIV_ITEM   = LS_LIPS-POSNR.
      ITEM_CONTROL-CHG_DELQTY   =  'X' .
      APPEND  ITEM_CONTROL.
      CLEAR  ITEM_CONTROL.
    ENDLOOP.

    SORT DLVR BY DLVID EBELN EBELP DLVITERM.
    SORT LT_LIPS BY VGBEL VGPOS.
    CV_POSNR = '000010'.
    LOOP AT DLVR INTO LS_DLVR WHERE DLVID = LV_VERUR.

      IF LV_POSNR >= 900001.
        LV_POSNR = LV_POSNR + 1.
      ELSE.
        LV_POSNR = 900001.
      ENDIF.
      CLEAR: LS_LIPS,CV_POSNR.
      DATA(LV_EBELP) = '0' && LS_DLVR-EBELP.
      READ TABLE LT_LIPS INTO LS_LIPS WITH KEY VGBEL = LS_DLVR-EBELN
                                               VGPOS = LV_EBELP
                                               BINARY SEARCH.
      IF SY-SUBRC = 0.
        CV_POSNR = LS_LIPS-POSNR.
        ITEM_DATA-MATERIAL   = LS_LIPS-MATNR.
      ENDIF.
      ITEM_DATA-DELIV_NUMB =  P_VBELN.
      ITEM_DATA-DELIV_ITEM =  LV_POSNR .
      ITEM_DATA-HIERARITEM =  CV_POSNR . "The batch split record below delivery item hierary
      ITEM_DATA-USEHIERITM =  '1' .
*      SELECT SINGLE MATNR INTO ITEM_DATA-MATERIAL FROM EKPO WHERE EBELN = LS_DLVR-EBELN AND EBELP = LS_DLVR-EBELP.

      CLEAR: LV_BATVH.
      PERFORM FRM_GET_BATCH_NUMBER CHANGING LV_BATVH.
      LS_DLVR-BATCH = LV_BATVH.
      MODIFY DLVR FROM LS_DLVR."将生成的批次号记录到LT_ITAB,和供应商批次对应起来,方便后续维护批次特性

      ITEM_DATA-BATCH      =  LV_BATVH.
      ITEM_DATA-DLV_QTY    =  LS_DLVR-DLVNUM .
      ITEM_DATA-FACT_UNIT_NOM =  1 .
      ITEM_DATA-FACT_UNIT_DENOM =  1 .
      APPEND  ITEM_DATA.
      CLEAR  ITEM_DATA.

      ITEM_CONTROL-DELIV_NUMB = P_VBELN.
      ITEM_CONTROL-DELIV_ITEM = LV_POSNR.
      ITEM_CONTROL-CHG_DELQTY =  'X' .
      APPEND  ITEM_CONTROL.
      CLEAR  ITEM_CONTROL.

*      AT END OF EBELP.
*        CV_POSNR = CV_POSNR + 10.
*      ENDAT.
      CLEAR LV_EBELP.
    ENDLOOP.
    CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
      EXPORTING
        HEADER_DATA    = HEADER_DATA
        HEADER_CONTROL = HEADER_CONTROL
        DELIVERY       = I_DELIVERY_NO
        TECHN_CONTROL  = TECHN_CONTROL
      TABLES
        ITEM_DATA      = ITEM_DATA
        ITEM_CONTROL   = ITEM_CONTROL
        RETURN         = LT_RETURN.
    IF  LT_RETURN[]  IS INITIAL.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'.
      LV_TYP = 'S'.
      LV_MSG = '交货单批次拆分成功'.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

      LV_TYP = 'E'.
      LV_MSG = '交货单拆分批次失败'.
      READ TABLE LT_RETURN WITH KEY TYPE = 'E'.
      MESSAGE ID SY-MSGID TYPE 'S' NUMBER SY-MSGNO
               WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
               INTO DATA(LV_MESS).
      LV_MSG = LV_MSG && ';' && LV_MESS.
    ENDIF .
  ENDIF.

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值