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. "获取所有锁对象
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).
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作业,定时执行解锁操作。
温馨提示
如果你喜欢本文,请分享给有需要的朋友,想要获得更多信息,请关注我。