Enumération typée

Depuis décembre 2025, le compilateur RPG permet la déclaration d’une énumération typée, ainsi que de variables de même type que l’énumération.

Prérequis

Avoir les PTFs :

7.5:

  • ILE RPG compiler: 5770WDS SJ08375

7.6:

  • ILE RPG compiler: 5770WDS SJ08384
  • ILE RPG compiler, TGTRLS(V7R5M0): 5770WDS SJ08394

Syntaxe

Par exemple :

Il faut indiquer le type précis de l’énumération, ici CHAR(3). Les valeurs des constantes énumérées doivent correspondre au type.

DFT indique une valeur par défaut : 1 et 1 seule, facultatif.

Il est impossible de définir une énumération comme une autre énumération :

Par contre, vous pouvez définir des variables comme une énumération typée :

Quelques règles

  • une valeur par défaut supportée par énumération
  • initialisation des variables ou zone de DS par une valeur de l’énumération :
    • dcl-s myCall1 like(CALL_TYPE) inz(CALL_TYPE.DISPLAY) : OK
    • dcl-s myCall2 like(CALL_TYPE) inz('DSP') : Erreur, même si la valeur existe dans l’énumération
  • si inz est indiqué sans valeur, la valeur par défaut de l’énumération est utilisée
  • de même pour l’affectation d’une nouvelle valeur, doit se faire via l’énumération, quelque soit le type de valeur :
    • myCall1 = CALL_TYPE.UPDATE : OK
    • myCall1 = 'UPD' oumyCall1 = ('U' + 'PD') : Erreur
  • Les fonctions %hival et %loval fonctionnent
  • Contrairement à*hival et*loval

En tant que tableau ou liste

Il est possible d’utiliser une énumération partout où un tableau est utilisable, sauf avec :

  • SORTA
  • %elem
  • %lookup
  • %subarr

Par exemple en tant que liste :

Domaine de validité

Seules les valeur de l’énumération sont utilisables, toute autre valeur provoque une erreur de compilation.

Toutefois, il est possible de contourner ce fonctionnement.

Pour les variables de type numérique, les calculs sont autorisés :

En passant avec un pointeur :

En paramètre de procédure

Cela permet d’indiquer explicitement les valeurs autorisés pour les paramètres définis comme une énumération :

  • la valeur de retour est définie parlike(ERROR) et ne pourra avoir que les valeurs définies
  • le paramètre p_callType est défini parlike(CALL_TYPE) pour lequel les valeurs sont également définies

C’est beaucoup plus pertinent qu’un commentaire, le compilateur effetuant le contrôle.

Précompilateur SQL

Les valeurs énumérées sont reconnues en tant que constantes, et les variables définies depuis une énumération sont utilisables :

Par contre, l’affectation d’une valeur non énumérée est possible :

L’utilisation en tant que liste de valeurs dans un IN SQL n’est pas supportée :

option de compilation CCSID(*EXACT)

Si votre énumération est définie en CHAR ou VARCHAR et contient des valeurs non définies par des constantes hexadécimales, c’est à dire la plupart des cas, vous devez indiquer ctl-opt ccsid(*exact).

C’est une obligation afin que le compilateur ne fasse pas de supposition incorrecte sur le CCSID des littéraux pour comparaison avec les variables de vos programmes. Aucune conversion implicite n’est effectuée et cela évote les incohérences que l’on peut avoir, particulièrement avec des fichiers source dans l’IFS, généralement encodés en UTF-8.

Références

https://www.ibm.com/docs/en/i/7.6.0?topic=enumerations-typed

https://www.ibm.com/support/pages/rpg-cafe

https://ibm.biz/rpgcafe_fall_2025_fld_like_enum

https://www.ibm.com/docs/en/i/7.6.0?topic=keyword-ccsidexact