Aller au contenu

%SCANR

Chercher un texte en partant de la fin

Renvoie la position de la dernière occurrence d'un texte dans une chaîne (recherche depuis la fin), ou 0 s'il n'y figure pas.

Syntaxe

%SCANR(recherché : chaîne)
%SCANR(recherché : chaîne : début)
%SCANR(recherché : chaîne : début : longueur)
recherché
Le texte à trouver.
chaîne
La chaîne dans laquelle on cherche.
début
Début de la zone examinée (par défaut 1).
longueur
Longueur de la zone examinée à partir de début (par défaut : jusqu'à la fin).
Résultat
Un entier : la position (comptée depuis la gauche, à partir de 1) de l'occurrence la plus à droite, ou 0 si le texte est introuvable.

À quoi ça sert

Certaines informations se trouvent après le dernier séparateur : le nom d'un fichier après la dernière barre oblique d'un chemin IFS, l'extension après le dernier point, le dernier mot d'une adresse. %SCAN s'arrêterait au premier séparateur ; %SCANR trouve le dernier directement.

Exemple 1 : Nom de fichier et extension d'un chemin IFS

**free
// %SCANR : chercher un texte en partant de la fin de la chaine.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-s chemin varchar(60) inz('/home/compta/2026/factures/fac0417.pdf');
dcl-s pos    int(10);

pos = %scan('/' : chemin);
snd-msg 'Premier /         : ' + %char(pos);
pos = %scanr('/' : chemin);
snd-msg 'Dernier /         : ' + %char(pos);
snd-msg 'Nom du fichier    : [' + %subst(chemin : pos + 1) + ']';
snd-msg 'Dossier           : [' + %subst(chemin : 1 : pos - 1) + ']';

// Extension : apres le dernier point.
pos = %scanr('.' : chemin);
snd-msg 'Extension         : [' + %subst(chemin : pos + 1) + ']';

// 3e parametre : debut de la zone examinee ; 4e : sa longueur.
snd-msg 'Zone depuis 20    : ' + %char(%scanr('/' : chemin : 20));
snd-msg 'Zone 1 a 20       : ' + %char(%scanr('/' : chemin : 1 : 20));
snd-msg 'Introuvable       : ' + %char(%scanr('\' : chemin));

*inlr = *on;

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

Premier /         : 1
Dernier /         : 27
Nom du fichier    : [fac0417.pdf]
Dossier           : [/home/compta/2026/factures]
Extension         : [pdf]
Zone depuis 20    : 27
Zone 1 a 20       : 18
Introuvable       : 0

La première barre oblique est en position 1, la dernière en position 27. Avec cette position, %SUBST sépare le dossier du nom de fichier. Même principe avec le dernier point pour l'extension.

Les deux dernières lignes de résultats montrent le rôle des paramètres : avec 20 comme début, la zone examinée va de 20 à la fin, donc la dernière barre reste en 27. Avec début 1 et longueur 20, la zone s'arrête au caractère 20 et le résultat est 18. Un texte absent donne 0.

Le piège

Le 3e paramètre est le début de la zone, pas le point de départ de la recherche vers la gauche. On pourrait croire que %SCANR('/' : chemin : 20) part de la position 20 et remonte vers le début ; il n'en est rien : la zone examinée est celle de 20 à la fin (résultat 27 dans l'exemple). Pour limiter la recherche vers la gauche, on donne la longueur en 4e paramètre : %SCANR('/' : chemin : 1 : 20) renvoie 18.

Comme pour %SCAN, les blancs de fin d'une zone fixe cherchée font partie du texte (une zone char(5) contenant ab n'est pas trouvée dans xxabxx) : passer par %TRIM. Et le résultat est toujours compté depuis la gauche.