外向交货单拆分

image.png

image.png

image.png

image.png

FUNCTION ZRFC_DNORDER_AUTO_CERATE.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(DELIV_NUMB) TYPE  VBELN_VL
*"  EXPORTING
*"     VALUE(E_CODE) TYPE  CHAR1
*"     VALUE(E_MSG) TYPE  STRING
*"     VALUE(E_VBELN_NEW) TYPE  VBELN_VL
*"  TABLES
*"      IN_TABLE STRUCTURE  ZWMS009
*"----------------------------------------------------------------------
  DATA: LV_VBELN_N          TYPE LIKP-VBELN,
        LV_REMAINING_WEIGHT TYPE LIPS-BRGEW,
        LV_UNIT_WEIGHT      TYPE LIPS-BRGEW,
        LV_UNIT             TYPE I,
        LV_NUMKI            TYPE TVLK-NUMKI,
        LS_LIKP             TYPE LIKP,
        LS_ITEMDATA         TYPE BAPIOBDLVITEMDSP,
        LT_ITEMDATA         TYPE STANDARD TABLE OF BAPIOBDLVITEMDSP,
        LT_RETURN           TYPE STANDARD TABLE OF BAPIRET2.

*--------------------
*第一部分   数据比较
*--------------------
  SELECT * FROM LIPS WHERE VBELN EQ @DELIV_NUMB ORDER BY VBELN,POSNR INTO TABLE @DATA(LT_LIPS).

  LOOP AT IN_TABLE WHERE DELIV_NUMB EQ DELIV_NUMB AND ORDER_REQ_QTY IS NOT INITIAL.

*    转换为内部单位
    CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
      EXPORTING
        INPUT  = IN_TABLE-ORDER_UNIT
*       LANGUAGE             = SY-LANGU
      IMPORTING
        OUTPUT = IN_TABLE-ORDER_UNIT
*     EXCEPTIONS
*       UNIT_NOT_FOUND       = 1
*       OTHERS = 2
      .
    IF SY-SUBRC <> 0.
* Implement suitable error handling here
    ENDIF.

*    数量比较
    READ TABLE LT_LIPS INTO DATA(LS_LIPS) WITH KEY VBELN = IN_TABLE-DELIV_NUMB
                                                   POSNR = IN_TABLE-ITEMNO.
    CHECK SY-SUBRC EQ 0.
*    单位转换(转换为销售单位)
    IF IN_TABLE-ORDER_UNIT NE LS_LIPS-MEINS.
      CALL FUNCTION 'MD_CONVERT_MATERIAL_UNIT'
        EXPORTING
          I_MATNR              = LS_LIPS-MATNR
          I_IN_ME              = IN_TABLE-ORDER_UNIT ""传入单位
          I_OUT_ME             = LS_LIPS-VRKME
          I_MENGE              = IN_TABLE-ORDER_REQ_QTY
        IMPORTING
          E_MENGE              = IN_TABLE-ORDER_REQ_QTY
        EXCEPTIONS
          ERROR_IN_APPLICATION = 1
          ERROR                = 2
          OTHERS               = 3.
    ENDIF.

*    校验数量
    CHECK IN_TABLE-ORDER_REQ_QTY LT LS_LIPS-LFIMG.

*    修改旧交货单的数据
    LS_ITEMDATA-DELIV_NUMB = LS_LIPS-VBELN.
    LS_ITEMDATA-DELIV_ITEM = LS_LIPS-POSNR.
    LS_ITEMDATA-CURR_QTY    = 'A'.
    LS_ITEMDATA-SALES_UNIT  = LS_LIPS-VRKME.
    CALL FUNCTION 'UNIT_OF_MEASURE_SAP_TO_ISO'
      EXPORTING
        SAP_CODE    = LS_ITEMDATA-SALES_UNIT
      IMPORTING
        ISO_CODE    = LS_ITEMDATA-ISOCODE_SALES_UNIT
      EXCEPTIONS
        NOT_FOUND   = 1
        NO_ISO_CODE = 2
        OTHERS      = 3.
    IF SY-SUBRC <> 0.
      CLEAR LS_ITEMDATA-ISOCODE_SALES_UNIT.
    ENDIF.
    LS_ITEMDATA-SALES_QTY_NUM   = LS_LIPS-UMVKZ.
    LS_ITEMDATA-SALES_QTY_DENOM = LS_LIPS-UMVKN.

    LS_ITEMDATA-DLV_QTY     = IN_TABLE-ORDER_REQ_QTY.
    LS_ITEMDATA-DEL_QTY_FLO = IN_TABLE-ORDER_REQ_QTY.
    APPEND LS_ITEMDATA TO LT_ITEMDATA.
    CLEAR LS_ITEMDATA.
  ENDLOOP.

*--------------------
*第二部分   检查状态,避免跳号
*--------------------
  IF LT_ITEMDATA[] IS NOT INITIAL.
*检查需要修改的交货单是否锁定
    DATA:LT_ENQ     TYPE TABLE OF SEQG7,
         LS_ENQ     TYPE SEQG7,
         LV_GARG    TYPE EQEGRAARG,
         LV_MESSAGE  TYPE SM04DIC-POPUPMSG.

    CALL FUNCTION 'ENQUE_READ2'
      EXPORTING
        GNAME = 'LIKP'
      TABLES
        ENQ   = LT_ENQ.

    IF LT_ENQ[] IS NOT INITIAL.
      LV_GARG = SY-MANDT && DELIV_NUMB.
      READ TABLE LT_ENQ INTO LS_ENQ WITH KEY GARG = LV_GARG.
      IF SY-SUBRC EQ 0.
        SELECT SINGLE TECHDESC FROM USR21
         WHERE BNAME EQ @LS_ENQ-GUNAME INTO @DATA(LV_TECHDESC).
        E_CODE = 'E'.
        E_MSG = '拆分失败!' && DELIV_NUMB && '被'
            &&  LV_TECHDESC && '(' && LS_ENQ-GUNAME && ')锁定!' .
        LV_MESSAGE = '物流人员在发货,请退出交货单' && DELIV_NUMB && '修改状态。'.
*       给操作者发送消息
        CALL FUNCTION 'TH_POPUP'
          EXPORTING
            CLIENT  = SY-MANDT
            USER    = LS_ENQ-GUNAME
            MESSAGE = LV_MESSAGE.
        RETURN.
      ENDIF.
    ENDIF.

*校验交货单对应的销售订单是否锁定
    SELECT DISTINCT VGBEL FROM LIPS WHERE VBELN EQ @DELIV_NUMB
     ORDER BY VGBEL INTO TABLE @DATA(LT_VGBEL).
    IF SY-SUBRC EQ 0.
      LOOP AT LT_VGBEL INTO DATA(LS_VGBEL).
        CLEAR:LT_ENQ[],LV_GARG.
        CALL FUNCTION 'ENQUE_READ2'
          EXPORTING
            GNAME = 'VBAK'
          TABLES
            ENQ   = LT_ENQ.

        DELETE LT_ENQ WHERE GMODE NE 'E'.

        CHECK LT_ENQ[] IS NOT INITIAL.
        LV_GARG = SY-MANDT && LS_VGBEL-VGBEL.
        READ TABLE LT_ENQ INTO LS_ENQ WITH KEY GARG = LV_GARG.
        IF SY-SUBRC EQ 0.
          SELECT SINGLE TECHDESC FROM USR21
           WHERE BNAME EQ @LS_ENQ-GUNAME INTO @DATA(WA_TECHDESC).
          E_CODE = 'E'.
          E_MSG = '拆分失败!' && LS_VGBEL-VGBEL && '被'
              &&  WA_TECHDESC && '(' && LS_ENQ-GUNAME && ')锁定!' .
          LV_MESSAGE = '物流人员在发货,请退出销售订单' && LS_VGBEL-VGBEL && '修改状态。'.
*       给操作者发送消息
          CALL FUNCTION 'TH_POPUP'
            EXPORTING
              CLIENT  = SY-MANDT
              USER    = LS_ENQ-GUNAME
              MESSAGE = LV_MESSAGE.
          RETURN.
        ENDIF.
      ENDLOOP.
    ENDIF.

*--------------------
*第三部分   获取新单号
*--------------------
    SELECT SINGLE LFART FROM LIKP WHERE VBELN EQ @DELIV_NUMB INTO @DATA(LV_LFART).
    SELECT SINGLE NUMKI INTO @LV_NUMKI FROM TVLK WHERE LFART EQ @LV_LFART.
    IF SY-SUBRC = 0.
      CALL FUNCTION 'NUMBER_GET_NEXT'
        EXPORTING
          NR_RANGE_NR             = LV_NUMKI
          OBJECT                  = 'RV_BELEG'
        IMPORTING
          NUMBER                  = LV_VBELN_N
        EXCEPTIONS
          INTERVAL_NOT_FOUND      = 1
          NUMBER_RANGE_NOT_INTERN = 2
          OBJECT_NOT_FOUND        = 3
          QUANTITY_IS_0           = 4
          QUANTITY_IS_NOT_1       = 5
          INTERVAL_OVERFLOW       = 6
          OTHERS                  = 99.
      IF SY-SUBRC NE 0.
        E_CODE = 'E'.
        E_MSG = '拆分失败!'.
        E_MSG = E_MSG && SY-MSGID && SY-MSGNO && SY-MSGV1 && SY-MSGV2 && SY-MSGV3 && SY-MSGV4.
      ENDIF.
*--------------------
*第死部分   开始拆单
*--------------------
      CALL FUNCTION 'BAPI_OUTB_DELIVERY_SPLIT_DEC'
        EXPORTING
          DELIVERY              = DELIV_NUMB
          DELIVERYNEW           = LV_VBELN_N
          DELIVERYITEMSBELONGTO = 'O'
          BUSINESSPROCESS       = '0001'
        TABLES
          ITEMDATA              = LT_ITEMDATA
          RETURN                = LT_RETURN.
      BREAK LUOLIN.
      IF LINE_EXISTS( LT_RETURN[ TYPE = 'E' ] ) .
        E_CODE = 'E'.
        E_MSG = '拆分失败!'.
        LOOP AT LT_RETURN INTO DATA(LS_RETURN).
          DATA LV_MSG TYPE STRING.
          CALL FUNCTION 'MESSAGE_TEXT_BUILD'
            EXPORTING
              MSGID               = LS_RETURN-ID
              MSGNR               = LS_RETURN-NUMBER
              MSGV1               = LS_RETURN-MESSAGE_V1
              MSGV2               = LS_RETURN-MESSAGE_V2
              MSGV3               = LS_RETURN-MESSAGE_V3
              MSGV4               = LS_RETURN-MESSAGE_V4
            IMPORTING
              MESSAGE_TEXT_OUTPUT = LV_MSG.
          IF SY-SUBRC EQ 0.
            CONDENSE LV_MSG NO-GAPS.
            E_MSG = E_MSG && LV_MSG.
          ENDIF.
        ENDLOOP.
      ELSE.
        E_CODE = 'S'.
        E_MSG = '拆分成功!'.
        E_VBELN_NEW = LV_VBELN_N.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFUNCTION.


关键词: ABAP

网友评论

发表评论