Modernes ABAP

String Verarbeitung

(C) Brandeis Consulting.

Umfrage - Was ist bekannt

Welche Anweisungen/Befehle/Funktionen für Zeichenkettenverarbeitung kennt Ihr in ABAP?

Bitte auf eine Karte schreiben und an die Pinwand pinnen.

(C) Brandeis Consulting.

Übersicht

  • Zeichenketten und Strings
  • Verkettungsoperator
  • String-Funktionen
  • String Templates
(C) Brandeis Consulting.

Textfelder und Textstrings

Nicht neu, aber wichtig!

Textfelder, intern ABAP-Typ c

DATA lv_char(10) TYPE c 
                 VALUE 'Brandeis '.
WRITE lv_char && lv_char.

In diesem Datentyp werden Leerzeichen am Ende stets entfernt. Das gilt auch schon für das Textfeldliteral, das mit einem "normalen" Hochkommata notiert wird.

Textstrings, intern ABAP-Typ string

DATA lv_string TYPE string 
               VALUE `Brandeis `.
WRITE lv_string && lv_string.

Beim String bleiben die Leerzeichen erhalten. Aber nur dann, wenn es sich um ein Textstringliteral mit den einfachen Backquotes (=schräge Hochkommata) im Quelltext erfasst wurden.
Leider wissen die meisten Menschen noch nicht einmal, wie man diese Backquotes auf einer deutschen Tastatur eingibt. :-)

Leerzeichen werden bei Textfeldern aber nicht bei Textstrings am Ende enternt!

(C) Brandeis Consulting.

Verketten von Zeichenketten

Verkettungsoperator &&

Mit dem Verkettungsoperator && können zwei Zeichenketten kombiniert werden. Das ist viel eleganter als mit CONCATENATE und geht vor allem auch in Operanden Positionen ohne Hilfsvariable.

    CONCATENATE 'ABC' 'DEF' 'GHI' INTO resultstring1.
    resultstring2 = 'ABC' && 'DEF' && 'GHI'.

Append/Anhängen mit &&=

    resultstring3 = 'ABC'.
    resultstring3 &&= 'DEF'.
    resultstring3 &&= 'GHI'.    

Ergibt jeweils 'ABCDEFGHI'

(C) Brandeis Consulting.

String-Funktionen - Übersicht

SAP Dokumentation String-Funktionen

String-Funktionen haben benannte Parameter. D.h. die Parameternamen müssen wir kennen. :-(
Aber die F1-Hilfe kann uns sofort sagen, welche Parameter erwartet werden und wie sie heißen.

--Jörg ==> Joerg
replace( val = text
         sub = 'ö'
         with = 'oe' )

(C) Brandeis Consulting.

String-Funktionen - Liste

Liste der Funktionen nach Relevanz

  • substring, substring_* - Substrings mit regulären Ausdrücken
  • replace - Ersetzen über Position & Länge oder mit regulären Ausdrücken
  • match - Substring der einem regulären Ausdruck entspricht
  • to_upper, to_lower - GROSS- und kleinschreibung
  • translate - Buchstabenweise Ersetzung
  • concat_lines_of - Tabellenzeilen verketten
  • condense - Zeichen am Anfang und Ende einer Zeichenkette entfernen, ggf. Duplikate dieser Zeichen innerhalb auf Eines reduzieren
(C) Brandeis Consulting.

String-Funktionen - Liste Fortsetzung

  • reverse - Buchstabenweise Umkehrung
  • segment - Substring ähnlich Split
  • shift_left, shift_right - Verschiebefunktionen
  • to_mixed, from_mixed - Konvertierung von und zu CamelCase
  • escape - Escaping von Text, z.B. für URLs
  • insert - Einfüge eines Text in einen anderen Text an einer angegebenen Position
  • cmax, cmin - Zeichenartige Extremwertfunktionen
(C) Brandeis Consulting.

Beispiele - substring

substring( val = 'joerg@brandeis.de' off = 3 len = 3 ) => rg@

substring_from( val = 'joerg@brandeis.de' sub = '@' ) => @brandeis.de

substring_after( val = 'joerg@brandeis.de' sub = '@' ) => brandeis.de

substring_before( val = 'joerg@brandeis.de' sub = '@' ) => joerg

substring_to( val = 'joerg@brandeis.de' sub = '@' ) => joerg@

(C) Brandeis Consulting.

Typische Parameter

  • val - Text
  • sub - Zeichenkette die gesucht wird
  • off - Offset, also Anzahl der Zeichen, die übersprungen werden
  • len - Länge der Zeichenkette
  • del - Was gelöscht werden soll
  • with - Ersatz
  • case - Case-Sensitiv oder nicht
  • occ - Das wievielte Vorkommen - Bei 0 werden alle Vorkommen ersetzt
(C) Brandeis Consulting.

Reguläre Ausdrücke

„Ein regulärer Ausdruck (englisch regular expression, Abkürzung RegExp oder Regex) ist in der theoretischen Informatik eine Zeichenkette, die der Beschreibung von Mengen von Zeichenketten mit Hilfe bestimmter syntaktischer Regeln dient.“ (Wikipedia)

ABAP Funktionen verwenden Perl Kompatible Reguläre Ausdrücke (PCRE)

(C) Brandeis Consulting.

Beispiele für Ersetzung mit regulären Ausdrücken

  • \b([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4})\b findet Datumsangaben in einem Text. Dazu wird nach drei Ziffernblöcken gesucht, die mit einem Punkt getrennt sind und deren Länge 1-2, 1-2 und 4 Zeichen beträgt. Die Plausibilität des Datums wird nicht geprüft, d.h. es kann auch der 32.3.2017 gefunden werden. Eine exaktere Prüfung ist mit regulären Ausdrücken durchaus möglich, aber dazu ist ein entsprechend komplexerer Ausdruck notwendig.

Auf der nächste Folie ist ein Text zum Testen

(C) Brandeis Consulting.

Beispieltext mit Datumsangaben

Jörg:

Erzeuge mir einen Text mit vielen Datumsangaben im Format MM.DD.YYYY

ChatGPT:

Gerne, hier ist ein Beispieltext mit vielen Datumsangaben im Format MM.DD.YYYY:
Am 03.28.2023 begann ein wichtiger internationaler Gipfel, der bis zum 04.02.2023 dauerte. Dabei trafen sich führende Politiker aus aller Welt, um über dringende globale Themen wie den Klimawandel, die Wirtschaft und den Frieden zu diskutieren.
Die Veranstaltung fand in einer großen Konferenzhalle statt, die extra für diesen Anlass am 03.25.2023 eröffnet wurde. Dort hatten die Teilnehmer die Möglichkeit, sich über die neuesten Entwicklungen in ihren Ländern und Regionen auszutauschen und Lösungen für globale Probleme zu finden.
Am 03.30.2023 gab es eine wichtige Pressekonferenz, auf der die Ergebnisse der bisherigen Gespräche präsentiert wurden. Dabei wurden auch neue Initiativen und Projekte vorgestellt, die in den kommenden Jahren umgesetzt werden sollen.

Beachte: Die Datumsangaben sind in einem blöden Format! Darum ersetzen wir sie.

(C) Brandeis Consulting.

Reguläre Ausdrücke in Funktionen

Möglich in den Funktionen:

  • match
  • replace
  • substring
(C) Brandeis Consulting.

Beispiel - match

Nachname aus E-Mail rauspicken

(C) Brandeis Consulting.

Beispiele - replace -

Mit und ohne Regulärem Ausdruck

--Jörg ==> Joerg
replace( val = text
         sub = 'ö'
         with = 'oe' )


--Peter Pan ==> Pan, Peter
replace( val = text    
         pcre = '(.*)\s(.*)'
         with = '$2, $1' )
(C) Brandeis Consulting.

String Templates

Ausdrücke, die eine Zeichenkette erzeugen. Sie bestehen aus Literalen die Eingebettete Ausdrücke, Formatierung und Steuerzeichen enthalten können.
SAP Dokumentation String Templates

Beispiel

DATA(thema) = |String Templates|. 
data(satz) = |Das ist ein Beispiel für das Thema { thema }|.
data(n) = |{ satz }, dass wir am { sy-datum } besprechen|.
out->write( satz ). 

Syntax

  • Start und Ende durch einen senkrechten | Strich markiert.
  • Alles dazwischen ist konstanter Text, außer
    • von geschweiften Klammern { } umgebene Eingebettete Ausdrücke optional mit Formatierung
    • Steuerzeichen
  • Die Zeichen {, }, | und \ müssen durch ein Backslash escaped werden
(C) Brandeis Consulting.

Eingebettete Ausdrücke

In String Templates können Eingebettete Ausdrücke verwendet werden.

Syntax

{ Ausdruck [Formatierung] }

  • In geschweiften Klammern
  • Am Anfang und Ende muss ein Leerzeichen sein.
  • Formatierung ist Optional

Mögliche Ausdrücke

  • Variablen und Datenobjekte
  • Operatorausdrücke, d.h. Ergebnisse von Berechnungen
  • Konstruktor-Ausdrücke
  • Tabellenausdrücke
  • Funktionsaufrufe und Aufrufe funktionaler Methoden
(C) Brandeis Consulting.

Beispiele für eingebettete Ausdrücke

  • |Heute ist der { sy-datum }|
  • |Es wurden { sy-dbcnt / 1000 } Tausend Datensätze geändert|
  • |Aufruf der Methode { new classname()->get_Name() } |
(C) Brandeis Consulting.

Formatierung eingebettete Ausdrücke (1/2)

SAP Dokumentation zur Formatierung

Allgemeine Formatierung

WIDTH - Länge des Platzhalters für den eingebetteten Ausdruck.
ALIGN - Ausrichtung des eingebetteten Ausdrucks, falls die Länge kleiner als WIDTH
PAD - Auffüllzeichen falls die Länge kleiner als WIDTH
CASE - Konvertierung der Zeichen des Ausdrucks in Groß- oder Kleinschreibung
ALPHA - Alphakonvertierung
XSD - Konvertierung in Datenformate für XML

(C) Brandeis Consulting.

Formatierung eingebettete Ausdrücke (2/2)

Numerische Formatierung

SIGN - Position bzw. Darstellung des Vorzeichens
EXPONENT - Exponent (EE) für die Darstellung
DECIMALS - Anzahl Nachkommastellen
ZERO - Darstellung der Zahl 0
STYLE - Formatierung als dezimale Gleitkommazahl
NUMBER - Benutzerspezifische Zahlendarstellung oder Standard
CURRENCY - Währung für die Ermittlung der Nachkommastellen

Datumsformatierung

DATE - Unterschiedliche Optionen zur Formatierung eines Datums
TIME - Unterschiedliche Optionen zur Formatierung einer Uhrzeit
TIMESTAMP - Unterschiedliche Optionen zur Formatierung eines Zeitstempels
TIMEZONE - Lokale Zeitzone in die UTC Zeitangaben konvertiert werden sollen

COUNTRY - Länderspezifische Formatierung für Zahlen oder Zeitangaben

(C) Brandeis Consulting.

Steuerzeichen in String Templates

Zeilenumbruch und Tabulator können in dem String Template direkt verwendet werden.

  • \r - Wagenrücklauf aka. Carriage Return
  • \n - Zeilenvorschub aka. Linefeed
  • \t - Tabulator

Damit ist die Verwendung von CL_ABAP_CHAR_UTILITIES=>CR_LF nicht mehr notwendig.

(C) Brandeis Consulting.

Übung zu String Templates

Aufgabenstellung

Erstellen Sie eine Methode, die für eine Person aus der Tabelle ZBC_USERS eine Begrüßung mit Hinweis auf den nächsten Geburtstag erzeugt.

Methodensignatur

METHODS get_salutation IMPORTING user_id TYPE char12
                       RETURNING VALUE(result) TYPE STRING

Aufruf aus der MAIN Methode heraus

  METHOD if_oo_adt_classrun~main.
    out->write( get_salutation( user_id = 'PMUELLER' )  ).
  ENDMETHOD.

Beispieldaten in der Tabelle ZBC_USERS (Ausschnitt)

USER_ID FIRSTNAME LASTNAME DATE_OF_BIRTH GENDER ...
0000000001 Peter Müller 20010101 M
0000000002 Siegfried Mustermann 19790203 M
0000000003 Petra Maier 19820304 F

Beispielausgabe

Hallo Herr Peter Müller, Sie feiern in 43 Tagen Ihren 22. Geburtstag!

`

(C) Brandeis Consulting.

Links

(C) Brandeis Consulting.

Clean Code Empfehlungen

  • Methodennamen sollten nicht 1:1 Funktionsnamen entsprechen. Eine Methode mit dem Namen replace führt zu Verwirrung.
  • Funktionen sind für die Zeichenkettenverarbeitung meist besser als Anweisungen, weil keine Hilfsvariablen benötigt werden.
  • Statt text = |{ text } abc| kann man viel eleganter schreiben: text &&= | abc|
(C) Brandeis Consulting.