viernes, octubre 21, 2011

BLOQUEOS

Para realizar bloqueos se debe crear un objeto de transacción con la tx. SE11. Se utiliza el prefijo EZ para la nomenclatura (EZ_EJEMPLO). En ella se informa la/las tabla/as que se requiere bloquear y el modo de bloqueo (escritura y/o lectura). El bloqueo se realizará por la clave de la tabla.

Al crear el objeto de bloqueo el sistema genera automáticamente dos módulos de función, uno para desbloquear DEQUEUE_* (con el ejempo DEQUEUE_EZ_EJEMPLO) y otro para bloquear ENQUEUE_* ( con el ejemplo ENQUEUE_EZ_EJEMPLO).

Llamada bloqueo (se actualiza variables del sistema SY-SUBRC).
  CALL FUNCTION 'ENQUEUE_EZ_EJEMPLO'
    EXPORTING
      id             = p_id
      _scope         = 1
    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.

Llamada desbloqueo (se actualiza variables del sistema SY-SUBRC):
  CALL FUNCTION 'DEQUEUE_EZ_EJEMPLO'
    EXPORTING
      id = p_id.

IMPORTANTE:
En la llamada al módulo de función ENQUEUE hay un parámetro de entrada _SCOPE que es opcional y por defecto tiene el valor 2. Para garantizar que nuestro programa sea el que desbloque el objeto se debe informar _SCOPE = 1. En caso contrario (_SCOPE =2 ) es el sistema quien decide cuando acaba el bloqueo (en UPDATE TASK).

Más información http://abaplog.wordpress.com/2007/05/02/sap-locks-mistery/