Instruction RPG full free · IBM i (AS/400) · Structures de contrôle
FOR-EACH
Parcourir les éléments d'un tableau
Parcourt un à un les éléments d'un tableau en plaçant chacun dans une variable, sans gérer d'indice.
Syntaxe
FOR-EACH variable IN tableau;
instructions;
ENDFOR;
variable- Zone, de même type que les éléments, qui reçoit tour à tour la valeur de chaque élément. Pour un tableau de structures, c'est une structure déclarée avec
LIKEDS. tableau- Tableau (
DIM) ou tableau de structures. Les éléments sont pris dans l'ordre, du premier au dernier. - Effet
- Aucun indicateur n'est positionné. La variable contient une copie de l'élément courant ; le tableau n'est pas modifié par les affectations faites sur cette copie.
À quoi ça sert
La boucle FOR i = 1 TO %elem(t) oblige à gérer l'indice et la taille. FOR-EACH supprime ces deux risques d'erreur : on lit « pour chaque ville dans villes ». C'est la forme à préférer pour un simple parcours en lecture.
Exemple 1 : Parcourir un tableau de villes
**free
// FOR-EACH : parcourir un tableau de villes sans gerer d'indice.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s villes char(15) dim(3);
dcl-s ville char(15);
villes(1) = 'Montpellier';
villes(2) = 'Lyon';
villes(3) = 'Brest';
for-each ville in villes;
snd-msg 'Agence : [' + %trim(ville) + ']';
endfor;
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Agence : [Montpellier]
Agence : [Lyon]
Agence : [Brest]
Un tableau de trois villes, une variable de même longueur, et la boucle affiche chaque agence dans l'ordre.
Exemple 2 : Copie et tableau de structures
**free
// FOR-EACH : la variable est une copie de l'element, et le parcours d'une structure.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-ds facture qualified template;
numero int(10);
montant packed(9:2);
end-ds;
dcl-s montants packed(9:2) dim(3);
dcl-s m packed(9:2);
dcl-ds f likeds(facture);
dcl-ds lignes likeds(facture) dim(2);
montants(1) = 100;
montants(2) = 250.50;
montants(3) = 75;
// On double la copie : le tableau ne bouge pas.
for-each m in montants;
m = m * 2;
endfor;
snd-msg 'Tableau apres boucle : ' + %char(montants(1)) + ' / ' + %char(montants(2)) + ' / '
+ %char(montants(3));
lignes(1).numero = 5001;
lignes(1).montant = 1250.50;
lignes(2).numero = 5002;
lignes(2).montant = 98000;
for-each f in lignes;
snd-msg 'Facture ' + %char(f.numero) + ' : ' + %char(f.montant);
endfor;
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Tableau apres boucle : 100.00 / 250.50 / 75.00
Facture 5001 : 1250.50
Facture 5002 : 98000.00
La boucle double chaque montant dans la variable m : le tableau reste à 100,00 / 250,50 / 75,00. Le second parcours lit un tableau de deux factures dans une structure f déclarée avec likeds.
Le piège
La variable est une copie : modifier la variable ne modifie pas le tableau. Dans le deuxième exemple, m = m * 2 ne change aucun élément (le tableau affiche toujours 100,00 / 250,50 / 75,00). Pour mettre à jour le tableau, passez par une boucle FOR avec un indice et écrivez dans tableau(i).