Aller au contenu

%CONCATARR

Assembler les éléments d'un tableau

Concatène tous les éléments d'un tableau de chaînes, séparés par un texte donné.

Syntaxe

%CONCATARR(séparateur : tableau)
séparateur
Le texte placé entre deux éléments : une virgule suivie d'un blanc, une barre… Il peut être vide.
tableau
Le tableau à assembler, ou une partie de tableau obtenue avec %SUBARR.
Résultat
Une chaîne : tous les éléments du tableau ou de la tranche, dans l'ordre, séparés par le séparateur.

À quoi ça sert

Après avoir lu un fichier, on a souvent une liste de valeurs en mémoire, et on veut la montrer d'un bloc : « Dupont SA, Martin et fils, … ». Plutôt qu'une boucle avec un test pour ne pas mettre de séparateur devant le premier élément, %CONCATARR fait tout.

Exemple 1 : Liste des clients du fichier

**free
// %CONCATARR : joindre les elements d'un tableau avec un separateur.
ctl-opt dftactgrp(*no) actgrp(*new) alwnull(*usrctl);

dcl-f client usage(*input);
dcl-s noms  varchar(30) dim(*auto : 10);
dcl-s villes varchar(20) dim(3);

read client;
dow not %eof(client);
  noms(*next) = %trim(nom);
  read client;
enddo;

snd-msg 'Clients : ' + %char(%elem(noms));
snd-msg 'Liste   : ' + %concatarr(', ' : noms);
snd-msg 'Trois premiers : ' + %concatarr(' / ' : %subarr(noms : 1 : 3));

villes(1) = 'Montpellier';
villes(2) = 'Lyon';
villes(3) = 'Brest';
snd-msg 'Villes  : ' + %concatarr(' - ' : villes);

*inlr = *on;

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

Clients : 5
Liste   : Dupont SA, Martin et fils, Leroy SARL, Bernard Transports, Petit Atelier
Trois premiers : Dupont SA / Martin et fils / Leroy SARL
Villes  : Montpellier - Lyon - Brest

Les cinq noms du fichier CLIENT sont rangés dans un tableau dim(*auto : 10), qui ne contient que les éléments ajoutés avec (*NEXT) : %ELEM donne 5 et %CONCATARR les joint proprement.

%SUBARR(noms : 1 : 3) limite l'assemblage aux trois premiers. Le tableau de villes, de taille fixe et entièrement rempli, se joint de la même façon.

Exemple 2 : Éléments vides et zones fixes

**free
// %CONCATARR : elements vides et zones fixes, ce que la fonction ne supprime pas.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-s codes  varchar(10) dim(5);
dcl-s fixes  char(6)     dim(3);
dcl-s utiles int(10);

codes(1) = 'A12';
codes(2) = 'B34';
codes(3) = 'C56';
utiles = 3;

// Le tableau a 5 elements, mais 3 seulement sont remplis.
snd-msg 'Tableau entier : [' + %concatarr('/' : codes) + ']';
snd-msg 'Elements remplis : [' + %concatarr('/' : %subarr(codes : 1 : utiles)) + ']';

// Une zone fixe garde ses blancs de fin, y compris les elements jamais remplis.
fixes(1) = 'ab';
fixes(2) = 'cd';
snd-msg 'Zones fixes : [' + %concatarr(',' : fixes) + ']';

*inlr = *on;

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

Tableau entier : [A12/B34/C56//]
Elements remplis : [A12/B34/C56]
Zones fixes : [ab    ,cd    ,      ]

Le tableau codes a cinq éléments mais trois seulement sont remplis : le résultat est A12/B34/C56//, avec deux séparateurs en trop pour les deux éléments vides. Avec %SUBARR(codes : 1 : 3), on obtient A12/B34/C56.

Pour les zones fixes, les blancs de fin sont conservés, et l'élément jamais rempli est un élément de six blancs.

Le piège

Tous les éléments comptent, même ceux qu'on n'a pas remplis. Un tableau dim(5) dont trois éléments sont remplis donne A12/B34/C56// : deux séparateurs pendent à la fin. Il faut soit déclarer le tableau en dim(*auto : n), soit limiter avec %SUBARR(tableau : 1 : nombre).

Le tableau de six caractères donne ab ,cd , : %CONCATARR ne retire aucun blanc. Avec des zones fixes, préférez un tableau de type varchar.