Aller au contenu

Instruction RPG full free · IBM i (AS/400) · Mots-clés de déclaration

INZ

Initialiser une zone à la déclaration

Donne une valeur de départ à une zone, à un tableau ou à une structure dès le chargement du programme, ou à chaque appel pour une variable locale.

Syntaxe

dcl-s zone type inz(valeur);
dcl-s zone type inz;
dcl-s zone date inz(*sys);
dcl-ds nom qualified inz; ... end-ds;
dcl-ds nom likeds(modele) inz(*likeds);
valeur
Un littéral ou une constante du type de la zone : 'Montpellier', 1250.50, d'2020-03-15'. Pour un tableau, la valeur est donnée à tous les éléments.
sans valeur
inz seul met la valeur par défaut du type : blancs pour un caractère, zéro pour un numérique, 0001-01-01 pour une date. Sur une structure, il initialise toutes ses sous-zones par type.
*SYS
Pour une date : la date du jour, prise au chargement du programme.
*LIKEDS
Pour une structure déclarée avec LIKEDS : reprend les valeurs INZ du modèle.
Effet
Aucun indicateur. La zone est mise à sa valeur initiale au chargement du programme ; pour une variable locale d'une procédure, à chaque entrée dans la procédure (sauf static, une seule fois).

À quoi ça sert

Une zone non initialisée n'est pas forcément à une valeur utile. INZ dit clairement la valeur de départ : le solde commence à zéro, la date de création est celle du jour.

C'est l'équivalent des constantes d'initialisation de la spécification D en colonnes, et il remplace les MOVE / Z-ADD de début de programme. Sur une structure, INZ évite d'écrire une affectation par sous-zone.

Exemple 1 : Zones, tableau, structure, INZ(*SYS)

**free
// INZ : valeur initiale d'une variable, d'un tableau et d'une structure.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-s ville   char(12)      inz('Montpellier');
dcl-s solde   packed(9:2)   inz(1250.50);
dcl-s creation date         inz(d'2020-03-15');
dcl-s sans    char(5);
dcl-s sansnum packed(5:2);
dcl-s valeurs     int(10) dim(3) inz(7);

dcl-ds client;
  numcli packed(5:0) inz(100);
  nom    char(20)    inz('Dupont SA');
  actif  ind         inz(*on);
end-ds;

dcl-s vide    char(10) inz;
dcl-s dateinit date inz(*sys);

snd-msg 'Ville : [' + ville + ']';
snd-msg 'Solde : [' + %char(solde) + ']';
snd-msg 'Creation : [' + %char(creation) + ']';
snd-msg 'Sans INZ : [' + sans + '] ' + %char(sansnum);
snd-msg 'Tableau : ' + %char(valeurs(1)) + ' ' + %char(valeurs(2)) + ' ' + %char(valeurs(3));
snd-msg 'Client : ' + %char(numcli) + ' [' + %trimr(nom) + '] ' + actif;
snd-msg 'INZ seul : [' + vide + ']';
snd-msg 'INZ(*SYS) vaut aujourd hui : ' + %char(dateinit = %date());

*inlr = *on;

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

Ville : [Montpellier ]
Solde : [1250.50]
Creation : [2020-03-15]
Sans INZ : [     ] .00
Tableau : 7 7 7
Client : 100 [Dupont SA] 1
INZ seul : [          ]
INZ(*SYS) vaut aujourd hui : 1

Une zone isolée sans inz vaut quand même blancs ou zéro. Le tableau reçoit 7 dans ses trois éléments. inz(*sys) prend la date du jour : la comparaison avec %DATE() donne 1 (vrai).

Exemple 2 : INZ sur une structure, et sans INZ

**free
// INZ sur une structure : INZ global, puis valeur propre a un sous-champ.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-ds facture qualified inz;
  numero packed(7:0);
  libelle char(15);
  montant packed(9:2) inz(99.90);
  emission date;
end-ds;

dcl-ds sans qualified;
  numero packed(7:0);
  libelle char(15);
end-ds;

snd-msg 'Numero : ' + %char(facture.numero);
snd-msg 'Libelle : [' + facture.libelle + ']';
snd-msg 'Montant : ' + %char(facture.montant);
snd-msg 'Emission : ' + %char(facture.emission);
snd-msg 'Sans INZ, numero : ' + %char(sans.numero);

*inlr = *on;

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

Numero : 0
Libelle : [               ]
Montant : 99.90
Emission : 0001-01-01
Erreur : RNQ0907 - (C G D F) Erreur de données décimales.

La structure facture est déclarée inz : numéro à zéro, libellé en blancs, date à 0001-01-01, et montant à sa valeur propre 99,90 (celle d'une sous-zone l'emporte). La structure sans n'a pas de inz : lire sa sous-zone packed fait planter le programme avec RNQ0907.

Exemple 3 : Variable locale et variable STATIC

**free
// Piege : INZ d'une variable locale rejoue a chaque appel, celui d'une STATIC une seule fois.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-s r int(10);

r = compter();
r = compter();
r = compter();

*inlr = *on;

dcl-proc compter;
  dcl-pi *n int(10) end-pi;
  dcl-s cumul  int(10) static inz(10);
  dcl-s locale int(10) inz(10);
  cumul += 1;
  locale += 1;
  snd-msg 'static=' + %char(cumul) + ' locale=' + %char(locale);
  return cumul;
end-proc;

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

static=11 locale=11
static=12 locale=11
static=13 locale=11

La zone locale est remise à 10 à chaque appel : elle vaut toujours 11 après l'ajout. La zone static garde sa valeur d'un appel à l'autre : 11, 12, 13. Son inz(10) n'est joué qu'une fois.

Le piège

Une structure sans INZ n'est pas initialisée par type. Une zone isolée a toujours une valeur par défaut, mais pas les sous-zones d'une structure : lire une sous-zone packed d'une structure sans inz déclenche l'erreur RNQ0907 (données décimales). Comme le montre le deuxième exemple, il suffit de inz sur la structure pour que tout soit correct.

Pour une structure déclarée par LIKEDS, le inz du modèle ne suit pas tout seul : il faut inz(*likeds) (voir la fiche QUALIFIED).