Code opération RPG III / RPG/400 · IBM i (AS/400) · Transferts de données
RESET
Rendre la valeur d'initialisation
Remet une zone, une structure de données ou un format à la valeur qu'ils avaient à la fin du sous-programme *INZSR, ou à vide / zéro en l'absence de *INZSR.
Syntaxe
C RESETzone
C RESETstructure
C RESETformat
- Facteur 1 (18-27)
- Non utilisé : on le laisse à blanc.
- Facteur 2 (33-42)
- Ce qu'on restaure : une zone, une structure de données ou un format d'enregistrement. Le résultat reste à blanc.
- Effet
- Aucun indicateur n'est positionné. La zone reprend la valeur qu'elle avait à l'issue de
*INZSR, c'est-à-dire sa valeur de départ pour le programme. Une zone que*INZSRn'a pas touchée retourne à blanc ou à zéro. La valeur affectée dans le calcul principal avant leRESETn'est pas retenue.
À quoi ça sert
Dans un programme qui reste actif (LR éteint) ou qui traite une série de clients, certaines zones doivent repartir de leur valeur de départ : un compteur à 100, un état à « INIT ». On les fixe une fois dans *INZSR, puis RESET les restaure. Là où CLEAR met à vide, RESET rend la valeur d'origine.
Exemple 1 : RESET puis CLEAR
H* RESET : rend la valeur d'initialisation, CLEAR la valeur vide
C Z-ADD7 QTE 50
C MOVEL'FIN' ETAT 6 P
C QTE DSPLY
C ETAT DSPLY
C RESETQTE
C RESETETAT
C QTE DSPLY
C ETAT DSPLY
C CLEARQTE
C CLEARETAT
C QTE DSPLY
C ETAT IFEQ *BLANKS
C 'ETAT vid'DSPLY
C END
C SETON LR
C *INZSR BEGSR
C Z-ADD100 QTE
C MOVEL'INIT' ETAT
C ENDSR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
7
FIN
100
INIT
0
ETAT vid
Le sous-programme *INZSR place 100 dans QTE et INIT dans ETAT. Le calcul change ces zones (7 et FIN), RESET les ramène à 100 et INIT, puis CLEAR les met à zéro et à blanc. Le P du MOVEL 'FIN' évite un résultat « FINT » (la fin de INIT aurait survécu).
Exemple 2 : La valeur restaurée est celle de *INZSR
H* RESET : la valeur retrouvee est celle de la fin de *INZSR
C Z-ADD50 TOTAL 50
C Z-ADD80 TOTAL
C RESETTOTAL
C TOTAL DSPLY
C Z-ADD99 CPT 30
C RESETCPT
C CPT DSPLY
C SETON LR
C *INZSR BEGSR
C Z-ADD10 CPT
C ENDSR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
0
10
TOTAL vaut 50 puis 80 dans le calcul principal, mais *INZSR n'y touche pas : RESET donne 0, pas 50. CPT, mis à 10 dans *INZSR puis à 99 dans le calcul, revient à 10.
Le piège
RESET ne mémorise pas « la valeur d'avant » : seule compte la valeur à la fin de *INZSR (deuxième exemple : TOTAL retourne à 0 et non à 50).
RESET est interdit dans *INZSR lui-même : QRG5077, « Opération RESET incorrecte dans un sous-programme d'initialisation ».
Aucune opération ne peut suivre ENDSR : placez *INZSR à la fin du source, sinon QRG5005, « L'opération suivant l'opération ENDSR est incorrecte ».
En RPG ILE full free
En RPG ILE, RESET existe aussi et restaure la valeur d'initialisation : celle du mot clé INZ de la déclaration, ou celle de *INZSR. Le plus lisible est de déclarer la valeur avec INZ.
dcl-s qte packed(5) inz(100);
qte = 7;
reset qte;