lunes, 21 de enero de 2013

Concurrencia de usuarios en programa o transacción.

Objetivo: Queremos evitar que haya más de un usuario en el mismo programa.
Solución: Hemos creado, siguiendo los consejos de Jesús, 2 subrutinas. Con la de BLOQUEO bloquearíamos al ejecutarla antes de la selección de datos y con la de DESBLOQUEO dejaríamos que otros usuarios accediesen a la misma. Lo controlo por programa y si no hemos desbloqueado y salimos de él "a saco Paco"  también se desbloquearía.
Subrutinas:
&---------------------------------------------------------------------*
*&      Form  BLOQUEO
*&---------------------------------------------------------------------*
*      
* Bloqueamos programa para evitar concurrencia de usuarios en programa.
* Se recomienda usar antes de buscar datos.
* Se desbloquearà al salir o forzar con PERFORM desbloqueo.
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
FORM bloqueo.
  DATAw_funcname LIKE tfdir-funcname.
  w_funcname sy-cprog.
*
  CALL FUNCTION 'ENQUEUE_ESFUNCTION'
    EXPORTING
*     MODE_TFDIR     = 'E'
      funcname       w_funcname
*     X_FUNCNAME     = ' '
*     _SCOPE         = '2'
*     _WAIT          = ' '
*     _COLLECT       = ' '
    EXCEPTIONS
      foreign_lock   1
      system_failure 2
      OTHERS         3.
  IF sy-subrc <> 0.
* Implement suitable error handling here
    MESSAGE e001(zgen)."Programa bloqueado por otro usuario. Inténtelo más tarde.
  ELSE.
    MESSAGE i002(zgen)"Ha bloqueado el programa para otros usuarios. Téngalo en cuenta.
  ENDIF.
ENDFORM                   " BLOQUEO

*&---------------------------------------------------------------------*
*&      Form  desbloqueo
*&---------------------------------------------------------------------*
*  
* Desbloqueamos el programa que ha sido bloqueado previamente con bloqueo.
*----------------------------------------------------------------------*
FORM desbloqueo.
*
  DATAw_funcname LIKE tfdir-funcname.
  w_funcname sy-cprog.
*
  CALL FUNCTION 'DEQUEUE_ESFUNCTION'
    EXPORTING
*     MODE_TFDIR = 'E'
      funcname   w_funcname
*     X_FUNCNAME = ' '
*     _SCOPE     = '3'
*     _SYNCHRON  = ' '
*     _COLLECT   = ' '
    .
  IF sy-subrc 0.
    MESSAGE i003(zgen)"Programa desbloqueado. Otros usuarios pueden usarlo.
  ENDIF.
*
ENDFORM.                    "desbloqueo

2 comentarios:

  1. Gracias a gente como tu, el resto tenemos lo que necesitamos, un buen e-apunte!

    ResponderEliminar
  2. Para bloquear un programa, tambien podemos utilizar la función ENQUEUE_ESINDX al principio del programa. No haciendo falta desbloquear el programa mediante otra función, ya que el propio programa se desbloque al finalizar.

    ResponderEliminar