如何删除一个编辑锁?

举报
雨绸缪 发表于 2023/07/31 17:01:53 2023/07/31
【摘要】 前言一个用户创建了 ABAP 程序,并将 "编辑器锁 "勾选为 ON(在程序属性屏幕中);这使得该用户是唯一可以对程序进行任何修改的人。但如果这个用户一年前离开了这个项目,现在需要改变这个程序。我们怎么能这样做呢?因为如果其他人试图修改它,系统不允许并会报错:“该程序被锁定,不能有任何改变。只有原来的用户可以改变它”。我们如何解决这个问题?我知道 checked-on 指标存储在 TRDI...

前言

一个用户创建了 ABAP 程序,并将 "编辑器锁 "勾选为 ON(在程序属性屏幕中);这使得该用户是唯一可以对程序进行任何修改的人。

image.png

但如果这个用户一年前离开了这个项目,现在需要改变这个程序。我们怎么能这样做呢?因为如果其他人试图修改它,系统不允许并会报错:“该程序被锁定,不能有任何改变。只有原来的用户可以改变它”。

我们如何解决这个问题?我知道 checked-on 指标存储在 TRDIR 表中,但该表不能手动维护。

ABAP 程序中的锁被定义在表 TRDIR ,字段 EDTX 。你必须用某种方式改变 'X' 的值。

使用下面的代码运行程序来解锁你的程序编辑器锁:

REPORT sy-repid. 
TABLES: TRDIR. 

PARAMETERS: P_PROG LIKE TRDIR-NAME OBLIGATORY. 

START-OF-SELECTION. 
  SELECT SINGLE * FROM TRDIR WHERE NAME = P_PROG. 
  IF SY-SUBRC = 0. 
    IF TRDIR-EDTX = 'X'. 
      MOVE ' ' TO TRDIR-EDTX. 
      MODIFY TRDIR. 
      WRITE: /'Editor Lock was removed from', P_PROG. 
    ELSE. 
      WRITE: /'Program', P_PROG, 'does not have an Editor Lock'. 
    ENDIF. 
  ELSE. 
    WRITE: /'No match found for program', P_PROG. 
  ENDIF.

什么是对象的锁定

锁定对象在 SAP 中的使用是为了避免在数据被插入/改变到数据库时出现不一致。

SAP 提供三种类型的锁对象。

  • 读取锁(共享锁)
    保护对一个对象的读取访问。读取锁允许其他事务读取访问,但不允许写访问表的锁定区域。

  • 写锁(独占锁)
    保护对一个对象的写访问。写锁允许其他事务既不读也不写对表的锁定区域的访问。

  • 增强型写锁(无累积的独占锁)
    工作方式与写锁类似,只是增强型写锁还可以保护同一事务的进一步访问。

你可以通过事务码 SE11 在 SAP 的一个对象上创建一个锁,并输入任何有意义的名称,以 EZ 开头,例如 EZTEST_LOCK

使用:

你可以看到在几乎所有的事务码中,当你在变更模式下打开一个对象时,SAP 不能允许任何其他用户在变更模式下打开同一个对象。

例如:在人力资源部门,当我们在主数据维护界面输入一个个人号码时,SAP 不允许任何其他用户使用同一个个人号码进行更改。

从技术上讲:

当你创建一个锁定对象时,系统会自动创建两个功能模块。

  1. ENQUEUE_<Lockobject name>.将该对象插入一个队列中。
  2. DEQUEUE_<Lockobject name>。通过上述调用删除正在排队的对象。

你必须在你的程序中使用这些函数模块。

锁定对象的结构

在锁对象中,应该用锁请求锁定数据记录的表和它们的关键字段一起被定义。当表被选择时,首先选择一个表(主表)。也可以使用外键关系添加更多的表(二级表)。

例如:

用户去 VA02 修改一个销售订单,在这个程序中,一个锁被设置。 你可以在事务 SM12 中看到这种锁。 如果一个锁被设置了,而另一个用户访问同一个销售订单,那么他们会得到一个消息,说这个销售订单被锁定。 ENQUEUE 功能模块用于设置锁,DEQUEUE 功能模块用于释放锁。

锁定用户

REPORT ZUSR_LOCK.
TABLES USR02.
DATA: Z_USR02 LIKE USR02 OCCURS 0 WITH HEADER LINE.
DATA: ZCOUNT TYPE I,
       DEST(72).

*-- Select-Options 
-----------------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK 1 WITH FRAME TITLE TEXT-100.
SELECT-OPTIONS: S_BNAME FOR USR02-BNAME NO INTERVALS.
*                S_CLASS FOR USR02-CLASS NO INTERVALS.
PARAMETER: ZTEST AS CHECKBOX DEFAULT 'X'.
selection-screen end of block 1.

SELECTION-SCREEN BEGIN OF BLOCK 2 WITH FRAME TITLE TEXT-110.
PARAMETERS: ZUFLAG_L RADIOBUTTON GROUP RADI,
            ZUFLAG_U RADIOBUTTON GROUP RADI.
SELECTION-SCREEN END OF BLOCK 2.
*-- Select-Options 
-----------------------------------------------------
AT SELECTION-SCREEN.
  IF SY-SUBRC NE 0.
    MESSAGE I001(CJ) WITH TEXT-001.
    EXIT.
  ENDIF.
  IF S_BNAME IS INITIAL.
* and    S_CLASS IS INITIAL.
    MESSAGE E001(CJ) WITH TEXT-003.
  ENDIF.

START-OF-SELECTION.

IF ZUFLAG_L EQ 'X'.
  SELECT * FROM USR02 INTO TABLE Z_USR02 WHERE BNAME IN S_BNAME
*                                           AND CLASS IN S_CLASS
                                           AND UFLAG EQ ' '.
ENDIF.

IF ZUFLAG_U EQ 'X'.
  SELECT * FROM USR02 INTO TABLE Z_USR02 WHERE BNAME IN S_BNAME
*                                           AND CLASS IN S_CLASS
                                           AND UFLAG EQ '64'.
  ENDIF.
  IF SY-SUBRC ?> 0.
    MESSAGE I001(CJ) WITH TEXT-002.
    EXIT.
  ELSE.
    IF ZTEST EQ ' '.
      LOOP AT Z_USR02.
        SELECT SINGLE * FROM USR02 WHERE BNAME EQ Z_USR02-BNAME.
        IF ZUFLAG_L EQ 'X'.
          USR02-UFLAG = '64'.
        ENDIF.
        IF ZUFLAG_U EQ 'X'.
          USR02-UFLAG = '0'.
        ENDIF.
        MODIFY USR02.
        IF SY-SUBRC EQ 0.
          ZCOUNT = ZCOUNT + 1.
*          z_usr02-zbvmaster = 'X'.
          MODIFY Z_USR02.
        ENDIF.
      ENDLOOP.
    ENDIF.
  ENDIF.
END-OF-SELECTION.

*Write result
  IF NOT ZCOUNT IS INITIAL.
    IF ZUFLAG_L EQ 'X'.
      WRITE TEXT-200 TO DEST(40).
      WRITE ZCOUNT TO DEST+41(3).
    ENDIF.
    IF ZUFLAG_U EQ 'X'.
      WRITE: TEXT-300 TO DEST(40).
      WRITE ZCOUNT TO DEST+41(3).
    ENDIF.
  ELSE.
    WRITE: TEXT-400.
  ENDIF.

  LOOP AT Z_USR02.
    WRITE: /3 Z_USR02-BNAME.
  ENDLOOP.

TOP-OF-PAGE.
  WRITE: /1 DEST COLOR 3.

锁定对象的优点:

  1. 它可以防止同一记录中的数据冲突,保护数据间的数据完整性和一致性
  2. 锁定对象可防止同一数据同时出现多个版本,防止数据冲突
  3. 它告诉其他程序/用户该表当前正在编辑,锁定对象通知其他事务共享对象当前正被一个特定事务或用户使用
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。