Aller au contenu

Code opération RPG III / RPG/400 · IBM i (AS/400) · Chaînes de caractères

CAT

Concaténer deux zones

Colle le facteur 2 derrière le facteur 1 et range le tout dans la zone résultat, avec un nombre de blancs choisi entre les deux.

Syntaxe

     C           fact1     CAT  fact2     result 30
     C           fact1     CAT  fact2:n   result 30
     C           fact1     CAT  fact2:n   result 30 P
     C                     CAT  fact2:n   result
Facteur 1 (18-27)
Première chaîne. Facultatif : s'il est vide, la zone résultat joue ce rôle et le facteur 2 est ajouté derrière son contenu (deuxième exemple).
Facteur 2 (33-42)
Seconde chaîne, suivie de :n pour fixer le nombre de blancs à placer entre les deux. Sans :n, aucun blanc n'est ajouté, mais les blancs de fin du facteur 1 restent dans le résultat.
Zone résultat (43-48)
Zone alphanumérique qui reçoit la chaîne. Elle doit être assez longue pour tout contenir.
Colonne 53
P : complète la zone résultat à droite avec des blancs. Sans P, les positions que la concaténation n'a pas écrites gardent leur ancien contenu.
Effet
Aucun indicateur n'est nécessaire. Dès que :n est présent (même :0), les blancs de fin du facteur 1 sont ignorés puis n blancs sont insérés. Sans :n, le facteur 1 est recopié en entier, blancs de fin compris.

À quoi ça sert

CAT sert à fabriquer un libellé à partir de morceaux : « nom + ville » pour une ligne d'édition, un message d'erreur, une clé de recherche. C'est la seule façon de concaténer en RPG III, qui n'a pas d'opérateur de concaténation.

Comme les zones RPG III ont une longueur fixe et sont complétées de blancs, tout le sujet est de savoir ce qu'on fait de ces blancs : c'est le rôle de :n.

Exemple 1 : Zéro, un ou trois blancs

     H*  CAT : nombre de blancs en facteur 2 (:0, :1, :3)
     C                     MOVEL'Dupont'  PRENOM 10
     C                     MOVEL'Lyon'    VILLE  10
     C           PRENOM    CAT  VILLE     R1     30
     C           R1        DSPLY
     C           PRENOM    CAT  VILLE:0   R2     30
     C           R2        DSPLY
     C           PRENOM    CAT  VILLE:1   R3     30
     C           R3        DSPLY
     C           PRENOM    CAT  VILLE:3   R4     30
     C           R4        DSPLY
     C                     SETON                     LR

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

Dupont    Lyon
DupontLyon
Dupont Lyon
Dupont   Lyon

La zone PRENOM fait 10 caractères et contient « Dupont » suivi de quatre blancs. Sans :n, ces quatre blancs restent entre les deux mots. Avec :0, ils disparaissent (« DupontLyon »). Avec :1 ou :3, ils sont remplacés par un ou trois blancs.

Exemple 2 : Colonne 53 et facteur 1 omis

     H*  CAT : colonne 53 = P (completer a blanc), facteur 1 omis
     C                     MOVEL'Martin'  NOM     6
     C                     MOVEL'Lyon'    VILLE   4
     C                     MOVEL'XXXXXXXX'R1     14
     C                     MOVE 'XXXXXXXX'R1
     C           NOM       CAT  VILLE:1   R1     14
     C           R1        DSPLY
     C                     MOVEL'XXXXXXXX'R2     14
     C                     MOVE 'XXXXXXXX'R2
     C           NOM       CAT  VILLE:1   R2     14 P
     C           R2        DSPLY
     C                     MOVEL'Ville :' R3     14
     C                     CAT  VILLE:1   R3
     C           R3        DSPLY
     C                     SETON                     LR

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

Martin LyonXXX
Martin Lyon
Ville : Lyon

La zone résultat est d'abord remplie de X. Le premier CAT n'a pas de P : les trois dernières positions gardent leurs X (« Martin LyonXXX »). Le second, avec P en colonne 53, les remplit de blancs. Le dernier CAT n'a pas de facteur 1 : il ajoute « Lyon » derrière le « Ville : » déjà présent dans la zone résultat.

Le piège

Sans :n, les blancs de fin du facteur 1 restent : une zone de 10 caractères qui contient « Dupont » donne « Dupont Lyon » (premier exemple). Le résultat paraît correct à l'écran, mais une comparaison ou une clé construite ainsi échoue. Écrivez toujours :1 (ou :0).

Sans P, la zone résultat n'est pas nettoyée : si elle contenait un texte plus long auparavant, la fin de l'ancien texte reste visible (« Martin LyonXXX », deuxième exemple).

En RPG ILE full free

En RPG ILE, l'opérateur + concatène des chaînes et %TRIM retire les blancs. Le résultat est toujours complété de blancs, donc P n'a pas d'équivalent.

res = %trim(prenom) + ' ' + %trim(ville);
res = %trim(prenom) + %trim(ville);