如何删除一个编辑锁?
前言
一个用户创建了 ABAP 程序,并将 "编辑器锁 "勾选为 ON(在程序属性屏幕中);这使得该用户是唯一可以对程序进行任何修改的人。
但如果这个用户一年前离开了这个项目,现在需要改变这个程序。我们怎么能这样做呢?因为如果其他人试图修改它,系统不允许并会报错:“该程序被锁定,不能有任何改变。只有原来的用户可以改变它”。
我们如何解决这个问题?我知道 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 不允许任何其他用户使用同一个个人号码进行更改。
从技术上讲:
当你创建一个锁定对象时,系统会自动创建两个功能模块。
ENQUEUE_<Lockobject name>
.将该对象插入一个队列中。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.
锁定对象的优点:
- 它可以防止同一记录中的数据冲突,保护数据间的数据完整性和一致性
- 锁定对象可防止同一数据同时出现多个版本,防止数据冲突
- 它告诉其他程序/用户该表当前正在编辑,锁定对象通知其他事务共享对象当前正被一个特定事务或用户使用
- 点赞
- 收藏
- 关注作者
评论(0)