Aller au contenu

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é const avec 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.