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
:npour 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. SansP, les positions que la concaténation n'a pas écrites gardent leur ancien contenu.- Effet
- Aucun indicateur n'est nécessaire. Dès que
:nest présent (même:0), les blancs de fin du facteur 1 sont ignorés puisnblancs 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);