11.9 Codebeispiel zum Selektionsbild (erweiterte Form) 

Listing 11.2 zeigt den gleichen Report wie Listing 11.1, allerdings in erweiterter Form.
1 *&---------------------------------------------*
2 *& Report Z_TEILNEHMERLISTE11_B *
3 *& *
4 *&---------------------------------------------*
5 *& *
6 *& *
7 *&---------------------------------------------*
8
9 REPORT z_teilnehmerliste11_b.
10
11 * Workarea deklarieren
12 DATA: wa_zteilnehmer02 TYPE zteilnehmer02.
13
14 * Felder deklarieren
15 DATA: jahr004 TYPE i,
16 jahr100 TYPE i,
17 jahr400 TYPE i,
18 falschtnr TYPE zteilnehmer02-tnummer,
19 tnr TYPE zteilnehmer02-tnummer.
20
21 * Selektionsbild gestalten
22 PARAMETERS: sek TYPE i DEFAULT 10 OBLIGATORY,
23 initialw RADIOBUTTON GROUP rad1,
24 non_sap RADIOBUTTON GROUP rad1,
25 schaltja RADIOBUTTON GROUP rad1.
26
27 * Block auf Selektionsbild mit Rahmen und
Rahmentext
28 SELECTION-SCREEN BEGIN OF BLOCK teilnehmer WITH
FRAME TITLE text-001. "Teilnehmerdaten
29
30 * Zeile im Block mit freiem Text
31 SELECTION-SCREEN BEGIN OF LINE.
32 SELECTION-SCREEN COMMENT 24(60) text-005.
33 SELECTION-SCREEN END OF LINE.
34 SELECTION-SCREEN SKIP.
35
36 * Zeile im Block mit freiem Text und zwei Parametern
37 SELECTION-SCREEN BEGIN OF LINE.
38 SELECTION-SCREEN COMMENT (20) text-002 FOR FIELD
geschlec.
39 SELECTION-SCREEN POSITION 24.
40 PARAMETERS geschlec TYPE
zteilnehmer02-tgeschlecht OBLIGATORY
VALUE CHECK.
41 SELECTION-SCREEN COMMENT 32(16) text-004.
42 PARAMETERS kursti TYPE zteilnehmer02-zzkurstitel
DEFAULT 'SAP-Grundlagen' LOWER CASE.
43 SELECTION-SCREEN END OF LINE. 44
45 * Zeile im Block mit freiem Text und Selektionstabelle
46 SELECTION-SCREEN BEGIN OF LINE.
47 SELECTION-SCREEN COMMENT (16) text-003.
48 SELECTION-SCREEN POSITION 21.
49 SELECT-OPTIONS gebdat FOR
wa_zteilnehmer02-tgeburtsdatum NO-EXTENSION.
50 SELECTION-SCREEN END OF LINE.
51
52 * Zeile im Block mit freiem Text und Parameter
53 SELECTION-SCREEN BEGIN OF LINE.
54 SELECTION-SCREEN COMMENT (47) text-006.
55 PARAMETERS vollstli AS CHECKBOX.
56 SELECTION-SCREEN END OF LINE.
57 SELECTION-SCREEN END OF BLOCK teilnehmer.
58
59 * Parameter nach dem Block
60 PARAMETERS neutnr TYPE zteilnehmer02-tnummer.
61
62 INITIALIZATION.
63
64 * Vorschlagswert für neue Teilnehmernummer
ermitteln und in Parameter übertragen
65 SELECT * FROM zteilnehmer02 INTO wa_zteilnehmer02
66 ORDER BY PRIMARY KEY.
67 tnr = wa_zteilnehmer02-tnummer.
68 ENDSELECT.
69 tnr = tnr + 1.
70 neutnr = tnr.
71
72 AT SELECTION-SCREEN ON sek.
73 * Eingabeprüfung für Startwert Sekunden
74 IF sek < 5 OR sek > 20.
75 MESSAGE e001(zabap).
76 ENDIF.
77
78 AT SELECTION-SCREEN ON neutnr.
79 * Eingabeprüfung für neue Teilnehmernummer
80 IF neutnr < tnr.
81 falschtnr = neutnr.
82 neutnr = tnr.
83 MESSAGE e002(zabap) with falschtnr.
84 ENDIF.
85
86
87 START-OF-SELECTION.
88
89 * Rückwärtslaufender Sekundenzähler
90 WHILE sek > 0.
91 WRITE: sek.
92 sek = sek - 1.
93 ENDWHILE.
94 WRITE: / sek.
95 SKIP.
96
97 * Ankreuzfeld prüfen
98 IF NOT vollstli IS INITIAL.
99 * Vollständigen Tabelleninhalt ausgeben
100 SELECT * FROM zteilnehmer02 INTO wa_zteilnehmer02
101 ORDER BY PRIMARY KEY.
102 WRITE: / wa_zteilnehmer02-tnummer,
103 wa_zteilnehmer02-tname,
104 wa_zteilnehmer02-tgeburtsdatum,
105 wa_zteilnehmer02-tgeschlecht,
106 wa_zteilnehmer02-tkurspreis,
107 wa_zteilnehmer02-twaehrung,
108 wa_zteilnehmer02-zzkfztyp,
109 wa_zteilnehmer02-zzkurstitel.
110 ENDSELECT.
111 SKIP.
112 ENDIF.
113
114 * Radiobutton initialw prüfen
115 IF NOT initialw IS INITIAL.
116 * Schleife über alle Sätze der Tabelle,
Feld auf Intitialwert hin prüfen
117 SELECT * FROM zteilnehmer02 INTO wa_zteilnehmer02
ORDER BY PRIMARY KEY.
118 IF wa_zteilnehmer02-tgeburtsdatum IS INITIAL.
119 WRITE: / 'TNr.', wa_zteilnehmer02-tnummer,
wa_zteilnehmer02-tname,
120 'fehlt Geburtsdatum, bitte nachtragen'.
121 ENDIF.
122 ENDSELECT.
123 SKIP.
124 ENDIF.
125
126 * Schleife über alle Sätze der Tabelle,
Selektionstabelle prüfen
127 SELECT * FROM zteilnehmer02 INTO wa_zteilnehmer02
128 ORDER BY PRIMARY KEY.
129 IF wa_zteilnehmer02-tgeburtsdatum IN gebdat.
130 WRITE: / 'TNr.', wa_zteilnehmer02-tnummer,
wa_zteilnehmer02-tname,
131 wa_zteilnehmer02-tgeburtsdatum.
132 ENDIF.
133 ENDSELECT.
134 SKIP.
135
136 * Schleife über alle Sätze der Tabelle,
logisches Und prüfen
137 SELECT * FROM zteilnehmer02 INTO wa_zteilnehmer02
138 ORDER BY PRIMARY KEY.
139 IF wa_zteilnehmer02-tgeschlecht = geschlec AND
140 wa_zteilnehmer02-zzkurstitel = kursti.
141 WRITE: / 'TNr.', wa_zteilnehmer02-tnummer,
wa_zteilnehmer02-tname,
142 wa_zteilnehmer02-tgeschlecht,
wa_zteilnehmer02-zzkurstitel.
143 ENDIF.
144 ENDSELECT.
145 SKIP.
146
147 * Radiobutton non_sap prüfen
148 IF NOT non_sap IS INITIAL.
149 * Schleife über alle Sätze der Tabelle,
logisches NOT prüfen
150 SELECT * FROM zteilnehmer02 INTO wa_zteilnehmer02
151 ORDER BY PRIMARY KEY.
152 IF NOT wa_zteilnehmer02-zzkurstitel(3) = 'SAP'.
153 WRITE: / 'TNr.', wa_zteilnehmer02-tnummer,
wa_zteilnehmer02-zzkurstitel.
154 ENDIF.
155 ENDSELECT.
156 SKIP.
157 ENDIF.
158
159 * Radiobutton schaltja prüfen
160 IF NOT schaltja IS INITIAL.
161 * Schleife über alle Sätze der Tabelle, Schaltjahr prüfen
162 SELECT * FROM zteilnehmer02 INTO wa_zteilnehmer02
163 ORDER BY PRIMARY KEY.
164 jahr004 = wa_zteilnehmer02-
tgeburtsdatum(4) MOD 4.
165 jahr100 = wa_zteilnehmer02-
tgeburtsdatum(4) MOD 100.
166 jahr400 = wa_zteilnehmer02-
tgeburtsdatum(4) MOD 400.
167 IF NOT wa_zteilnehmer02-tgeburtsdatum
IS INITIAL.
168 IF jahr400 = 0
OR jahr004 = 0 AND NOT jahr100 = 0.
169 WRITE: / 'TNr.',
wa_zteilnehmer02-tnummer,
wa_zteilnehmer02-zzkurstitel,
170 wa_zteilnehmer02-tgeburtsdatum(4).
171 ENDIF.
172 ENDIF.
173 ENDSELECT.
174 SKIP.
175 ENDIF.
Listing 11.2 Report Z_TEILNEHMERLISTE11_B
Anmerkungen zum Quellcode
Der Quellcode in der erweiterten Form unterscheidet sich in zwei wesentlichen Punkten vom Quellcode in der einfachen Form: Das Selektionsbild wurde frei gestaltet, und es wurden Ereignisse zur Steuerung eingebaut. Im Deklarationsteil des Reports finden sich nicht nur die Anweisungen PARAMETERS und SELECT-OPTIONS, sondern auch Anweisungen zur Block- und Zeilengestaltung.
Zeile 28
Der Blockanfang wird deklariert; der Name des Blocks ist zur Deklaration erforderlich. Sie benötigen ihn aber nur, um den benannten Block zu öffnen und (in Zeile 57) wieder zu schließen. Zusätzlich zum Blocknamen wird festgelegt, dass der Block einen Rahmen und einen Titel haben soll. Der Titeltext ist im Textsymbol TEXT-001 hinterlegt.
Zeile 31
Die erste Zeile wird deklariert.
Zeile 32
In der ersten Zeile wird ab Position 24 in einer Länge von 60 Zeichen ein Text ausgegeben. Der Text selbst ist im Textsymbol TEXT-005 hinterlegt.
Zeile 33
Die Deklaration der Zeile wird beendet.
Zeile 34
Es wird eine Leerzeile erzeugt. Diese Anweisung ist ein Beispiel dafür, dass es SELECTION-SCREEN-Anweisungen gibt, die innerhalb einer Zeile keinen Sinn ergeben. In einer Zeile kann keine Leerzeile erzeugt werden, nur zwischen zwei Zeilen im Block.
Zeile 37
Die dritte Zeile wird deklariert.
Zeile 38
Ein Text wird linksbündig, sozusagen ab Spalte 0, mit einer Länge von 20 Zeichen ausgegeben und mit dem Eingabefeld GESCHLEC verknüpft. Hierdurch gelten nicht nur für das Eingabefeld, sondern auch für den verknüpften Text die Hilfefunktionen der Tasten (F1) und (F4).
Testen Sie die Wirkungsweise im Selektionsbild: Fokussieren Sie den Text, und rufen Sie die Hilfe auf. Es erscheint dieselbe Hilfe wie beim Eingabefeld.
Zeile 39
In derselben Zeile wird die Positionierung für das nächste Feld in Spalte 24 festgelegt. Hier erfolgt die nächste Ausgabe im Selektionsbild. Doch Vorsicht: Gehen Sie aufmerksam mit der Positionierung um! Durch »geschicktes« Positionieren kann man vorherige Texte oder Felder in der Zeile übersteuern, abhacken oder zudecken.
Zeile 40
Weiter in Zeile 3 wird an der aktuellen Position das Parameterfeld GESCHLEC zur Eingabe im Selektionsbild angezeigt.
Zeile 41
Ab Position 32 wird in der Länge 16 der Text ausgegeben, der im Textsymbol TEXT-004 hinterlegt ist.
Zeile 42
Immer noch in Zeile 3 wird das Eingabefeld KURSTI in das Selektionsbild geschrieben.
Zeile 43
Die Struktur für Zeile 3 wird geschlossen.
Zeile 46 bis 50
Struktur und Inhalt von Zeile 4 werden deklariert.
Zeile 53 bis 57
Struktur und Inhalt von Zeile 5 werden deklariert.
[+] Stillschweigende Konventionen
Viele Entwickler schreiben aufgrund der besseren Lesbarkeit des Quellcodes den hinterlegten Text als Kommentar zum Kommando hinzu – eine stillschweigende Konvention, die man weiterpflegen sollte. Die Deklaration des Blockendes finden Sie in Zeile 56. Dazwischen stehen die Strukturen für die Zeilengestaltung der Zeilen im Block.
Zeile 62
Das »Zeitalter der Ereignissteuerung« bricht an. Das Ereignisschlüsselwort INITIALIZATION bewirkt, dass vor Erscheinen des Selektionsbildes von der Laufzeitumgebung bereits die ersten Verarbeitungskommandos des Reports ausgeführt werden. Alle Anweisungen, die hinter dem Ereignisschlüsselwort stehen, gehören zum Ereignis und werden ausgeführt. Das Ereignis ist zwar eine Struktur, hat aber keine explizite Anweisung für das Strukturende, d. h. keine Anweisung, die von ihrer strukturschließenden Bedeutung her vergleichbar mit ENDIF, ENDCASE, ENDDO, SELECTION-SCREEN END OF LINE oder Ähnlichem wäre. Mit anderen Worten: Würde das nächste Ereignisschlüsselwort in Zeile 71 fehlen, würden auch diese Anweisungen noch zum Ereignis INITIALIZATION gehören.
Ein Ereignis endet beispielsweise, wenn ein neues Ereignisschlüsselwort ein neues Ereignis definiert, der Report endet oder ein Unterprogramm beginnt. Kommt das erste Ereignisschlüsselwort im Quellcode vor, müssen Sie zwangsläufig mit Ereignisschlüsselwörtern weiterarbeiten. Ab sofort werden auch Sie mit Ereignissen arbeiten und noch einige kennenlernen. Sie erleichtern die Arbeit in der Praxis ungemein und ermöglichen überhaupt erst einige fortgeschrittene Lösungen.
Zeile 65 bis 70
Dieser Anweisungsblock wird beim Ereignis INITIALIZATION ausgeführt. Als Beispiel für die Verarbeitung wird die Teilnehmertabelle gelesen und die letzte, d. h. die höchste Teilnehmernummer ermittelt. Dann wird die Teilnehmernummer hochgezählt und so ein Vorschlagswert für die Nummer des nächsten Teilnehmers gebildet. Dieser Vorschlagswert könnte bei der Erfassung eines neuen Teilnehmersatzes automatisch übernommen und verwendet werden.
Zeile 72
Das neue Ereignis AT SELECTION-SCREEN grenzt das vorhergehende Ereignis INITIALIZATION ab. Das Ereignis AT SELECTION-SCREEN wird noch im Selektionsbild prozessiert und prüft im Beispiel für das Feld SEK, ob die vorgenommenen Eingaben als gültig akzeptiert werden. Falls die Eingaben gültig sind, wird mit der Programmausführung ((F8)-Taste) fortgefahren.
Zeile 74 bis 76
Die Eingabeprüfung selbst wird prozessiert. Liegt der eingegebene Wert unter 5 oder über 20 Sekunden, wird der nachfolgende Verarbeitungsblock – der Fehlerbehandlungsblock – ausgeführt.
Dieser Anweisungsblock besteht im Beispiel nur aus Zeile 75; die MESSAGE-Anweisung sendet eine Nachricht an den Benutzer. Die Nachricht hat die Nummer 001 aus der Nachrichtenklasse ZABAP: Der Nachrichtentext ist in Tabelle T100 in der zugehörigen Nachrichtenklasse hinterlegt. Durch den Nachrichtentyp, in unserem Fall E für Error, wird gesteuert, wie die Nachricht wirkt. Denken Sie wieder daran, dass der Nachrichtentyp kontextsensitiv ist. Es wurde beschrieben, wie dieser Nachrichtentyp im Zusammenhang mit einem Selektionsbild wirkt. Hier würde es aber zu weit führen, alle Möglichkeiten sämtlicher Nachrichtentypen und Wirkungen aufzulisten. Bei Bedarf können Sie der ABAP-Referenz (SAP PRESS 2010) weitere Details entnehmen.
Zeile 80 bis 84
Es folgt die Eingabeprüfung für die neue Teilnehmernummer. Wird versucht, einen Teilnehmer mit einer bereits bestehenden Teilnehmernummer zu erfassen, kommt es zur Fehlerbehandlung: Die weitere Verarbeitung wird abgebrochen, und das Selektionsbild wird erneut gesendet. Als Hinweis auf die Falscheingabe erfolgt in der Meldung die Ausgabe der ungültig eingegebenen Teilnehmernummer. Diese ungültige Nummer wird in der MESSAGE-Anweisung in Zeile 83 mit den Zusatz WITH und dem Feld FALSCHTNR in die Meldung eingetragen. Die gesendete Nachricht 002 hat an der entsprechenden Stelle ein kaufmännisches Und (&) im Text.
Zeile 87
Das neue Ereignisschlüsselwort START-OF-SELECTION grenzt wieder das vorhergehende Ereignis ab. Unter dem Ereignis stehen die Anweisungen, die Sie bereits aus den vorangegangenen Beispielen kennen.
[»] Ereignissteuerung
Ohne Ereignissteuerung könnten Sie weder eigene Verarbeitungsblöcke vor dem Erscheinen des Selektionsbildes noch eine eigene Eingabeprüfung definieren.
Ausgabe des Quellcodes
In Abbildung 11.34 sehen Sie, dass der Block im Selektionsbild dunkel hinterlegt ist, einen Rahmen besitzt sowie oben links einen Rahmentext Teilnehmer. Die erste Zeile im Block besteht aus einem freien Text ohne Bezug zu einem Eingabefeld. Die zweite Zeile ist eine Leerzeile.
Abbildung 11.34 Selektionsbild mit frei gestalteten Texten und freier Parameterpositionierung
In der dritten Zeile sind zwei Eingabefelder enthalten: Geschlecht m/w und Kursbezeichnung. Der Text vor dem Eingabefeld Geschlecht m/w ist mit dem Eingabefeld verknüpft, sodass man die Verknüpfung registriert, wenn man den Text fokussiert und die Hilfetaste (F1) bzw. (F4) drückt. Dann erscheint die Hilfe beim Text für das Eingabefeld auch so, wie sie im ABAP Dictionary hinterlegt ist. Beim zweiten Eingabefeld Kursbezeichnung ist der Text nicht verknüpft. Die Hilfetasten (F1) und (F4) funktionieren nur bei Fokussierung des Eingabefeldes, nicht aber des Textes. Vergleichen Sie hierzu auch noch einmal die relevanten Stellen im Quellcode, und zwar Zeile 38 bzw. Zeile 41.
Die vierte Zeile enthält die Selektionstabelle ohne Mehrfachselektion, interessanter ist aber wieder die fünfte Zeile. Ankreuzfelder stehen üblicherweise linksbündig mit dem unmittelbar folgenden Selektionstext. Durch die freie Positionierung ist es möglich, diese Reihenfolge zu tauschen und Text und Ankreuzfeld frei in der Zeile zu positionieren.
[»] Mehrere Blöcke im Selektionsbild
Nach dem Ende des Blocks können im Eingabebildschirm – wie in diesem Beispiel – weitere Eingabefelder oder weitere Blöcke definiert werden. Je nach fachlicher Anforderung kann es durchaus sinnvoll sein, mehrere Blöcke in einem Selektionsbild zu deklarieren.
In Abbildung 11.35 wurde versucht, den Report auszuführen, ohne das Pflichtfeld für das Geschlecht auszufüllen. Das System hat die Verarbeitung abgebrochen und das Selektionsbild mit der Meldung »Füllen Sie alle Mußfelder aus« erneut gesendet.
Abbildung 11.35 Selektionsbild mit Fehlermeldung (1)
In Abbildung 11.36 wurde versucht, den Report mit einer ungültigen Angabe für die Sekunden auszuführen. Im Ereignis AT SELECTION-SCREEN wurde speziell für das Feld SEK eine Eingabeprüfung codiert, die erfordert, dass gültige Werte für Sekunden zwischen 5 und 20 liegen müssen – dies war hier nicht der Fall, und deshalb erfolgte die Meldung in der Statuszeile. Diese Meldung sollte so formuliert sein, dass sie dem Benutzer hilft, gültige Eingaben vorzunehmen. Aufgrund der Formulierung des Ereignisses ist nur das Feld SEK wieder eingabebereit; alle anderen Felder sind nur im Anzeigemodus sichtbar.
Abbildung 11.36 Selektionsbild mit Fehlermeldung (2)