Aller au contenu

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).