• WMS函数组:9.交货单过帐3(BDC)


    FUNCTION ZRFC_WMS_DELIVERY_UPDATE2.
    *"----------------------------------------------------------------------
    *"*"本地接口:
    *"  IMPORTING
    *"     VALUE(MODE) LIKE  APQI-PUTACTIVE DEFAULT 'N'
    *"  TABLES
    *"      ITAB_HEADER STRUCTURE  ZVBKOK OPTIONAL
    *"      ITAB_DETAIL STRUCTURE  ZVBPOK OPTIONAL
    *"      ITAB_RETURN STRUCTURE  ZINTERFACE_RETURN OPTIONAL
    *"      ET_LOG STRUCTURE  BAPIRET2 OPTIONAL
    *"----------------------------------------------------------------------



      DATA: IP_WBSTK      LIKE VBUK-WBSTK.
       DATA: T_LIPS LIKE LIPS OCCURS 0 WITH HEADER LINE.
       DATA: T_VTFA LIKE VTFA OCCURS 0 WITH HEADER LINE.

       DATA: ITAB_DETAIL2 LIKE ITAB_DETAIL OCCURS 0 WITH HEADER LINE.

       CHECK ITAB_HEADER[] IS NOT INITIAL.

      SORT ITAB_HEADER.
       DELETE ADJACENT DUPLICATES FROM ITAB_HEADER .





      LOOP AT ITAB_HEADER.



        PERFORM F_ADD_ZERO USING ITAB_HEADER-VBELN.

         ITAB_RETURN-BILLNO = ITAB_HEADER-WMS_NO.
        ITAB_RETURN-SAPNO = ITAB_HEADER-VBELN.
        ITAB_RETURN-SUBRC = '-1'.

    *    **** 检查单据是否已经完成-START
         CLEAR IP_WBSTK.
        SELECT SINGLE WBSTK INTO IP_WBSTK FROM VBUK WHERE VBELN = ITAB_HEADER-VBELN..

         IF IP_WBSTK = 'C'.
          ITAB_RETURN-SUBRC = -1.
           ITAB_RETURN-MSG = '已经过账!'.
          APPEND ITAB_RETURN.
          DELETE ITAB_HEADER .
          CONTINUE.
        ENDIF.


    ***获取交货单子项目明细
        SELECT  VBELN POSNR MATNR SHKZG XCHPF UECHA LGORT
            WERKS LFIMG
           FROM   LIPS
        INTO CORRESPONDING FIELDS OF TABLE T_LIPS
         WHERE VBELN = ITAB_HEADER-VBELN.
    ***获取交货单子项目装箱明细
        SELECT  VBELV POSNV RFMNG
           FROM   VTFA
        INTO CORRESPONDING FIELDS OF TABLE T_VTFA
         WHERE VBELV = ITAB_HEADER-VBELN.
    ***已装箱明细不能更改数量,需要通知后手动更改
        LOOP AT T_LIPS.
          READ TABLE T_VTFA WITH KEY VBELV = T_LIPS-VBELN POSNV = T_LIPS-POSNR.
           IF SY-SUBRC = 0.
            CLEAR T_LIPS-XCHPF.
            MODIFY T_LIPS.
           ENDIF.
         ENDLOOP.

    ******* 公司间转储价检查

        DATA LP LIKE SY-SUBRC.
         DATA: ZLOG LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE.
         CLEAR: LP , ZLOG[].

         CALL FUNCTION 'ZRFC_CHECK_ZPB2'
           EXPORTING
             IP_VBELN = ITAB_HEADER-VBELN
          IMPORTING
             EX_SUBRC = LP
           TABLES
             ET_LOG   = ZLOG
             LIPS     = T_LIPS.

         IF LP > 0.
          APPEND LINES OF ZLOG TO ET_LOG.
           ITAB_RETURN-SUBRC = -1.
           ITAB_RETURN-MSG = '公司间价格ZPB2不存在'.
          APPEND ITAB_RETURN.
          DELETE ITAB_HEADER .
          CONTINUE.
        ENDIF.



    **汇总数据 1.删除WMS附赠物料.2.将子项目汇总到母项目
        LOOP AT ITAB_DETAIL WHERE VBELN = ITAB_HEADER-VBELN.
          PERFORM F_ADD_ZERO USING ITAB_DETAIL-POSNR.
           READ TABLE T_LIPS WITH KEY
             VBELN = ITAB_DETAIL-VBELN
               POSNR = ITAB_DETAIL-POSNR.

          IF SY-SUBRC = 0.
            IF T_LIPS-UECHA IS NOT INITIAL.
               ITAB_DETAIL-POSNR = T_LIPS-UECHA.
             ENDIF.
             MOVE T_LIPS-WERKS TO  ITAB_DETAIL-MX02.
             COLLECT ITAB_DETAIL INTO ITAB_DETAIL2.
           ELSE.
             ITAB_RETURN-SUBRC = -1.
             ITAB_RETURN-MSG = '行项目在交货单中不存在'.
            APPEND ITAB_RETURN.
             DELETE ITAB_HEADER .
          ENDIF.


        ENDLOOP.



    *1.删除WMS附赠物料和删除行项目为0的数据
        LOOP AT ITAB_DETAIL2 WHERE VBELN = ITAB_HEADER-VBELN.
          PERFORM F_ADD_ZERO USING ITAB_DETAIL-POSNR.


           READ TABLE T_LIPS WITH KEY
               VBELN = ITAB_DETAIL-VBELN
                 UECHA = ITAB_DETAIL2-POSNR.
          IF SY-SUBRC = 0.
            IF  T_LIPS-SHKZG = 'X'. "退货,和无批次同样处理
              CLEAR T_LIPS-XCHPF.
            ENDIF.
             MOVE T_LIPS-XCHPF TO ITAB_DETAIL2-MX01.
          ENDIF.



          SELECT SINGLE MATNR INTO ITAB_DETAIL2-MX03 FROM ZSDA35
                      WHERE MATNR = T_LIPS-MATNR.

           MODIFY ITAB_DETAIL2.

        ENDLOOP.

    *"2.不能存在为0的交货单过帐,删除
        LOOP AT ITAB_DETAIL2 WHERE VBELN = ITAB_HEADER-VBELN AND LGMNG = 0.
           ITAB_RETURN-SUBRC = -1.
           ITAB_RETURN-MSG = '存在交货为0的行项目'.
          APPEND ITAB_RETURN.
          DELETE ITAB_HEADER .
          EXIT.
        ENDLOOP.


    *3.判读SAP中存在 参数中不存在的行项目
        LOOP AT T_LIPS .
           IF T_LIPS-UECHA IS NOT INITIAL.
             T_LIPS-POSNR = T_LIPS-UECHA.
           ENDIF.

           READ TABLE ITAB_DETAIL2 WITH KEY VBELN = T_LIPS-VBELN POSNR = T_LIPS-POSNR.
           IF SY-SUBRC > 0.
             ITAB_RETURN-SUBRC = -1.
             ITAB_RETURN-MSG = '交货单行项目不够!'.
            APPEND ITAB_RETURN.
             DELETE ITAB_HEADER .
            EXIT.
           ENDIF.

         ENDLOOP. "T_lips

       ENDLOOP. " ITAB_HEADER


      CLEAR ITAB_RETURN-MSG.
      CLEAR ITAB_RETURN-SUBRC.



       CHECK ITAB_DETAIL2[] IS NOT INITIAL.
      CHECK ITAB_HEADER[] IS NOT INITIAL.
      CLEAR ITAB_DETAIL.
    *  MOVE ITAB_DETAIL2[] TO ITAB_DETAIL[].
    *  CLEAR ITAB_DETAIL2[].



       DATA: LF_VALUE(20).
      DATA: LF_NAME(50).
      DATA: LF_INDEX(2).
      DATA: LS_MCHB LIKE MCHB.
       DATA: LS_INDEX TYPE I.



      DATA: MESSTAB LIKE  BDCMSGCOLL OCCURS 0 WITH HEADER LINE.
       DATA: ET_LOG2 LIKE  BAPIRET2 OCCURS 0 WITH HEADER LINE.
       DATA:I_ERROR_MESSAGES  LIKE  ARRANG_ERR.
       DATA:CTU      LIKE  APQI-PUTACTIVE,
    *       MODE     LIKE  APQI-PUTACTIVE,
            UPDATE   LIKE  APQI-PUTACTIVE,
            GROUP    LIKE  APQI-GROUPID,
            USER     LIKE  APQI-USERID,
            KEEP     LIKE  APQI-QERASE,
            HOLDDATE LIKE  APQI-STARTDATE,
            NODATA   LIKE  APQI-PUTACTIVE.


       CTU = 'X'.
       KEEP = 'X'.
    *  MODE = 'A'.
      UPDATE = 'L'.
      NODATA = '/'.

    **录屏改数据


      LOOP AT ITAB_HEADER.
         PERFORM BDC_NODATA      USING NODATA.
         PERFORM OPEN_GROUP       USING GROUP USER KEEP HOLDDATE CTU.

        PERFORM BDC_DYNPRO      USING 'SAPMV50A' '4004'.
         PERFORM BDC_FIELD       USING 'BDC_CURSOR'  'LIKP-VBELN'.
         PERFORM BDC_FIELD       USING 'BDC_OKCODE'  '/00'.
         PERFORM BDC_FIELD       USING 'LIKP-VBELN'  ITAB_HEADER-VBELN.
         PERFORM BDC_DYNPRO      USING 'SAPMV50A' '1000'.

         LOOP AT ITAB_DETAIL2 INTO ITAB_DETAIL WHERE VBELN = ITAB_HEADER-VBELN.

          PERFORM BDC_FIELD       USING 'BDC_OKCODE'  '=POPO_T'.
           PERFORM BDC_DYNPRO      USING 'SAPMV50A' '0111'.
           PERFORM BDC_FIELD       USING 'BDC_CURSOR'  'RV50A-POSNR'.
           PERFORM BDC_FIELD       USING 'BDC_OKCODE'  '=WEIT'.
           MOVE ITAB_DETAIL-POSNR TO LF_VALUE.
           SHIFT LF_VALUE LEFT DELETING LEADING SPACE.
           PERFORM BDC_FIELD       USING 'RV50A-POSNR'  LF_VALUE.

          PERFORM BDC_DYNPRO      USING 'SAPMV50A' '1000'.
           IF ITAB_DETAIL-MX01 = 'X' .
            PERFORM BDC_FIELD       USING 'BDC_OKCODE'  '=CHSP_T'.
             PERFORM BDC_DYNPRO      USING 'SAPMV50A' '3000'.
             PERFORM BDC_FIELD       USING 'BDC_OKCODE'  '=MKAL_T'.
             PERFORM BDC_DYNPRO      USING 'SAPMV50A' '3000'.
             PERFORM BDC_FIELD       USING 'BDC_OKCODE'  '=POLO_T'.
             PERFORM BDC_DYNPRO      USING 'SAPMV50A' '3000'.
             PERFORM BDC_FIELD       USING 'BDC_OKCODE'  '=BACK_T'.

             PERFORM BDC_DYNPRO      USING 'SAPMV50A' '1000'.
             PERFORM BDC_FIELD       USING 'RV50A-LIPS_SELKZ(01)'  'X'.
             PERFORM BDC_FIELD       USING 'BDC_OKCODE'  '=CHSP_T'.
    *    PERFORM BDC_DYNPRO      USING 'SAPMV50A' '1000'.
           ENDIF.



           MOVE ITAB_DETAIL-LGMNG TO LF_VALUE.
           SHIFT LF_VALUE LEFT DELETING LEADING SPACE.
           PERFORM BDC_FIELD       USING 'LIPSD-G_LFIMG(01)'  LF_VALUE.
    *      PERFORM BDC_FIELD       USING 'LIPS-LGORT(01)'  ITAB_DETAIL-LGORT.

           IF ITAB_DETAIL-MX01 = 'X' .


             IF ITAB_DETAIL-MX03 IS INITIAL.
               PERFORM BDC_DYNPRO      USING 'SAPMV50A' '3000'.
               PERFORM BDC_FIELD       USING 'BDC_OKCODE'  '=CHFD_T'.
             ENDIF.
             PERFORM BDC_DYNPRO      USING 'SAPMV50A' '3000'.
             PERFORM BDC_FIELD       USING 'BDC_OKCODE'  '=BACK_T'.

             IF ITAB_DETAIL-MX03 IS NOT INITIAL. "扣版业务

              LS_INDEX = 0.
               SELECT
                 MATNR
                 WERKS
                 LGORT
                 CHARG
                 CLABS
                 INTO CORRESPONDING FIELDS OF  LS_MCHB
                 FROM MCHB
                 WHERE MATNR = ITAB_DETAIL-MX03
                   AND WERKS = ITAB_DETAIL-MX02
                   AND LGORT = ITAB_DETAIL-LGORT
                   AND CLABS > 0.
                 CHECK ITAB_DETAIL-LGMNG > 0.
                 LS_INDEX = LS_INDEX + 1.
                 MOVE LS_INDEX TO LF_INDEX.
                 PERFORM F_ADD_ZERO USING LF_INDEX.


                 CONCATENATE 'LIPS-CHARG(' LF_INDEX ')' INTO LF_NAME.
                 PERFORM BDC_FIELD  USING LF_NAME LS_MCHB-CHARG.
                 CONCATENATE 'LIPS-LFIMG(' LF_INDEX ')' INTO LF_NAME.

                 IF LS_MCHB-CLABS >= ITAB_DETAIL-LGMNG.

                   MOVE ITAB_DETAIL-LGMNG TO LF_VALUE.
                   SHIFT LF_VALUE LEFT DELETING LEADING SPACE.
                   PERFORM BDC_FIELD  USING LF_NAME  LF_VALUE.
                   ITAB_DETAIL-LGMNG = 0.

                 ELSE.

                   ITAB_DETAIL-LGMNG = ITAB_DETAIL-LGMNG LS_MCHB-CLABS.
                   MOVE LS_MCHB-CLABS TO LF_VALUE.
                   SHIFT LF_VALUE LEFT DELETING LEADING SPACE.
                   PERFORM BDC_FIELD  USING LF_NAME  LF_VALUE.

                 ENDIF.

                 CLEAR LS_MCHB.
               ENDSELECT.

             ENDIF.


             PERFORM BDC_DYNPRO      USING 'SAPMV50A' '1000'.
           ENDIF.

           CLEAR ITAB_DETAIL.
         ENDLOOP. "itab_deatil




         PERFORM BDC_FIELD       USING 'BDC_OKCODE'  '=WABU_T'.


         CLEAR MESSTAB[].

        PERFORM BDC_TRANSACTION TABLES MESSTAB
        USING 'VL02N'
              CTU
              MODE
              UPDATE.
         PERFORM CLOSE_GROUP USING     CTU.

        CLEAR ET_LOG2.
         ITAB_RETURN-SUBRC = 0.
        LOOP AT MESSTAB. "WHERE MSGTYP = 'E'.
    *      SUBRC = -1.
           CLEAR    I_ERROR_MESSAGES.
           I_ERROR_MESSAGES-MSGID  = MESSTAB-MSGID.
           I_ERROR_MESSAGES-MSGTY  = MESSTAB-MSGTYP.
           I_ERROR_MESSAGES-MSGNO  = MESSTAB-MSGNR.
           I_ERROR_MESSAGES-MSGV1  = MESSTAB-MSGV1.
           I_ERROR_MESSAGES-MSGV2  = MESSTAB-MSGV2.
           I_ERROR_MESSAGES-MSGV3  = MESSTAB-MSGV3.
           I_ERROR_MESSAGES-MSGV4  = MESSTAB-MSGV4.
           ET_LOG2-TYPE             = MESSTAB-MSGTYP.
          ET_LOG2-ID               = MESSTAB-MSGID.
           ET_LOG2-NUMBER           = MESSTAB-MSGNR.
           MOVE ITAB_HEADER-VBELN TO ET_LOG2-MESSAGE_V1 .
           CALL FUNCTION 'MM_ARRANG_GET_MESSAGE_TEXT'
             EXPORTING
               I_ERROR_MESSAGES = I_ERROR_MESSAGES
               I_LANGU          = SY-LANGU
             IMPORTING
               E_TEXT           = ET_LOG2-MESSAGE
             EXCEPTIONS
               PARAMETER_ERROR  = 1
               OTHERS           = 2.

          IF MESSTAB-MSGTYP = 'E'.
             ITAB_RETURN-SUBRC = -1.
             WRITE / ET_LOG-MESSAGE.

           ENDIF.

           APPEND ET_LOG2 TO ET_LOG.
           CLEAR:ET_LOG2[],ET_LOG2..
        ENDLOOP. " messagetab

         ITAB_RETURN-BILLNO = ITAB_HEADER-WMS_NO.
        ITAB_RETURN-SAPNO = ITAB_HEADER-VBELN.


        SELECT SINGLE WBSTK INTO IP_WBSTK FROM VBUK WHERE VBELN = ITAB_HEADER-VBELN..

         IF IP_WBSTK = 'C'.
          ITAB_RETURN-SUBRC = 0.
          ITAB_RETURN-MSG = '过帐完成!'.
        ELSE.
           ITAB_RETURN-SUBRC = -1.
           ITAB_RETURN-MSG = '过帐失败!'.
        ENDIF.



         APPEND ITAB_RETURN.

      ENDLOOP. "itab_header



    *  INCLUDE BDCRECXY.


    *  INCLUDE ZRPT_FUN.

    ENDFUNCTION.
  • 相关阅读:
    Java nio Socket非阻塞模式
    Android执行文件apk的组成结构
    C++大会归来
    C++大会的入场卷已入手
    DVB vs. SVB+Shader & Instancing
    放一个半年前写的Python静态检查编译器
    GCC 4.1 Released
    C++大会后的一些感想
    多核技术来临?
    Notepad++ v3.3 released
  • 原文地址:https://www.cnblogs.com/twttafku/p/14315980.html
Copyright © 2020-2023  润新知