Aller au contenu

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 (N20 dans le premier exemple).
Facteur 1 (18-27)
Sur TAG uniquement : le nom de l'étiquette.
Facteur 2 (33-42)
Sur GOTO uniquement : le nom de l'étiquette cible.
Effet
L'exécution reprend à la ligne qui suit le TAG. TAG ne 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;