1、锁表
在一些业务场景中,我们需要将某张表或某张表中的某些数据锁定,防止多人对该表进行操作,导致数据出现问题。SAP对于表的锁定,有专门的锁对象。
1.1、创建锁
事务代码SE11,表的锁对象名称,需要以EZ或EY开头
1.2、锁模式
①模式S:本身不需要更改数据,但是希望显示的数据不被别人更改。
②模式E:当更改数据的时候设置为此模式。
③模式X:和E类似,但是不允许累加,完全独占。
④如果当前用户在一个程序里成功对一个锁对象加锁之后:
如果模式为S:
其他用户不能再对这个锁对象加E、X模式的锁;
当前用户还可以再对这个锁对象加S模式的锁。如果没有别的用户对其加S模式的锁,那么你还可以对其加E模式的锁。但X模式的不可以。
如果模式为E:
其他用户不能再对这个锁对象加E、X、S模式的锁;
当前用户还可以再对这个锁对象加E、S模式的锁。
如果模式为X:
其他用户和当前用户均不能再对这个锁对象加E、X、S模式的锁;
1.3、激活锁对象
激活创建的锁对象,将会产生两个函数:
加锁:ENQUEUE_<锁对象名>
解锁:DEQUEUE_<锁对象名>
2、程序锁
2.1、示例代码
REPORT y071. *加锁 CALL FUNCTION 'ENQUEUE_ES_PROG' EXPORTING mode_trdir = 'X' name = 'Y071' "程序名,也可以另起名字 x_name = ' ' _scope = '2' _wait = ' ' _collect = ' ' EXCEPTIONS foreign_lock = 1 system_failure = 2 OTHERS = 3. IF sy-subrc EQ 0. * 模拟逻辑 ... * 解锁 CALL FUNCTION 'DEQUEUE_ES_PROG' EXPORTING mode_trdir = 'X' name = 'Y071' x_name = ' ' _scope = '3' _synchron = ' ' _collect = ' '. ELSEIF sy-subrc EQ 1. MESSAGE '程序被锁定' TYPE 'S' DISPLAY LIKE 'E'. STOP. ENDIF.
运行结果,当一个程序当前正在运行,则在其他窗口运行这个程序,则会报错
2.2、实际案例
当用户正在查看某ALV报表,其他用户进入后,隐藏掉ALV报表的工具按钮。此实例中不需要写解锁函数,因为用户退出ALV后会自动解锁。
DATA:gv_clock TYPE char1 VALUE 'X'."锁标识
"进入报表先加锁
PERFORM frm_clock_report."进入报表先加锁
PERFORM frm_get_data."查询数据
PERFORM frm_out_alv."显示ALV
"加锁方法
FORM frm_clock_report.
CALL FUNCTION 'ENQUEUE_ES_PROG'
EXPORTING
mode_trdir = 'X'
name = 'ZMM_CUS_201_A03'
x_name = ' '
_scope = '2'
_wait = ' '
_collect = ' '
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
IF sy-subrc EQ 0."锁成功
gv_clock = 'X'.
ELSE."已经被占用
gv_clock = ''.
ENDIF.
ENDFORM.
"加锁结果判断是否显示按钮
FORM pf_status USING u_extab TYPE slis_t_extab.
DATA:lt_extab TYPE slis_t_extab.
IF gv_clock = 'X'."加锁成功不用隐藏
ELSE."加锁不成功,就是已经被占用,就隐藏按钮
lt_extab = VALUE #(
( fcode = 'CHECK' )"库存校验
( fcode = 'QRFH' )"确认发货
).
ENDIF.
SET PF-STATUS 'STANDARD' EXCLUDING lt_extab.
ENDFORM.