解除SM12锁

文摘   科技   2024-06-27 08:01   江苏  

01

前言

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

可用在如下场景: 因为未知原因,单据被长时间异常锁定,导致无法正常操作。可以设置一个JOB程序,获取锁定超时的锁(如10分钟、1小时),然后通过代码解锁这些单据。


02

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.

 


  

03

小贴士

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

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


 

END

 

温馨提示

如果你喜欢本文,请分享给有需要的朋友,想要获得更多信息,请关注我。





 

 

扫码关注我们

以便获取最新更新内容


 

ABAP三叔
ABAP开发技术分享