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 valeurinzseul met la valeur par défaut du type : blancs pour un caractère, zéro pour un numérique,0001-01-01pour 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).