ABAP CONCATENATE : Concaténer des chaînes de caractères – Syntaxe et alternatives

Catégorie
ABAP-Statements
Publié
Auteur
Johannes

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 type STRING, C, N, D ou T. 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 type STRING, car la longueur s’adapte alors dynamiquement.
    • Si <variable_cible> est de type C (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.
  • SEPARATED BY <separateur> (Optionnel) : Permet de spécifier un caractère de séparation (ex. un espace space, 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 (type C, 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 BLANKS n’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).

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 :

  1. 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 }.|.
  2. 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 : AnnaSchmidt

2. Concaténation avec séparateur

DATA: city TYPE string VALUE 'Paris',
zip_code TYPE string VALUE '75001',
address TYPE string.
" Séparer par un espace
CONCATENATE zip_code city INTO address SEPARATED BY space.
WRITE: / address. " Sortie : 75001 Paris
" Séparer par une virgule et un espace
CONCATENATE city zip_code INTO address SEPARATED BY ', '.
WRITE: / address. " Sortie : Paris, 75001

3. 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és
CONCATENATE 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és
CONCATENATE 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 2
address = |{ zip_code } { city }|.
WRITE: / address. " Sortie : 75001 Paris
" Équivalent à l'exemple 3
output_str = |{ item_count } { item_desc } disponibles|.
WRITE: / output_str. " Sortie : 5 Pommes disponibles

Notes importantes / Bonnes pratiques

  • CONCATENATE est 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 STRING comme 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.