Instruction RPG full free · IBM i (AS/400) · Déclarations
DCL-ENUM
Déclarer une énumération
Regroupe sous un même nom plusieurs constantes liées (statuts, couleurs, niveaux), à employer à la place de valeurs écrites en dur.
Syntaxe
dcl-enum nom [qualified];
constante const(valeur);
…
end-enum;
dcl-enum statut qualified; actif const(0); ferme const(2); end-enum;
nom- Le nom de l'énumération.
qualified- Les constantes s'écrivent
nom.constante(statut.actif). Sans lui, elles sont directement visibles dans tout le programme. constante const(valeur)- Chaque constante a son nom et sa valeur obligatoire : nombre, texte… Le mot-clé
constavec sa valeur est exigé. - Effet
- Aucun indicateur ni %FOUND. Chaque constante prend le type de sa valeur et n'occupe pas de mémoire, comme avec
dcl-c. L'énumération elle-même n'est pas une valeur : on n'emploie que ses constantes.
À quoi ça sert
Un statut stocké dans une zone numérique (0 actif, 1 suspendu, 2 fermé) devient illisible quand il apparaît partout sous la forme d'un 1 ou d'un 2. statut.suspendu dit ce qu'il est. Regrouper les constantes dans une énumération évite de les déclarer séparément avec des noms à préfixes (STATUT_ACTIF, STATUT_FERME…) et regroupe les valeurs liées, au même endroit.
Avec qualified, on peut réutiliser les mêmes noms dans plusieurs énumérations sans conflit. L'énumération sert surtout dans les select/when et les comparaisons.
Exemple 1 : Statuts, couleurs et seuils
**free
// DCL-ENUM : un groupe de constantes liees, avec un nom qualifie.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-enum statut qualified;
actif const(0);
suspendu const(1);
ferme const(2);
end-enum;
dcl-enum couleur qualified;
rouge const('R');
vert const('V');
bleu const('B');
end-enum;
dcl-enum seuil qualified;
bas const(100);
moyen const(500);
haut const(1000);
end-enum;
dcl-s etat int(5) inz(statut.suspendu);
snd-msg 'actif = ' + %char(statut.actif);
snd-msg 'suspendu = ' + %char(statut.suspendu);
snd-msg 'ferme = ' + %char(statut.ferme);
snd-msg 'rouge = ' + couleur.rouge;
snd-msg 'moyen = ' + %char(seuil.moyen);
select;
when etat = statut.actif;
snd-msg 'Dossier actif';
when etat = statut.suspendu;
snd-msg 'Dossier suspendu';
other;
snd-msg 'Dossier ferme';
endsl;
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
actif = 0
suspendu = 1
ferme = 2
rouge = R
moyen = 500
Dossier suspendu
Trois énumérations qualifiées : des nombres (statut.actif = 0…), des textes (couleur.rouge = R) et des seuils. Un select compare la zone etat aux constantes : le code se lit sans connaître les valeurs numériques.
Exemple 2 : Avec ou sans QUALIFIED
**free
// DCL-ENUM : sans QUALIFIED, les constantes sont globales; avec QUALIFIED, on prefixe par le nom.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-enum priorite;
basse const(1);
haute const(2);
end-enum;
dcl-enum etat qualified;
basse const('B');
haute const('H');
end-enum;
dcl-s niveau int(5) inz(2);
snd-msg 'basse sans prefixe : ' + %char(basse);
snd-msg 'haute sans prefixe : ' + %char(haute);
snd-msg 'etat.basse : ' + etat.basse;
snd-msg 'etat.haute : ' + etat.haute;
if niveau = haute;
snd-msg 'Niveau haut';
endif;
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
basse sans prefixe : 1
haute sans prefixe : 2
etat.basse : B
etat.haute : H
Niveau haut
L'énumération priorite, non qualifiée, rend basse et haute visibles directement. L'énumération etat, qualifiée, a aussi une constante basse et une haute, mais on les écrit etat.basse : aucun conflit entre les deux.
Le piège
Chaque constante demande sa valeur avec const. Écrire actif; seul est refusé à la compilation (RNF3905, mot-clé CONST manquant pour la définition de la constante). Le simple const sans parenthèses est refusé aussi (RNF0603).
Autre erreur fréquente : l'énumération elle-même n'est pas une valeur. Sans qualified, prio.haute est refusé (RNF0203, le nom d'énumération ne peut pas être utilisé ici). On écrit haute tout court, comme dans l'exemple 2.