%REPLACE
Remplacer une portion par position
Renvoie la chaîne dans laquelle une portion, repérée par sa position et sa longueur, est remplacée par un autre texte ; permet aussi d'insérer ou de supprimer.
Syntaxe
%REPLACE(remplaçant : chaîne)
%REPLACE(remplaçant : chaîne : début)
%REPLACE(remplaçant : chaîne : début : longueur)
remplaçant- Le texte à mettre à la place. Il peut être vide pour supprimer.
chaîne- La chaîne d'origine, qui n'est pas modifiée.
début- Position du premier caractère remplacé (par défaut 1). Un début égal à la longueur de la chaîne plus 1 ajoute à la fin.
longueur- Nombre de caractères de la chaîne d'origine à retirer. Sans ce paramètre, c'est la longueur du texte remplaçant. À 0, le texte est inséré sans rien supprimer.
- Résultat
- Une chaîne variable : le début de la chaîne, le remplaçant, puis la suite. Sa longueur peut être différente de la chaîne d'origine.
À quoi ça sert
Quand on sait où se trouve la portion à changer (une position fixe dans un code, un préfixe téléphonique, une tranche de référence), %REPLACE évite d'assembler à la main le début, le nouveau texte et la fin avec des %SUBST. Elle sert aussi à insérer ou à supprimer, ce que %SUBST à gauche du signe égal ne permet pas (il garde la longueur).
Exemple 1 : Remplacer, insérer, supprimer, ajouter
**free
// %REPLACE : remplacer, inserer ou supprimer une portion de chaine par position.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s tel varchar(20) inz('0467123456');
dcl-s code varchar(20) inz('CLI-0100-MTP');
// Remplacement de meme longueur : 4 caracteres par 4 caracteres.
snd-msg 'Code 0100->0200 : [' + %replace('0200' : code : 5 : 4) + ']';
// Sans 4e parametre : on remplace autant de caracteres que la longueur du texte insere.
snd-msg 'Sans longueur : [' + %replace('X' : code : 5) + ']';
// Longueur 0 : insertion pure, rien n'est supprime.
snd-msg 'Insertion (0) : [' + %replace('+33 ' : tel : 1 : 0) + ']';
// Longueur precisee : on supprime 1 caractere (le 0 initial) pour en mettre 4.
snd-msg 'Prefixe pays : [' + %replace('+33 ' : tel : 1 : 1) + ']';
// Texte vide : suppression pure.
snd-msg 'Suppression : [' + %replace('' : code : 1 : 4) + ']';
// Position juste apres la fin : ajout en fin de chaine.
snd-msg 'Ajout en fin : [' + %replace('-X' : code : %len(code) + 1 : 0) + ']';
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Code 0100->0200 : [CLI-0200-MTP]
Sans longueur : [CLI-X100-MTP]
Insertion (0) : [+33 0467123456]
Prefixe pays : [+33 467123456]
Suppression : [0100-MTP]
Ajout en fin : [CLI-0100-MTP-X]
Le premier appel remplace 4 caractères par 4 caractères. Sans 4e paramètre, le deuxième remplace autant de caractères que le texte remplaçant en compte : un seul, le 0.
Avec une longueur de 0, on insère (+33 devant le numéro) ; avec une longueur de 1, on retire le zéro initial en même temps. Un remplaçant vide supprime. Enfin, un début égal à la longueur plus 1 ajoute en fin de chaîne.
Le piège
Sans longueur, on remplace autant de caractères qu'il y en a dans le nouveau texte, pas toute la portion voulue. Dans l'exemple, %REPLACE('X' : code : 5) ne change que le 0 de 0100 et donne CLI-X100-MTP, alors qu'on attendait peut-être CLI-X-MTP. Pour insérer sans rien supprimer, il faut écrire explicitement une longueur de 0.