一旦我们从
SE11
为 SAP ABAP 中的特定表创建了锁定对象,是否可以在表中创建条目?如果是,那么锁对象有什么特别之处?
我尝试在
SE11
中创建一个锁定对象,然后在SE37
中我执行了一个锁定对象。我的问题是,一旦创建了锁定对象,我们就不应该能够添加条目,但在这里我可以在表中添加条目。锁对象有什么特别之处?
锁定对象用于在程序中提供逻辑锁定功能。比如说,如果两个用户不应同时编辑同一个文档,那么我们可以实现锁定对象来限制一个用户打开该文档,以防另一用户已打开该文档进行编辑。
在ABAP字典中定义锁对象时,会创建两个功能模块
ENQUEUE_obj_name
和DEQUEUE_obj_name
。之后可以在ABAP程序中调用它们来分别锁定和解锁对象。
在
Tables
选项卡中的锁定对象本身中,我们定义要锁定的主表。在 Lock parameters
选项卡中,我们定义在请求设置或释放锁定期间传递给功能模块的参数,这些参数对应于充当锁定标准条件的表字段。
假设我们为计费文档头表 VBRK 创建一个锁 EZDOC_BILLING。默认情况下,作为锁定参数,表 MANDT 和 VBELN 的关键字段会自动填充。
锁定对象激活后,生成功能模块
ENQUEUE_EZDOC_BILLING
和 DEQUEUE_EZDOC_BILLING
。
为了在代码中实现它,我们使用应设置锁定的文档编号来调用排队 FM。一旦成功完成,我们就可以继续进行更改文档等操作,并且锁定可确保此时没有其他用户可以编辑同一文档。完成后,我们应该通过调用出队 FM 来释放锁。 一般来说,它在编码中看起来像这样:
...
PERFORM set_lock USING l_vbeln CHANGING l_retcode.
IF l_retcode = 0.
PERFORM change_doc_billing ...
ENDIF.
PERFORM release_lock USING l_vbeln.
...
FORM set_lock USING i_vbeln CHANGING c_retcode.
CALL FUNCTION 'ENQUEUE_EZDOC_BILLING'
EXPORTING
mode_vbrk = 'E'
mandt = sy-mandt
vbeln = i_vbeln
_scope = '2'
_wait = ' '
_collect = ' '
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
c_retcode = sy-subrc.
ENDFORM.
FORM release_lock USING i_vbeln.
CALL FUNCTION 'DEQUEUE_EZDOC_BILLING'
EXPORTING
mode_vbrk = 'E'
mandt = sy-mandt
vbeln = i_vbeln
x_vbeln = ' '
_scope = '3'
_synchron = ' '
_collect = ' '.
ENDFORM.
锁机制在数据库/内核级别不起作用。因此,您需要手动检查报告/函数/类中的锁定状态。 SE16/SE16N 不检查锁定状态。您还可以创建报告来修改表而无需进行锁定检查。