L’instruction CONCATENATE sert à assembler le contenu de deux ou plusieurs objets de données de type caractère (variables, littéraux) en une seule chaîne de caractères (concaténation) et à stocker le résultat dans une variable cible.
Syntaxe
CONCATENATE <source1> <source2> ... <sourceN> INTO <variable_cible> [SEPARATED BY <separateur>] [RESPECTING BLANKS]. " [CONDENSING]. " Obsolète, ne plus utiliser !<source1> <source2> ... <sourceN>: Ce sont les objets de données (variables, constantes ou littéraux) dont les contenus doivent être assemblés les uns après les autres. Ils doivent normalement être de typeSTRING,C,N,DouT. Les autres types (ex. numériques) sont généralement convertis en leur représentation caractère avant la concaténation.INTO <variable_cible>: C’est la variable qui reçoit le résultat de la concaténation. Le contenu précédent de cette variable est écrasé.- Idéalement,
<variable_cible>est de typeSTRING, car la longueur s’adapte alors dynamiquement. - Si
<variable_cible>est de typeC(chaîne de longueur fixe) et que le résultat de la concaténation est plus long que la longueur définie de la variable cible, le résultat est tronqué à droite.
- Idéalement,
SEPARATED BY <separateur>(Optionnel) : Permet de spécifier un caractère de séparation (ex. un espacespace, une virgule',', un tiret'-') qui est inséré entre les éléments sources.<separateur>est lui-même un objet de données de type caractère.RESPECTING BLANKS(Optionnel) : Ce complément influence le traitement des espaces de fin des champs sources de longueur fixe (typeC,N,D,T).- Sans
RESPECTING BLANKS(comportement par défaut) : Les espaces de fin dans les champs de longueur fixe sont supprimés avant la concaténation. - Avec
RESPECTING BLANKS: Les espaces de fin dans les champs de longueur fixe sont conservés. - Important : Pour les champs sources de type
STRING, les espaces de fin sont toujours pris en compte, indépendamment de ce complément.RESPECTING BLANKSn’est donc pertinent que lorsqu’on veut explicitement conserver la longueur originale des champs de type C y compris leurs espaces (et que la cible est peut-être aussi de type C).
- Sans
Alternatives modernes (Préférées !)
En ABAP moderne (à partir de la version 7.40), il existe des alternatives bien plus flexibles et souvent plus lisibles à CONCATENATE :
- String Templates (Littéraux avec
|...|) : Permettent d’intégrer directement des variables et expressions dans une chaîne.DATA(lv_name) = 'Monde'.DATA(lv_greeting) = |Bonjour { lv_name } ! Il est { sy-timlo }.|. - Opérateur de concaténation (
&&) : Connecte deux chaînes directement.DATA(lv_part1) = 'Partie 1'.DATA(lv_part2) = 'Partie 2'.DATA(lv_combined) = lv_part1 && ' et ' && lv_part2.
Il est fortement recommandé d’utiliser les String Templates ou l’opérateur && pour les nouveaux développements ! CONCATENATE reste cependant important pour la compréhension et la maintenance de code plus ancien.
Exemples pour CONCATENATE
1. Concaténation simple
DATA: firstname TYPE string VALUE 'Anna', lastname TYPE string VALUE 'Schmidt', fullname TYPE string.
CONCATENATE firstname lastname INTO fullname.WRITE: / fullname. " Sortie : AnnaSchmidt2. Concaténation avec séparateur
DATA: city TYPE string VALUE 'Paris', zip_code TYPE string VALUE '75001', address TYPE string.
" Séparer par un espaceCONCATENATE zip_code city INTO address SEPARATED BY space.WRITE: / address. " Sortie : 75001 Paris
" Séparer par une virgule et un espaceCONCATENATE city zip_code INTO address SEPARATED BY ', '.WRITE: / address. " Sortie : Paris, 750013. Concaténation de différents types de données
DATA: item_count TYPE i VALUE 5, item_desc TYPE string VALUE 'Pommes', output_str TYPE string.
CONCATENATE item_count item_desc 'disponibles' INTO output_str SEPARATED BY space.WRITE: / output_str. " Sortie : 5 Pommes disponibles(Le nombre 5 est automatiquement converti en chaîne '5').
4. Gestion des espaces avec Type C (avec et sans RESPECTING BLANKS)
DATA: field_c1 TYPE c LENGTH 10 VALUE 'Texte Un', " A 1 espace à la fin field_c2 TYPE c LENGTH 10 VALUE 'Deux'. " A 6 espaces à la fin target_str TYPE string.
" Standard : Les espaces de fin de field_c1 et field_c2 sont supprimésCONCATENATE field_c1 field_c2 INTO target_str SEPARATED BY '|'.WRITE: / target_str. " Sortie : Texte Un|Deux
" Avec RESPECTING BLANKS : Les espaces de fin sont conservésCONCATENATE field_c1 field_c2 INTO target_str SEPARATED BY '|' RESPECTING BLANKS.WRITE: / target_str. " Sortie : Texte Un |Deux |5. Comparaison avec String Template
" Équivalent à l'exemple 2address = |{ zip_code } { city }|.WRITE: / address. " Sortie : 75001 Paris
" Équivalent à l'exemple 3output_str = |{ item_count } { item_desc } disponibles|.WRITE: / output_str. " Sortie : 5 Pommes disponiblesNotes importantes / Bonnes pratiques
CONCATENATEest la méthode classique de concaténation de chaînes en ABAP.- Soyez conscient du comportement par défaut concernant les espaces de fin pour les champs de longueur fixe (comme le type C).
- Utilisez idéalement
STRINGcomme type cible pour éviter la troncature. - Préférez les String Templates (
|...|) ou l’opérateur de concaténation (&&) pour le nouveau code, car ils sont généralement plus lisibles, plus flexibles et moins sujets aux erreurs.