Aller au contenu

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';