Cerca nel blog

venerdì 9 maggio 2025

Blocchi per i programmi per evitare esecuzioni contemporanee

 

Blocchi per i programmi per evitare esecuzioni contemporanee

Per gestire i blocchi per i programmi, garantendo che solo un utente alla volta possa eseguire un determinato programma usare i FM ENQUEUE_ES_PROG e DEQUEUE_ES_PROG

Questo è un programma semplice di esempio:

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

*& Report ZTEST_BLOCCOPROGRAMMA
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztest_bloccoprogramma.

DATA: lv_user TYPE sy-uname.

START-OF-SELECTION.

* Ottieni l'utente corrente
  lv_user = sy-uname.

* Blocca il programma per l'utente corrente
  CALL FUNCTION 'ENQUEUE_ES_PROG'
    EXPORTING
      mode_trdir     = 'E'
      name           = sy-repid
      x_name         = lv_user
    EXCEPTIONS
      foreign_lock   = 1
      system_failure = 2
      OTHERS         = 3.

  IF sy-subrc <> 0.
    WRITE: 'Il programma è già in esecuzione da un altro utente.', SY-MSGV1.
    EXIT.
  ENDIF.

* Il programma principale inizia qui
*WRITE: 'Esecuzione del programma da parte dell''utente:', lv_user.

* Simula un'attività lunga
  WAIT UP TO 30 SECONDS.

* Rilascia il blocco
  CALL FUNCTION 'DEQUEUE_ES_PROG'
    EXPORTING
      mode_trdir = 'E'
      name       = sy-repid
      X_NAME      = lv_user.

  WRITE: 'Il programma è stato completato con successo.'.


Ecco cosa otteniamo in output se eseguiamo in contemporanea lo stesso report