Code opération RPG III / RPG/400 · IBM i (AS/400) · Chaînes de caractères
XLATE
Remplacer des caractères
Recopie le facteur 2 dans la zone résultat en remplaçant chaque caractère de la liste « de » du facteur 1 par le caractère correspondant de la liste « vers ».
Syntaxe
C de:vers XLATEsrc result
C de:vers XLATEsrc:debut result
- Facteur 1 (18-27)
- Deux listes séparées par deux-points,
de:vers: le caractère en position i de la première est remplacé par celui en position i de la seconde. Les autres caractères ne changent pas. Écrits en littéraux, les deux ensemble doivent tenir dans les 10 positions du facteur 1. - Facteur 2 (33-42)
- La chaîne source, éventuellement suivie de
:début. Les caractères avant cette position sont recopiés sans changement. - Zone résultat (43-48)
- Zone alphanumérique qui reçoit le texte transformé. Elle peut être la même que la source.
- Effet
- La zone résultat reçoit la chaîne transformée. Aucun indicateur n'est nécessaire.
À quoi ça sert
XLATE est l'outil des conversions de caractères : minuscules en majuscules (RPG III n'a pas de fonction pour cela), remplacement d'un séparateur par un autre. Les zones comparées doivent souvent être normalisées en majuscules avant un CHAIN ou un SCAN.
Exemple 1 : Majuscules puis minuscules
H* XLATE : passer un nom en majuscules, puis en minuscules
C MOVEL'abcdefgh'MIN 26
C MOVEL'ijklmnop'PART 8
C MIN CAT PART:0 MIN
C MOVEL'qrstuvwx'PART 8
C MIN CAT PART:0 MIN
C MOVEL'yz' PART 8
C MIN CAT PART:0 MIN
C MOVEL'ABCDEFGH'MAJ 26
C MOVEL'IJKLMNOP'PART 8
C MAJ CAT PART:0 MAJ
C MOVEL'QRSTUVWX'PART 8
C MAJ CAT PART:0 MAJ
C MOVEL'YZ' PART 8
C MAJ CAT PART:0 MAJ
C MOVEL'dupont' NOM 20
C MIN:MAJ XLATENOM NOMMAJ 20
C NOMMAJ DSPLY
C MAJ:MIN XLATENOMMAJ NOMMIN 20
C NOMMIN DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
DUPONT
dupont
Les deux alphabets sont construits dans MIN et MAJ (26 caractères, en quatre morceaux assemblés par CAT, car un littéral ne peut pas dépasser 8 caractères utiles). MIN:MAJ passe « dupont » en « DUPONT », MAJ:MIN le remet en minuscules.
Exemple 2 : Position de départ et remplacement simple
H* XLATE : position de depart et remplacement de caracteres
C MOVEL'abcdefgh'MIN 26
C MOVEL'ijklmnop'PART 8
C MIN CAT PART:0 MIN
C MOVEL'qrstuvwx'PART 8
C MIN CAT PART:0 MIN
C MOVEL'yz' PART 8
C MIN CAT PART:0 MIN
C MOVEL'ABCDEFGH'MAJ 26
C MOVEL'IJKLMNOP'PART 8
C MAJ CAT PART:0 MAJ
C MOVEL'QRSTUVWX'PART 8
C MAJ CAT PART:0 MAJ
C MOVEL'YZ' PART 8
C MAJ CAT PART:0 MAJ
C MOVEL'dupont' NOM 10
C MOVEL'........'RES 8
C MIN:MAJ XLATENOM:4 RES
C RES DSPLY
C MIN:MAJ XLATENOM:4 NOM
C NOM DSPLY
C MOVEL'12-05-24'DAT 8
C '-':'/' XLATEDAT DAT
C DAT DSPLY
C SETON LR
Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :
dupONT
dupONT
12/05/24
Avec NOM:4, seuls les caractères à partir de la position 4 sont traduits : « dupONT ». Le littéral '-':'/' tient dans le facteur 1 et change les tirets d'une date en barres obliques.
Le piège
Les listes de caractères en littéral sont limitées par la largeur du facteur 1 (10 colonnes). Avec 'abcdef':'ABCDEF', le compilateur refuse la ligne : QRG5150, « Le littéral entré en Facteur 1 est incorrect » (suivi de QRG5014, « Le code opération est incorrect »). Construisez l'alphabet dans une zone, comme dans le premier exemple.
Les caractères avant la position de départ ne sont pas traduits mais restent dans le résultat : « dupONT » (deuxième exemple).
En RPG ILE full free
En RPG ILE, %XLATE prend les mêmes listes ; pour les majuscules et minuscules, on peut aussi définir les deux alphabets en constantes.
nommaj = %xlate(minus:majus:nom);
dat = %xlate('-':'/':dat);