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'EXPORTINGmode_trdir = 'X'name = 'Y071' "程序名,也可以另起名字x_name = ' '_scope = '2'_wait = ' '_collect = ' 'EXCEPTIONSforeign_lock = 1system_failure = 2OTHERS = 3. IF sy-subrc EQ 0. * 模拟逻辑... * 解锁CALL FUNCTION 'DEQUEUE_ES_PROG'EXPORTINGmode_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'EXPORTINGmode_trdir = 'X'name = 'ZMM_CUS_201_A03'x_name = ' '_scope = '2'_wait = ' '_collect = ' 'EXCEPTIONSforeign_lock = 1system_failure = 2OTHERS = 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.