Instruction RPG full free · IBM i (AS/400) · Données et calculs
CLEAR
Remettre à blanc ou à zéro
Met une zone, une structure ou un tableau à sa valeur vide : blancs pour un caractère, zéro pour un nombre, date minimale pour une date.
Syntaxe
CLEAR zone;
CLEAR structure;
CLEAR tableau;
zone- Une variable, une sous-zone, un élément de tableau ou un indicateur.
structure- Toutes ses sous-zones sont vidées chacune selon son type.
tableau- Tous les éléments reçoivent la valeur vide de leur type.
- Effet
- Modifie la cible seulement. Caractère : blancs. Numérique : zéro. Date :
0001-01-01. Chaîne de longueur variable : longueur 0. Ne positionne ni %FOUND ni indicateur. Ne tient pas compte de la valeurINZde la déclaration.
À quoi ça sert
On s'en sert pour préparer une zone de travail avant de la remplir : vider un enregistrement avant un WRITE, repartir d'une structure propre à chaque tour de boucle, effacer les messages d'un écran.
Une seule instruction suffit quel que soit le type, là où il faudrait sinon écrire = *blanks, = 0 et une date de départ.
Exemple 1 : Zones simples et structure
**free
// CLEAR : remettre des zones a blanc ou a zero.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s ville char(12) inz('Lyon');
dcl-s solde packed(7:2) inz(1250.50);
dcl-s libelle varchar(30) inz('Petit Atelier');
dcl-s dernier date inz(d'2024-01-08');
dcl-ds client qualified;
nom char(20) inz('Martin et fils');
ville char(12) inz('Lyon');
solde packed(7:2) inz(45.10);
end-ds;
clear ville;
clear solde;
clear libelle;
clear dernier;
snd-msg 'Ville : [' + ville + ']';
snd-msg 'Solde : [' + %char(solde) + ']';
snd-msg 'Libelle : [' + libelle + '] long. ' + %char(%len(libelle));
snd-msg 'Date : [' + %char(dernier) + ']';
clear client;
snd-msg 'Nom : [' + client.nom + ']';
snd-msg 'Solde : [' + %char(client.solde) + ']';
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Ville : [ ]
Solde : [.00]
Libelle : [] long. 0
Date : [0001-01-01]
Nom : [ ]
Solde : [.00]
Le caractère revient à des blancs, le décimal à .00 (donc 0), la chaîne variable à une longueur 0 (%len le confirme) et la date à 0001-01-01. Sur une structure, chaque sous-zone est vidée selon son type : un seul CLEAR client remet à blanc le nom et la ville, et à zéro le solde.
Exemple 2 : CLEAR n'est pas RESET
**free
// CLEAR ne rend pas la valeur initiale (inz) : c'est le role de RESET.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s devise char(3) inz('EUR');
dcl-s taux packed(5:2) inz(20.00);
devise = 'USD';
taux = 8.50;
clear devise;
clear taux;
snd-msg 'Devise : [' + devise + ']';
snd-msg 'Taux : [' + %char(taux) + ']';
reset devise;
reset taux;
snd-msg 'Reset devise : [' + devise + ']';
snd-msg 'Reset taux : [' + %char(taux) + ']';
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Devise : [ ]
Taux : [.00]
Reset devise : [EUR]
Reset taux : [20.00]
Les zones sont déclarées avec inz('EUR') et inz(20.00), puis modifiées. Après CLEAR, on retrouve des blancs et un zéro, pas EUR ni 20.00. C'est RESET, derrière, qui ramène aux valeurs d'origine.
Le piège
CLEAR n'est pas un retour à la valeur initiale. Une zone déclarée inz('EUR'), une fois passée par CLEAR, contient des blancs et non EUR : le deuxième exemple le montre. Pour revenir à la valeur d'initialisation, il faut RESET.
Attention aussi à la date : une zone date « vide » n'existe pas, elle vaut 0001-01-01, une date valide.