解除 SM12锁

作者:ABAP三叔 约 4 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, Data Engineering, 开发, 数据工程
解除 SM12锁 - 封面图
解除 SM12锁 - 封面图

前言

[ 获取SM12锁列表

](http://mp.weixin.qq.com/s?__biz=MzkwNzUxNDQ5Mg==&mid=2247484645&idx=1&sn=199fda586ca96cd37e6fa9f13037fadc&chksm=c0d943f6f7aecae016cc40d9874341fcabe343f137ba0ef5db1dd9995d6aaacb42da830a8999&scene=21#wechat_redirect)

文章中介绍了使用ABAP获取SM12锁列表的方法,本文接着介绍下使用ABAP代码解锁锁列表。

可用在如下场景: 因为未知原因,单据被长时间异常锁定,导致无法正常操作。可以设置一个JOB程序,获取锁定超时 的锁

(如10分钟、1小时),然后通过代码解锁这些单据。

ABAP解锁

1\. 先获取锁列表,锁列表的锁定时间( timestamp )是一个到微秒级的时间戳,然后跟当前时间的时间戳相减去比较,超过自定义的时长后,调用

if_enq_admin~remove_locks 方法执行解锁。

DATA: lt_list TYPE if_enq_admin=>lock_list. "获取所有锁对象  DATA: lt_remove_locks TYPE if_enq_admin=>remove_lock_list. "待移除锁列表 STATICS go_admin TYPE REF TO cl_enq_admin. DATA: lv_vbeln TYPE vbeln_va. DATA: lv_timestamp TYPE int8. DATA: lv_locktime TYPE int8. DATA: lv_time TYPE string.
"获取当前时区的时间戳 CONVERT DATE sy-datum TIME sy-uzeit INTO TIME STAMP DATA(ts) TIME ZONE sy-zonlo.  "获取UTC日期和时间 CONVERT TIME STAMP ts TIME ZONE 'UTC' INTO DATE DATA(date) TIME DATA(time). "获取UTC时间戳 cl_pco_utility=>convert_abap_timestamp_to_java( EXPORTING iv_date = date iv_time = time IMPORTING ev_timestamp = lv_time ). "到秒的时间 lv_timestamp = lv_time. lv_timestamp /= 1000. IF NOT go_admin IS BOUND. go_admin = NEW cl_enq_admin( iv_restrictions = '' ) ##NEEDED. ENDIF. TRY. go_admin->if_enq_admin~get_locks( EXPORTING iv_process_type = if_enq_admin=>type_server iv_name = `` iv_argument = `` iv_client = CONV #( sy-mandt ) iv_username = `` iv_owner = '*' iv_max_entries = 10000 IMPORTING et_list = lt_list ev_peak = DATA(lv_peak) ##NEEDED ev_max = DATA(lv_max) ##NEEDED ev_incomplete = DATA(lv_incomplete) ev_matching_locks = DATA(lv_matching_locks) RECEIVING rv_rc = DATA(lv_rc) ). CATCH cx_enq_admin_no_auth INTO DATA(oref). MESSAGE oref->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.  ENDTRY.  LOOP AT lt_list INTO DATA(ls_list).    lv_locktime = ls_list-timestamp DIV 1000000. "微妙->秒    IF lv_timestamp - lv_locktime > 3600. "3600秒,1小时,根据需要修改 APPEND VALUE #( type = ls_list-type owner1 = ls_list-owner1 owner2 = ls_list-owner2 name = ls_list-name argument = ls_list-argument username = ls_list-username client = ls_list-client scope = COND #( WHEN ls_list-counter1 <> 0 AND ls_list-counter2 = 0 THEN if_enq_admin=>scope1 WHEN ls_list-counter1 = 0 AND ls_list-counter2 <> 0 THEN if_enq_admin=>scope2 ELSE if_enq_admin=>scope3 )       ) TO lt_remove_locks. ENDIF. ENDLOOP. TRY. lv_rc = go_admin->if_enq_admin~remove_locks( lt_remove_locks ). CATCH cx_enq_admin_no_auth INTO oref. MESSAGE oref->get_text( ) TYPE 'S' DISPLAY LIKE 'E'. ENDTRY.

小贴士

可以写个报表将锁列表展示出来,然后选中行之后,执行解锁。

或者设置JOB作业,定时执行解锁操作。

ABAP三叔

关于作者:ABAP三叔

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「解除SM12锁.md」整理生成,仅用于内部技术分享与学习交流。