Aller au contenu

%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é, %OCCUR dé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.