Locking in ABAP on BTP

The most important thing here is to know the factory class cl_abap_lock_object_factory, which creates You an instance of the lock implementing the interface if_abap_lock_object, just provide the Lock Object name.

Use method enqueue/dequeue to lock the required record(s) providing a name-value pair table passing the field names and the corresponding value.

In case invalid parameters are provided, cx_abap_lock_failure is triggered.

If someone else is locking the record(s) already, You get exception cx_abap_foreign_lock, where the user_name attribute holds the guilty user name :).

    TRY.
        "Get instance of lock object
        DATA(lock) = cl_abap_lock_object_factory=>get_instance( iv_name = 'EZ_ZPMMNRQ' ).

        "Enqueue(lock) the record / group of records
        lock->enqueue(
            it_parameter  = VALUE #( (  name = 'PLANT' value = REF #( 'DE82' ) ) )
        ).

        "lock error
      CATCH cx_abap_lock_failure INTO DATA(ex_lock_failure).
        "Depends on implementation if You need to let it dump
        RAISE SHORTDUMP ex_lock_failure.

        "foreign lock
      CATCH cx_abap_foreign_lock INTO DATA(ex_foreign_lock).
        "This user is locking already
        DATA(iam_locking_it) = ex_foreign_lock->user_name.
    ENDTRY.

Interesting facts

Some part of the factory is implemented inside with TEST-SEAM, whether You are allowed to use that lock object. It means released or not in cloud development.

METHOD whitelist_check.
    "check if caller is allowed to use the object

    TRY.
        DATA lt_objects_not_to_be_used TYPE if_ars_abap_object_check=>ty_gts_object_not_to_be_used.

        TEST-SEAM ars_generic_call_check.
          lt_objects_not_to_be_used = cl_ars_generic_call_check=>get_instance( )->check( "Perform object restriction check
            iv_api_name     = 'CL_ABAP_LOCK_OBJECT_FACTORY'
            it_used_objects = VALUE #( ( object-type = 'ENQU' object-name = iv_name  ) ) ).
        END-TEST-SEAM.

        IF lt_objects_not_to_be_used IS NOT INITIAL.
          RAISE EXCEPTION TYPE cx_abap_lock_failure
            EXPORTING
              textid           = cx_abap_lock_failure=>object_not_to_be_used
              object_name      = |{ iv_name }|
              object_type_text = |{ 'lock object'(001) }|.
        ENDIF.

      CATCH cx_ars_abap_object_check INTO DATA(lx_exc).
        RAISE EXCEPTION TYPE cx_abap_lock_failure
          EXPORTING
            previous = lx_exc.
    ENDTRY.

  ENDMETHOD.

Another interesting thing, that the lock object implementation is a local class within the factory class implementing the global interface if_abap_lock_object. Here You at which place the exception is triggered, when the record(s) is/are locked already.

kep-4-1024x174 Locking in ABAP on BTP

SAPDEV.EU
Privacy Overview

This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.