Aller au contenu

Instruction RPG full free · IBM i (AS/400) · Déclarations

DCL-C

Déclarer une constante

Donne un nom à une valeur fixe (nombre, texte, date) que le programme ne peut pas modifier, pour ne plus écrire de valeur en dur dans le code.

Syntaxe

dcl-c nom valeur;
dcl-c nom const(valeur);
dcl-c TAUX_TVA 0.20;
dcl-c VILLE_SIEGE 'Montpellier';
nom
Le nom de la constante. Par habitude, on l'écrit en majuscules.
valeur
Un littéral numérique ou un texte entre apostrophes.
const(valeur)
Autre écriture du même résultat, avec le mot-clé const.
Effet
Aucun indicateur ni %FOUND. La constante n'occupe pas de place en mémoire : le compilateur remplace son nom par la valeur partout dans le source. Elle prend le type de sa valeur : 0.3333 est un nombre à quatre décimales, 'FR' un texte de 2 caractères, 007 un nombre.

À quoi ça sert

Un montant de seuil, un taux de TVA, le nom de la ville du siège : écrire la valeur à dix endroits du programme, c'est dix endroits à corriger le jour où elle change. dcl-c donne un nom à la valeur, on la change à un seul endroit, et le compilateur refuse toute tentative de la modifier ailleurs.

Une constante sert aussi de borne de tableau (dim(MAX_LIGNES)) ou de valeur de comparaison dans un select ou un if, car elle est connue dès la compilation, ce qu'une variable ne permet pas. En RPG IV en colonnes, c'était la spécification D avec le code C.

Exemple 1 : Taux, seuil, texte et borne de tableau

**free
// DCL-C : des constantes nommees, calculees une fois pour toutes a la compilation.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-c TAUX_TVA 0.20;
dcl-c SEUIL_ALERTE 1000;
dcl-c VILLE_SIEGE 'Montpellier';
dcl-c MAX_LIGNES 3;
dcl-c TITRE const('FAC-CLIENT');

dcl-s montantHt packed(9:2) inz(1250.50);
dcl-s tva       packed(9:2);
dcl-s lignes    char(10) dim(MAX_LIGNES);

tva = montantHt * TAUX_TVA;
snd-msg 'TVA      : ' + %char(tva);
snd-msg 'Titre    : ' + TITRE;
snd-msg 'Lignes   : ' + %char(%elem(lignes));
snd-msg 'Siege    : [' + VILLE_SIEGE + '] longueur ' + %char(%len(VILLE_SIEGE));

if montantHt > SEUIL_ALERTE;
  snd-msg 'Montant au-dessus du seuil de ' + %char(SEUIL_ALERTE);
endif;

*inlr = *on;

Résultat réel, compilé et exécuté sur IBM i 7.5 :

TVA      : 250.10
Titre    : FAC-CLIENT
Lignes   : 3
Siege    : [Montpellier] longueur 11
Montant au-dessus du seuil de 1000

La TVA se calcule avec TAUX_TVA, la taille du tableau vient de MAX_LIGNES (%elem redonne 3) et %len d'une constante texte donne la longueur du texte (11 pour « Montpellier »). Le seuil d'alerte est comparé directement au montant.

Exemple 2 : La constante a le type de sa valeur

**free
// DCL-C : la constante prend le type de sa valeur, pas celui de la zone qui la recoit.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-c UN_TIERS 0.3333;
dcl-c CODE_PAYS 'FR';
dcl-c CODE_NUM 007;

dcl-s total  packed(9:2);
dcl-s entier int(10);
dcl-s texte  char(10);

total = 100 * UN_TIERS;
entier = 100 * UN_TIERS;
texte = CODE_PAYS;

snd-msg 'En packed(9:2) : ' + %char(total);
snd-msg 'En int(10)     : ' + %char(entier);
snd-msg 'Texte          : [' + texte + ']';
snd-msg 'Code numerique : ' + %char(CODE_NUM);
snd-msg 'Longueur FR    : ' + %char(%len(CODE_PAYS));

*inlr = *on;

Résultat réel, compilé et exécuté sur IBM i 7.5 :

En packed(9:2) : 33.33
En int(10)     : 33
Texte          : [FR        ]
Code numerique : 7
Longueur FR    : 2

Le littéral 0.3333 a quatre décimales : 100 * UN_TIERS donne 33,33 dans un packed(9:2). Dans un int(10), le même calcul donne 33, partie décimale coupée. 'FR' est un texte de 2 caractères ; 007 est un nombre : il s'affiche 7.

Le piège

Une constante numérique n'est pas une chaîne de chiffres. dcl-c CODE_NUM 007 vaut le nombre 7 : %char affiche 7, sans les zéros. Si vous voulez les trois chiffres, il faut un texte : dcl-c CODE_TXT '007'.

Et le nombre de décimales vient du littéral. Dans l'exemple 2, 100 * UN_TIERS donne 33 dans un int(10) : rien n'est arrondi.

Une constante ne se modifie pas : MAX_LIGNES = 5; est refusé à la compilation (RNF7418, la zone résultat de l'opération EVAL ne peut pas être modifiée). Sur cette version d'IBM i, on ne peut pas non plus donner une expression à une constante : dcl-c TITRE PREFIXE + 'CLIENT'; est refusé (RNF3308), il faut un littéral.