Code opération RPG III / RPG/400 · IBM i (AS/400) · Tableaux, structures et bits
OCUR
Choisir l'occurrence d'une structure de données
Positionne une structure de données à occurrences multiples sur l'occurrence demandée, ou en donne le rang courant.
Syntaxe
C rang OCUR struct ER
C OCUR struct rangc 30
- Facteur 1 (18-27)
- Le rang de l'occurrence à rendre courante : une zone numérique sans décimale ou un littéral. Vide pour seulement lire le rang courant.
- Facteur 2 (33-42)
- Le nom de la structure de données définie avec un nombre d'occurrences (spécification I, colonnes 44-47 de la ligne
DS). - Zone résultat (43-48)
- Facultative : reçoit le rang de l'occurrence courante. Zone numérique sans décimale.
- Indicateurs (56-57)
- S'allume si le rang de facteur 1 est hors limites (supérieur au nombre d'occurrences). Sans lui, l'erreur arrête le programme.
- Effet
- Les sous-zones de la structure désignent désormais l'occurrence demandée : lire ou écrire une sous-zone lit ou écrit cette occurrence. Au début du programme, c'est l'occurrence 1. En cas de rang hors limites, l'indicateur 56-57 s'allume et l'occurrence courante ne change pas.
À quoi ça sert
Une structure de données à occurrences multiples est le « tableau d'enregistrements » du RPG III : une même description (code, quantité, libellé…) répétée n fois. OCUR choisit laquelle des n copies manipulent les sous-zones. On l'emploie pour garder en mémoire une dizaine de lignes de saisie, ou pour cumuler des lignes avant de les imprimer.
Le nombre d'occurrences se déclare sur la ligne DS de la spécification I (colonnes 44-47) ; les sous-zones sont décrites par leurs positions de début et de fin dans une occurrence.
Exemple 1 : Remplir deux occurrences puis relire la première
H* OCUR : structure a occurrences multiples, une occurrence par client
IDSCLI DS 3
I 1 50NUM
I 6 15 VILLE
C*
C Z-ADD1 IDX 30
C IDX OCUR DSCLI
C Z-ADD100 NUM
C MOVEL'LYON' VILLE
C Z-ADD2 IDX
C IDX OCUR DSCLI
C Z-ADD200 NUM
C MOVEL'BREST' VILLE
C* On revient sur l'occurrence 1
C Z-ADD1 IDX
C IDX OCUR DSCLI
C NUM DSPLY
C VILLE DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
100
LYON
La structure DSCLI a 3 occurrences de 15 caractères (numéro, ville). On se place sur l'occurrence 1 et on y range 100 et LYON, puis sur la 2 avec 200 et BREST. Revenir sur la 1 ramène 100 et LYON.
Exemple 2 : Rang courant et rang hors limites
H* OCUR : occurrence courante en zone resultat, rang hors limites
IDSART DS 3
I 1 50CODE
I 6 100QTE
C*
C OCUR DSART CUR 30
C CUR DSPLY
C Z-ADD3 IDX 30
C IDX OCUR DSART
C OCUR DSART CUR
C CUR DSPLY
C* Rang 4 : la structure n'a que 3 occurrences
C Z-ADD4 IDX
C IDX OCUR DSART 90
C *IN90 IFEQ '1'
C 'Hors lim'DSPLY
C OCUR DSART CUR
C CUR DSPLY
C END
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
1
3
Hors lim
3
Au départ le rang courant est 1. Après OCUR sur le rang 3, la zone résultat donne 3. Le rang 4 n'existe pas : l'indicateur 90 (colonnes 56-57) s'allume, et le rang courant reste 3.
Exemple 3 : Rang hors limites sans indicateur
H* OCUR : rang hors limites sans indicateur 56-57, le travail s'arrete
IDSART DS 3
I 1 50CODE
C Z-ADD4 IDX 30
C 'Avant' DSPLY
C IDX OCUR DSART
C 'Apres' DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
Avant
Erreur : RPG0122 - OCUR hors limites (facteur 1)
Sans indicateur en 56-57, le travail s'arrête sur le rang 4 : après « Avant », le message RPG0122 (« OCUR hors limites (facteur 1) ») met fin au programme, et « Apres » n'est jamais affiché.
Le piège
Un rang hors limites arrête le programme si l'indicateur d'erreur manque : RPG0122, « OCUR … hors limites (facteur 1) » (troisième exemple). Codez l'indicateur en 56-57 dès que le rang vient d'une saisie ou d'un compteur.
Après une erreur, l'occurrence courante ne change pas (deuxième exemple : elle reste à 3). Si vous écrivez dans les sous-zones sans tester l'indicateur, vous écrasez la dernière occurrence.
Le facteur 2 doit être une structure déclarée avec des occurrences : sinon le compilateur refuse la ligne par QRG5163 (« La zone Facteur 2 ne contient pas le nom d'une structure de données à occurrences multiples, pour l'opération OCUR »).
En RPG ILE full free
En RPG ILE, on déclare plutôt un tableau de structures avec dim() et on l'indexe directement. L'ancienne forme à occurrences reste valide, avec la fonction %OCCUR pour lire ou fixer le rang courant.
dcl-ds cli qualified dim(3);
num packed(5);
ville char(10);
end-ds;
cli(1).num = 100;
cli(1).ville = 'LYON';