5.3 Codebeispiel zu String-Operationen 

Das folgende Beispiel fügt alles zusammen:
1 *&---------------------------------------------*
2 *& Report Z_TEILNEHMERLISTE03 *
3 *& *
4 *&---------------------------------------------*
5 *& *
6 *& *
7 *& *
8 *&---------------------------------------------*
9
10 REPORT z_teilnehmerliste03 .
11
12
13 * Zeichenketten deklarieren
14 DATA: geschlecht TYPE c length 1 VALUE 'W',
15 familienname TYPE zteilnehmer-tname,
16 telefon TYPE n LENGTH 8 VALUE '887766',
17 national_vorwahl TYPE n LENGTH 5 VALUE '09876',
18 international_vorwahl TYPE c LENGTH 5 VALUE '+49',
19 telefon_international TYPE c LENGTH 25.
20
21
22 * Kontrollausgabe der ursprünglichen Feldinhalte
23 WRITE / 'ursprüngliche Feldinhalte'.
24 WRITE: 30 telefon,
25 40 national_vorwahl,
26 50 international_vorwahl,
27 60 telefon_international.
28 ULINE.
29 * SHIFT-Anweisung
30 WRITE / 'Shift'.
31 SHIFT telefon LEFT DELETING LEADING '0'.
32 WRITE 30 telefon.
33 SHIFT telefon BY 2 PLACES RIGHT.
34 WRITE /30 telefon.
35 ULINE.
36 * REPLACE-Anweisung
37 WRITE / 'Replace'.
38 telefon_international = ' 887766'.
39 REPLACE ` ` IN telefon_international
WITH national_vorwahl.
40 WRITE 60 telefon_international.
41 REPLACE '0' IN telefon_international
WITH '+49-(0)'.
42 WRITE /60 telefon_international.
43 REPLACE ` ` IN telefon_international
WITH `-`.
44 WRITE /60 telefon_international.
45 ULINE.
46 * CONDENSE-Anweisung
47 WRITE / 'Condense'.
48 telefon_international = '+49 -(0)9876 887766'.
49 CONDENSE telefon_international.
50 WRITE 60 telefon_international.
51 CONDENSE telefon_international NO-GAPS.
52 WRITE /60 telefon_international.
53 ULINE.
54 * CONCATENATE-Anweisung
55 WRITE / 'Concatenate'.
56 telefon = '887766'.
57 SHIFT telefon LEFT DELETING LEADING '0'.
58 telefon_international = space.
59 CONCATENATE international_vorwahl
national_vorwahl
telefon
60 INTO
61 telefon_international
62 SEPARATED BY '-'.
63 WRITE 60 telefon_international.
64 ULINE.
65 * SPLIT-Anweisung
66 WRITE / 'Split'.
67 international_vorwahl = space.
68 national_vorwahl = space.
69 telefon = space.
70 SPLIT telefon_international AT '-'
71 INTO
72 international_vorwahl
national_vorwahl
telefon.
73 WRITE: 30 telefon,
74 40 national_vorwahl,
75 50 international_vorwahl.
76 ULINE.
77 * Direktes Positionieren
78 WRITE / 'Direktes Positionieren'.
79 international_vorwahl = space.
80 international_vorwahl =
telefon_international(3).
81 WRITE 50 international_vorwahl.
82 telefon_international = '+49-(0)9876-887766'.
83 national_vorwahl = space.
84 national_vorwahl = telefon_international+4(7).
85 WRITE 40 national_vorwahl.
86 telefon_international+1(2) = '33'.
87 WRITE 60 telefon_international.
Listing 5.1 Report Z_TEILNEHMERLISTE03
Anmerkungen zum Quellcode
Gehen wir den Quellcode einmal durch. Der Report beginnt mit der Deklaration der Zeichenkette.
Zeile 14 bis 19
In der Praxis müssen Sie bei der Konzeption der Felder und Datentypen im Vorfeld gründlich analysieren, welcher Datentyp am ehesten den fachlichen Anforderungen entspricht. Fehler in der Konzeption rächen sich später immer. In unserem Beispiel in Listing 5.1 wurde davon ausgegangen, dass die örtliche Telefonnummer und die nationale Vorwahlnummer ausschließlich numerisch sind. Bei der internationalen Vorwahl ist hingegen ein Pluszeichen enthalten, und die gesamte internationale Telefonnummer kann Trennzeichen wie Schrägstiche, Klammern oder Minuszeichen für die bessere Lesbarkeit enthalten. Deshalb müssen die internationale Vorwahl und die gesamte internationale Telefonnummer vom Typ c sein.
Zeile 23 bis 28
Diese Anweisungen dienen der Ausgabe der Liste. Aus Gründen der Übersichtlichkeit soll der Inhalt des Feldes TELEFON in der Zeile an Position 30 beginnen, der Inhalt des Feldes NATIONAL_VORWAHL an Position 40, INTERNATIONAL_VORWAHL und TELEFON_INTERNATIONAL entsprechend ab Spalte 50 und 60. Die Liste wird schließlich durch waagerechte Linien – hier und später – in überschaubare Themenbereiche aufgeteilt.
Zeile 31
Die Zeichenkette im numerischen Feld wird nach links verschoben, um die führenden Nullen zu entfernen. Je nach fachlicher Anforderung hätte man diese Aufgabe auch anders lösen können; aber wir sind ja noch in der Übungsphase.
Zeile 33
Der Inhalt des Feldes wird um zwei Stellen nach rechts verschoben; die ersten beiden Stellen bleiben Leerzeichen.
Zeile 38
Das Literal ' 887766' wird der neue Inhalt des Feldes. Für das folgende Beispiel sind die beiden führenden Leerzeichen links wichtig.
Zeile 39
Das erste Leerzeichen wird durch den Inhalt des Feldes NATIONAL_VORWAHL ersetzt. Dies funktioniert nur, weil der Suchbegriff durch die Backquotes vom Typ string ist und somit das darin enthaltene Leerzeichen beachtet wird.
Zeile 41
Im Feld wird das Zeichen '0' an der Stelle ersetzt, an der es, von links aus betrachtet, zum ersten Mal auftritt, und zwar durch das Literal '+49-(0)'.
Zeile 43
Im Feld wird das Leerzeichen ` ` durch das Minuszeichen `-` an der ersten Fundstelle ersetzt. Auch hier arbeiten wir wieder mit einem String-Literal, damit das Leerzeichen nicht ignoriert wird, da es sonst nur eine Fundstelle vor der gesamten Zeichenkette gäbe.
Zeile 48
Das Feld TELEFON_INTERNATIONAL erhält für die Übung den definierten Inhalt '+49 -(0)9876 887766'. Im Feld befinden sich insgesamt drei Leerzeichen.
Zeile 49
Die Teil-Strings im Feld werden so weit zusammengezogen, dass sie jeweils nur noch ein Leerzeichen trennt.
Zeile 51
Auch die restlichen Leerzeichen im Feld werden eliminiert und die Teil-Strings lückenlos zusammengezogen.
Zeile 56 und 57
Mit bekannten Mitteln wird der Inhalt des Feldes auf den Ausgangswert für die Übung gesetzt.
Zeile 58
Das Feld TELEFON_INTERNATIONAL wird mit Leerzeichen gefüllt. Im Beispiel wird dafür das reservierte Wort SPACE verwendet, das mit dem Textfeldliteral ' ' und damit mit dem Textfeldliteral '' äquivalent ist und den Effekt hat, dass das Feld TELEFON_INTERNATIONAL nach der Zuweisung einen initialen, leeren Wert hat.
Zeile 59 bis 62
Die Anweisung erstreckt sich über vier Zeilen. Sie füllt das leere Feld TELEFON_INTERNATIONAL mit den Inhalten der Felder INTERNATIONAL_VORWAHL, NATIONAL_VORWAHL und TELEFON in der Reihenfolge, wie sie im Kommando geschrieben werden. Dabei werden im Zielfeld die Teil-Strings zur besseren Lesbarkeit durch ein Minuszeichen getrennt.
Zeile 67 bis 69
Die Felder werden für die Übung durch Zuweisung eines Leerzeichens initialisiert.
Zeile 70 bis 72
Der Inhalt des Feldes TELEFON_INTERNATIONAL wird nach dem Trennzeichen '-' durchsucht. Das Feld enthält dieses Trennzeichen an zwei Stellen; hierdurch ergeben sich drei Teil-Strings. Diese werden in die Zielfelder geschrieben, und zwar in der Reihenfolge, in der die Felder als Stellungsoperanden bei der Anweisung stehen.
Zeile 73 bis 75
Die zuvor mit Leerzeichen belegten Felder sind jetzt mit den Teil-Strings belegt und werden positionsgerecht in die Liste geschrieben.
Zeile 80
Das Feld INTERNATIONAL_VORWAHL wird mit den ersten drei Zeichen des Feldes TELEFON_INTERNATIONAL gefüllt.
Zeile 84
Aus dem Feld TELEFON_INTERNATIONAL werden nach Stelle 4 sieben Zeichen, nämlich die der Positionen 5, 6, 7, 8, 9, 10 und 11 kopiert, und das System versucht, diese Zeichen in das Feld NATIONAL_VORWAHL zu übertragen. Das Quellfeld ist vom Datentyp c, und an den Stellen 5 und 7 stehen Klammern. Beim Zielfeld handelt es sich um ein Feld vom Datentyp n, das keine Ziffern und Sonderzeichen akzeptiert. Durch die automatische Typkonvertierung werden nur die numerischen Zeichen in das Zielfeld übertragen.
Zeile 86
Im Feld TELEFON_INTERNATIONAL werden die Inhalte der Stellen 2 und 3 durch den Inhalt des Literals '33' überschrieben.
Ausgabe des Quellcodes
Am Anfang der Liste werden zur Kontrolle die Ursprungswerte der Felder ab Position 30 ausgegeben. Das Feld TELEFON hat dabei zwei führende Nullen; das Feld TELEFON_INTERNATIONAL ist noch leer (siehe Abbildung 5.1).
Abbildung 5.1 Listbild zu Z_TEILNEHMERLISTE03
Im zweiten Abschnitt wurde die Zeichenkette zuerst nach links, dann nach rechts verschoben. Die Ergebnisse der REPLACE-Anweisung sind im dritten Abschnitt zu sehen: Zuerst wurde die führende Null durch die internationale Vorwahl ersetzt, anschließend das Leerzeichen durch ein Minuszeichen. Die CONDENSE-Anweisung im vierten Abschnitt hat die Leerzeichen aus der Zeichenkette entfernt; das CONCATENATE-Kommando im fünften Abschnitt hat eine durch Minuszeichen aufgeteilte Zeichenkette zusammengesetzt. Mit der SPLIT-Anweisung wurde diese Zeichenkette wieder auf drei Felder verteilt, und der letzte Abschnitt zeigt schließlich, wie durch direktes Positionieren aus der internationalen Vorwahl 49 eine 33 wird.