Aller au contenu

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