Fonction ABAP substring() : Extraire des sous-chaines (Syntaxe et exemples)

Catégorie
ABAP-Functions
Publié
Auteur
Johannes

La fonction substring() sert a extraire une sous-chaine (une portion) d’un objet de donnees de type caractere (comme STRING ou C). Elle retourne la partie extraite comme une nouvelle chaine et ne modifie pas la variable originale.

Syntaxe

La fonction est appelee dans une expression ABAP :

DATA(result_string) = substring( val = <source> [off = <offset>] [len = <longueur>] ).
  • val = <source> : L’objet de donnees de type caractere (Type STRING, C, N, D, T) dont la sous-chaine doit etre extraite.
  • off = <offset> (Optionnel) : Le decalage de depart (position) pour l’extraction. Important : Le decalage est base sur 0, c’est-a-dire que le premier caractere a le decalage 0, le deuxieme le decalage 1, etc. La valeur doit etre un entier non negatif. Si off est omis, l’extraction commence par defaut au decalage 0 (debut).
  • len = <longueur> (Optionnel) : La longueur de la sous-chaine a extraire (nombre de caracteres). La valeur doit etre un entier non negatif. Si len est omis, tous les caracteres depuis la position off jusqu’a la fin de <source> sont extraits.
  • result_string : Le resultat de la fonction est toujours de type STRING.

Fonctionnement et comportement

  • La fonction retourne une chaine contenant les caracteres de <source> depuis la position <offset> avec la longueur <longueur>.
  • Si <longueur> est omis, l’extraction va jusqu’a la fin de <source>.
  • Si <offset> + <longueur> depasse la fin de <source>, seuls les caracteres disponibles jusqu’a la fin sont retournes (pas d’erreur, tant que offset lui-meme est valide).
  • Pour les variables source de longueur fixe (Type C etc.), les espaces en fin sont consideres comme faisant partie de la chaine et peuvent etre extraits s’ils se trouvent dans la plage off/len.
  • Des valeurs invalides pour off (negatif, superieur ou egal a la longueur de val determinee avec strlen) ou len (negatif) conduisent generalement a une erreur d’execution (ex. Exception CX_SY_RANGE_OUT_OF_BOUNDS).

Alternative : Acces par decalage/longueur (+off(len))

Une syntaxe plus compacte souvent vue est variable+offset(longueur), par ex. partie = texte+5(10)..

  • Differences : Cette syntaxe essaie de conserver le type de donnees de la variable originale, tandis que substring() retourne toujours un STRING. La gestion des erreurs peut differer. La fonction substring() est souvent plus robuste et plus claire dans son intention.

Fonctions apparentees

Il existe aussi des fonctions qui extraient en fonction de delimiteurs : substring_after(), substring_before(), substring_from(), substring_to().

Exemples

DATA text TYPE string VALUE 'Bonjour ABAP Monde!'.
DATA part1, part2, part3, part4 TYPE string.
DATA offset TYPE i VALUE 8.
DATA length TYPE i VALUE 4.
" 1. Avec Offset et Longueur
part1 = substring( val = text off = 8 len = 4 ).
WRITE: / '1. Partie (off=8, len=4):', part1. " Sortie : ABAP
" 2. Depuis l'Offset jusqu'a la fin (len omis)
part2 = substring( val = text off = 13 ).
WRITE: / '2. Partie (off=13, fin):', part2. " Sortie : Monde!
" 3. Du debut jusqu'a la longueur X (off omis -> Default 0)
part3 = substring( val = text len = 7 ).
WRITE: / '3. Partie (debut, len=7):', part3. " Sortie : Bonjour
" 4. Avec variables pour Offset/Longueur
part4 = substring( val = text off = offset len = length ).
WRITE: / '4. Partie (variables):', part4. " Sortie : ABAP
" 5. Avec Type C
DATA text_c TYPE c LENGTH 20 VALUE 'Texte fixe '. " 11 caracteres + 9 espaces
DATA part_c TYPE string.
part_c = substring( val = text_c off = 9 len = 5 ). " Extrait 'xe' + 3 espaces
WRITE: / '5. Partie (Type C):', |'{ part_c }'|. " Sortie : '{xe }"
" 6. Comparaison avec l'acces par offset
DATA part_via_offset TYPE string.
part_via_offset = text+8(4). " Equivalent a l'exemple 1
WRITE: / 'Comparaison (+off(len)):', part_via_offset. " Sortie : ABAP

Remarques importantes / Bonnes pratiques

  • substring() est une fonction qui retourne une nouvelle chaine et ne modifie pas l’original.
  • Le decalage (off) est base sur 0.
  • La fonction est relativement tolerante concernant la longueur (len), mais pas concernant le decalage (off).
  • C’est une methode claire et sure pour extraire des sous-chaines, surtout quand le resultat doit etre de type STRING.