%EQUAL
Clé exactement trouvée après SETLL
Renvoie *ON si le dernier SETLL est tombé exactement sur la clé demandée, et non sur une clé supérieure.
Syntaxe
%EQUAL(nom-fichier)
%EQUAL
nom-fichier- Le fichier concerné. Il peut être omis pour désigner la dernière opération.
- Résultat
- Un indicateur : *ON si un enregistrement de clé égale à la clé demandée existe, *OFF sinon.
À quoi ça sert
SETLL positionne le fichier sur le premier enregistrement de clé supérieure ou égale. %EQUAL précise si c'était une égalité stricte. Le couple SETLL + %EQUAL permet de tester l'existence d'une clé sans lire l'enregistrement ni charger ses zones : c'est plus léger qu'un CHAIN.
Exemple 1 : Tester l'existence d'une clé
**free
// %EQUAL : un SETLL est tombe exactement sur la cle demandee ?
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*usrctl);
dcl-f client keyed;
dcl-s cle packed(5:0);
// Test d'existence sans lire l'enregistrement : SETLL + %EQUAL
cle = 300;
setll (cle) client;
snd-msg 'Cle ' + %char(cle) + ' : %EQUAL = [' + %char(%equal(client)) +
'] %FOUND = [' + %char(%found(client)) + ']';
cle = 350;
setll (cle) client;
snd-msg 'Cle ' + %char(cle) + ' : %EQUAL = [' + %char(%equal(client)) +
'] %FOUND = [' + %char(%found(client)) + ']';
cle = 999;
setll (cle) client;
snd-msg 'Cle ' + %char(cle) + ' : %EQUAL = [' + %char(%equal(client)) +
'] %FOUND = [' + %char(%found(client)) + ']';
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Cle 300 : %EQUAL = [1] %FOUND = [1]
Cle 350 : %EQUAL = [0] %FOUND = [1]
Cle 999 : %EQUAL = [0] %FOUND = [0]
Pour 300, l'enregistrement existe : %EQUAL et %FOUND valent 1. Pour 350, il n'existe pas mais un client de clé supérieure (400) oui : %FOUND vaut 1 et %EQUAL vaut 0. Pour 999, rien après : les deux valent 0.
Exemple 2 : Valeur périmée après un CHAIN
**free
// %EQUAL n'est pas mis a jour par CHAIN : la valeur du dernier SETLL reste.
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*usrctl);
dcl-f client keyed;
setll (400) client;
snd-msg 'SETLL 400 : %EQUAL = [' + %char(%equal(client)) + ']';
chain (999) client;
snd-msg 'CHAIN 999 : %FOUND = [' + %char(%found(client)) +
'] %EQUAL = [' + %char(%equal(client)) + ']';
setll (999) client;
chain (300) client;
snd-msg 'SETLL 999 puis CHAIN 300 : %FOUND = [' + %char(%found(client)) +
'] %EQUAL = [' + %char(%equal(client)) + ']';
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
SETLL 400 : %EQUAL = [1]
CHAIN 999 : %FOUND = [0] %EQUAL = [1]
SETLL 999 puis CHAIN 300 : %FOUND = [1] %EQUAL = [0]
Le CHAIN met %FOUND à jour, mais pas %EQUAL : après setll (400) puis chain (999) raté, %EQUAL vaut toujours 1. Dans le dernier cas, %EQUAL a été remis à 0 par le SETLL de 999, et le CHAIN réussi de 300 ne l'a pas remis à 1.
Le piège
%EQUAL ne se lit qu'après un SETLL. Le deuxième exemple le prouve : un CHAIN ne modifie pas %EQUAL. Tester %EQUAL après un CHAIN donne le résultat du SETLL précédent, donc une réponse fausse dans un sens ou dans l'autre.
Et ne confondez pas avec %FOUND : après un SETLL, %FOUND vaut 1 dès qu'il existe une clé supérieure ou égale (350 le montre). Pour savoir si la clé existe vraiment, c'est %EQUAL.