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.
DATA: w_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.
*
DATA: w_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
Gracias a gente como tu, el resto tenemos lo que necesitamos, un buen e-apunte!
ResponderEliminarPara 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