Zeichenketten-Templates

Aus SAP-Wiki
Zur Navigation springenZur Suche springen

Siehe Neues ABAP (ab Release 7.40).

Siehe Schlüsselbefehl Concatenate und Verknüpfung über &&, Schlüsselbefehl Split.

"Zeichenketten-Templates" sind eine moderne Alternative zum Schlüsselbefehl "Concatenate" und Verknüpfung über "&&". Sie können ab ABAP-Release 7.02 verwendet werden.

Der gesamte String wird durch ein Pipe (|) umschlossen. Jede Variable wird mit "{ <variable> }" umschlossen, mit jeweils einem Space zwischen der geschweiften Klammer und der Variablen. Man kann auch mit den Verkettungsoperatoren "&" oder "&&" arbeiten. Dann wird jeder Verkettungsteil mit "|" umschlossen. Das ist auch meine Empfehlung.

Funktionalität Zeichenketten-Templates

Ausgabe Literale

  • Literale werden hier nicht wie sonst gewohnt durch ein einfaches Anführungszeichen umschlossen.
lv_ziel = |Test und Beispiel|.

Ausgabe Variable

  • Variablen werden mit einer geschweiften Klammer umschlossen. Zwischen der Klammer und der Variablen ist ein Leerzeichen zu setzen.
lv_ziel = |{ lv_zahl }|.

Ausgabe Kombination Literal und Variable

lv_ziel = |Return-Code: { sy-subrc }|.

Nutzung Funktionen

  • Sehr elegant ist, dass man in Zeichenketten-Templates auch Funktionen direkt nutzen kann ohne Hilfsvariablen zu definieren.
  • Etwas konzentrieren muss man sich hier bei der korrekten Setzung der Klammern.
lv_ziel = |{ strlen( lv_variable )}|.

Nutzung Returnparameter von Methoden

  • Der Returnparameter von Methoden kann sehr nützlich sein, um ein Coding übersichtlicher zu strukturieren und man den Returnwert einer Methode direkt in einem Zeichenketten-Template zu nutzen
  • hier könnte es z. B. eine Methode "GET_VBELN" geben, die einen Returnparameter "RV_VBELN" hat.
  • klassisch würde man schreiben
lv_vbeln = get_vbeln( ).
lv_ziel = |Kundenauftrag: { lv_vbeln }|.

Aber den Returnparameter der Methode kann man auch direkt im Zeichenkettentemplates nutzen. Hier nutzt man die Eigenschaft vom Returnparameter, dass es in einer Methode nur maximal einen Returnparameter geben kann und man daher nicht den Namen vom Returnparameter schreiben muss.

lv_ziel = |Kundenauftrag: { get_vbeln( ) }|.

Nutzung in Messages / Nachrichten

  • Recht elegant kann es sein Zeichenkettentemplates in Messages/Nachrichten zu verwenden
  • z. B. im alten Coding möchte man von Variablen (Bestellung und Bestellposition) die führenden Nullen entfernen und diese Variablen dann in einer Info-Nachricht ausgeben.
lv_ebeln = ekpo-ebeln.
lv_ebelp = ekpo-ebelp.

shift lv_ebeln left deleting leading '0'.
shift lv_ebelp left deleting leading '0'.

*'Bitte die Position &1 in Bestellung &2 prüfen 
message i010(zmm) with lv_ebelp lv_ebeln.
  • Im Coding mit den Zeichenkettentemplates kann man sich hier die Definition der Hilfsvariablen sparen und die Entfernung der Nullen gleich in der Nachricht/in den Zeichenkettentemplates durchführen.
*'Bitte die Position &1 in Bestellung &2 prüfen 
message i010(zmm) with |{ lv_ebelp alpha = out }|
                       |{ lv_ebeln alpha = out }|.

Ausgabe formatiertes Währungsfeld

lv_ziel = |{ lv_wert CURRENCY = lv_waerk }|.

Rechnen mit Variablen

  • Bei Zeichenketten-Templates kann man sich oftmals die Deklaration von Hilfsvariablen sparen.
  • Man kann innerhalb des Ausdrucks mit Variablen rechnen.
lv_ziel = |{ lv_zahl - 1 }|.

Spezielle Konvertierungen

ISOLA-Konvertierung (Sprachschlüssel)

  • Intern speichert SAP den Sprachschlüssel in einem einstelligen Feld von der Domäne SPRAS, wo z. B. "D" (Deutsch) steht. In sehr vielen SAP-Feldern gibt man jedoch den Sprachschlüssel zweistellig ein, z. B. "DE" (Deutsch). Hier konvertiert der Konvertierungsschlüssel ISOLA von einstellig in zweistellig und umgekehrt.

Alpha-Konvertierung

  • Die Alpha-Konvertierung ist ab ABAP 7.40 SP 2 möglich
  • Sehr bequem ist auch die Alphakonvertierung, die man vorher z. B. mit dem Overlay-Befehl machen konnte.
  • "ALPHA = IN" fügt zu einer Variable die führenden Nullen hinzu entsprechend der Länge des Typs.
  • "ALPHA = OUT" entfernt aus einer Variable die führenden Nullen. Allerdings verbleibt entsprechend der Länge des CHAR-Feldes für die Nullen die White-Spaces. Das kann optisch unschön aussehen in einem Zeichenketten-Template mit mehreren Bestandteilen. Hier im Beispiel fällt es beim Material auf, was im Feld MATNR eine Länge von 40 Zeichen hat.
i_text      = |Position { <fs_zolltarif>-posnr ALPHA = OUT } Material { <fs_zolltarif>-matnr ALPHA = OUT } Zolltarifnummer fehlt|

Zeichenkettentemplate2.jpg

  • Mit dem Parameter WIDTH kann die Länge der Ziffernfolge bestimmt werden.
  • Im Folgenden ist die Variable "LV_MATNR" typisiert als MATNR (C40).
DATA: lv_matnr TYPE matnr.

lv_matnr = '42'.

lv_matnr = |{ lv_matnr ALPHA = IN }|.   "Ausgabe: 0000000000000000000000000000000000000042

lv_matnr = |{ lv_matnr ALPHA = OUT }|.  "Ausgabe: 42
lv_matnr = |{ lv_matnr ALPHA = IN WIDTH = 10 }|.   "Ausgabe: 0000000042

Es ist allerdings nicht möglich einen beliebigen Konvertierungsexit einzugeben. Folgendes Coding gibt beim Vesuch der Verwendung vom Konvertierungsexit MATN1 einen Syntaxfehler

DATA: lv_matnr TYPE matnr.

lv_matnr = '42'.

lv_matnr = |{ lv_matnr MATN1 = IN }|.  "Syntaxfehler

Zeichenkettentemplate1.jpg

Vor- und Nachteile Zeichenketten-Templates

  • Zeichenketten-Templates sind innerhalb des zu bildenden Templates sehr flexibel und man spart sich oft die Definition von Hilfsvariablen.
  • Es ist jedoch abzuwägen, ob das Zeichenketten-Template noch verständlich ist und in kurzer Zeit nachvollziehbar ist. Es würde keinen Sinn machen wenige Hilfsvariablen durch ein Template zu ersetzen, wenn gleichzeitig dieses Coding für einen selbst oder für andere SAP-Entwickler sehr schwer nachvollziehbar ist.

Problem: Übersetzung Zeichenketten-Templates

  • In ABAP ist es gewöhnlich sehr komfortabel mit Übersetzungen in einem Report zu arbeiten
  • Man möchte z. B. einen String füllen "Kundenauftrag: <nummer>"
  • Mit concatenate würde man schreiben
concatenate 'Kundenauftrag:'
            lv_vbeln
            into lv_zielvariable
            separated by space.

Damit der Text "Kundenauftrag:" bei der Übersetzung in andere Sprachen vorgeschlagen wird, führt man einen Doppelklick auf den Text durch und der ABAP-Editor schlägt die nächste freie dreistellige Nummer vor, z. B.

concatenate 'Kundenauftrag:(001)
            lv_vbeln
            into lv_zielvariable
            separated by space.

Dies hat den Vorteil, dass man sofort den Text "Kundenauftrag" erkennt, aber auch gleichzeitig dieser String zur Übersetzung vorgeschlagen wird.

Das Gleiche geht, wenn man die Teile der Zielvariablen mit "&&" verknüpft

lv_zielvariable = 'Kundenauftrag:'(001)
                 && lv_vbeln.

Bei einem Zeichenkettentemplate funktioniert die gleiche Systematik jedoch nicht

lv_zielvariable = |Kundenauftrag:(001) { lv_vbeln }|.

Hier würde "(001)" als String interpretiert und so in die Zielvariable geschrieben und es wird kein Teil als übersetzungsrelevant erkannt.

Für die gewünschte Funktionalität muss man schreiben

lv_zielvariable = |{ text-001 } { lv_vbeln }|.

Im Textsymbol "text-001" steht dann "Kundenauftrag:". Dies erschwert die Lesbarkeit von Zeichenkettentemplates. Oftmals werden SAP-Entwickler diese Problematik (zunächst) ignorieren und später vergessen eine saubere Übersetzbarkeit zu gewährleisten, indem sie schreiben

lv_zielvariable = |Kundenauftrag: { lv_vbeln }|.

Das fällt dann oft erst im Produktivsystem auf, wenn ein User sich z. B. in Englisch anmeldet (nicht in der Anlagesprache vom Report) und dann liest "Kundenauftrag: <nummer>", wo der User erwartet hatte "Sales order: <nummer>" zu lesen.

Bei Texten, die übersetzungsrelevant sind und eine Mischung zwischen Variablen und "harten" Texten sind, sollten oftmals doch eher SE91-Nachrichten verwendet werden für eine bessere Lesbarkeit.

Kombination && und Zeichenketten-Templates

  • Wenn einige Operanten in einer Zeile stehen, wird die Zeile schwer lesbar. Es ist besser hier die verschiedenen Operanten zu verbinden mit
lv_zielvariable = |..|
               && |..|
               && |..|.
  • Damit verbindet man die Flexibilität der Zeichenketten-Templates mit der Übersichtlichkeit vom Verkettungsbefehl "&&", um so jeden Operant auf einer Zeile zu sehen.
  • Man sollte aber aufpassen wie lang die Zielvariable wird. Angenommen die Zielvariable wird mit 100 Zeichen gefüllt, ist es erst mal kein Problem, wenn man die Variable entsprechend typisiert. Aber wenn man diese Variable in einer Message ausgeben will, wird dieser Text auf 50 Zeichen gekürzt. Da ist es dann häufig besser die Message in einer Nachrichtenklasse über die Transaktion SE91 (Nachrichtenpflege) anzulegen.

Zeichenketten-Templates und Transaktion SE91 (Nachrichtenpflege)

  • Man sollte sich als Entwickler in der Projektpraxis die Vor- und Nachteile von Zeichenketten-Templates auch mit der Verwendung von Nachrichten mit der SE91 (Nachrichtenpflege) abwägen.
  • Häufig ist eine gut formulierte Nachricht in der Transaktion SE91 sehr transparent und am besten wartbar und liefert im Produktivbetrieb oft auch über den Verwendungsnachweis einer (Fehler-)Nachricht sehr nützliche Hinweise.

Web-Links