Aller au contenu

%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ébut et 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).