Instruction RPG full free · IBM i (AS/400) · Données et calculs
RESET
Revenir à la valeur initiale
Remet une zone, une structure ou un tableau à la valeur donnée par son mot-clé INZ, ou à blanc/zéro quand il n'y en a pas.
Syntaxe
RESET zone;
RESET structure;
zone- Une variable, une sous-zone ou un élément de tableau.
structure- Chaque sous-zone retrouve sa propre valeur initiale :
INZsi elle en a une, sinon la valeur vide de son type. - Effet
- Modifie la cible seulement. Elle reprend la valeur de son
INZ; sansINZ, blancs pour un caractère, zéro pour un nombre. Ne positionne ni %FOUND ni indicateur.
À quoi ça sert
Les paramètres, compteurs et indicateurs d'un traitement ont souvent une valeur de départ : devise EUR, taux de 20 %, compteur à 100. Au lieu de recopier ces valeurs dans le code à chaque réinitialisation, on les déclare une fois avec INZ et on appelle RESET.
Si la valeur initiale change, un seul endroit à modifier. C'est la bonne façon de repartir à zéro une structure qui mélange des sous-zones avec et sans valeur de départ.
Exemple 1 : Zones et structure
**free
// RESET : revenir a la valeur initiale (inz) d'une zone ou d'une structure.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s ville char(12) inz('Montpellier');
dcl-s total packed(7:2);
dcl-ds param qualified;
devise char(3) inz('EUR');
taux packed(5:2) inz(20.00);
note char(10);
end-ds;
ville = 'Brest';
total = 98000;
param.devise = 'USD';
param.taux = 8.50;
param.note = 'urgent';
reset ville;
reset total;
reset param;
snd-msg 'Ville : [' + ville + ']';
snd-msg 'Total : [' + %char(total) + ']';
snd-msg 'Devise : [' + param.devise + ']';
snd-msg 'Taux : [' + %char(param.taux) + ']';
snd-msg 'Note : [' + param.note + ']';
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Ville : [Montpellier ]
Total : [.00]
Devise : [EUR]
Taux : [20.00]
Note : [ ]
La ville retrouve Montpellier, valeur de son INZ ; le total, sans INZ, retombe à zéro. Dans la structure param, la devise et le taux reviennent à EUR et 20.00, mais la note, sans INZ, est remise à blanc : elle ne garde pas urgent.
Exemple 2 : Dans une procédure
**free
// RESET dans une procedure : la valeur de depart d'une zone locale a chaque appel.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s compteur int(10) inz(100);
ajouter();
ajouter();
snd-msg 'Compteur : ' + %char(compteur);
reset compteur;
snd-msg 'Compteur apres reset : ' + %char(compteur);
*inlr = *on;
dcl-proc ajouter;
dcl-s lignes int(10) inz(5);
lignes += 1;
snd-msg 'Local avant reset : ' + %char(lignes);
reset lignes;
snd-msg 'Local apres reset : ' + %char(lignes);
compteur += 1;
end-proc;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Local avant reset : 6
Local apres reset : 5
Local avant reset : 6
Local apres reset : 5
Compteur : 102
Compteur apres reset : 100
La zone locale lignes est incrémentée (6) puis ramenée à 5 par RESET, à chaque appel. La zone globale compteur, modifiée par la procédure, finit à 102 puis repasse à 100 sur un RESET du programme principal.
Le piège
Sans INZ, RESET ne rend rien de « d'avant » : il vide. Dans le premier exemple, total n'a pas d'INZ et retombe à zéro, param.note perd son urgent : RESET ne mémorise pas la valeur que la zone avait avant vos modifications, seulement celle de la déclaration.
Et il y a l'inverse : une zone déclarée INZ puis remise à blanc par CLEAR n'est pas restaurée tant qu'on n'appelle pas RESET (voir la fiche CLEAR).