Aller au contenu

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);