Objectif : Les jobs déjà actifs doivent être synchronisés manuellement.
Objets utilisés : Objet script et Objet Sync
Eléments de script utilisés : ADD, :ATTACH_SYNC, :BEGINREAD, FORMAT, GET_SYNC, GET_UC_OBJECT_NR, :PRINT, :READ, SET_SYNC et :STOP
Les objets Sync servent à synchroniser les tâches. Chaque objet activable contient un onglet Sync permettant de sélectionner toutes les actions nécessaires. Il est également possible de synchroniser ultérieurement les tâches déjà actives.
Objets Sync
Des statuts sont définis dans un objet Sync (par ex. : "EXCLUSIV - La base de données est utilisée de façon exclusive"). Vous pouvez définir vous-même leur désignation et leur nombre. L'objet Sync accepte l'un des statuts et le change dès que les actions surviennent. Ces actions sont également définies dans l'objet Sync, puis sont sélectionnables dans les objets.
Dans chaque objet activable, vous pouvez sélectionner l'objet Sync requis, puis définir les actions correspondantes et le moment de leur exécution dans la tâche (par exemple l'action "Libérer" à la fin de la tâche). Les taches peuvent être synchronisées en fonction de la condition courante et de la réaction définie.
L'exemple suivant montre comment synchroniser deux tâches en définissant l'une comme successeur de l'autre. Le processus se présente comme suit :
Objet Sync disponible ? -> La 1ère tâche est exécutée-> La 2nde tâche est exécutée
Les statuts "DISPONIBLE", "TACHE1" et "TACHE2" en découlent pour l'objet Sync. Trois actions sont également nécessaires pour contrôler les statuts de l'objet Sync : Trois actions sont requises pour contrôler les statuts de l'objet Sync : "SET_TACHE1", "SET_TACHE2" et "SET_DISPONIBLE".
Le tableau suivant explique l'interaction entre l'objet Sync et les tâches :
Condition préalable : l'objet Sync a le statut "DISPONIBLE" |
||
---|---|---|
Définition dans... |
Action |
Résultat |
SET_SYNC (dans le script) |
SET_TACHE1 |
La tâche 1 peut démarrer |
Tâche 1 |
SET_TACHE2 (à la fin) |
La tâche 2 peut démarrer |
Tâche 2 |
SET_DISPONIBLE (au début) |
L'objet Sync est de nouveau disponible |
Ces paramètres permettent de synchroniser deux tâches avec un objet Sync. Dans cet exemple, deux objets Sync sont utilisés, ce qui est suffisant. La synchronisation manuelle n'est utilisée qu'exceptionellement, par exemple si une tâche supplémentaire doit être intégrée dans un processus existant. L'utilisation d'une désignation fixe plus d'un numéro comme nom d'objet présente un intérêt, car vous pouvez communiquer avec chaque objet Sync à l'aide d'un compteur.
Script
La synchronisation ultérieure des deux tâches peut être implémentée avec des éléments de scripts. Vous devez créer un objet script contenant la procédure nécessaire.
Dans le script suivant, un dialogue de saisie est tout d'abord créé, dans lequel les noms des deux tâches pourront être saisis. Ensuite, il faut contrôler si ces tâches sont vraiment actives (c'est-à-dire qu'elles possèdent un RunID). Sinon, le script est interrompu.
Ensuite, une boucle WHILE vérifie s'il a des objets SYNC disponibles. Une Variable de compteur permet d'étudier les noms des séries (SYNC.JOB.DEPENDANCE_nn).
La fonction de script GET_SYNC permet de lire le statut courant de l'objet Sync. Si le statut est "DISPONIBLE", les tâches pourront l'utiliser. Si aucun objet Sync n'est trouvé, le script s'interrompt. Si un objet Sync est disponible, il peut être entré dans les deux tâches à l'aide de l'élément de script ATTACH_SYNC.
!Number of available SYNC objects
:SET &number_sync# = 2
!Specifying the task and its successor
:BEGINREAD 'Defining a dynamic dependency'
: PRINT 'ATTENTION: The tasks must
already be active !!!'
: PRINT ''
: READ &task1#,'00','Name of the predecessor',,M
: READ &task2#,'00','Name of the successor',,M
:ENDREAD
!Is the task active?
:SET &RunIDa1# = GET_UC_OBJECT_NR(JOBS,'&task1#')
:IF &RunIDa1# = ''
: STOP MSG,50,'Predecessor (&task1#)
is not active!'
:ENDIF
!Is task 2 active?
:SET &RunIDa2# = GET_UC_OBJECT_NR(JOBS,'&task2#')
:IF &RunIDa2# = ''
: STOP MSG,50,'successor (&task2#)
is not active!'
:ENDIF
Retrieving a free SYNC object through a counter
!(SYNC.JOB.DEPENDENCY_01, SYNC.JOB.DEPENDENCY_02)
:SET &status# = ''
:SET &counter# = 0
:WHILE &status# <> 'FREE'
: SET &counter# = ADD(&counter#,1)
: SET &counter# = FORMAT(&counter#,'00')
: IF &counter# > &number_sync#
: STOP MSG,50,'No free Sync object
available!'
: ENDIF
: SET &status# = GET_SYNC('SYNC.JOB.DEPENDENCY_&counter#','STATE')
:ENDWHILE
!Adding the SYNCs
:SET &ret# = SET_SYNC('SYNC.JOB.DEPENDENCY_&counter#','SET_TASK1')
:ATTACH_SYNC
JOBS,&RunIDa1#,'SYNC.JOB.DEPENDENCY_&counter#',,,SET_TASK2,W
:ATTACH_SYNC
JOBS,&RunIDa2#,'SYNC.JOB.DEPENDENCY_&counter#',SET_FREE,,,W