WMS函数组:交货单过帐(BAPI)

FUNCTION ZRFC_WMS_DELIVERY_UPDATE.
*"----------------------------------------------------------------------

*"      'LE_MOB_DELIVERY_UPDATE' 更改批次

*"      'WS_DELIVERY_UPDATE' 过帐
*"*"Local interface:
*"  TABLES
*"      ITAB_HEADER STRUCTURE  ZVBKOK OPTIONAL
*"      ITAB_DETAIL STRUCTURE  ZVBPOK OPTIONAL
*"      ITAB_RETURN STRUCTURE  ZINTERFACE_RETURN OPTIONAL
*"      ET_LOG STRUCTURE  BAPIRET2 OPTIONAL
*"----------------------------------------------------------------------
DATA: VBPOK_TAB LIKE VBPOK OCCURS 0 WITH HEADER LINE,
        VBKOK_WA  LIKE VBKOK,
        IT_LIPS LIKE ITAB_DETAIL.
DATA:
         IPROT LIKE PROTT OCCURS 0 WITH HEADER LINE,
         ET_LOG1 LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE.
DATA :
        ITAB_LIPS LIKE LIPS OCCURS 0 WITH HEADER LINE,
*        ITAB_LIPS1 like LIPS occurs 0 with header line,
        IP_WBSTK LIKE VBUK-WBSTK,
        IP_VBELN LIKE LIPS-VBELN.
DATA:
  I_ERROR_MESSAGES  LIKE  ARRANG_ERR .
*------------------CHA JWY_20170811
SORT ITAB_HEADER.
*------------------CHA JWY_20170811
LOOP AT ITAB_HEADER.
CLEAR VBKOK_WA.
    ITAB_RETURN-BILLNO = ITAB_HEADER-WMS_NO.
    ITAB_RETURN-SAPNO = ITAB_HEADER-VBELN.
MOVE ITAB_HEADER-VBELN TO IP_VBELN.
PERFORM F_ADD_ZERO USING IP_VBELN.
**** 检查单据是否被锁定-START
CALL FUNCTION 'ENQUEUE_EVVBLKE'
EXPORTING
        VBELN          = IP_VBELN
EXCEPTIONS
        FOREIGN_LOCK   = 01
        SYSTEM_FAILURE = 02.
IF SY-SUBRC > 0.
      ET_LOG-TYPE = 'E'.
      ET_LOG-ID = IP_VBELN.
      ET_LOG-MESSAGE = 'Object requested is currently locked by user'.
      ET_LOG-LOG_NO = IP_VBELN.
APPEND ET_LOG.
      ITAB_RETURN-SUBRC = -1.
      ITAB_RETURN-MSG = ET_LOG-MESSAGE.
APPEND ITAB_RETURN.
CONTINUE.
ENDIF.
**** 检查单据是否被锁定-END
**** 检查单据是否已经完成-START
CLEAR IP_WBSTK.
SELECT SINGLE WBSTK INTO IP_WBSTK FROM VBUK WHERE VBELN = IP_VBELN.
IF IP_WBSTK = 'C'.
      ET_LOG-TYPE = 'W'.
      ET_LOG-ID = IP_VBELN.
      ET_LOG-MESSAGE = '  已经过账!'.
CONCATENATE IP_VBELN  ET_LOG-MESSAGE INTO ET_LOG-MESSAGE.
APPEND ET_LOG.
      ITAB_RETURN-SUBRC = 0.
      ITAB_RETURN-MSG = ET_LOG-MESSAGE.
APPEND ITAB_RETURN.
CONTINUE.
ENDIF.
**** 检查单据是否已经完成-END
******注意原单的库位不更改
*LOOP AT ITAB_DETAIL.
*update LIPS set LGORT = ITAB_DETAIL-LGORT WHERE VBELN = IP_VBELN AND POSNR =  ITAB_DETAIL-POSNR.
****update LIPS set LGORT = '9131' WHERE VBELN = IP_VBELN AND POSNR =  ITAB_DETAIL-POSNR.
*ENDLOOP.
** 修改批次-START
DATA : IT_MARA LIKE MARA.
CLEAR ITAB_LIPS[].
SELECT * FROM  LIPS INTO TABLE ITAB_LIPS  WHERE VBELN = IP_VBELN.
IF SY-SUBRC > 0 .
      ET_LOG-TYPE = 'E'.
      ET_LOG-ID = IP_VBELN.
      ET_LOG-MESSAGE = ' 交货单不存在'.
CONCATENATE IP_VBELN ET_LOG-MESSAGE INTO ET_LOG-MESSAGE.
      ET_LOG-LOG_NO = IP_VBELN.
APPEND ET_LOG.
      ITAB_RETURN-SUBRC = -1.
      ITAB_RETURN-MSG = ET_LOG-MESSAGE.
APPEND ITAB_RETURN.
CONTINUE.
ENDIF.
*------------------CHA JWY_20170811
SORT ITAB_LIPS.
*------------------CHA JWY_20170811
LOOP AT ITAB_LIPS.
IF ITAB_LIPS-LGORT IS INITIAL.
CLEAR IT_LIPS.
READ  TABLE ITAB_DETAIL INTO IT_LIPS WITH KEY VBELN = IP_VBELN  POSNR = ITAB_LIPS-POSNR.
IF SY-SUBRC EQ 0.
          ITAB_LIPS-LGORT = IT_LIPS-LGORT.
MODIFY ITAB_LIPS.
MODIFY LIPS FROM ITAB_LIPS.
ENDIF.
ENDIF.
CLEAR: IT_MARA,IT_LIPS.
SELECT SINGLE * INTO IT_MARA FROM MARA WHERE MATNR = ITAB_LIPS-MATNR.
IF IT_MARA-XCHPF = 'X'. "查看此物料是否需要进行批次管理
READ  TABLE ITAB_DETAIL INTO IT_LIPS WITH KEY VBELN = IP_VBELN  POSNR = ITAB_LIPS-POSNR.
IF SY-SUBRC EQ 0.
          ITAB_LIPS-CHARG = IT_LIPS-CHARG.
MODIFY ITAB_LIPS.
ENDIF.
ENDIF.
ENDLOOP.
CALL FUNCTION 'LE_MOB_DELIVERY_UPDATE'
EXPORTING
        DO_COMMIT                = 'X'
TABLES
        T_DELIVERY_ITEMS         = ITAB_LIPS
        PROT                     = IPROT
EXCEPTIONS
        CONVERSION_OVERFLOW      = 1
        ESSENTIAL_DATA_MISSING   = 2
        ERROR                    = 3
        NOTHING_TO_UPDATE        = 4
        LOCK_AFTER_UPDATE_FAILED = 5
        ERROR_IN_DELIVERY_UPDATE = 6
OTHERS                   = 7.
IF SY-SUBRC = 0 .
      ET_LOG-TYPE = 'I'.
      ET_LOG-ID = IP_VBELN.
      ET_LOG-MESSAGE = ' 批次修改成功'.
CONCATENATE IP_VBELN ET_LOG-MESSAGE  INTO ET_LOG-MESSAGE.
      ET_LOG-LOG_NO = IP_VBELN.
APPEND ET_LOG.
ENDIF.
*** 修改批次-END
    VBKOK_WA-VBELN_VL = IP_VBELN.
    VBKOK_WA-KOMUE = 'X'.
    VBKOK_WA-WABUC = 'X'.
    VBKOK_WA-WADAT_IST = ITAB_HEADER-WADAT_IST.
CLEAR : VBPOK_TAB,VBPOK_TAB[].
*-------------CHA JWY_20170811
SORT ITAB_DETAIL.
*-------------CHA JWY_20170811
LOOP AT ITAB_DETAIL WHERE VBELN = IP_VBELN.
READ TABLE ITAB_LIPS WITH KEY POSNR = ITAB_DETAIL-POSNR.
CHECK SY-SUBRC = 0.
CLEAR VBPOK_TAB.
      VBPOK_TAB-VBELN_VL = ITAB_DETAIL-VBELN.
      VBPOK_TAB-POSNR_VL =  ITAB_DETAIL-POSNR.
      VBPOK_TAB-VBELN = ITAB_DETAIL-VBELN.
      VBPOK_TAB-POSNN = ITAB_DETAIL-POSNR.
      VBPOK_TAB-CHARG = ITAB_DETAIL-CHARG.
      VBPOK_TAB-LIANP =  'X'.
*      READ TABLE  ITAB_LIPS WITH KEY VBELN = ITAB_DETAIL-VBELN  POSNR = ITAB_DETAIL-POSNR .
*      IF SY-SUBRC  = 0.
*        IF ITAB_DETAIL-LGMNG > ITAB_LIPS-LFIMG.
*          ITAB_DETAIL-LGMNG =  ITAB_LIPS-LFIMG.
*        ENDIF.
*      ENDIF.
      VBPOK_TAB-LGMNG = ITAB_DETAIL-LGMNG.
      VBPOK_TAB-LGPLA = ITAB_DETAIL-LGORT.
*        IF VBPOK_TAB-LGMNG = '0'.
*          CLEAR VBPOK_TAB-CHARG.
*          VBPOK_TAB-LIPS_DEL = 'X'. "删除单据,此处操作危险,转人工操作
*        ENDIF.
APPEND VBPOK_TAB.
ENDLOOP.
CLEAR:IPROT[].
IF VBPOK_TAB[] IS NOT INITIAL.
CALL FUNCTION 'WS_DELIVERY_UPDATE'
EXPORTING
          VBKOK_WA       = VBKOK_WA
COMMIT         = 'X'
          SYNCHRON       = 'X'
          DELIVERY       = IP_VBELN
          UPDATE_PICKING = 'X'
TABLES
          VBPOK_TAB      = VBPOK_TAB
          PROT           = IPROT
*        VBSUPCON_TAB = it_VB
*        IT_VERPO_SERNR = it_se
*        IT_PACKING = it_wm
*        IT_PACKING_SERNR = it_nr
*        IT_REPACK = it_pk
*        IT_HANDLING_UNITS = it_hu
*        IT_OBJECTS = it_pr
*        ET_CREATED_HUS =  it_kp
*        TVPOD_TAB = it_tv
EXCEPTIONS
          ERROR_MESSAGE  = 1           "INS_HP_136357
OTHERS         = 2.          "INS_HP_136357
ENDIF.
*    IF SY-SUBRC = 0 .
*    ELSE.
*      ET_LOG-TYPE = 'E'.
*      ET_LOG-ID = IP_VBELN.
*      ET_LOG-MESSAGE = ' 过账错误,请检查数据来源!'.
*      CONCATENATE IP_VBELN ET_LOG-MESSAGE  INTO ET_LOG-MESSAGE.
*      ET_LOG-LOG_NO = IP_VBELN.
*      APPEND ET_LOG.
*
*      ITAB_RETURN-MSG = ET_LOG-MESSAGE.
*      ITAB_RETURN-SUBRC = SY-SUBRC.
*      APPEND ITAB_RETURN.
*
*
*      LOOP AT iPROT.
*        CLEAR I_ERROR_MESSAGES.
*        I_ERROR_MESSAGES-MSGID  = iPROT-MSGID.
*        I_ERROR_MESSAGES-MSGTY  = iPROT-MSGTY.
*        I_ERROR_MESSAGES-MSGNO  = iPROT-MSGNO.
*        I_ERROR_MESSAGES-MSGV1  = iPROT-MSGV1.
*        I_ERROR_MESSAGES-MSGV2  = iPROT-MSGV2.
*        I_ERROR_MESSAGES-MSGV3  = iPROT-MSGV3.
*        I_ERROR_MESSAGES-MSGV4  = iPROT-MSGV4.
*
*        CALL FUNCTION 'MM_ARRANG_GET_MESSAGE_TEXT'
*          EXPORTING
*            I_ERROR_MESSAGES = I_ERROR_MESSAGES
*            I_LANGU          = SY-LANGU
*          IMPORTING
*            E_TEXT           = ET_LOG-MESSAGE
*          EXCEPTIONS
*            PARAMETER_ERROR  = 1
*            OTHERS           = 2.
*
*        ET_LOG-TYPE = iPROT-MSGTY.
*        ET_LOG-ID = iPROT-MSGID.
*        ET_LOG-NUMBER = iPROT-MSGNO.
*        ET_LOG-MESSAGE_V1 = iPROT-MSGV1.
*        ET_LOG-MESSAGE_V2 = iPROT-MSGV2.
*        ET_LOG-MESSAGE_V3 = iPROT-MSGV3.
*        ET_LOG-MESSAGE_V4 = iPROT-MSGV4.
*        ET_LOG-LOG_NO = iPROT-VBELN.
*        APPEND ET_LOG.
*      ENDLOOP.
*    ENDIF.
CLEAR IP_WBSTK.
SELECT SINGLE WBSTK INTO IP_WBSTK FROM VBUK WHERE VBELN = IP_VBELN.
*****查找数据库,是否过帐成功
    ET_LOG-ID = IP_VBELN.
IF IP_WBSTK = 'C'. "过帐成功
      ITAB_RETURN-SUBRC = 0.
      ET_LOG-TYPE = 'W'.
      ET_LOG-MESSAGE = ' 恭喜,过账成功!'.
ELSE. "过帐失败
      ITAB_RETURN-SUBRC = -1.
      ET_LOG-TYPE = 'E'.
      ET_LOG-MESSAGE = ' 过账失败!'.
ENDIF.
CONCATENATE IP_VBELN ET_LOG-MESSAGE  INTO ET_LOG-MESSAGE.
APPEND ET_LOG.
    ITAB_RETURN-MSG = ET_LOG-MESSAGE.
APPEND ITAB_RETURN.
WAIT UP TO 1 SECONDS.
ENDLOOP.
ENDFUNCTION.

上一篇:成本价自动创建功能自动函数


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