Modifikation von Zeichenketten mit ABAP
Dieser Beitrag ist Teil des Kurses ABAP Grundlagen.
In diesem Artikel werden grundlegene Anweisungen für den Umgang mit String-Operationen erläutert. Manipulation von Zeichenketten ist oft im Rahmen einer Transformationsroutine oder FOX-Formel notwendig. Die Syntax von FOX kann in einzelnen Fällen leicht abweichen, bleibt aber recht nahe an ABAP. Daher wird in diesem Artikel nicht explizit auf FOX Syntax eingegangen. Folgende Operationen werden dargestellt:
Zeichenketten verschieben
Zeichenketten ersetzen
Zeichenketten verdichten
Zeichenketten zusammenziehen
Zeichenketten zerlegen
Direkte Positionierung (Substring)
In unserem Beispiel benutzen wir eine (fiktive) Telefonnummer des Telefonerfinders Phillip Reis. Dabei werden folgende Zeichenketten deklariert:
DATA telefon TYPE n LENGTH 8 VALUE '998877'.
DATA national_vorwahl TYPE n LENGTH 5 VALUE '04321'.
DATA international_vorwahl TYPE c LENGTH 5 VALUE '+49'.
DATA telefon_international TYPE c LENGTH 25.
Die Deklaration kann auch mithilfe eines Kettensatzes DATA: x TYPE n, y TYPE c erfolgen.
Nun haben wir das Feld Telefon als numerische Zeichenkette mit acht Stellen deklariert und mit dem Startwert 998877 belegt. Wenn wir jedoch dieses Feld zu lesen versuchen, würden wir 00998877 als Wert bekommen. Denn der Initialwert einer achtstelligen nummerischen Zeichenkette sind acht Nullen. Der sechsstellige Startwert von 998877 überschreibt sechs Nullen rechtsbündig, links bleiben aber zwei führende Nullen. Wenn wir nun 00998877 anrufen, würden wir unseren Wunschteilnehmer nicht erreichen. Deshalb müssen wir die beiden führenden Nullen mit einer String-Operation löschen
Zeichenketten verschieben
Eine Alternative wäre, die Zeichenkette nach links zu verschieben, bis die führenden Nullen verschwunden sind. Die Anweisung lautet dann:
SHIFT telefon LEFT DELETING LEADING '0'.
Durch die SHIFT
-Anweisung wird der Feldinhalt, in userem Falle die Zeichenkette 00998877, so lange nach links verschoben, bis alle führenden NullHen gelöscht sind.
Wenn wir uns den Feldinhalt nach der Operation im Debugger anschauen, so lautet der hexadezimaler Wert 38003800370037003600360020002000
, also 998877▢▢. Das Feld wird demnach rechts mit zwei Leerzeichen aufgefüllt.
Natürlich könne Sie auch die Zeichenkette in eine bestimme Richtung um eine bestimmte Anzahl Positionen verschieben. Wenn Sie die Telefonnummer wieder um zwei Stellen nach rechts rücken möchten, schreiben Sie:
SHIFT telefon BY 2 PLACES RIGHT.
Anschließend lautet der Feldinhalt ▢▢998877. Beim Verschieben von Feldinhalten können Sie sich ein Bücherregal vorstellen: Wenn Sie auf einem Brett die Bücher zu weit zu einer Seite hin verschieben, fallen die äußersten Bücher herunter. Bei Feldinhalten gilt dasselbe Prinzip: Schieben Sie den Feldinhalt über den linken oder rechten Rand hinaus, gehen Zeichen unwiederbringlich verloren.
Zeichenketten ersetzen
Oft müssen Sie auch bestimmte Zeichen oder Zeichengruppen finden und ersetzen. Diese Aufgabe können Sie mit der REPLACE
-Anweisung erledigen.
Das Feld telefon_international ist vom Typ c, ist 25-stellig und hat den Inhalt ▢▢998877. Das führende Leerzeichen wird nun durch den Inhalt des Feldes national_vorwahl ersetzt.
DATA international_vorwahl TYPE c LENGTH 5 VALUE '+49'.
DATA telefon_international TYPE c LENGTH 25.
telefon_international = ' 998877'.
Hierzu verwenden Sie folgenden Befehl:
REPLACE ' ' IN telefon_international
WITH national_vorwahl.
Die REPLACE
-Anweisung sucht und ersetzt das erste Auftreten des Suchbegriffs, der hier Leerzeichen lautet. Damit das Leerzeichen als solches behandelt wird, wird das Leerzeichen anstelle der sonst üblichen Hochkommen in Backquotes eingeschlossen. Das Feld telefon_international hat nun den Inhalt 04321▢998877. Das erste Leerzeichen wurde durch die nationale Vorwahlnummer ersetzt, das zweite Leerzeichen bleibt erhalten und steht jetzt zwischen der nationalen Vorwahl und der Ortstelefonnummer.
Zum besseren Verständnis soll noch ein zweites Beispiel angeführt werden. Sie möchten nun im String 04321▢998877 die führende Null durch die internationale Vorwahl sowie eine eingeklammerte Null ersetzen, für Deutschland also +49-(0). Die Anweisung lautet dann:
REPLACE '0' IN telefon_international
WITH '+49-(0)'.
Das Ergebniss lautet +49-(0)4321▢998877.
Wenn wir nun das verbliebene Leerezeichen durch ein Minuszeichen ersetzen wollen, lautet die Anweisung:
REPLACE ' ' IN telefon_international
WITH '-'.
Dieser Befehl sucht ein Leerzeichen, findet es erstmals im Feld an Position 12 und tauscht es gegen ein Minuszeichen aus. Der Feldinhalt lautet nun +49-(0)4321-998877.
Mit SAP NetWeaver 7.0 EHP2 steht unter anderem eine neue REPLACE
-Funktion zur Verfügung:
telefon_international = REPLACE
( val = '04321-998877'
sub = '0'
with = '+49-(0)-'
occ = 0 ).
Diese Anweisung ersetzt in der Zeichenkette 04321-998877 alle Vorkommnisse des Suchstrings 0 mit +49-(0)- und weist das Ergebnis der Variablen telefon_international zu. Wenn Sie sichergehen wollen, dass anstatt aller Vorkommen nur die erste Null ersetzt wird, können Sie für den Parameter occ auch den Wert 1 übergeben.
In langen Textfeldern finden sich oft überflüssige Leereichen. Und auch durch String-Operationen können in längeren Zeichenketten Leerzeichen entstehen. Sie können nun in einem Feld die Teil-Strings zusammenziehen, dass alle überflüssigen Leerzeichen verschwinden oder aber die Zeichenketten mehrerer Felder in einem Feld sammeln und dann verdichten.
Zunächst wird die erste Möglichkeit betrachtet:
Zeichenketten verdichten
Angenommen unser Feld telefon_international hat den Inhalt +49▢-(0)4321▢▢998877.
telefon_international = '+49 -(0)4321 998877'.
Mit der CONDENSE
-Anweisung können Sie die drei Teile so weit zusammenziehen, dass zwischen den einzelnen Teilen nur noch ein Leerzeichen bestehen bleibt. Dabei ist es egal, wie viele Leerzeichen davor dazwischen standen. Sollen auch die verbliebenen Leerzeichen weg, lautet die Anweisung:
CONDENSE telefon_international NO-GAPS.
Der Feldinhalt wird auf +49-(0)4321998877 korrigiert.
Es gibt aber einen weiteren Weg, um Zeichenkettenfelder in frei wählbarer Reihenfolge in ein Zielfeld zu schreiben:
Zeichenketten zusammenziehen
Nehmen wir an, Sie wollen die Inhalte der Felder international_vorwahl, national_vorwahl und telefon in genau dieser Reihenfolge in das Feld telefon_international schreiben. Dazu verwenden Sie die Anweisung CONCATENATE
:
CONCATENATE international_vorwahl
national_vorwahl
telefon
INTO
telefon_international.
Dabei wereden führende Leerzeichen übernommen. Schließende Leerzeichen werden bei Quellfeldern vom Typ c ignoriert, bei Quellfeldern vom Typ string aber übernommen.
In unserem Beispiel hat das Feld international_vorwahl den Inhalt +49, das Feld national_vorwahl den Inhalt 04321 und das Feld telefon den Inhalt 998877. Somit lautet nach der Operation der Inhalt des Zielfeldes telefon_international +4904321998877.
Zwecks besserer Lesbarkeit sollen die einzelnen Bestandteile durch ein Minuszeichen getrennt werden. In diesem Fall lautet der Befehl:
CONCATENATE international_vorwahl
national_vorwahl
telefon
INTO
telefon_international
SEPARATED BY '-'.
Das Ergebnis sieht nun wie folgt aus +49-04321-998877.
Zeichenketten zerlegen
Es ist auch der umgekehrte Fall denkbar. So sollen etwa eine große Zeichenkette zerlegt oder Teile der Zeichenkette in ein eigenes Feld geschrieben werden. Sie möchten nun die internationale Telefonnummer +49-04321-998877 in ihre Bestandteile zerlegen.
Die SPLIT
-Anweisung teilt eine Zeichenkette auf mehrere Felder auf:
SPLIT telefon_international AT '-'
INTO
international_vorwahl
national_vorwahl
telefon.
Mit diesem Befehl wird das Feld telefon_international bei der Trennzeichenkette zerlegt. Die Trennzeichenkette folgt dem Zusatz AT und kann entweder der Inhalt eines Feldes sein, das als Variable geschrieben wird, oder wie in unserem Beispiel ein Literal.
Direkte Positionierung (Substring)
Manchmal muss in eine Zeichenkette an einer bestimmten Position in einer bestimmten Länge etwas hineingeschrieben, oder im umgekehrten Fall ab einer bestimmten Position Zeichen in einer bestimmten Länge herausgelesen werden.
Im Gegensatz zu vielen anderen höheren Programmiersprachen gibt es in ABAP keinen Substring Befehl (in FOX lautet die Anweisung SUBSTR
). Die ABAP Syntax lautet feldname+start_position(zeichenlänge).
Angenommen, das Feld telefon_international hat den Inhalt +49-(0)4321-998877. Wir wissen, dass bei der internationalen Telefonnummer die ersten drei Zeichen immer die internationale Vorwahlnummer bilden. Daher können wir auf diese drei Zeichen direkt durch Positionierung und Längenangabe zugreifen. Die so herausgelesene Zeichenkette wird in das Zielfeld international_vorwahl gestellt. Dafür benutzen wir die folgende Syntax:
international_vorwahl = telefon_international+0(3).
Umgangssprachlich lautet die Anweisung, dass der neue Inhalt des Zilfeldes international_vorwahl dem Inhalt des Quellfeldes entspricht, und zwar ab Position 0 in der Länge von drei Zeichen. Das Ergebnis lautet somit +49.
Häufig liegt der gesuchte Teil-String irgendwo in der Mitte der Zeichenkette, dann müssen Sie die Anfangsposition und die Länge des gesuchten Teils kennen. Wir wissen, dass die nationale Vorwahl immer nach der Position 4 beginnt und eine Länge von sieben Zeichen hat. Sie übertragen also die Zeichen der Stellen 5,6,7,8,9,10 und 11. Die Anweisung hierfür lautet:
national_vorwahl = telefon_international+4(7).
Hat das Zielfeld den Typ c, hat es nach der Anweisung den Inhalt (0)4321. Ist es jedoch ein Feld vom Typ n, so hat es den Inhalt 04321, da beim Datentyp n die Klammern als alphanumerische Zeichen ignoriert werden.
Mit der selben Logik können Sie auch Zeichen in einer Kette manipulieren. Wenn Sie nun die internationale Vorwahl 49 durch 33 ersetzen möchten, dann schreiben Sie:
telefon_international+1(2) = '33'.
Wir wollen, dass die erste Stelle, also das Pluszeichen, auch bei der neuen internationalen Vorwahl bestehen bleibt. Daher ersetzen wird hinter der Stelle 1 die Stellen 2 und 3 des Feldes telefon_international durch das Literal ’33‘.
Diese ABAP Tricks machen Ihr Leben leichter!
- In meinem Newsletter gebe ich eine Menge Tipps und Kniffe rund um ABAP.
- Die Mini-Tutorials unterstützen Sie dabei, Software in ABAP effizienter zu entwickeln.
- Praktische Anleitungen ermöglichen Ihnen schnelle Erfolge bei der Optimierung Ihrer Arbeit.
- Bei der Anmeldung zu meinem Newsletter erhalten Sie das Buch „ABAP Tipps und Tricks“ als Willkommensgeschenk.
Quellen:
Karl-Heinz Kühnhauser, Thorsten Franz (2011): Discover ABAP, 3. Auflage, Bonn
https://delphi.programmieren.vias.org/dkk_asciitable.html
https://www.dolcevie.com/js/converter.html
Falls Ihnen dieser Beitrag weitergeholfen hat, wäre es eine sehr nette Anerkennung meiner Arbeit wenn Sie z.B. Ihre Bücher über Amazon bestellen würden. Wenn Sie ein Produkt kaufen, erhalte ich dafür eine Provision. Für Sie ändert sich am Preis des Produktes gar nichts. Ich möchte mich an dieser Stelle jetzt schon für Ihre Unterstützung bedanken.
Das Beispiel REPLACE IN telefon_international WITH ‚-‚.
funktioniert so nicht, da es einen Syntaxfehler gibt.
Feld IN unbekannt.
Danke Kai, die Formatierung hat den Code zerhauen. Sollte natürlich REPLACE ‚ ‚ IN telefon_international heißen.