abap SO保存前做校验
时间: 2023-09-02 15:05:51 浏览: 98
在 ABAP 中,可以使用 SO_USER_EXIT 函数来在保存 SO 前做校验。
1. 首先,在 SE11 中创建一个结构体,用于存储校验结果及相关信息。
2. 在 SE37 中创建一个函数,通过传入 SO 的相关参数,进行校验,并返回校验结果及相关信息的结构体。
3. 在 VA01、VA02、VA03 等事务代码的用户退出函数中,调用上述函数进行校验,若校验结果为错误,则阻止 SO 的保存。
以下是一个简单的示例代码:
```
TYPES: BEGIN OF ty_so_check_result,
error TYPE i,
message TYPE string,
END OF ty_so_check_result.
FUNCTION zso_check.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(vbeln) TYPE vbak-vbeln
*" EXPORTING
*" VALUE(result) TYPE ty_so_check_result
*"----------------------------------------------------------------------
DATA: wa_vbak TYPE vbak.
SELECT SINGLE * FROM vbak INTO wa_vbak WHERE vbeln = vbeln.
IF wa_vbak-kunnr IS INITIAL.
result-error = 1.
result-message = 'Customer is mandatory.'.
ENDIF.
ENDFUNCTION.
FUNCTION zuser_exit_save_document.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(ta_vbak) TYPE TABLE OF vbak
*" VALUE(ta_vbap) TYPE TABLE OF vbap
*" EXPORTING
*" VALUE(e_save) TYPE c
*"----------------------------------------------------------------------
DATA: wa_so_check_result TYPE ty_so_check_result.
CALL FUNCTION 'zso_check'
EXPORTING
vbeln = ta_vbak[ 1 ]-vbeln
IMPORTING
result = wa_so_check_result.
IF wa_so_check_result-error = 1.
MESSAGE wa_so_check_result-message TYPE 'E'.
e_save = space.
ELSE.
e_save = 'S'.
ENDIF.
ENDFUNCTION.
```
在上述示例代码中,我们首先定义了一个 ty_so_check_result 的结构体,用于存储校验结果及相关信息。然后,我们创建了 zso_check 的函数,通过传入 SO 的相关参数,进行校验,并返回校验结果及相关信息的结构体。最后,在用户退出函数 zuser_exit_save_document 中,我们调用 zso_check 函数进行校验,若校验结果为错误,则阻止 SO 的保存,否则允许 SO 的保存。
阅读全文