10.7 Codebeispiel zu CASE 

Als Nächstes sehen wir uns ein Codebeispiel zur CASE-Anweisung genauer an.
1 *&---------------------------------------------*
2 *& Report Z_TEILNEHMERLISTE10_CASE *
3 *& *
4 *&---------------------------------------------*
5 *& *
6 *& *
7 *&---------------------------------------------*
8
9 REPORT z_teilnehmerliste10_case.
10
11 * Workarea deklarieren
12 DATA: wa_zteilnehmer02 TYPE zteilnehmer02.
13
14 * Zeichenketten deklarieren
15 DATA: tz_pc_grundlagen TYPE i,
16 tz_netzwerktechnik TYPE i,
17 tz_sonst 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
32 * Alle Sätze der Tabelle lesen, Anzahl der
Kursteilnehmer aufteilen mit CASE
33 SELECT * FROM zteilnehmer02 INTO wa_zteilnehmer02.
34 CASE wa_zteilnehmer02-zzkurstitel.
35 WHEN 'Netzwerktechnik'.
36 tz_netzwerktechnik = tz_netzwerktechnik + 1.
37 WHEN 'PC-Grundlagen'.
38 tz_pc_grundlagen = tz_pc_grundlagen + 1.
39 WHEN OTHERS.
40 tz_sonst = tz_sonst + 1.
41 ENDCASE.
42 ENDSELECT.
43 SKIP.
44 WRITE: / 'Verteilung der Personen auf die Kurse:',
45 / tz_netzwerktechnik, 'Netzwerktechnik',
46 / tz_pc_grundlagen, 'PC-Grundlagen',
47 / tz_sonst, 'sonstige Kurse'.
48
49 * Wieder benötigte Zähler initialisieren
50 CLEAR: tz_netzwerktechnik.
51
52 * sy-subrc der SELECT-Anweisung mit
CASE auswerten
53 SELECT * FROM zteilnehmer02 INTO wa_zteilnehmer02
54 WHERE zzkurstitel = 'Netzwerktechnik'.
55 tz_netzwerktechnik = tz_netzwerktechnik + 1.
56 ENDSELECT.
57 SKIP.
58 CASE sy-subrc.
59 WHEN 0.
60 * Okay-Fall
61 WRITE: / tz_netzwerktechnik, 'Teilnehmer für
den Kurs Netzwerktechnik gefunden'.
62 WHEN 4.
63 * Fehlerfall
64 WRITE: / 'keine Teilnehmer für den Kurs
Netzwerktechnik gefunden'.
65 WHEN OTHERS.
66 * Kann nicht sein, anderer sy-subrc von der
Anweisung nicht geliefert
67 ENDCASE.
Listing 10.4 Report Z_TEILNEHMERLISTE10_CASE
Anmerkungen zum Quellcode
Die ersten Codezeilen entsprechen weitgehend dem Beispiel aus Listing 10.3.
Zeile 33 bis 42
Alle Sätze der Teilnehmertabelle werden gelesen. Je nach Feldinhalt des Kurstitels werden die Zähler für die verschiedenen Kurse »Netzwerktechnik«, »PC-Grundlagen« und für sonstige Kurse hochgezählt.
Zeile 44 bis 47
Nach der SELECT-Schleife werden die Gruppensummen ausgegeben. Dabei gilt wieder das Prinzip, in der Schleife die Summen hochzuzählen und nach der Schleife die Summen auszugeben.
Zeile 50
Das Feld für die Gruppensumme der Teilnehmer am Kurs »Netzwerktechnik« wird im nächsten Abschnitt noch einmal gefüllt und muss deshalb initialisiert werden.
Zeile 53 bis 56
In der Tabelle werden alle Sätze gelesen, die die Bedingung erfüllen, dass im Feld für den Kurstitel »Netzwerktechnik« enthalten ist. Der Inhalt der Tabelle wird so manipuliert, dass einmal Treffer erzielt werden und in einem anderen Programmlauf keine Treffer erzielt werden können.
Zeile 58 bis 67
Unmittelbar nach der SELECT-Anweisung wird der Returncode dieser Anweisung über die CASE-Struktur ausgewertet. Die Auswertung des Returncodes muss immer unmittelbar nach dem Kommando erfolgen, dessen Returncode überprüft werden soll. Steht zwischen der CASE-Struktur ab Zeile 58 und dem Kommando ENDSELECT in Zeile 56, für das der Returncode ausgewertet werden soll, ein anderes Kommando, das seinerseits auch einen Returncode liefert, entsteht ein Problem – Sie sollten dann mit der CASE-Struktur den »falschen« Returncode abfragen. Am sichersten ist es, wenn dazwischen überhaupt keine andere Anweisung mehr steht oder – wie in unserem Beispiel – eine Anweisung, die SY-SUBRC nicht füllt. Das Kommando SKIP gehört in diesem Fall glücklicherweise zu dieser Gruppe.
Die CASE-Struktur im Beispiel unterscheidet den Okay-Fall und einen Fehlerfall. Hat der SY-SUBRC den Inhalt 0, hat das Lesen in der Tabelle Treffersätze erzielt. Für diese Treffersätze werden die Anweisungen im ersten Anweisungsblock verarbeitet. Der Anweisungsblock besteht im Beispiel nur aus einer Anweisung, könnte aber später auch ein Unterprogrammaufruf oder Ähnliches sein und die »normale« Verarbeitung abbilden.
In der CASE-Struktur wird als Fehlerfall berücksichtigt, dass SY-SUBRC den Inhalt 4 hat. Die SELECT-Anweisung liefert diesen Returncode zurück, wenn beim Lesen der Tabelleneinträge kein Treffer erzielt werden konnte. In unserem Beispiel gibt es keinen Satz, bei dem im Feld für die Kursbezeichnung »Netzwerktechnik« steht; entsprechende Tabelleneinträge wurden vor dem Programmstart gelöscht.
Folglich wird der Anweisungsblock für SY-SUBRC mit dem Inhalt 4 durchlaufen. In diesem Beispiel besteht die Fehlerbehandlung nur in einer anderen Listausgabe; in der Praxis kann die Fehlerbehandlung ähnlich umfangreich wie die »normale« Verarbeitung sein.
Ausgabe des Quellcodes
Im oberen Teil beider Listbilder sehen Sie den Tabelleninhalt wieder vollständig aufgelistet. In Abbildung 10.7 sind zwei Teilnehmer für den Kurs »Netzwerktechnik« vorhanden; deshalb endet die dritte SELECT-Anweisung mit dem Returncode 0, und die »normale« Verarbeitung wird durchlaufen, die die letzte Zeile in der Liste erstellt.
Abbildung 10.7 Listbild zum CASE-Beispiel – mit Returncode 0 der dritten SELECT-Anweisung
Beim zweiten Listbild in Abbildung 10.8 sehen Sie, dass keine Teilnehmer mehr für den Kurs »Netzwerktechnik« in der Tabelle vorhanden sind. Die dritte SELECT-Anweisung endet deshalb mit dem Returncode 4, und der Anweisungsblock für diesen Fehlerfall wird prozessiert. In der letzten Zeile erfolgt die Ausgabe, dass keine passenden Teilnehmer gefunden wurden.
Abbildung 10.8 Listbild zum CASE-Beispiel – mit Returncode 4 der dritten SELECT-Anweisung