利用BAPI_OUTB_DELIVERY_SPLIT_DEC对交货单拆分

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.
    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.
        "           Cannot find number range. Should not happened.
        MESSAGE ID SY-MSGID TYPE 'A' NUMBER SY-MSGNO
                WITH 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.

      IF LINE_EXISTS( LT_RETURN[ TYPE = 'E' ] ) .
        E_CODE = 'E'.
        E_MSG = '拆分失败!'.
      ELSE.
        E_CODE = 'S'.
        E_MSG = '拆分成功!'.
        E_VBELN_NEW = LV_VBELN_N.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFUNCTION.


关键词: ABAP

网友评论

发表评论