ABAP substring() Funktion: Teilstrings extrahieren (Syntax & Beispiele)

kategorie
ABAP-Functions
Veröffentlicht
autor
Johannes

Die Funktion substring() dient dazu, einen Teilstring (einen Abschnitt) aus einem zeichenartigen Datenobjekt ( wie STRING oder C) zu extrahieren. Sie gibt den extrahierten Teil als neuen String zurück und verändert die Originalvariable nicht.

Syntax

Die Funktion wird innerhalb eines ABAP-Ausdrucks aufgerufen:

DATA(result_string) = substring( val = <quelle> [off = <offset>] [len = <laenge>] ).
  • val = <quelle>: Das zeichenartige Datenobjekt (Typ STRING, C, N, D, T), aus dem der Teilstring extrahiert werden soll.
  • off = <offset> (Optional): Der Start-Offset (Position) für die Extraktion. Wichtig: Der Offset ist * 0-basiert*, d.h. das erste Zeichen hat den Offset 0, das zweite den Offset 1 usw. Der Wert muss ein nicht-negativer Integer sein. Wenn off weggelassen wird, wird standardmäßig ab Offset 0 (Anfang) extrahiert.
  • len = <laenge> (Optional): Die Länge des zu extrahierenden Teilstrings (Anzahl der Zeichen). Der Wert muss ein nicht-negativer Integer sein. Wenn len weggelassen wird, werden alle Zeichen ab der off-Position bis zum Ende der <quelle> extrahiert.
  • result_string: Das Ergebnis der Funktion ist immer vom Typ STRING.

Funktionsweise und Verhalten

  • Die Funktion liefert einen String zurück, der die Zeichen aus <quelle> ab der Position <offset> mit der Länge <laenge> enthält.
  • Wird <laenge> weggelassen, geht die Extraktion bis zum Ende der <quelle>.
  • Wenn <offset> + <laenge> über das Ende der <quelle> hinausgeht, werden nur die verfügbaren Zeichen bis zum Ende zurückgegeben (es gibt keinen Fehler, solange offset selbst gültig ist).
  • Bei Quellvariablen fester Länge (Typ C etc.) werden nachfolgende Leerzeichen als Teil der Zeichenkette betrachtet und können extrahiert werden, wenn sie innerhalb des off/len-Bereichs liegen.
  • Ungültige Werte für off (negativ, größer/gleich der Länge von val ermittelt mit strlen) oder len (negativ) führen in der Regel zu einem Laufzeitfehler (z.B. Exception CX_SY_RANGE_OUT_OF_BOUNDS).

Alternative: Offset-/Längen-Zugriff (+off(len))

Eine oft gesehene, kompaktere Syntax ist variable+offset(laenge), z. B. teil = text+5(10)..

  • Unterschiede: Diese Syntax versucht, den Datentyp der Originalvariablen beizubehalten, während substring() immer einen STRING zurückgibt. Das Fehlerhandling kann sich unterscheiden. Die Funktion substring() ist oft robuster und klarer in ihrer Absicht.

Verwandte Funktionen

Es gibt auch Funktionen, die basierend auf Trennzeichen extrahieren: substring_after(), substring_before(), substring_from(), substring_to().

Beispiele

DATA text TYPE string VALUE 'Hallo ABAP Welt!'.
DATA teil1, teil2, teil3, teil4 TYPE string.
DATA offset TYPE i VALUE 6.
DATA length TYPE i VALUE 4.
" 1. Mit Offset und Länge
teil1 = substring( val = text off = 6 len = 4 ).
WRITE: / '1. Teil (off=6, len=4):', teil1. " Ausgabe: ABAP
" 2. Ab Offset bis zum Ende (len weggelassen)
teil2 = substring( val = text off = 11 ).
WRITE: / '2. Teil (off=11, Ende):', teil2. " Ausgabe: Welt!
" 3. Vom Anfang bis Länge X (off weggelassen -> Default 0)
teil3 = substring( val = text len = 5 ).
WRITE: / '3. Teil (Anfang, len=5):', teil3. " Ausgabe: Hallo
" 4. Mit Variablen für Offset/Länge
teil4 = substring( val = text off = offset len = length ).
WRITE: / '4. Teil (Variablen):', teil4. " Ausgabe: ABAP
" 5. Mit Typ C
DATA text_c TYPE c LENGTH 20 VALUE 'Festtext '. " 11 Zeichen + 9 Leerzeichen
DATA teil_c TYPE string.
teil_c = substring( val = text_c off = 9 len = 5 ). " Extrahiert 'xt' + 3 Leerzeichen
WRITE: / '5. Teil (Typ C):', |'{ teil_c }'|. " Ausgabe: '{xt }'
" 6. Vergleich mit Offset-Zugriff
DATA teil_via_offset TYPE string.
teil_via_offset = text+6(4). " Äquivalent zu Beispiel 1
WRITE: / 'Vergleich (+off(len)):', teil_via_offset. " Ausgabe: ABAP

Wichtige Hinweise / Best Practice

  • substring() ist eine Funktion, die einen neuen String zurückgibt und das Original nicht verändert.
  • Der Offset (off) ist 0-basiert.
  • Die Funktion ist relativ fehlertolerant bezüglich der Länge (len), aber nicht bezüglich des Offsets (off).
  • Sie ist eine klare und sichere Methode, um Teilstrings zu extrahieren, besonders wenn das Ergebnis vom Typ STRING sein soll.