ABAP Zeichenketten Templates (String expressions)

Mit ABAP 700 wurden Zeichenketten Templates neu in den Funktionsumfang aufgenommen. Die Templates bietet eine komfortable Alternative zu den bisherigen Literalen, bei denen der Text in Hochkomma eingeschossen wird.

Zeichenketten Templates werden gebildet, indem der eigentliche Text (ohne Hochkomma) mit den Pipe Zeichen | eingeschlossen wird.

Beispiel:

lv_char = |Das ist eine Zeichenkette|.   " neuer Weg
lv_char = 'Das ist eine Zeichenkette'.   " alter Weg

Es können beliebige Zeichen verwendet werden. Innerhalb des Templates lassen sich bestimmte Funktionen nutzen oder Ausgabeformate festlegen. Es gibt einige Steuerzeichen wie etwa { oder \. Sollen diese im Text ausgegeben werden, müssen die Zeichen mit einem vorangestellten \ maskiert werden. Funktionen und Ausgabeoptionen werden immer mit geschweiften Klammern eingeschlossen.

Vorteile:

  1. eingebettete Funktionen
  2. diverse Formatoptionen, dadurch keine/weniger CONVERSION_EXITS notwendig
  3. durch Verwendung eines anderen Symbols (| statt ') klare optische Trennung zwischen Texten und Datenwerten (Variablen, Konstanten)
  4. Verkettung von Texten und Daten durch Verkettungsoperator && statt durch CONCATENATE

Besonderheit

Neu in ABAP 740 ist die Formatoption ALPHA. Mit ihr können zeichenartige Daten aufbereitet werden, ohne dass CONVERSION_EXIT_ALHPA* verwendet werden muss. Die folgenden Anweisungen führen zum gleichen Ergebnis:

" Neuer Weg über Zeichenketten Template 
lv_matnr =  |{ lv_matnr ALPHA = IN }|.
 
 " Alter Weg über CONVERSION EXIT
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
   EXPORTING
     input  = lv_matnr
   IMPORTING
     output = lv_matnr.

Beispiel

Der folgende Report zeigt die Verwendung von Zeichenketten Templates. Es werden komplexe Templates erstellt, Variablen verkettet und verschiedene (nicht alle) Formatoptionen dargestellt. Zeichenketten Templates eignen sich auch zur Wertzuweisung an einen zeichenartigen Datentyp.

ABAP Zeichenketten Templates - Ergebnis
ABAP Zeichenketten Templates - Ergebnis
*&---------------------------------------------------------------------*
*& Report  Z_TEST_STRING_EXPR
*&
*&---------------------------------------------------------------------*
*&
*& Zeichenkettentemplates und Formatoptionen (ab ABAP 700)
*&---------------------------------------------------------------------*

REPORT z_test_string_expr.

DATA: lv_matnr    TYPE matnr,
      lv_text1    TYPE char10,
      lv_text2    TYPE char10,
      lv_text3    TYPE char30,
      lv_date     TYPE d,
      lv_number_1 TYPE menge_d,
      lv_number_2 TYPE menge_d.

" Zeichenketten
lv_text1 = |Hallo|.
lv_text2 = |Welt|.

CONCATENATE lv_text1 lv_text2 INTO lv_text3 SEPARATED BY space.
WRITE: /(30) |Verketten Standard|,
         35  lv_text3.

lv_text3 = lv_text1 && lv_text2.
WRITE: /(30) |Verketten mit &&|,
         35  lv_text3.

SKIP 1.

WRITE: /(30) |Komplexes Literal|,
         35  |Characters \|, \{, and \} have to be escaped by \\ in literal text.|.

lv_text3 = lv_text1 && | | && lv_text2.
WRITE: /(30) |&& und \| \| |,
         35  lv_text3.

lv_text3 = |'| && lv_text1 && | | && lv_text2 && |'|.
WRITE: /(30) |&& und \|'\|  |,                                                                         "'
         35  lv_text3.

SKIP 1.

lv_matnr = '12345'.
WRITE: /(30) |Zeichenkette Standard|,
         35  lv_matnr.

WRITE: /(30) |ALPHA IN|,
         35 |{ lv_matnr ALPHA = IN }|.

WRITE: /(30) |ALPHA OUT|,
         35 |{ lv_matnr ALPHA = OUT }|.

WRITE: /(30) |ALIGN LEFT|,
         35 |{ lv_matnr ALIGN = LEFT WIDTH = 18 }|.

WRITE: /(30) |ALIGN RIGHT|,
         35  |{ lv_matnr ALIGN = RIGHT WIDTH = 18 }|.

WRITE: /(30) |ALIGN CENTER|,
         35  |{ lv_matnr ALIGN = CENTER WIDTH = 18 }|.

WRITE: /(30) |PAD|,
         35  |{ lv_matnr ALIGN = RIGHT WIDTH = 18 PAD = '9' }|.

WRITE: /(30) |ALIGN CENTER PAD|,
         35  |{ lv_matnr ALIGN = CENTER WIDTH = 18 PAD = '9' }|.

SKIP 1.
" Zahlen
lv_number_1 = '1234.456'.
lv_number_2 = '-1234.456'.

WRITE: /(30) |Nummer Standard|,
         35  lv_number_1,
         70  lv_number_2.

WRITE: /(30) |SIGN LEFT|,
         35  |{ lv_number_1 SIGN = LEFT }|,
         70  |{ lv_number_2 SIGN = LEFT }|.

WRITE: /(30) |SIGN LEFTPLUS|,
         35  |{ lv_number_1 SIGN = LEFTPLUS }|,
         70  |{ lv_number_2 SIGN = LEFTPLUS }|.

WRITE: /(30) |SIGN LEFTSPACE|,
         35  |{ lv_number_1 SIGN = LEFTSPACE }|,
         70  |{ lv_number_2 SIGN = LEFTSPACE }|.

WRITE: /(30) |DECIMALS|,
         35  |{ lv_number_1 DECIMALS = 2 }|,
         70  |{ lv_number_2 DECIMALS = 2 }|.

WRITE: /(30) |CURRENCY|,
         35  |{ lv_number_1 CURRENCY = 'EUR' }|,
         70  |{ lv_number_2 CURRENCY = 'EUR' }|.

WRITE: /(30) |NUMBER RAW|,
         35  |{ lv_number_1 NUMBER = RAW }|,
         70  |{ lv_number_2 NUMBER = RAW }|.

WRITE: /(30) |NUMBER USER|,
         35  |{ lv_number_1 NUMBER = USER }|,
         70  |{ lv_number_2 NUMBER = USER }|.

WRITE: /(30) |NUMBER ENVIRONMENT|,
         35  |{ lv_number_1 NUMBER = ENVIRONMENT }|,
         70  |{ lv_number_2 NUMBER = ENVIRONMENT }|.

SKIP 1.

" Datum
lv_date = '20150305'.
WRITE: /(30) |Datum Standard|,
         35  lv_date.

WRITE: /(30) |DATE ISO|,
         35   |{ lv_date DATE = ISO }|.

WRITE: /(30) |DATE USER|,
         35   |{ lv_date DATE = USER }|.