锁定和解锁行记录

    在某项目中,按客户要求协同联动程序(直送、非直送)在收货或交货时对查询出来的一条记录用BDC录屏的方式在前台操作,因为前台操作的时间可能比较长,在某一个人进行操作的时候,必须锁定这条行记录,防止其他人操作,这样就用到了行记录锁定函数,把查出来用ALV显示的记录的某几个可以唯一标识该行的字段作为关键字P_KEY,调用行记录锁函数LOCK_RECORD,对该行记录进行锁定。这样,即使别人查出该条记录,在进行操作,会有行记录锁定的提示。调用该函数处理完该行后,可以调UnLock_RECORD函数进行解锁。也可以不调用,程序退出后,系统能进行自动解锁。也可以通过事务代码SM12进行解锁。

    这两个函数可以应用到所有的需要处理数据的程序中,防止几个人同时操作的并发。

 

函数如下:

 

*&---------------------------------------------------------------------*

*&      Form  LOCK_RECORD

*&---------------------------------------------------------------------*

*       text  锁定

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM LOCK_RECORD USING P_KEY.

      DATA: IT_SEQG3 TYPE SEQG3 OCCURS 01 WITH HEADER LINE.

      DATA: GNAME LIKE SEQG3-GNAME, GARG LIKE SEQG3-GARG.

 

      DATA: BEGIN OF %ZRECORD_LOCK,

            MANDT TYPE ZRECORD_LOCK-MANDT,

            FIELDKEY TYPE ZRECORD_LOCK-FIELDKEY,

      END OF %ZRECORD_LOCK.

 

      CALL 'C_ENQ_WILDCARD' ID 'HEX0' FIELD %ZRECORD_LOCK.

 

      MOVE SY-MANDT TO: %ZRECORD_LOCK-MANDT.

 

      IF NOT P_KEY IS INITIAL.

          MOVE P_KEY TO: %ZRECORD_LOCK-FIELDKEY.

      ENDIF.

 

      GNAME = 'ZRECORD_LOCK'.

      GARG = %ZRECORD_LOCK.

 

      CALL FUNCTION 'ENQUEUE_READ'

      EXPORTING

          GCLIENT = SY-MANDT

          GNAME = GNAME

          GARG = GARG

      TABLES

          ENQ = IT_SEQG3.

 

      IF SY-SUBRC <> 0.

          MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

      ENDIF.

 

      IF IT_SEQG3 IS NOT INITIAL.

          DATA:CMESSAGE(100) TYPE C.

          CONCATENATE '所选择记录正由' IT_SEQG3-GUNAME '处理!' INTO CMESSAGE.

          CONDENSE CMESSAGE.

          MESSAGE CMESSAGE TYPE 'E'.

      ELSE.

          CALL FUNCTION 'ENQUEUE_EZRECORD_LOCK'

               EXPORTING

                   MODE_ZRECORD_LOCK = 'E'

                   MANDT = SY-MANDT

                   FIELDKEY = P_KEY

                   X_FIELDKEY = ' '

                   _SCOPE = '2'

                   _WAIT = ' '

                   _COLLECT = ' '

               EXCEPTIONS

                   FOREIGN_LOCK = 1

                   SYSTEM_FAILURE = 2

                   OTHERS = 3.

          IF SY-SUBRC <> 0.

              MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

          ENDIF.

 

      ENDIF.

ENDFORM.

 

*&---------------------------------------------------------------------*

*&      Form  UNLOCK_RECORD

*&---------------------------------------------------------------------*

*       text  解锁

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

 

FORM UNLOCK_RECORD USING P_KEY.

    CALL FUNCTION 'DEQUEUE_EZRECORD_LOCK'

    EXPORTING

    MODE_ZRECORD_LOCK = 'E'

    MANDT = SY-MANDT

    FIELDKEY = P_KEY

    X_FIELDKEY = ' '

    _SCOPE = '3'

    _SYNCHRON = ' '

    _COLLECT = ' '.

 

ENDFORM.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChampaignWolf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值