ABAP CONDENSE : Supprimer les espaces – Mais attention aux espaces de fin !

Catégorie
ABAP-Statements
Publié
Auteur
Johannes

L’instruction CONDENSE sert à supprimer les espaces superflus d’un objet de données de type caractère (le plus souvent de type C - chaîne de longueur fixe). Elle modifie le contenu de la variable spécifiée directement en place (“in place”).

Concrètement, CONDENSE effectue les actions suivantes dans son comportement standard :

  1. Supprime tous les espaces de début.
  2. Remplace les séquences de plusieurs espaces internes (espaces entre les caractères visibles) par exactement un seul espace.

Important : Par défaut, CONDENSE ne supprime pas les espaces de fin à la fin de la chaîne !

Syntaxe

CONDENSE <variable> [NO-GAPS].
  • <variable> : Le nom de la variable de type caractère (généralement type C) dont le contenu doit être condensé.
  • [NO-GAPS] (Optionnel) : Un complément qui modifie le comportement : si NO-GAPS est spécifié, tous les espaces (de début, internes et de fin) sont complètement supprimés de la variable.

Fonctionnement en détail

Sans NO-GAPS (CONDENSE <variable>.)

  • " Bonjour Monde " devient "Bonjour Monde " (si <variable> est par ex. C(30). Les espaces de fin jusqu’à la longueur du champ restent.)
  • " " devient " " (uniquement des espaces, est rempli d’espaces à gauche jusqu’à la longueur du champ)
  • " ABC " devient "ABC "
  • "A B C" devient "A B C "

Avec NO-GAPS (CONDENSE <variable> NO-GAPS.)

  • " Bonjour Monde " devient "BonjourMonde " (reste rempli d’espaces)
  • " " devient " " (champ vide)
  • " ABC " devient "ABC "
  • "A B C" devient "ABC "

Applicabilité (Type C vs. STRING)

Type C (chaîne de longueur fixe) : C’est le cas d’utilisation principal de CONDENSE. Les champs de type C sont souvent remplis d’espaces à droite après les affectations ou peuvent contenir des espaces de début/multiples internes suite à des traitements. Type STRING (chaîne de longueur variable) : CONDENSE peut aussi être appliqué aux strings.

  • Le CONDENSE standard supprime les espaces de début et réduit les espaces internes multiples à un seul. Les espaces de fin qui font partie de la valeur du string sont conservés.
  • CONDENSE ... NO-GAPS supprime tous les espaces du string.
  • Pour les strings, il existe souvent des alternatives plus spécifiques et modernes comme SHIFT ... DELETING LEADING/TRAILING space., REPLACE ou les String Templates/fonctions, qui offrent plus de contrôle.

Exemples

1. CONDENSE standard avec Type C

DATA text_c TYPE c LENGTH 40 VALUE ' Première partie deuxième partie '.
WRITE: / 'Type C avant :', |'{ text_c }'|.
CONDENSE text_c.
WRITE: / 'Type C après :', |'{ text_c }'|.

Sortie :

Type C avant : '{ Première partie deuxième partie }"
Type C après : '{Première partie deuxième partie }"

(Espaces de début supprimés, internes réduits à 1, espaces de fin conservés jusqu’à la longueur 40).

2. CONDENSE avec NO-GAPS pour Type C

DATA text_c_ng TYPE c LENGTH 40 VALUE ' Première partie deuxième partie '.
WRITE: / 'Type C NG avant :', |'{ text_c_ng }'|.
CONDENSE text_c_ng NO-GAPS.
WRITE: / 'Type C NG après :', |'{ text_c_ng }'|.

Sortie :

Type C NG avant : '{ Première partie deuxième partie }"
Type C NG après : '{Premièrepartiedeuxièmepartie }"

(Tous les espaces supprimés, le reste est aligné à gauche).

3. CONDENSE avec Type STRING

DATA text_s TYPE string VALUE ` String avec beaucoup d espace `.
WRITE: / 'String avant :', |'{ text_s }'|.
CONDENSE text_s.
WRITE: / 'String après :', |'{ text_s }'|. " Début supprimés, internes réduits, fin conservés
DATA text_s_ng TYPE string VALUE ` String avec beaucoup d espace `.
CONDENSE text_s_ng NO-GAPS.
WRITE: / 'String après NG :', |'{ text_s_ng }'|. " Tous les espaces supprimés

Sortie :

String avant : '{ String avec beaucoup d espace }"
String après : '{String avec beaucoup d espace }"
String après NG : '{Stringavecbeaucoupdespace}"

Notes importantes / Bonnes pratiques

  • CONDENSE modifie la variable passée directement. Sauvegardez la valeur originale avant si elle est encore nécessaire.
  • L’erreur la plus fréquente est de supposer que CONDENSE supprime les espaces de fin. C’est faux par défaut. Seul CONDENSE ... NO-GAPS supprime tous les espaces.
  • Pour supprimer uniquement les espaces de fin, on utilise pour les strings SHIFT <str> RIGHT DELETING TRAILING space. ou pour le type C par ex. l’affectation à un string et retour ou des modules fonction spéciaux.
  • CONDENSE est utile pour nettoyer les champs de saisie ou les données de sources externes qui pourraient contenir des espaces indésirables.
  • Pour les manipulations de chaînes complexes, les fonctions de string modernes ou les opérateurs sont souvent un meilleur choix que CONDENSE.