Aller au contenu

Code opération RPG III / RPG/400 · IBM i (AS/400) · Chaînes de caractères

CHEKR

Vérifier une zone de droite à gauche

Comme CHECK, mais lit le facteur 2 de droite à gauche : donne la position du dernier caractère qui ne figure pas dans la liste du facteur 1.

Syntaxe

     C           valides   CHEKRbase      pos     20     58
     C           valides   CHEKRbase:dep  pos     20     58
Facteur 1 (18-27)
La liste des caractères autorisés (un littéral ou une zone).
Facteur 2 (33-42)
La zone contrôlée, éventuellement suivie de :début.
Zone résultat (43-48)
Zone numérique sans décimale : position du dernier caractère invalide, 0 si tout est valide.
Indicateurs (58-59)
Facultatif : s'allume quand un caractère invalide est trouvé.
Effet
La zone résultat contient la position du caractère invalide le plus à droite, 0 si tous sont valides. L'indicateur 58-59 est allumé si un caractère invalide existe.

À quoi ça sert

L'usage courant de CHEKR est de calculer la longueur utile d'une zone : avec le blanc comme liste, la position renvoyée est celle du dernier caractère non blanc, donc la longueur du texte sans ses blancs de fin. On s'en sert ensuite avec SUBST, SCAN ou CAT.

Exemple 1 : CHECK ou CHEKR sur une saisie

     H*  CHEKR : dernier caractere invalide (lecture de droite a gauche)
     C                     MOVEL'01234'   CHIF   10
     C                     MOVE '56789'   CHIF
     C                     MOVEL'12A4B'   SAISIE  5
     C           CHIF      CHECKSAISIE    PREM    10     58
     C           PREM      DSPLY
     C           CHIF      CHEKRSAISIE    DERN    10     58
     C           DERN      DSPLY
     C           *IN58     DSPLY
     C                     SETON                     LR

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

3
5
1

Dans « 12A4B », avec la liste des chiffres, CHECK renvoie 3 (premier caractère invalide) et CHEKR renvoie 5 (dernier). L'indicateur 58 est allumé.

Exemple 2 : Longueur utile du nom d'un client

     H*  CHEKR : longueur utile du nom d'un client (blancs de fin ignores)
     FCLIENT3 IF  E           K        DISK
     C                     MOVEL' '       BLANC   1
     C                     Z-ADD200       NUMERO  50
     C           NUMERO    CHAINCLIENT3              99
     C           BLANC     CHEKRNOM       LONG    20     58
     C           LONG      DSPLY
     C           LONG      SUBSTNOM:1     COURT  14
     C           COURT     DSPLY
     C                     SETON                     LR

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

14
Martin et fils

Le client 200 est lu dans CLIENT3. NOM fait 30 caractères mais « Martin et fils » n'en occupe que 14 : CHEKR avec un blanc comme liste renvoie 14, qui sert de longueur à SUBST pour obtenir le nom sans ses blancs de fin.

Le piège

La position renvoyée est celle du dernier caractère invalide, pas du premier. Avec « 12A4B », CHECK dit 3 et CHEKR dit 5 (premier exemple) : pour signaler la première erreur à l'utilisateur, prenez CHECK.

En RPG ILE full free

En RPG ILE, %CHECKR fait la même chose. Pour la longueur utile d'une zone, on utilise plutôt %LEN(%TRIMR(...)).

long = %checkr(' ':nom);
long = %len(%trimr(nom));