Zeichenketten ändern in ABAP: TRANSLATE verstehen, aber moderne Funktionen nutzen

kategorie
ABAP-Statements
Veröffentlicht
autor
Johannes

Die TRANSLATE-Anweisung in ABAP dient dazu, den Inhalt eines zeichenartigen Datenobjekts (wie STRING, C, N, D, T) zeichenweise zu manipulieren. Sie hat zwei Hauptfunktionen:

  1. Umwandlung der Groß-/Kleinschreibung: Konvertiert den gesamten Text in Groß- oder Kleinbuchstaben.
  2. Zeichen-Ersetzung: Ersetzt bestimmte Zeichen durch andere Zeichen gemäß einer definierten Ersetzungsregel ( USING-Zusatz).

Wichtig ist, dass TRANSLATE die angegebene Variable direkt verändert (die Änderung erfolgt “in place”).

Syntax

Es gibt zwei grundlegende Formen:

  1. Groß-/Kleinschreibung ändern:

    TRANSLATE <variable> TO UPPER CASE.
    TRANSLATE <variable> TO LOWER CASE.
  2. Zeichen ersetzen mittels Regel:

    TRANSLATE <variable> USING <regel>.

Bestandteile:

  • <variable>: Die zeichenartige Variable, deren Inhalt modifiziert werden soll.
  • TO UPPER CASE: Wandelt alle Kleinbuchstaben (inklusive sprachspezifischer wie ä, ö, ü, ß) in der <variable> in die entsprechenden Großbuchstaben (Ä, Ö, Ü, SS) um. Ziffern und Sonderzeichen bleiben unverändert.
  • TO LOWER CASE: Wandelt alle Großbuchstaben (inklusive Ä, Ö, Ü) in der <variable> in die entsprechenden Kleinbuchstaben (ä, ö, ü) um. Ziffern und Sonderzeichen bleiben unverändert.
  • USING <regel>: Führt eine zeichenweise Ersetzung durch. <regel> ist ein zeichenartiges Datenobjekt (Literal oder Variable), das die Ersetzungsregeln paarweise enthält:
    • Die Regel wird als XYAB... interpretiert: Ersetze Zeichen X durch Y, ersetze Zeichen A durch B, und so weiter.
    • Die Länge der <regel> muss gerade sein.
    • Die <variable> wird Zeichen für Zeichen durchlaufen. Für jedes Zeichen wird geprüft, ob es an einer ungeraden Position (1, 3, 5, …) in der <regel> vorkommt.
    • Wird das Zeichen an der ersten passenden ungeraden Position 2n-1 in <regel> gefunden, wird es in <variable> durch das Zeichen an der geraden Position 2n in <regel> ersetzt.
    • Kommt ein Zeichen aus <variable> nicht an einer ungeraden Position in <regel> vor, bleibt es unverändert.

Moderne Alternativen (Bevorzugt!)

Obwohl TRANSLATE funktional ist, gibt es in modernem ABAP oft bevorzugte Alternativen, die flexibler sind und einen neuen Wert zurückgeben, statt die Originalvariable zu ändern:

  • Groß-/Kleinschreibung: Die eingebauten Funktionen to_upper( text ) und to_lower( text ).
  • Zeichenersetzung: Die eingebaute Funktion replace( val = ... sub = ... with = ... ). Diese Funktion ist mächtiger, da sie auch ganze Zeichenketten (Substrings) und nicht nur einzelne Zeichen ersetzen kann und auch Optionen für Reguläre Ausdrücke bietet.

Beispiele

1. In Großbuchstaben umwandeln

DATA text_mixed TYPE string VALUE 'Ein Test mit Groß und klein.'.
WRITE: / 'Original:', text_mixed.
TRANSLATE text_mixed TO UPPER CASE.
WRITE: / 'Upper Case:', text_mixed.
" Moderne Alternative:
DATA(upper_result) = to_upper( 'Ein Test mit Groß und klein.' ).
WRITE: / 'Upper (Funktion):', upper_result.

Ausgabe:

Original: Ein Test mit Groß und klein.
Upper Case: EIN TEST MIT GROSS UND KLEIN.
Upper (Funktion): EIN TEST MIT GROSS UND KLEIN.

2. In Kleinbuchstaben umwandeln

DATA text_caps TYPE c LENGTH 30 VALUE 'NUR GROSSBUCHSTABEN'.
WRITE: / 'Original:', text_caps.
TRANSLATE text_caps TO LOWER CASE.
WRITE: / 'Lower Case:', text_caps.
" Moderne Alternative:
DATA(lower_result) = to_lower( 'NUR GROSSBUCHSTABEN' ).
WRITE: / 'Lower (Funktion):', lower_result.

Ausgabe:

Original: NUR GROSSBUCHSTABEN
Lower Case: nur grossbuchstaben
Lower (Funktion): nur grossbuchstaben

3. Zeichen ersetzen mit USING (Umlaute entfernen)

DATA umlaut_text TYPE string VALUE 'Schöne Grüße aus Österreich'.
DATA rule TYPE c LENGTH 12 VALUE 'ÄAÖOÜUäaöoüu'. " Ä->A, Ö->O, Ü->U, ä->a, ...
WRITE: / 'Original:', umlaut_text.
TRANSLATE umlaut_text USING rule.
WRITE: / 'Ohne Umlaute:', umlaut_text.
" Moderne Alternative (Beispielhaft für Ä):
DATA(no_ae) = replace( val = 'Schöne Grüße' sub = 'ä' with = 'ae' occ = 0 ).
WRITE: / 'Mit replace (ae):', no_ae.

Ausgabe:

Original: Schöne Grüße aus Österreich
Ohne Umlaute: Schone Gruße aus Osterreich
Mit replace (ae): Schoene Gruesse

(Man sieht, dass replace flexibler ist und auch durch mehrere Zeichen ersetzen kann).

4. Zeichen ersetzen mit USING (Zeichen-Mapping)

DATA code TYPE c LENGTH 5 VALUE 'A1B2C'.
DATA map_rule TYPE c LENGTH 10 VALUE 'ABCDE12345'. " A->1, B->2, C->3, D->4, E->5
WRITE: / 'Code Original:', code.
TRANSLATE code USING map_rule.
WRITE: / 'Code Mapped:', code.

Ausgabe:

Code Original: A1B2C
Code Mapped: 11223

(A wird zu 1, 1 wird nicht in der Regel gefunden (nur an gerader Position), B wird zu 2, 2 nicht gefunden, C wird zu 3).

Wichtige Hinweise / Best Practice

  • TRANSLATE ändert die Variable direkt. Wenn der ursprüngliche Wert benötigt wird, muss er vorher gesichert werden.
  • TRANSLATE ... USING ist eine reine Zeichen-zu-Zeichen Ersetzung. Es kann nicht nach Zeichenketten suchen oder Zeichen hinzufügen/löschen (nur durch andere ersetzen).
  • Für komplexere Ersetzungen (ganze Wörter, Muster via Regex) oder wenn der Originalwert erhalten bleiben soll, sind die modernen Funktionen to_upper(), to_lower() und insbesondere replace() meist die bessere Wahl.
  • TRANSLATE kann jedoch für einfache, performante Case-Konvertierungen oder multiple 1-zu-1-Zeichenersetzungen immer noch nützlich sein.