%CHECKR
Vérifier les caractères depuis la fin
Renvoie la position du dernier 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
%CHECKR(autorisés : chaîne)
%CHECKR(autorisés : chaîne : début)
autorisés- La liste des caractères acceptés.
chaîne- La chaîne à contrôler, parcourue de droite à gauche.
début- Position à partir de laquelle on contrôle vers la gauche : le contrôle commence en
débutet remonte vers le début de la chaîne. Par défaut : la fin de la chaîne. - Résultat
- Un entier : la position (comptée depuis la gauche) du dernier caractère non autorisé, ou 0 si tous sont autorisés.
À quoi ça sert
Là où %CHECK trouve la première erreur, %CHECKR trouve où s'arrête la partie valide de la fin. C'est ce qu'il faut pour isoler un suffixe numérique (le numéro d'une référence), pour repérer le dernier caractère utile d'un texte rempli de caractères de bourrage, ou pour vérifier qu'une chaîne se termine bien par des chiffres.
Exemple 1 : Suffixe numérique d'une référence
**free
// %CHECKR : chercher le dernier caractere non autorise, en partant de la fin.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-c CHIFFRES '0123456789';
dcl-s ref varchar(20) inz('FAC-2026-0417');
dcl-s pos int(10);
pos = %checkr(CHIFFRES : ref);
snd-msg 'Dernier non-chiffre : ' + %char(pos) + ' = [' + %subst(ref : pos : 1) + ']';
snd-msg 'Suffixe numerique : [' + %subst(ref : pos + 1) + ']';
// A titre de comparaison, %CHECK part de la gauche.
snd-msg '%CHECK (gauche) : ' + %char(%check(CHIFFRES : ref));
// Fin utile d'un texte suivi de points : %CHECKR ignore les points de la fin.
snd-msg 'Points de suite : ' + %char(%checkr('.' : 'Brest.....'));
// Aucun caractere invalide : 0.
snd-msg 'Que des chiffres : ' + %char(%checkr(CHIFFRES : '20260930'));
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Dernier non-chiffre : 9 = [-]
Suffixe numerique : [0417]
%CHECK (gauche) : 1
Points de suite : 5
Que des chiffres : 0
Dans FAC-2026-0417, le dernier caractère qui n'est pas un chiffre est le tiret en position 9. Tout ce qui suit (0417) est le numéro. %CHECK, lui, s'arrête au premier caractère invalide : le F en position 1.
Avec le point comme seul caractère autorisé, Brest..... donne 5 : la fin utile du texte, avant les points de bourrage. Une chaîne entièrement valide renvoie 0.
Le piège
Le résultat est une position depuis la gauche, pas depuis la fin. %CHECKR parcourt la chaîne de droite à gauche, mais renvoie le numéro habituel (le tiret de FAC-2026-0417 est en 9, pas en 5 depuis la droite). Ce qui vient après cette position, jusqu'à la fin, est donc %SUBST(ref : pos + 1).
Comme pour %CHECK, les blancs de fin d'une zone fixe sont des caractères invalides : ils seraient trouvés en premier (un numéro 1234 dans une zone char(8) donne 8).