%OCCUR
Occurrence courante d'une structure
Lit ou change l'occurrence courante d'une structure de données à occurrences multiples (occurs).
Syntaxe
%OCCUR(structure)
%OCCUR(structure) = numéro
structure- Une structure de données déclarée avec le mot-clé
occurs(n). - Résultat
- Un entier : le numéro de l'occurrence courante, 1 au départ. Affecté,
%OCCURdéplace l'occurrence courante. Les noms de sous-zones désignent toujours l'occurrence courante.
À quoi ça sert
Une structure occurs(n) est un ancien moyen de garder plusieurs lignes en mémoire avec une seule déclaration. Une seule occurrence est visible à la fois : pour lire ou écrire la deuxième ligne, on se place dessus avec %occur(client) = 2.
Pour du code neuf, un tableau de structures (dcl-ds … dim(n), accès client(2).nom) est plus lisible. %occur sert surtout à comprendre et à maintenir l'existant.
Exemple 1 : Remplir et parcourir des occurrences
**free
// %OCCUR : lire et changer l'occurrence courante d'une structure a occurrences multiples.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-ds client qualified occurs(4) inz;
numcli packed(5:0);
nom char(20);
ville char(12);
end-ds;
dcl-s i int(10);
snd-msg 'Occurrence au depart : ' + %char(%occur(client));
// Remplissage : on se place sur l'occurrence, puis on ecrit les sous-zones.
%occur(client) = 1;
client.numcli = 100;
client.nom = 'Dupont SA';
client.ville = 'Montpellier';
%occur(client) = 2;
client.numcli = 200;
client.nom = 'Martin et fils';
client.ville = 'Lyon';
%occur(client) = 3;
client.numcli = 400;
client.nom = 'Bernard Transports';
client.ville = 'Brest';
// Lecture : le nom de sous-zone designe toujours l'occurrence courante.
for i = 1 to 4;
%occur(client) = i;
snd-msg 'Occurrence ' + %char(%occur(client)) + ' : ' + %char(client.numcli) +
' [' + %trim(client.nom) + ']';
endfor;
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Occurrence au depart : 1
Occurrence 1 : 100 [Dupont SA]
Occurrence 2 : 200 [Martin et fils]
Occurrence 3 : 400 [Bernard Transports]
Occurrence 4 : 0 []
La structure a 4 occurrences et inz les initialise toutes. On se place sur chaque occurrence avec %occur(client) = n, puis on écrit ses sous-zones. Dans la boucle, client.numcli est toujours celui de l'occurrence courante. L'occurrence 4, jamais remplie, est à zéro et à blanc.
Exemple 2 : Occurrence hors limites
**free
// %OCCUR : viser une occurrence au-dela du nombre declare arrete le programme.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-ds client qualified occurs(3) inz;
numcli packed(5:0);
nom char(20);
end-ds;
dcl-s i int(10) inz(4);
%occur(client) = 3;
snd-msg 'Occurrence 3 : ' + %char(%occur(client));
// Il n'y a que 3 occurrences.
%occur(client) = i;
snd-msg 'Cette ligne n''est jamais atteinte';
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Occurrence 3 : 3
Erreur : RNQ0122 - (C G D F) OCCUR hors limites.
La structure a 3 occurrences. Se placer sur la 3e est valide ; viser la 4e arrête le programme avec RNQ0122.
Exemple 3 : Sans inz
**free
// Sans inz, les occurrences non remplies contiennent des donnees decimales invalides.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-ds client qualified occurs(3);
numcli packed(5:0);
nom char(20);
end-ds;
dcl-s i int(10);
%occur(client) = 1;
client.numcli = 100;
client.nom = 'Dupont SA';
for i = 1 to 3;
%occur(client) = i;
snd-msg 'Occurrence ' + %char(i) + ' : ' + %char(client.numcli);
endfor;
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Occurrence 1 : 100
Erreur : RNQ0907 - (C G D F) Erreur de données décimales.
La structure n'a pas de inz. L'occurrence 1, qu'on a remplie, se lit sans problème. Dès qu'on lit l'occurrence 2, jamais initialisée, le programme s'arrête avec RNQ0907 : la zone numérique contient des données décimales invalides.
Le piège
Sans inz, les occurrences non remplies sont invalides. Le troisième exemple lit l'occurrence 2 d'une structure jamais initialisée : erreur de données décimales RNQ0907. Avec inz (premier exemple), toutes les occurrences sont mises à zéro et à blanc au départ.
Et le numéro doit rester entre 1 et le nombre d'occurrences : au-delà, c'est RNQ0122, à l'exécution seulement.