1. 程式人生 > >VA02 刪除銷售訂單增強,根據訂單型別確認是否可刪除

VA02 刪除銷售訂單增強,根據訂單型別確認是否可刪除

程式:MV45AFZB, 

FORM:USEREXIT_CHECK_XVBAP_FOR_DELET.

This form is called when user tries to delete an item from the sales document or by clicking Delete button and confirming the popup or tries to delete the order from the header by selecting Sales document -> Delete. This way, user will be informed immediately that item cannot be deleted. Required code is as below:
IF… “Appropriate condition to separate deletable items for other plants
IF VBAP-POSNR NE ‘000000’. “This prevents a short dump when user tries to delete the order from the header by selecting Sales document -> Delete
          MESSAGE E001(00) WITH 'DELETE FAILURE'.
ENDIF.
        US_EXIT = CHARX.
ENDIF.
That’s it – This way items cannot be deleted from sales documents.

也就是說針對單獨的行專案刪除提示沒有任何問題,如果通過選單欄  銷售憑證->刪除  刪除整張憑證會dump

最如下改進:

FUNCTION:

第一種(整單刪除校驗推薦使用)

FUNCTION zsd_005_check_sotype_for_delet.
*"----------------------------------------------------------------------
*"*"本地介面:
*"  IMPORTING
*"     REFERENCE(IV_AUART) TYPE  VBAK-AUART
*"     REFERENCE(IV_VBELN) TYPE  VBAP-VBELN
*"     REFERENCE(IV_POSNR) TYPE  VBAP-POSNR
*"     REFERENCE(IV_ACTIVATE) TYPE  FLAG DEFAULT 'X'
*"  EXPORTING
*"     VALUE(EV_US_EXIT) TYPE  FLAG
*"----------------------------------------------------------------------

  CHECK iv_activate = 'X'.

  CHECK iv_auart = 'ZOR0'. "訂單型別待確定
  ev_us_exit = abap_true.
  MESSAGE s001(00) WITH '該訂單不允許直接刪除,請使用關閉訂單的方式關閉該訂單'
                   DISPLAY LIKE 'E'.
  LEAVE TO TRANSACTION 'VA02' AND SKIP FIRST SCREEN .
第二種(行專案刪除校驗推薦使用)
FUNCTION zsd_005_check_sotype_for_delet.
*"----------------------------------------------------------------------
*"*"本地介面:
*"  IMPORTING
*"     REFERENCE(IV_AUART) TYPE  VBAK-AUART
*"     REFERENCE(IV_VBELN) TYPE  VBAP-VBELN
*"     REFERENCE(IV_POSNR) TYPE  VBAP-POSNR
*"     REFERENCE(IV_ACTIVATE) TYPE  FLAG DEFAULT 'X'
*"  EXPORTING
*"     VALUE(EV_US_EXIT) TYPE  FLAG
*"----------------------------------------------------------------------

  DATA: BEGIN OF lt_so OCCURS 0,
          posnr TYPE vbap-posnr,
        END OF lt_so.

  CHECK iv_activate = 'X'.

  SELECT posnr
    INTO CORRESPONDING FIELDS OF TABLE lt_so
    FROM vbap
    WHERE vbeln = iv_vbeln.

  "獲取最後一條行專案的 行專案號,且只有最後一條時跳出提示視窗
  SORT lt_so BY posnr DESCENDING.
  READ TABLE lt_so INDEX 1.

  IF iv_auart = 'ZXXX'. "訂單型別待確定
    ev_us_exit = abap_true.

    IF iv_posnr = lt_so-posnr.
      "最後一條時,跳窗提示
      MESSAGE i001(00) WITH '該訂單不允許直接刪除,請使用關閉訂單的方式關閉該訂單'.
    ENDIF.
  ENDIF.

ENDFUNCTION.

MV45AFZB增強
FORM USEREXIT_CHECK_XVBAP_FOR_DELET USING US_ERROR
                                          US_EXIT.

* Example

* IF US_ERROR NE SPACE.
*   MESSAGE ......
* ENDIF.

* IF .......
*   US_EXIT = CHARX.
* ENDIF.
*{   INSERT         DEVK900048                                        1
* 刪除SO時 根據訂單型別確認是否可刪除
  CALL FUNCTION 'ZSD_005_CHECK_SOTYPE_FOR_DELET'
    EXPORTING
      iv_auart    = vbak-auart
      iv_vbeln    = xvbap-vbeln
      iv_posnr    = xvbap-posnr
*      iv_activate = 'X'
    IMPORTING
      ev_us_exit  = us_exit.


*}   INSERT

ENDFORM.
OK~~~  

搞定