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.
  • 相关阅读:
    表达式和计算的描述
    表达式和计算的描述
    递归算法浅谈
    编程基本功训练:流程图画法及练习
    【2012.1.24更新】不要再在网上搜索eclipse的汉化包了!
    VS2008下直接安装使用Boost库1.46.1版本号
    android关键组件service服务(一)
    U盘安装咱中国人自己的操作系统UbuntuKylin14.04LST(超具体原创图文教程)
    数据流图的画法
    匈牙利算法
  • 原文地址:https://www.cnblogs.com/sapSB/p/5771697.html
Copyright © 2011-2022 走看看