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:
- Umwandlung der Groß-/Kleinschreibung: Konvertiert den gesamten Text in Groß- oder Kleinbuchstaben.
- 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:
-
Groß-/Kleinschreibung ändern:
TRANSLATE <variable> TO UPPER CASE.TRANSLATE <variable> TO LOWER CASE. -
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 ZeichenX
durchY
, ersetze ZeichenA
durchB
, 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 Position2n
in<regel>
ersetzt. - Kommt ein Zeichen aus
<variable>
nicht an einer ungeraden Position in<regel>
vor, bleibt es unverändert.
- Die Regel wird als
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 )
undto_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 GROSSBUCHSTABENLower Case: nur grossbuchstabenLower (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 ÖsterreichOhne Umlaute: Schone Gruße aus OsterreichMit 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: A1B2CCode 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 insbesonderereplace()
meist die bessere Wahl. TRANSLATE
kann jedoch für einfache, performante Case-Konvertierungen oder multiple 1-zu-1-Zeichenersetzungen immer noch nützlich sein.