Code opération RPG III / RPG/400 · IBM i (AS/400) · Indicateurs et branchements
SETON
Allumer des indicateurs
Allume jusqu'à trois indicateurs écrits dans les colonnes 54-55, 56-57 et 58-59.
Syntaxe
C SETON 010203
C N10 11 SETON 20
C SETON LR
- Indicateurs de conditionnement (9-17)
- Facultatifs : jusqu'à trois indicateurs, chacun précédé d'un
Npour la négation (colonnes 9, 12 et 15). Tous doivent être vrais (ET) pour que la ligne s'exécute. Pour un OU ou plus de trois conditions, on utilise des lignesANetOR(colonnes 7-8). - Indicateurs (54-55)
- Premier indicateur à allumer.
- (56-57)
- Deuxième indicateur à allumer, facultatif.
- (58-59)
- Troisième indicateur à allumer, facultatif. Un des trois au moins est obligatoire.
- Effet
- Chaque indicateur nommé passe à
'1'. Les autres indicateurs ne changent pas. Aucune zone n'est modifiée.
À quoi ça sert
Les indicateurs (01 à 99, plus LR…) sont les variables booléennes du RPG III. SETON les allume, SETOF les éteint, et on les utilise ensuite pour conditionner une ligne (colonnes 9-17) ou pour les tester par *IN01.
On allume souvent un indicateur d'erreur, un indicateur d'affichage d'écran ou l'indicateur LR en fin de programme. Une ligne SETON peut en allumer trois d'un coup, et peut elle-même être conditionnée, comme n'importe quelle ligne de calcul.
Pour conditionner une ligne avec plus de trois indicateurs, ou avec un OU, on écrit une première ligne qui ne porte que des indicateurs (pas de code opération), puis des lignes AN ou OR en colonnes 7-8. La dernière ligne, celle qui porte le code opération, commence elle aussi par AN ou OR (deuxième exemple ci-dessous).
Exemple 1 : Trois indicateurs sur une ligne
H* SETON : allumer trois indicateurs sur une seule ligne
C* Avant : tous eteints
C *IN01 DSPLY
C *IN02 DSPLY
C *IN03 DSPLY
C SETON 010203
C* Apres : les trois sont allumes
C *IN01 DSPLY
C *IN02 DSPLY
C *IN03 DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
0
0
0
1
1
1
Avant le SETON, les indicateurs 01, 02 et 03 sont éteints (0). Une seule ligne, avec 01, 02 et 03 dans les colonnes 54-59, les allume tous les trois. DSPLY sur *IN01 montre la valeur de l'indicateur.
Exemple 2 : Conditionner un SETON : N, ET, ligne AN
H* SETON : conditionnement par N et par une ligne AN
C SETON 1011
C SETOF 12
C* 20 : 10 allume ET 11 eteint -> faux, 11 est allume
C 10N11 SETON 20
C* 21 : 10 allume ET 11 allume -> vrai
C 10 11 SETON 21
C* 22 : 10 ET 11 ET N12 sur trois lignes -> vrai
C 10
CAN 11N12 SETON 22
C *IN20 DSPLY
C *IN21 DSPLY
C *IN22 DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
0
1
1
Les indicateurs 10 et 11 sont allumés, 12 éteint. Le premier SETON est conditionné par 10 et N11 : 11 est allumé, la condition est fausse, 20 reste éteint. Le deuxième demande 10 et 11 : vrai, 21 s'allume. Le troisième utilise une ligne de conditionnement seule (10), puis une ligne AN (11 et N12) qui porte aussi le SETON : les trois conditions sont vraies, 22 s'allume.
Exemple 3 : SETON LR ne termine pas le programme tout de suite
H* SETON LR : le programme ne s'arrete pas sur la ligne
C *INLR DSPLY
C SETON LR
C* LR est allume mais les lignes suivantes s'executent
C *INLR DSPLY
C 'Apres LR'DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
0
1
Apres LR
Après SETON LR, *INLR vaut 1, mais le programme continue : le DSPLY 'Apres LR' placé après s'exécute. Le programme ne se termine qu'à la fin du cycle, quand il atteint la dernière ligne.
Le piège
SETON LR n'arrête pas le programme : toutes les lignes qui suivent sont exécutées (troisième exemple, « Apres LR » s'affiche). Placez SETON LR en dernière ligne, ou sachez que le code placé après s'exécute encore.
Un indicateur de condition doit être défini quelque part : un N12 qu'aucune ligne ne positionne donne QRG7030, « La zone ou l'indicateur n'est pas défini » (gravité 30, la compilation échoue). Dans le deuxième exemple, un SETOF 12 règle le problème.
Indicateurs et alignement : chaque indicateur de conditionnement occupe 3 colonnes (N ou blanc, puis deux chiffres). Décalé d'une colonne, il donne QRG5006, « La zone Non ne contient pas N, et n'est pas à blanc » et QRG5007, « L'indicateur de condition est incorrect ».
En RPG ILE full free
En RPG ILE, on affecte *ON à l'indicateur, un indicateur à la fois.
*in01 = *on;
*in02 = *on;
*in03 = *on;
*inlr = *on;