Skip to content

其他

一、 ENQUEUE_READ 函数

  如多个用户同时修改一个订单,在SAP系统中经常会发生修改同一个数据的情况。在开发程序中利用 ENQUEUE_READ函数可以检查该数据是否被加锁。标准程序修改数据时始终会加锁,因此要习惯用 ENQUEUE_READ函数对锁设置状态进行检查。

abap
CALL FUNCTION 'ENQUEUE_READ'
    EXPORTING
        GCLIENT         =SY-MANDT
*    GNAME       =''
*    GARG        =''
*    GUNAMME     =SY-UNAME
*    LOCAL       =''
*IMPORTING
*    NUMBER      =
*    SUBRC       =
     TABLES
        eng     =lt eng

  ENQUEUE_READ函数返回被加锁的表数据列表。即使不使用锁对象,只要用ENQUEUE_READ函数就可以查询被加锁状态的所有列表对象。ENQUEUE_READ函数的参数请参照[表 8-1]。 alt text

  ENQUEUE_READ在T-CODE:SE37 中执行,则显示现在被加锁的对象列表。 alt text

  [例 8-4]是从生产订单表'AUFK'中读取被加锁的对象后检查tseqg 内表中是否存在相应生产订单的实例。若存在被加锁的订单,则等待1秒后执行5次循环。 [例 8-4]

abap
REPORT z08_04.
DATA lt_seqg LIKE seqg3 OCCURS 0 WITH HEADER LINE.
DATA lv_aufnr TYPE aufr VALUE '0000123456'.

DO 5 TIMES.
    CALL FUNCTION 'ENQUEUE_READ'
        EXPORTING
            gname ='AUFK'
            guname = space
        TABLES
            eng= lt_seqg
        EXCEPTIONS
            communication_failure=1
        OTHERS =2.
    IF NOT It_seqg[] IS INITIAL.
        READ TABLE lt_segg WITH KEY garg+3(12)=lv_aufnr.
        IF sy-subrc EQ 0.
            WAIT UP TO 1 SECONDS.
        ELSE.
            EXIT.
        ENDIF.
    ELSE.
        EXIT.
    ENDIF.
ENDDO.

二、Editor Lock 解除

  在 ABAP 编辑器中修改程序时,EditorLock可以防止其他人对此表进行修改。即,与本章的锁对象是不同的两个概念。
  当其他开发者修改程序时,该程序会被加锁。将程序放到修改状态下,到T-CODE:SM12中查询就可以显示相应程序的列表。
  若在公休日需要紧急修改程序时要解除 EditorLock 状态。这种情况下可以执行下列例子程序来解除锁。TRDIR 表是存储程序名、创建日期、修改日期、EditorLock 设置与否信息<的视图。
[例 8-5]

abap
REPORT z08_05.

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.

alt text