Aller au contenu

%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.