交货单过账

转自:https://www.cnblogs.com/sapSB/p/5771585.html

FUNCTION Z_SD_DN_PGI1.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     REFERENCE(I_VBELN) TYPE  VBELN
*"     REFERENCE(I_BUDAT) TYPE  BUDAT DEFAULT SY-DATUM
*"  EXPORTING
*"     REFERENCE(E_MBLNR) TYPE  MBLNR
*"  TABLES
*"      T_DATA STRUCTURE  ZSDS0015
*"      IT_RETURN STRUCTURE  BAPIRET2 OPTIONAL
*"----------------------------------------------------------------------
  DATA : LS_DATA LIKE LINE OF  T_DATA,
         LT_DATA LIKE TABLE OF ZSDS0015.

  DATA: LV_VBELN LIKE LIKP-VBELN,
        LW_VBKOK LIKE VBKOK,
        IT_PROTT LIKE PROTT OCCURS 0 WITH HEADER LINE,  "Return Message
        IT_VBPOK LIKE VBPOK OCCURS 0 WITH HEADER LINE.  "Delivery items

  DATA : LV_PGI,
         LV_VBTYP_N TYPE VBFA-VBTYP_N,
         LV_COUNT   TYPE I.

  REFRESH IT_RETURN.

* 检查交货单是否已经过账
  SELECT  VBELN VBTYP_N INTO (E_MBLNR,LV_VBTYP_N)
    FROM VBFA
    WHERE VBELV = I_VBELN
      AND POSNV = 10
      AND VBTYP_N IN ('R','h').  "货物移动
  ENDSELECT.

  IF SY-SUBRC EQ 0 AND LV_VBTYP_N EQ 'R'."交货 h 取消交货
    EXIT.
  ENDIF.

  LW_VBKOK-VBELN_VL   = I_VBELN.   "<- Delivery number
  LW_VBKOK-WABUC      = 'X'.       "<- Automatic PGI
  LW_VBKOK-WADAT_IST  = I_BUDAT. "<- Automatic PGI Date

  LT_DATA[] = T_DATA[].

  LOOP AT LT_DATA INTO LS_DATA.
    CLEAR IT_VBPOK.
    IT_VBPOK-VBELN_VL = I_VBELN.
    IT_VBPOK-POSNR_VL = LS_DATA-POSNR.
    IT_VBPOK-VBELN    = I_VBELN.
    IT_VBPOK-POSNN    = LS_DATA-POSNR.
    IT_VBPOK-CHARG    = LS_DATA-CHARG. "批次
    IT_VBPOK-LGORT    = LS_DATA-LGORT. "库存地点
    IT_VBPOK-KZLGO    = 'X'.           "库存地点可修改
    IT_VBPOK-PIKMG    = LS_DATA-PIKMG. "捡配数量
    IT_VBPOK-LFIMG    = LS_DATA-LFIMG. "交货数量
    APPEND IT_VBPOK.

  ENDLOOP.

  PERFORM FRM_LOCK_DELIVERY(ZSDS0002) USING I_VBELN.

* DO PGI
  LV_PGI = 'X'.
  FREE MEMORY ID 'PGI'.
  EXPORT LV_PGI TO MEMORY ID 'PGI'.

  FREE MEMORY ID 'PGI_DATA'.
  EXPORT LT_DATA FROM LT_DATA TO MEMORY ID 'PGI_DATA'.

* Perform Pick and PGI
  CALL FUNCTION 'WS_DELIVERY_UPDATE'
    EXPORTING
      VBKOK_WA                 = LW_VBKOK
      SYNCHRON                 = 'X'
      UPDATE_PICKING           = 'X'
      COMMIT                   = ' '
      DELIVERY                 = I_VBELN
      NICHT_SPERREN            = 'X'
      IF_ERROR_MESSAGES_SEND_0 = 'X'
    TABLES
      PROT                     = IT_PROTT
      VBPOK_TAB                = IT_VBPOK
    EXCEPTIONS
      ERROR_MESSAGE            = 1
      OTHERS                   = 2.

  IF SY-SUBRC <> 0.
    ROLLBACK WORK.
  ELSE.

    LOOP AT IT_PROTT WHERE MSGTY EQ 'E' OR MSGTY EQ 'A' OR MSGTY EQ 'X'.
      EXIT.
    ENDLOOP.

    IF SY-SUBRC NE 0.

      COMMIT WORK AND WAIT.

      SELECT COUNT(*) INTO LV_COUNT
           FROM LIPS
           WHERE VBELN = I_VBELN
             AND LFIMG NE 0.

      IF LV_COUNT NE LINES( LT_DATA ).

        PERFORM FRM_REVERSE_POSTING(ZSDS0002) TABLES IT_RETURN USING I_VBELN I_BUDAT.

        MAC_APPEND_IT_RETURN: '00' '000' 'E' '实际交货数量与请求交货数量不一致,停止交货'
                              '实际交货数量与请求交货数量不一致'
                              ',停止交货'
                              I_VBELN
                              ''.
        EXIT.
      ENDIF.

      SELECT MBLNR
        INTO E_MBLNR
        FROM MKPF
        WHERE LE_VBELN = I_VBELN
          AND BUDAT = I_BUDAT.
      ENDSELECT.
    ELSE.
      ROLLBACK WORK.
    ENDIF.

  ENDIF.

  LOOP AT IT_PROTT.

    CLEAR GS_RETURN.
    MOVE : IT_PROTT-MSGTY TO GS_RETURN-TYPE,
           IT_PROTT-MSGID TO GS_RETURN-ID,
           IT_PROTT-MSGNO TO GS_RETURN-NUMBER,
           IT_PROTT-MSGV1 TO GS_RETURN-MESSAGE_V1,
           IT_PROTT-MSGV2 TO GS_RETURN-MESSAGE_V2,
           IT_PROTT-MSGV3 TO GS_RETURN-MESSAGE_V3,
           IT_PROTT-MSGV4 TO GS_RETURN-MESSAGE_V4.
    MESSAGE ID IT_PROTT-MSGID TYPE IT_PROTT-MSGTY NUMBER IT_PROTT-MSGNO
          WITH IT_PROTT-MSGV1 IT_PROTT-MSGV2 IT_PROTT-MSGV3 IT_PROTT-MSGV4
          INTO GS_RETURN-MESSAGE.

    APPEND GS_RETURN TO IT_RETURN.
  ENDLOOP.

ENDFUNCTION.
FORM frm_lock_delivery  USING    p_delivery.
  DATA : lv_time TYPE p DECIMALS 2 VALUE '0.50'.

  CHECK p_delivery IS NOT INITIAL.

  DO 50 TIMES.

    CALL FUNCTION 'ENQUEUE_EVVBLKE'
      EXPORTING
        vbeln          = p_delivery
      EXCEPTIONS
        foreign_lock   = 1
        system_failure = 2
        OTHERS         = 3.
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.

    IF sy-subrc EQ 0.

      CALL FUNCTION 'DEQUEUE_EVVBLKE'
        EXPORTING
          mode_likp = 'E'
          mandt     = sy-mandt
          vbeln     = p_delivery
          x_vbeln   = ' '
          _scope    = '3'
          _synchron = ' '
          _collect  = ' '.
      WAIT UP TO lv_time SECONDS.
      EXIT.
    ELSE.
      WAIT UP TO lv_time SECONDS.
    ENDIF.
  ENDDO.

ENDFORM.                    " FRM_LOCK_DELIVERY
FORM frm_reverse_posting TABLES it_return USING p_vbeln p_budat.

  DATA:   BEGIN OF lt_mesg OCCURS 0.
          INCLUDE STRUCTURE mesg.
  DATA:   END OF lt_mesg.

  DATA :  lv_vbeln TYPE likp-vbeln,
          lv_budat TYPE sy-datlo.

  lv_vbeln = p_vbeln.
  lv_budat = p_budat.

  PERFORM frm_lock_delivery(zsds0002) USING p_vbeln.

  DO 10 TIMES.
    CALL FUNCTION 'WS_REVERSE_GOODS_ISSUE'
      EXPORTING
        i_vbeln                   = lv_vbeln
        i_budat                   = lv_budat
        i_tcode                   = 'VL09'
        i_vbtyp                   = 'J'
      TABLES
        t_mesg                    = lt_mesg
      EXCEPTIONS
        error_reverse_goods_issue = 1
        OTHERS                    = 2.
    IF sy-subrc =  0.
*   删除交货单
      COMMIT WORK.

      PERFORM  frm_delete_delivery_note TABLES it_return USING p_vbeln.

      EXIT.
    ENDIF.

    WAIT UP TO 1 SECONDS.
  ENDDO.


ENDFORM.                    " FRM_REVERSE_POSTING
FORM frm_delete_delivery_note TABLES it_return STRUCTURE bapiret2
                               USING p_vbeln.
  DATA : lv_delivery TYPE likp-vbeln.

  CHECK p_vbeln IS NOT INITIAL.

  lv_delivery = p_vbeln.

  PERFORM frm_lock_delivery(zsds0002) USING lv_delivery.

  REFRESH bdcdata.
* Go to VL02N
* Init Screen and input DN number
  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'
                                 lv_delivery.
*  Delete DN
  PERFORM bdc_dynpro      USING 'SAPMV50A' '1000'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
                                '/ELOES_T'.

  PERFORM bdc_transaction TABLES it_return USING 'VL02N'.


ENDFORM.

猜你喜欢

转载自www.cnblogs.com/rainysblog/p/10923322.html