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.