zoukankan      html  css  js  c++  java
  • 根据采购/销售订单创建STO/SO

    FUNCTION Z_SD_CREATE_DN.
    *"----------------------------------------------------------------------
    *"*"本地接口:
    *"  IMPORTING
    *"     VALUE(IM_SHIP_TYPE) TYPE  LIKP-VSART DEFAULT '01'
    *"     VALUE(IM_DUE_DATE) TYPE  DATUM DEFAULT '99991231'
    *"  EXPORTING
    *"     VALUE(E_DN) TYPE  CHAR10
    *"     VALUE(E_STATUS) TYPE  CHAR1
    *"     VALUE(E_MESSAGE) TYPE  CHAR40
    *"  TABLES
    *"      T_DATA STRUCTURE  ZSDS0008
    *"      IT_RETURN STRUCTURE  BAPIRET2 OPTIONAL
    *"      IT_DN STRUCTURE  VBAK OPTIONAL
    *"----------------------------------------------------------------------
      DATA : LV_SHIP_POINT TYPE          BAPIDLVCREATEHEADER-SHIP_POINT,
             LV_DUE_DATE   TYPE          BAPIDLVCREATEHEADER-DUE_DATE,
             LV_DELIVERY   TYPE          BAPISHPDELIVNUMB-DELIV_NUMB,
             LV_DELIVERYS  TYPE          BAPIDLVCREATEHEADER-NUM_DELIVERIES, "TUS-2015-12-04
             LT_DELIVERIES TYPE          BAPISHPDELIVNUMB OCCURS 0 WITH HEADER LINE, "TUS-2015-12-04
             LT_SO_ITEMS   LIKE TABLE OF BAPIDLVREFTOSALESORDER,
             LS_SO_ITEM       LIKE          BAPIDLVREFTOSALESORDER,
             LT_STO_ITEMS  LIKE TABLE OF BAPIDLVREFTOSTO,
             LS_STO_ITEM   LIKE          BAPIDLVREFTOSTO,
             LT_RETURN     LIKE TABLE OF BAPIRET2,
             LS_RETURN     LIKE          BAPIRET2.
    
      DATA : LV_TYPE(2). "PO / SO
      DATA : LV_SUCCESS.
      DATA : LV_MATNR TYPE VBAP-MATNR.
      DATA : LV_VBELN TYPE VBELN.
      DATA : LV_TABIX TYPE SY-TABIX.
      DATA : LV_CONTINUE.
    
      DATA : LT_LIPS TYPE TABLE OF LIPS,
             LS_LIPS TYPE          LIPS.
    
      DATA : BEGIN OF LS_DATA,
               DEL.
              INCLUDE STRUCTURE ZSDS0008.
      DATA : END OF LS_DATA.
    
      DATA : LT_DATA LIKE TABLE OF LS_DATA.
    
      DATA : BEGIN OF LT_VBFA OCCURS 0,
               VBELV TYPE VBFA-VBELV,   "先前凭证
               POSNV TYPE VBFA-POSNV,
               VBELN TYPE VBFA-VBELN,   "后续凭证
               POSNR TYPE VBFA-POSNN,
             END OF LT_VBFA.
    
      DATA : LV_MAX   TYPE I VALUE '333',
             LV_COUNT TYPE I.
    
      LOOP AT T_DATA.
        MOVE-CORRESPONDING T_DATA TO LS_DATA.
        APPEND LS_DATA TO LT_DATA.
      ENDLOOP.
    
      PERFORM FRM_DATA_CHECK TABLES LT_DATA CHANGING E_MESSAGE.
    
      IF E_MESSAGE IS NOT INITIAL.
        E_STATUS = 'E'.
        EXIT.
      ENDIF.
    
      REFRESH : LT_STO_ITEMS,
                LT_SO_ITEMS,
                IT_RETURN.
    
      SORT LT_DATA BY VBELN POSNR.
    
      LV_DUE_DATE = IM_DUE_DATE.
    
      CLEAR LS_DATA.
      READ TABLE LT_DATA INTO LS_DATA INDEX 1.
      SELECT SINGLE * FROM EKKO WHERE EBELN = LS_DATA-VBELN.
      IF SY-SUBRC EQ 0."PO - STO.
        LV_TYPE = 'PO'.
        LV_SHIP_POINT = '8001'.
    *    LV_DUE_DATE = '99991230'.
      ELSE.
        LV_TYPE = 'SO'.
        LV_SHIP_POINT = '8001'.
    *    LV_DUE_DATE = '99991230'.
      ENDIF.
    ***********CHANGED BY JAHLEEL 20160328 BEGIN**************************
    *CHANGE THE WAY OF SEARCHING THE DELIVERY FROM SALES ORDERS.
    
    ** 判断行项目是否产生过交货单
    *  SELECT VGBEL AS VBELV VGPOS AS POSNV VBELN POSNR
    *    FROM LIPS
    *    INTO TABLE LT_VBFA
    *    WHERE VGBEL = LS_DATA-VBELN.
    
      IF LV_TYPE EQ 'SO'.
    
        SELECT VBELV POSNV VBELN POSNN AS POSNR
         FROM VBFA
          INTO TABLE LT_VBFA
          WHERE VBELN EQ LS_DATA-VBELN
          AND VBTYP_N EQ 'J'.
    
      ELSEIF LV_TYPE EQ 'PO'.
    
        SELECT EBELN AS VBELV EBELP AS POSNV BELNR AS VBELN BUZEI AS POSNR
          FROM EKBE
          INTO TABLE LT_VBFA
          WHERE EBELN EQ LS_DATA-VBELN
          AND BEWTP EQ 'L'.
    
      ENDIF.
    
    ***********CHANGED BY JAHLEEL 20160328 END***************************
    
    * 控制交货单最大的项目数
      DO.
    
        CLEAR LV_CONTINUE.
    
        LOOP AT LT_DATA INTO LS_DATA WHERE DEL EQ ''.
    
    *      IF LV_MAX = LV_COUNT.
    *        CLEAR LV_COUNT.
    *        EXIT.
    *      ENDIF.
    *     排除掉已经创建过交货单的行项目
          READ TABLE LT_VBFA WITH KEY VBELV = LS_DATA-VBELN POSNV = LS_DATA-POSNR.
          IF SY-SUBRC EQ 0.
            E_DN = LT_VBFA-VBELN.
            IT_DN-VBELN = E_DN.
            COLLECT IT_DN.
            CONTINUE.
          ENDIF.
    
          CLEAR E_DN.
    
          ADD 1 TO LV_COUNT.
    
          IF LV_TYPE = 'PO'.
            CLEAR LS_STO_ITEM.
            LS_STO_ITEM-REF_DOC = LS_DATA-VBELN.
            LS_STO_ITEM-REF_ITEM = LS_DATA-POSNR.
            APPEND LS_STO_ITEM TO LT_STO_ITEMS.
          ELSE.
            CLEAR LS_SO_ITEM.
            LS_SO_ITEM-REF_DOC = LS_DATA-VBELN.
            LS_SO_ITEM-REF_ITEM = LS_DATA-POSNR.
            APPEND LS_SO_ITEM TO LT_SO_ITEMS.
          ENDIF.
    
          LV_CONTINUE = 'X'.
    
          LS_DATA-DEL = 'X'.
          MODIFY LT_DATA FROM LS_DATA TRANSPORTING DEL.
        ENDLOOP.
    
        IF LV_CONTINUE EQ ''.
          EXIT.
        ENDIF.
    
        IF LV_DUE_DATE NE '99991231'.
          FREE MEMORY ID 'DUE_DATE'.
          EXPORT LV_DUE_DATE TO MEMORY ID 'DUE_DATE'.
        ENDIF.
    
    
        IF LT_SO_ITEMS IS NOT INITIAL.
    * Call BAPI to Create DN
          CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_SLS'
            EXPORTING
              SHIP_POINT        = LV_SHIP_POINT
              DUE_DATE          = LV_DUE_DATE
            IMPORTING
              DELIVERY          = LV_DELIVERY
            TABLES
              SALES_ORDER_ITEMS = LT_SO_ITEMS
              RETURN            = LT_RETURN.
    
        ELSEIF LT_STO_ITEMS IS NOT INITIAL.
    * Call BAPI to Create DN
          CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_STO'
            EXPORTING
              SHIP_POINT        = LV_SHIP_POINT
              DUE_DATE          = LV_DUE_DATE
            IMPORTING
              DELIVERY          = LV_DELIVERY
              NUM_DELIVERIES    = LV_DELIVERYS  "TUS-2015-12-04
            TABLES
              STOCK_TRANS_ITEMS = LT_STO_ITEMS
              DELIVERIES        = LT_DELIVERIES "TUS-2015-12-04
              RETURN            = LT_RETURN.
    
        ENDIF.
    
        APPEND LINES OF LT_RETURN TO IT_RETURN.
    
        LOOP AT LT_RETURN TRANSPORTING NO FIELDS WHERE TYPE = 'A' OR
                                                       TYPE = 'E' OR
                                                       TYPE = 'X'.
          EXIT.
        ENDLOOP.
    
        IF SY-SUBRC EQ 0.
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    
          PERFORM FRM_CONVERT_MESSAGE TABLES LT_RETURN CHANGING E_MESSAGE.
    
          E_STATUS = 'E'.
          EXIT.
        ELSE.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              WAIT = 'X'.
    
          E_STATUS = 'S'.
          E_DN = LV_DELIVERY.
        ENDIF.
    
        IF LT_DELIVERIES[] IS NOT INITIAL.
          DO 100 TIMES.
            SELECT *
              FROM LIPS
              INTO TABLE LT_LIPS
              FOR ALL ENTRIES IN LT_DELIVERIES
              WHERE VBELN = LT_DELIVERIES-DELIV_NUMB.
    
            IF SY-SUBRC EQ 0.
              EXIT.
            ENDIF.
          ENDDO.
        ELSE.
          DO 100 TIMES.
            SELECT *
              FROM LIPS
              INTO TABLE LT_LIPS
              WHERE VBELN = LV_DELIVERY.
    
            IF SY-SUBRC EQ 0.
              EXIT.
            ENDIF.
          ENDDO.
        ENDIF.
    
    
    *   --->请求交货数量 与交货数量不一致 20152417
        IF LT_STO_ITEMS IS NOT INITIAL AND LINES( LT_STO_ITEMS ) NE LINES( LT_LIPS ).
    *      WAIT UP TO 1 SECONDS.
          "更换成内表 TUS-2015-12-04
          LOOP AT LT_DELIVERIES.
            PERFORM FRM_DELETE_DELIVERY TABLES IT_RETURN USING LT_DELIVERIES-DELIV_NUMB.
            CLEAR IT_RETURN.
            IT_RETURN-ID         = '00'.
            IT_RETURN-NUMBER     = '000'.
            IT_RETURN-TYPE       = 'E'.
            IT_RETURN-MESSAGE    = '交货数量与请求交货数量不一致,停止交货'.
            IT_RETURN-MESSAGE_V1 = '交货数量与请求交货数量不一致'.
            IT_RETURN-MESSAGE_V2 = ',停止交货'.
            IT_RETURN-MESSAGE_V3 = LT_DELIVERIES-DELIV_NUMB.
            IT_RETURN-MESSAGE_V4 = ''.
            APPEND IT_RETURN.
    
            CLEAR: E_STATUS,E_DN.
          ENDLOOP.
          EXIT.
        ELSEIF LT_SO_ITEMS IS NOT INITIAL AND LINES( LT_SO_ITEMS ) NE LINES( LT_LIPS ).
    *      WAIT UP TO 1 SECONDS.
          PERFORM FRM_DELETE_DELIVERY TABLES IT_RETURN USING LV_DELIVERY.
          CLEAR IT_RETURN.
          IT_RETURN-ID         = '00'.
          IT_RETURN-NUMBER     = '000'.
          IT_RETURN-TYPE       = 'E'.
          IT_RETURN-MESSAGE    = '交货数量与请求交货数量不一致,停止交货'.
          IT_RETURN-MESSAGE_V1 = '交货数量与请求交货数量不一致'.
          IT_RETURN-MESSAGE_V2 = ',停止交货'.
          IT_RETURN-MESSAGE_V3 = LV_DELIVERY.
          IT_RETURN-MESSAGE_V4 = ''.
          APPEND IT_RETURN.
    
          CLEAR: E_STATUS,E_DN.
          EXIT.
        ENDIF.
    *   <---请求交货数量 与交货数量不一致 20150427
        IF LT_DELIVERIES[] IS NOT INITIAL.
          LOOP AT LT_DELIVERIES.
            IT_DN-VBELN = LT_DELIVERIES-DELIV_NUMB.
            APPEND IT_DN.
          ENDLOOP.
        ELSE.
          IT_DN-VBELN = LV_DELIVERY.
          APPEND IT_DN.
        ENDIF.
    
    *    REFRESH :  GT_DN_ITEM.
    *
    *    LOOP AT LT_LIPS INTO LS_LIPS.
    *      LV_TABIX = SY-TABIX.
    *
    *      CLEAR GS_DN_ITEM.
    *      GS_DN_ITEM-DELIV_NUMB = LS_LIPS-VBELN.
    *      GS_DN_ITEM-DELIV_ITEM = LS_LIPS-POSNR.
    *      GS_DN_ITEM-MATERIAL = LS_LIPS-MATNR.
    *      GS_DN_ITEM-DLV_QTY = LS_LIPS-LGMNG.
    *      GS_DN_ITEM-FACT_UNIT_NOM = LS_LIPS-UMVKZ.
    *      GS_DN_ITEM-FACT_UNIT_DENOM = LS_LIPS-UMVKN.
    *
    *      READ TABLE LT_DATA INTO LS_DATA WITH KEY VBELN = LS_LIPS-VGBEL POSNR = LS_LIPS-VGPOS.
    *      IF SY-SUBRC EQ 0 AND LS_DATA-CHARG IS NOT INITIAL AND LS_LIPS-CHARG NE LS_DATA-CHARG.
    *        GS_DN_ITEM-BATCH = LS_DATA-CHARG.
    *        APPEND GS_DN_ITEM TO GT_DN_ITEM.
    *
    *        LS_LIPS-CHARG = LS_DATA-CHARG.
    *      ELSE.
    *        DELETE LT_LIPS INDEX LV_TABIX.
    *        CONTINUE.
    *      ENDIF.
    *
    *      CLEAR GS_DN_ITEM_CTR.
    *      GS_DN_ITEM_CTR-DELIV_NUMB = LS_LIPS-VBELN.
    *      GS_DN_ITEM_CTR-DELIV_ITEM = LS_LIPS-POSNR.
    *      GS_DN_ITEM_CTR-CHG_DELQTY = 'X'.
    *      APPEND GS_DN_ITEM_CTR TO GT_DN_ITEM_CTR.
    *
    *      MODIFY LT_LIPS FROM LS_LIPS TRANSPORTING CHARG.
    *    ENDLOOP.
    
    *    CHECK GT_DN_ITEM IS NOT INITIAL.
    
    *    GS_DN_HEADER-DELIV_NUMB = LV_DELIVERY.
    *    GS_DN_HEADER_CTR-DELIV_NUMB = LV_DELIVERY.
    *    GS_DN_HEADER-SHIP_COND = IM_SHIP_COND."Ship condition
    *    GS_DN_HEADER_CTR-SHIP_COND_FLG = 'X'."Ship condition
    *    GV_DN_NUMBER = LV_DELIVERY.
    
    
    *  Update Batch to DN
    *  CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
    *    EXPORTING
    *      HEADER_DATA    = GS_DN_HEADER
    *      HEADER_CONTROL = GS_DN_HEADER_CTR
    *      DELIVERY       = GV_DN_NUMBER
    *    TABLES
    *      ITEM_DATA      = GT_DN_ITEM
    *      ITEM_CONTROL   = GT_DN_ITEM_CTR
    *      RETURN         = GT_RETURN.
    
    *    LV_VBELN = LV_DELIVERY.
    *    CALL FUNCTION 'Z_SD_CHANGE_DN'
    *      EXPORTING
    *        IM_DELIVERY  = LV_VBELN
    *        IM_SHIP_TYPE = IM_SHIP_TYPE
    *      TABLES
    *        IT_ITEM      = LT_LIPS
    *        IT_RETURN    = GT_RETURN.
    *
    *
    *    LOOP AT GT_RETURN TRANSPORTING NO FIELDS WHERE TYPE = 'A' OR
    *                                                   TYPE = 'E' OR
    *                                                   TYPE = 'X'.
    *      EXIT.
    *    ENDLOOP.
    *
    *    IF SY-SUBRC EQ 0.
    *      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    *
    *      APPEND LINES OF GT_RETURN TO IT_RETURN.
    *
    *      PERFORM FRM_CONVERT_MESSAGE TABLES GT_RETURN CHANGING E_MESSAGE.
    **   Delete Delivery Note
    *      PERFORM FRM_DELETE_DELIVERY USING LV_VBELN.
    *
    *      E_STATUS = 'E'.
    *    ELSE.
    *      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    *        EXPORTING
    *          WAIT = 'X'.
    *
    *      E_STATUS = 'S'.
    *      E_DN = LV_DELIVERY.
    *    ENDIF.
    *
    *    REFRESH: LT_SO_ITEMS,
    *             LT_STO_ITEMS,
    *             LT_LIPS.
    *
    *    APPEND LINES OF GT_RETURN TO IT_RETURN.
    *
    *    IT_DN-VBELN = LV_DELIVERY.
    *    APPEND IT_DN.
      ENDDO.
    
    
    
    ENDFUNCTION.
  • 相关阅读:
    【SCOI 2011】 糖果
    【POJ 3159】 Candies
    【POJ 1716】 Integer Intervals
    【POJ 2983】 Is the information reliable?
    【POJ 1364】 King
    【POJ 1201】 Intervals
    【POJ 1804】 Brainman
    6月10日省中提高组题解
    【POJ 3352】 Road Construction
    【POJ 1144】 Network
  • 原文地址:https://www.cnblogs.com/sapSB/p/5771697.html
Copyright © 2011-2022 走看看