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