%RIGHT
Les n derniers caractères
Extrait la fin d'une chaîne, sur le nombre de caractères demandé.
Syntaxe
%RIGHT(chaîne : longueur)
chaîne- Le texte dont on garde la fin : zone caractère, graphique ou UCS-2, littéral ou expression.
longueur- Le nombre de caractères à garder, de 0 à la longueur de la chaîne. Une valeur supérieure à la longueur de la chaîne est une erreur.
- Résultat
- Une valeur du même type que la chaîne, de la longueur demandée.
À quoi ça sert
La fin d'une valeur porte souvent l'information utile : le numéro d'ordre au bout d'une référence, les quatre derniers caractères d'un IBAN à afficher, une extension. Il suffit de dire combien de caractères on veut garder, sans calculer de position.
Associée à une concaténation de zéros, elle donne aussi un remplissage à gauche.
Exemple 1 : Numéro, fin d'IBAN, zone fixe
**free
// %RIGHT : les n derniers caracteres d'une chaine.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s reference varchar(13) inz('CLI-2026-0042');
dcl-s iban varchar(27) inz('FR7630006000011234567890189');
dcl-s villeFixe char(20) inz('Montpellier');
dcl-s villeVar varchar(20) inz('Montpellier');
snd-msg 'Numero : [' + %right(reference : 4) + ']';
snd-msg 'Fin d''IBAN : [' + %right(iban : 4) + ']';
snd-msg 'Zone fixe : [' + %right(villeFixe : 4) + ']';
snd-msg 'Fixe + trimr: [' + %right(%trimr(villeFixe) : 4) + ']';
snd-msg 'Varchar : [' + %right(villeVar : 4) + ']';
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Numero : [0042]
Fin d'IBAN : [0189]
Zone fixe : [ ]
Fixe + trimr: [lier]
Varchar : [lier]
Les quatre derniers caractères de CLI-2026-0042 donnent le numéro d'ordre 0042, ceux de l'IBAN 0189.
Regardez la zone fixe : la ville est déclarée en char(20), donc les quatre derniers caractères sont des blancs, et %RIGHT renvoie quatre blancs. Il faut retirer les blancs de fin avec %TRIMR pour obtenir lier, ce que le varchar donne directement.
Exemple 2 : Longueur trop grande et remplissage de zéros
**free
// %RIGHT : longueur trop grande, et remplissage a gauche par des zeros.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s ville varchar(20) inz('Lyon');
dcl-s numero packed(5:0) inz(42);
dcl-s nb int(10);
nb = 8;
monitor;
snd-msg 'Trop long : [' + %right(ville : nb) + ']';
on-error *all;
snd-msg 'Trop long : erreur, statut ' + %char(%status);
endmon;
// Numero sur 6 chiffres avec des zeros a gauche : on ajoute des zeros puis on coupe.
snd-msg 'Numero 6 : [' + %right('000000' + %char(numero) : 6) + ']';
numero = 12345;
snd-msg 'Numero 6 : [' + %right('000000' + %char(numero) : 6) + ']';
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Trop long : erreur, statut 100
Numero 6 : [000042]
Numero 6 : [012345]
Demander 8 caractères d'un varchar de 4 provoque une erreur (statut 100), que le monitor intercepte.
Le remplissage à gauche se fait en collant six zéros devant le nombre converti par %CHAR, puis en gardant les six derniers caractères : 42 devient 000042 et 12345 devient 012345.
Le piège
Sur une zone fixe, %RIGHT lit les blancs de fin. Avec une ville de char(20), %RIGHT(ville : 4) renvoie quatre blancs, et non les quatre dernières lettres du nom. Le résultat a la bonne longueur mais aucun contenu utile.
La solution est %RIGHT(%TRIMR(ville) : 4), ou une zone varchar. Comme pour %LEFT, une longueur supérieure à celle de la chaîne est une erreur d'exécution (statut 100, message RNX0100) ; le compilateur la refuse avec le message RNF0203 quand la valeur est une constante.