Aller au contenu

%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.