Schlüssel, die mehrere Informationen tragen, sind in SAP-Daten normal: Die ersten Stellen einer Kostenstelle bezeichnen den Bereich, ein Name enthält Vor- und Nachnamen, ein Belegtyp steckt am Ende einer Nummer. ABAP-Routinen zerlegen solche Felder mit der Offset-Schreibweise und mit SPLIT. SQLScript hat dafür SUBSTRING und eine Familie von Funktionen um LOCATE.
Offset und SPLIT
Die ABAP-Routine
Zwei typische Fälle in einer Routine: feste Positionen und ein Trennzeichen.
METHOD end_routine.
LOOP AT result_package ASSIGNING FIELD-SYMBOL(<ls_result>).
" Feste Positionen: Stellen 1 bis 4 sind der Bereich, ab Stelle 5 die Nummer
<ls_result>-cc_area = <ls_result>-costcenter+0(4).
<ls_result>-cc_number = <ls_result>-costcenter+4.
" Trennzeichen: „Nachname Vorname“ an der ersten Leerstelle teilen
SPLIT <ls_result>-fullname AT space
INTO <ls_result>-lastname <ls_result>-firstname.
ENDLOOP.
ENDMETHOD.
Die SQLScript-Fassung
SUBSTRING( feld, start, länge ) zählt ab eins, der Offset in ABAP ab null. costcenter+0(4) wird also SUBSTRING( costcenter, 1, 4 ), und costcenter+4 wird SUBSTRING( costcenter, 5 ). Ohne Längenangabe läuft SUBSTRING bis zum Ende.
LOCATE( feld, muster ) liefert die Position des ersten Treffers oder null. SUBSTR_BEFORE und SUBSTR_AFTER geben den Teil vor beziehungsweise nach dem ersten Treffer zurück.
outTab = SELECT costcenter,
SUBSTRING( costcenter, 1, 4 ) AS cc_area,
SUBSTRING( costcenter, 5 ) AS cc_number,
fullname,
CASE
WHEN LOCATE( fullname, ' ' ) > 0
THEN SUBSTR_BEFORE( fullname, ' ' )
ELSE fullname
END AS lastname,
SUBSTR_AFTER( fullname, ' ' ) AS firstname,
record,
sql__procedure__source__record
FROM :inTab;
Das CASE beim Nachnamen gleicht einen Unterschied aus: SPLIT legt bei fehlendem Trennzeichen den gesamten Wert in das erste Zielfeld, SUBSTR_BEFORE liefert in diesem Fall eine leere Zeichenkette. Ohne die Prüfung ginge ein Name ohne Leerzeichen verloren. SUBSTR_AFTER verhält sich wie SPLIT und liefert ohne Treffer eine leere Zeichenkette.
Zeichenfelder kommen in HANA ohne die auffüllenden Leerzeichen an, die ABAP bei CHAR-Feldern kennt. Passt ein Ergebnis nicht in die Länge des Zielfelds, bricht die Routine ab, wo ABAP stillschweigend abschneidet; dann LEFT( wert, länge ) setzen.