Aller au contenu

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;