程序: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~~~
搞定