Aller au contenu

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 : INZ si elle en a une, sinon la valeur vide de son type.
Effet
Modifie la cible seulement. Elle reprend la valeur de son INZ ; sans INZ, 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).