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.
上一篇:WMS函数组:交货单过帐(BAPI)


下一篇:BDC应用