Code opération RPG III / RPG/400 · IBM i (AS/400) · Indicateurs et branchements
GOTO
Brancher vers une étiquette (GOTO et TAG)
Saute à l'étiquette TAG nommée dans le facteur 2 ; la page couvre aussi TAG, qui définit l'étiquette.
Syntaxe
C GOTO ETIQ
C 10 GOTO ETIQ
C ETIQ TAG
- Indicateurs de conditionnement (9-17)
- Facultatifs sur
GOTO: sans eux, le saut est systématique. Avec eux, c'est un saut conditionnel (N20dans le premier exemple). - Facteur 1 (18-27)
- Sur
TAGuniquement : le nom de l'étiquette. - Facteur 2 (33-42)
- Sur
GOTOuniquement : le nom de l'étiquette cible. - Effet
- L'exécution reprend à la ligne qui suit le
TAG.TAGne fait rien d'autre que servir de cible : le traverser en séquence n'a aucun effet.
À quoi ça sert
GOTO et TAG sont les branchements « libres » du RPG III. On les trouve dans les vieux programmes pour sortir d'un traitement, passer à un traitement de fin, ou former une boucle. Un TAG peut être placé avant ou après le GOTO.
Le GOTO est souvent conditionné par des indicateurs (colonnes 9-17). Dans un sous-programme, il peut viser un TAG du même sous-programme ou du programme principal.
Exemple 1 : Boucle en arrière et saut en avant
H* GOTO / TAG : saut en avant pour sortir, saut en arriere pour boucler
C Z-ADD0 N 20
C DEBUT TAG
C ADD 1 N
C N DSPLY
C N COMP 3 20
C N20 GOTO DEBUT
C* Sortie de boucle
C GOTO FIN
C 'Jamais' DSPLY
C FIN TAG
C 'Fin' DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
1
2
3
Fin
Le TAG DEBUT sert de départ de boucle : tant que N n'est pas à 3, GOTO DEBUT repart en arrière (le COMP allume l'indicateur 20 à l'égalité, le GOTO est conditionné par N20). À 3, on passe au GOTO FIN qui saute le « Jamais » et atterrit sur FIN.
Exemple 2 : GOTO à l'intérieur d'un sous-programme
H* GOTO dans un sous-programme vers un TAG du meme sous-programme
C Z-ADD7 QTE 30
C EXSR CTRL
C 'Retour' DSPLY
C SETON LR
C CTRL BEGSR
C QTE COMP 0 30
C 30 GOTO SORTIE
C 'Qte > 0' DSPLY
C SORTIE TAG
C ENDSR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Qte > 0
Retour
Le sous-programme CTRL saute à l'étiquette SORTIE située dans lui-même quand la quantité est nulle. Ici elle vaut 7, le GOTO n'a pas lieu et « Qte > 0 » s'affiche.
Exemple 3 : GOTO depuis un sous-programme vers le programme principal
H* GOTO hors d'un sous-programme vers un TAG du programme principal
C Z-ADD7 QTE 30
C EXSR CTRL
C 'Retour' DSPLY
C FINPGM TAG
C 'Fin pgm' DSPLY
C SETON LR
C CTRL BEGSR
C 'Dans SP' DSPLY
C GOTO FINPGM
C 'Apres' DSPLY
C ENDSR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Dans SP
Fin pgm
Le GOTO FINPGM du sous-programme sort de CTRL sans passer par ENDSR : « Apres » et « Retour » ne s'affichent pas, l'exécution reprend après le TAG FINPGM du programme principal (« Fin pgm »).
Le piège
Une cible introuvable est refusée : QRG7043, « La destination de GOTO ou CABxx n'a pas d'instruction TAG ou ENDSR correspondante. La spécification n'est pas prise en compte. » Un nom de TAG déjà utilisé est refusé aussi : QRG5013, « L'étiquette entrée en Facteur 1 pour une opération TAG est déjà définie ou est un mot réservé ».
On ne saute pas dans un sous-programme depuis le programme principal : QRG7047, « Branchement GOTO d'une ligne de traitement détail à un sous-programme. La spécification n'est pas prise en compte. » L'inverse, un GOTO de sous-programme vers le programme principal, compile (troisième exemple) mais saute ENDSR : le sous-programme n'est jamais terminé proprement et le code qui suit l'EXSR est perdu (« Retour » absent de la sortie). À éviter.
Littéral en facteur 1 : un littéral de plus de 8 caractères utiles ne tient pas dans les colonnes 18-27. Un 'Dans CTRL' en facteur 1 de DSPLY donne QRG5150, « Le littéral entré en Facteur 1 est incorrect ».
En RPG ILE full free
Le format libre n'a ni GOTO ni TAG. On les remplace par des boucles (DOW, FOR) et par LEAVE et ITER.
dow n < 3;
n += 1;
dsply n;
enddo;