ABAP锁对象

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值