Code opération RPG III / RPG/400 · IBM i (AS/400) · Chaînes de caractères
CHECK
Vérifier les caractères d'une zone
Cherche, de gauche à droite, le premier caractère du facteur 2 qui ne figure pas dans la liste du facteur 1 et donne sa position (0 si tous sont valides).
Syntaxe
C valides CHECKbase pos 10 58
C valides CHECKbase:dep pos 10 58
- Facteur 1 (18-27)
- La liste des caractères autorisés : un littéral ou une zone (un caractère par position).
- Facteur 2 (33-42)
- La zone contrôlée, éventuellement suivie de
:début, la position où commence le contrôle (1 par défaut). - Zone résultat (43-48)
- Zone numérique sans décimale : position du premier caractère invalide, 0 si tout est valide.
- Indicateurs (58-59)
- Facultatif : s'allume quand un caractère invalide est trouvé, s'éteint sinon.
- Effet
- La zone résultat contient la position du premier caractère absent de la liste, 0 sinon. L'indicateur 58-59 est allumé si un caractère invalide existe, ce qui en fait un indicateur d'erreur de saisie. Les blancs sont des caractères comme les autres.
À quoi ça sert
CHECK contrôle une saisie avant de la convertir : un numéro de client ne doit contenir que des chiffres, une référence que des lettres et des chiffres. On évite ainsi de traiter comme un nombre une zone qui n'en est pas un.
Il sert aussi à sauter des blancs de tête : en donnant le blanc comme liste, la position renvoyée est celle du premier caractère non blanc.
Exemple 1 : Contrôler une saisie numérique
H* CHECK : controler qu'une saisie ne contient que des chiffres
C MOVEL'01234' CHIF 10
C MOVE '56789' CHIF
C MOVEL'12A45' SAISIE 5
C CHIF CHECKSAISIE POS 10 58
C POS DSPLY
C *IN58 DSPLY
C MOVEL'12345' SAISIE
C CHIF CHECKSAISIE POS 58
C POS DSPLY
C *IN58 DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
3
1
0
0
La liste des chiffres est construite dans CHIF par deux opérations MOVE/MOVEL (un littéral ne peut pas dépasser 8 caractères utiles en facteur 2). « 12A45 » renvoie 3 et allume l'indicateur 58 : le troisième caractère est invalide. « 12345 » renvoie 0 et l'indicateur est éteint.
Exemple 2 : Blancs de fin et blancs de tête
H* CHECK et CHEKR : blancs de fin et longueur utile d'une zone
C MOVEL'01234' CHIF 10
C MOVE '56789' CHIF
C MOVEL'123' SAISIE 8
C CHIF CHECKSAISIE POS 10 58
C POS DSPLY
C CHIF CHEKRSAISIE POS 58
C POS DSPLY
C MOVEL' ' BLANC 1
C MOVEL' Lyon' VILLE 8
C BLANC CHECKVILLE DEB 10 58
C DEB DSPLY
C BLANC CHEKRVILLE FIN 10 58
C FIN DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
4
8
3
6
La zone SAISIE contient « 123 » dans 8 caractères. Les blancs de fin ne sont pas des chiffres : CHECK renvoie 4 et CHEKR renvoie 8. Avec le blanc comme liste, une zone qui contient deux blancs, « Lyon » puis deux blancs : CHECK donne 3, le début du texte, et CHEKR donne 6, sa fin.
Le piège
Une zone alphanumérique plus longue que la saisie contient des blancs de fin, et le blanc est un caractère invalide. Une saisie « 123 » dans 8 positions est rejetée en position 4 (deuxième exemple). Ajoutez le blanc à la liste, ou contrôlez seulement la partie utile avec SUBST et CHEKR.
En RPG ILE full free
En RPG ILE, %CHECK renvoie la position du premier caractère invalide, 0 si tout est valide, ce qui remplace aussi bien le résultat que l'indicateur.
if %check('0123456789':saisie) > 0;
dsply 'Saisie invalide';
endif;