Aller au contenu

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 *INZSR n'a pas touchée retourne à blanc ou à zéro. La valeur affectée dans le calcul principal avant le RESET n'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;