10.8 Codebeispiel zu DO und Abbruchbedingungen 

In diesem Abschnitt sehen wir uns die Verwendung der DO-Schleife und den Einsatz der verschiedenen Abbruchbedingungen am Beispiel des Reports Z_TEILNEHMERLISTE10_DO an.
1 *&---------------------------------------------*
2 *& Report Z_TEILNEHMERLISTE10_DO *
3 *& *
4 *&---------------------------------------------*
5 *& *
6 *& *
7 *&---------------------------------------------*
8
9 REPORT z_teilnehmerliste10_do.
10
11 * Workarea deklarieren
12 DATA: wa_zteilnehmer02 TYPE zteilnehmer02.
13
14 * Felder deklarieren
15 DATA: min TYPE i,
16 sek TYPE i,
17 std TYPE i.
18
19 * Vollständigen Tabelleninhalt ausgeben
20 SELECT * FROM zteilnehmer02 INTO wa_zteilnehmer02
21 ORDER BY PRIMARY KEY.
22 WRITE: / wa_zteilnehmer02-tnummer,
23 wa_zteilnehmer02-tname,
24 wa_zteilnehmer02-tgeburtsdatum,
25 wa_zteilnehmer02-tgeschlecht,
26 wa_zteilnehmer02-tkurspreis,
27 wa_zteilnehmer02-twaehrung,
28 wa_zteilnehmer02-zzkfztyp,
29 wa_zteilnehmer02-zzkurstitel.
30 ENDSELECT.
31 SKIP.
32
33 * Schleife über alle Sätze der Tabelle,
mit Bedingung
34 SELECT * FROM zteilnehmer02 INTO wa_zteilnehmer02
35 ORDER BY PRIMARY KEY.
36 IF wa_zteilnehmer02-tgeburtsdatum LT '19700101'.
37 CONTINUE.
38 ENDIF.
39 WRITE: / wa_zteilnehmer02-tnummer,
40 wa_zteilnehmer02-tname,
41 wa_zteilnehmer02-tgeburtsdatum,
42 wa_zteilnehmer02-tgeschlecht,
43 wa_zteilnehmer02-tkurspreis,
44 wa_zteilnehmer02-twaehrung,
45 wa_zteilnehmer02-zzkfztyp,
46 wa_zteilnehmer02-zzkurstitel.
47 ENDSELECT.
48 SKIP.
49
50 SELECT * FROM zteilnehmer02 INTO wa_zteilnehmer02
51 ORDER BY PRIMARY KEY.
52 CHECK wa_zteilnehmer02-tgeschlecht = 'W'.
53 WRITE: / wa_zteilnehmer02-tnummer,
54 wa_zteilnehmer02-tname,
55 wa_zteilnehmer02-tgeburtsdatum,
56 wa_zteilnehmer02-tgeschlecht,
57 wa_zteilnehmer02-tkurspreis,
58 wa_zteilnehmer02-twaehrung,
59 wa_zteilnehmer02-zzkfztyp,
60 wa_zteilnehmer02-zzkurstitel.
61 ENDSELECT.
62 SKIP.
63
64 * Ablauflogik für Zeitmesser mit Abbruch
durch EXIT
65 WRITE: / std, min, sek. "sy-index.
66 SKIP.
67
68 DO 24 TIMES.
69 IF sy-index = 3.
70 EXIT.
71 ENDIF.
72 min = 0.
73 DO 60 TIMES.
74 IF sy-index = 3.
75 EXIT.
76 ENDIF.
77 sek = 0.
78 DO 60 TIMES.
79 WRITE: / std, min, sek.
80 sek = sek + 1.
81 IF sy-index = 3.
82 EXIT.
83 ENDIF.
84 ENDDO.
85 min = min + 1.
86 ENDDO.
87 std = std + 1.
88 ENDDO.
89 SKIP.
90 WRITE: / std, min, sek.
91
92 * Programmabbruch
93 EXIT.
94
95 WRITE: / std, min, sek.
96 SKIP.
97
98 * Ablauflogik für Zeitmesser mit 24 Stunden,
Minuten und Sekunden
99 DO 24 TIMES.
100 min = 0.
101 DO 60 TIMES.
102 sek = 0.
103 DO 60 TIMES.
104 WRITE: / std, min, sek.
105 sek = sek + 1.
106 ENDDO.
107 min = min + 1.
108 ENDDO.
109 std = std + 1.
110 ENDDO.
111 SKIP.
112
113 WRITE: / std, min, sek.
Listing 10.5 Report Z_TEILNEHMERLISTE10_DO
Anmerkungen zum Quellcode
Man kann es nicht oft genug wiederholen: Bei Literalen ist die Unterscheidung zwischen Groß- und Kleinschreibung und die Einhaltung der Form enorm wichtig. Beispielsweise prüfen Sie den Geschlechtsschlüssel für einen männlichen Teilnehmer formal mit M. Steht im Feld versehentlich m, wird dieser Satz in der Bedingung anders behandelt. Entsprechende Pingeligkeit ist deshalb bei allen Literalen notwendig, die gegen Datumsfelder geprüft werden, oder auch bei Zeichenketten.
[»] Für alle Schleifen
Die beschriebenen Abbruchbedingungen laufen grundsätzlich in allen ABAP-Schleifen. Wird die Wirkung einer Abbruchbedingung in einer Schleife beschrieben, gilt dies sinngemäß auch für die anderen ABAP-Schleifen.
Zeile 34 bis 47
Alle Sätze der Tabelle werden gelesen. Für jeden der gelesenen Sätze werden die folgenden Schritte durchgeführt: In Zeile 36 wird die Bedingung geprüft, ob ein Geburtsdatum kleiner als das genannte Datum ist, d. h. früher als der 01.01.1970 liegt. Ist diese Bedingung erfüllt, wird die Verarbeitung dieses Satzes abgebrochen und der nächste Satz gelesen. In den Verarbeitungsblock zwischen Zeile 39 und Zeile 46 gelangt ein Satz nur dann, wenn das Geburtsdatum größer als das genannte Datum ist, d. h. später als der 01.01.1970 liegt. Ist das Geburtsdatum genau der 01.01.1970, läuft der Satz ebenfalls in den Verarbeitungsblock zwischen Zeile 39 und Zeile 46.
Zeile 50 bis 61
Wieder werden in einer Schleife alle Sätze der Tabelle gelesen. In Zeile 52 wird beim aktuell gelesenen Satz geprüft, ob im Feld GESCHLECHT der Geschlechtsschlüssel W steht. Ist dies der Fall, werden die nachstehenden Anweisungen in den Zeilen 53 bis 60 durchlaufen; anderenfalls wird die Verarbeitung des Satzes abgebrochen und der nächste Satz gelesen. Mit anderen Worten: Die Anweisungen in den Zeilen 53 bis 60 werden nur von den Sätzen für die weiblichen Teilnehmer durchlaufen; Sätze männlicher Teilnehmer werden nicht verarbeitet.
Zeile 68 bis 88
Die Abbruchsteuerung über SY-INDEX verhindert, dass die Schleifen für die Stunden, Minuten und Sekunden wirklich 24-mal bzw. 60-mal durchlaufen werden. Zur Demonstration wird in jeder Schleife der Durchlauf beendet und die Schleife verlassen, sobald der SY-INDEX den Wert 3 hat. Die Steuerung wirkt von »innen nach außen«: Sobald der SY-INDEX für die Sekundenschleife auf 3 steht, wird die Sekundenschleife beendet und mit der Minutenschleife weitergemacht. Steht bei der Minutenschleife der SY-INDEX auf 3, wird die Minutenschleife beendet und die Stundenschleife ausgeführt. Steht bei der Stundenschleife der SY-INDEX auf 3, wird auch diese Schleife beendet und das Programm mit der Anweisung in Zeile 89 fortgesetzt.
Zeile 93
Das EXIT-Kommando steht außerhalb einer Schleife. Das Programm wird sofort beendet und die Listausgabe prozessiert. Möchten Sie, dass die nachfolgenden Programmzeilen ausgeführt werden, müssen Sie Zeile 93 unwirksam machen, z. B. als Kommentarzeile.
Zeile 99 bis 110
So könnte beispielsweise die einfache Ablauflogik für die Schachtelung von Stunden, Minuten und Sekunden aussehen. Wenn Sie diesen Programmteil laufen lassen, wundern Sie sich nicht über die Laufzeit. Es dauert bekanntlich eine Idee länger, bis 86.400 Sekunden durchlaufen sind.
Ausgabe des Quellcodes
Zur besseren Nachvollziehbarkeit werden zunächst wieder alle Sätze der Tabelle aufgelistet (siehe Abbildung 10.9). Im zweiten Block der Liste sehen Sie die Sätze der Kursteilnehmer, die am 1. Januar 1970 oder danach geboren sind. Der dritte Abschnitt der Liste enthält die gelisteten Sätze für die weiblichen Teilnehmer.
Die Zahlenkolonnen im letzten Abschnitt der Liste sind die Listausgaben für Stunden, Minuten und Sekunden. Durch die Begrenzung von SY-INDEX und den Schleifenabbruch hat der Tag 2 Stunden, 1 Stunde 2 Minuten und 1 Minute 3 Sekunden.
Abbildung 10.9 Listbild zum DO-Beispiel und Abbruchbedingungen
Der Ort der Abbruchbedingung in der Schleife ist entscheidend dafür, ob die Verarbeitung in der Schleife stattfindet und wie weit; der Ort des WRITE-Kommandos in der Schleife ist maßgebend dafür, ob die zuletzt berechneten Werte noch auf die Liste geschrieben werden oder nicht. Probieren Sie es aus, die Listausgabe und die Abbruchbedingungen anders zu platzieren, und beobachten Sie die Konsequenzen. Spielen Sie ruhig ein wenig damit – Hauptsache, Sie produzieren keine Endlosschleife.
Durch das EXIT-Kommando in Zeile 93 fehlt die Listausgabe für die geschachtelten Schleifen der Stunden, Minuten und Sekunden. Die Liste wäre sonst auch ein wenig länger.