Aller au contenu

%CHECK

Vérifier les caractères autorisés

Renvoie la position du premier caractère d'une chaîne qui ne figure pas dans une liste de caractères autorisés, ou 0 si tous sont valides.

Syntaxe

%CHECK(autorisés : chaîne)
%CHECK(autorisés : chaîne : début)
autorisés
La liste des caractères acceptés (par exemple '0123456789'). Le blanc n'en fait partie que s'il est écrit dedans.
chaîne
La chaîne à contrôler.
début
Position à partir de laquelle on contrôle (par défaut 1). Ce qui précède n'est pas examiné.
Résultat
Un entier : la position du premier caractère non autorisé, ou 0 si tous les caractères sont autorisés (une chaîne vide donne aussi 0).

À quoi ça sert

Avant de convertir un texte en nombre avec %DEC, ou d'accepter un code postal, un identifiant, un numéro de téléphone saisi à l'écran, on vérifie qu'il ne contient que des caractères permis. %CHECK le fait en un appel et indique en plus où se trouve l'erreur, pour un message précis.

Exemple 1 : Contrôler un code postal

**free
// %CHECK : trouver le premier caractere qui n'est pas dans la liste autorisee.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-c CHIFFRES '0123456789';
dcl-s codepost varchar(10) inz('34O00');
dcl-s valide   varchar(10) inz('34000');
dcl-s pos      int(10);

pos = %check(CHIFFRES : codepost);
snd-msg '34O00 : ' + %char(pos);
if pos > 0;
  snd-msg 'Caractere invalide : [' + %subst(codepost : pos : 1) + '] en position ' + %char(pos);
endif;

snd-msg '34000 : ' + %char(%check(CHIFFRES : valide));
// 3e parametre : position de depart (le O en position 3 est ignore).
snd-msg 'Depuis 4 : ' + %char(%check(CHIFFRES : codepost : 4));
// Chaine vide : rien d'invalide.
snd-msg 'Vide  : ' + %char(%check(CHIFFRES : ''));

*inlr = *on;

Résultat réel, compilé et exécuté sur IBM i 7.5 :

34O00 : 3
Caractere invalide : [O] en position 3
34000 : 0
Depuis 4 : 0
Vide  : 0

Dans 34O00, la lettre O a pris la place du zéro : %CHECK renvoie 3, et %SUBST permet d'afficher le caractère fautif. La valeur correcte donne 0. En commençant à la position 4, le O (en 3) n'est plus examiné : résultat 0. Une chaîne vide donne 0.

Exemple 2 : Le piège des blancs d'une zone fixe

**free
// %CHECK : les blancs de fin d'une zone fixe sont des caracteres comme les autres.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-c CHIFFRES '0123456789';
dcl-s numfixe char(8)      inz('4170');
dcl-s numvar  varchar(8)   inz('4170');

snd-msg 'Zone fixe       : ' + %char(%check(CHIFFRES : numfixe));
snd-msg 'Avec %trim      : ' + %char(%check(CHIFFRES : %trim(numfixe)));
snd-msg 'Zone variable   : ' + %char(%check(CHIFFRES : numvar));
// On peut aussi autoriser le blanc dans la liste.
snd-msg 'Blanc autorise  : ' + %char(%check(CHIFFRES + ' ' : numfixe));

*inlr = *on;

Résultat réel, compilé et exécuté sur IBM i 7.5 :

Zone fixe       : 5
Avec %trim      : 0
Zone variable   : 0
Blanc autorise  : 0

La zone fixe de 8 caractères contient 4170 suivi de 4 blancs. Le blanc n'est pas dans la liste des chiffres : %CHECK renvoie 5, alors que le nombre est valide. Avec %TRIM, avec une zone variable ou en ajoutant un blanc à la liste des caractères autorisés, on obtient 0.

Le piège

Les blancs de fin d'une zone fixe sont des caractères invalides. Un numéro correct rangé dans une zone plus longue que lui est refusé avec la position du premier blanc (5 dans l'exemple), ce qui trompe facilement : on croit à une erreur de saisie alors que la zone est simplement plus grande que la donnée. On contrôle %TRIM(zone), ou on met un blanc dans la liste si les blancs sont acceptables.

Notez aussi qu'un texte vide n'est jamais invalide : penser à tester %LEN si la saisie est obligatoire.