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 (TypeSTRING,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. Sioffest 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. Silenest omis, tous les caracteres depuis la positionoffjusqu’a la fin de<source>sont extraits.result_string: Le resultat de la fonction est toujours de typeSTRING.
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 queoffsetlui-meme est valide). - Pour les variables source de longueur fixe (Type
Cetc.), les espaces en fin sont consideres comme faisant partie de la chaine et peuvent etre extraits s’ils se trouvent dans la plageoff/len. - Des valeurs invalides pour
off(negatif, superieur ou egal a la longueur devaldeterminee avecstrlen) oulen(negatif) conduisent generalement a une erreur d’execution (ex. ExceptionCX_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 unSTRING. La gestion des erreurs peut differer. La fonctionsubstring()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 Longueurpart1 = 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/Longueurpart4 = substring( val = text off = offset len = length ).WRITE: / '4. Partie (variables):', part4. " Sortie : ABAP
" 5. Avec Type CDATA text_c TYPE c LENGTH 20 VALUE 'Texte fixe '. " 11 caracteres + 9 espacesDATA part_c TYPE string.part_c = substring( val = text_c off = 9 len = 5 ). " Extrait 'xe' + 3 espacesWRITE: / '5. Partie (Type C):', |'{ part_c }'|. " Sortie : '{xe }"
" 6. Comparaison avec l'acces par offsetDATA part_via_offset TYPE string.part_via_offset = text+8(4). " Equivalent a l'exemple 1WRITE: / 'Comparaison (+off(len)):', part_via_offset. " Sortie : ABAPRemarques 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.