ABAP Selection Screens: PARAMETERS, SELECT-OPTIONS

kategorie
ABAP-Statements
Veröffentlicht
autor
Johannes

Selection Screens bieten eine standardisierte Benutzeroberfläche für die Eingabe von Selektionskriterien in ABAP-Reports. Mit PARAMETERS und SELECT-OPTIONS können flexible Eingabemasken erstellt werden.

Grundelemente

ElementBeschreibung
PARAMETERSEinzelwert-Eingabe
SELECT-OPTIONSBereichseingabe (von-bis, Mehrfachselektion)
SELECTION-SCREENLayout-Steuerung

Beispiele

1. Einfache Parameter

REPORT zselection_demo.
" Einzelne Parameter
PARAMETERS: p_bukrs TYPE bukrs, " Buchungskreis
p_gjahr TYPE gjahr DEFAULT sy-datum(4)," Jahr mit Default
p_name TYPE string. " Freitext
" Parameter mit Suchhilfe (automatisch aus Domäne)
PARAMETERS: p_matnr TYPE matnr.
" Pflichtfeld
PARAMETERS: p_kunnr TYPE kunnr OBLIGATORY.
START-OF-SELECTION.
WRITE: / 'Buchungskreis:', p_bukrs,
/ 'Jahr:', p_gjahr,
/ 'Name:', p_name,
/ 'Kunde:', p_kunnr.

2. SELECT-OPTIONS für Bereiche

" Bereichsauswahl
SELECT-OPTIONS: s_kunnr FOR kna1-kunnr, " Kundennummer
s_erdat FOR vbak-erdat, " Datum
s_matnr FOR mara-matnr. " Material
START-OF-SELECTION.
" SELECT mit SELECT-OPTIONS
SELECT * FROM kna1
WHERE kunnr IN @s_kunnr
INTO TABLE @DATA(lt_customers).
" Oder mit mehreren Bedingungen
SELECT * FROM vbak
WHERE kunnr IN @s_kunnr
AND erdat IN @s_erdat
INTO TABLE @DATA(lt_orders).
WRITE: / 'Gefundene Kunden:', lines( lt_customers ).

3. Checkbox und Radiobuttons

" Checkbox
PARAMETERS: p_test AS CHECKBOX DEFAULT 'X'.
PARAMETERS: p_detail AS CHECKBOX.
" Radiobuttons (Gruppe)
PARAMETERS: p_opt1 RADIOBUTTON GROUP grp1 DEFAULT 'X',
p_opt2 RADIOBUTTON GROUP grp1,
p_opt3 RADIOBUTTON GROUP grp1.
START-OF-SELECTION.
IF p_test = abap_true.
WRITE: / 'Testmodus aktiv'.
ENDIF.
CASE abap_true.
WHEN p_opt1.
WRITE: / 'Option 1 gewählt'.
WHEN p_opt2.
WRITE: / 'Option 2 gewählt'.
WHEN p_opt3.
WRITE: / 'Option 3 gewählt'.
ENDCASE.

4. Listbox (Dropdown)

" Listbox mit festen Werten
PARAMETERS: p_status TYPE char1 AS LISTBOX
VISIBLE LENGTH 20
DEFAULT 'A'.
" Werte werden bei INITIALIZATION gesetzt
INITIALIZATION.
DATA: lt_values TYPE vrm_values.
lt_values = VALUE #(
( key = 'A' text = 'Aktiv' )
( key = 'I' text = 'Inaktiv' )
( key = 'B' text = 'Gesperrt' )
).
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'P_STATUS'
values = lt_values.

5. SELECTION-SCREEN Blöcke

" Block mit Rahmen
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-b01.
PARAMETERS: p_bukrs TYPE bukrs OBLIGATORY,
p_gjahr TYPE gjahr OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.
" Weiterer Block
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-b02.
SELECT-OPTIONS: s_kunnr FOR kna1-kunnr,
s_name FOR kna1-name1.
SELECTION-SCREEN END OF BLOCK b2.
" Block für Optionen
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-b03.
PARAMETERS: p_test AS CHECKBOX,
p_alv AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK b3.

6. Elemente in einer Zeile

" Mehrere Elemente nebeneinander
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(10) TEXT-001. " 'Von Datum:'
PARAMETERS: p_from TYPE sy-datum.
SELECTION-SCREEN COMMENT 30(10) TEXT-002. " 'Bis Datum:'
PARAMETERS: p_to TYPE sy-datum DEFAULT sy-datum.
SELECTION-SCREEN END OF LINE.
" Noch eine Zeile
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(15) TEXT-003.
PARAMETERS: p_check AS CHECKBOX.
SELECTION-SCREEN COMMENT 20(20) TEXT-004.
SELECTION-SCREEN END OF LINE.

7. Dynamische Texte

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE gv_title.
PARAMETERS: p_value TYPE i.
SELECTION-SCREEN END OF BLOCK b1.
DATA: gv_title TYPE string.
INITIALIZATION.
gv_title = 'Eingabeparameter'.
" Feldbezeichner dynamisch setzen
%_p_value_%_app_%-text = 'Menge'.

8. Tabstrips

" Tabstrip definieren
SELECTION-SCREEN BEGIN OF TABBED BLOCK tab FOR 15 LINES.
SELECTION-SCREEN TAB (20) tab1 USER-COMMAND ucomm1 DEFAULT SCREEN 100.
SELECTION-SCREEN TAB (20) tab2 USER-COMMAND ucomm2 DEFAULT SCREEN 200.
SELECTION-SCREEN TAB (20) tab3 USER-COMMAND ucomm3 DEFAULT SCREEN 300.
SELECTION-SCREEN END OF BLOCK tab.
" Subscreen 100
SELECTION-SCREEN BEGIN OF SCREEN 100.
PARAMETERS: p_par1 TYPE string.
SELECTION-SCREEN END OF SCREEN 100.
" Subscreen 200
SELECTION-SCREEN BEGIN OF SCREEN 200.
PARAMETERS: p_par2 TYPE i.
SELECTION-SCREEN END OF SCREEN 200.
" Subscreen 300
SELECTION-SCREEN BEGIN OF SCREEN 300.
SELECT-OPTIONS: s_range FOR mara-matnr.
SELECTION-SCREEN END OF SCREEN 300.
INITIALIZATION.
tab1 = 'Allgemein'.
tab2 = 'Details'.
tab3 = 'Selektion'.

9. Selection Screen Events

PARAMETERS: p_kunnr TYPE kunnr,
p_name TYPE name1_gp.
" Vor Anzeige des Selektionsbildes
INITIALIZATION.
p_kunnr = '0000001000'. " Default-Wert
" Bei Wertänderung eines Feldes
AT SELECTION-SCREEN ON p_kunnr.
" Prüfung des Kundenfelds
SELECT SINGLE kunnr FROM kna1
WHERE kunnr = @p_kunnr
INTO @DATA(lv_kunnr).
IF sy-subrc <> 0.
MESSAGE e001(zmsg) WITH p_kunnr.
" 'Kunde & existiert nicht'
ENDIF.
" Bei Wertänderung mit Werteübernahme
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_name.
" Eigene F4-Hilfe
DATA: lt_return TYPE TABLE OF ddshretval.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'NAME'
value_org = 'S'
TABLES
value_tab = lt_names
return_tab = lt_return.
IF lt_return IS NOT INITIAL.
p_name = lt_return[ 1 ]-fieldval.
ENDIF.
" Bei F1 (Hilfe)
AT SELECTION-SCREEN ON HELP-REQUEST FOR p_kunnr.
MESSAGE 'Geben Sie eine gültige Kundennummer ein' TYPE 'I'.
" Am Ende der Eingabe (vor START-OF-SELECTION)
AT SELECTION-SCREEN.
" Kreuzvalidierung
IF p_kunnr IS INITIAL AND p_name IS INITIAL.
MESSAGE e002(zmsg).
" 'Mindestens ein Suchkriterium angeben'
ENDIF.
START-OF-SELECTION.
" Hauptlogik

10. SELECT-OPTIONS modifizieren

SELECT-OPTIONS: s_kunnr FOR kna1-kunnr.
INITIALIZATION.
" Default-Werte für SELECT-OPTIONS
s_kunnr = VALUE #(
( sign = 'I' option = 'BT' low = '0000001000' high = '0000001999' )
).
AT SELECTION-SCREEN OUTPUT.
" SELECT-OPTION auf "nur gleich" einschränken
LOOP AT SCREEN.
IF screen-name CS 'S_KUNNR'.
screen-required = '1'. " Pflichtfeld
ENDIF.
MODIFY SCREEN.
ENDLOOP.

11. Felder ein-/ausblenden

PARAMETERS: p_mode TYPE char1 AS LISTBOX VISIBLE LENGTH 10.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
PARAMETERS: p_field1 TYPE string MODIF ID gr1,
p_field2 TYPE string MODIF ID gr2.
SELECTION-SCREEN END OF BLOCK b1.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
" Gruppe 1 nur bei Mode = 'A' anzeigen
IF screen-group1 = 'GR1'.
IF p_mode = 'A'.
screen-active = '1'.
ELSE.
screen-active = '0'.
ENDIF.
ENDIF.
" Gruppe 2 nur bei Mode = 'B' anzeigen
IF screen-group1 = 'GR2'.
IF p_mode = 'B'.
screen-active = '1'.
ELSE.
screen-active = '0'.
ENDIF.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
AT SELECTION-SCREEN ON p_mode.
" Screen nach Modusänderung neu aufbauen

12. Felder schreibschützen

PARAMETERS: p_ref TYPE string,
p_calc TYPE p DECIMALS 2 MODIF ID ro1. " Readonly
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF screen-group1 = 'RO1'.
screen-input = '0'. " Keine Eingabe möglich
screen-intensified = '1'. " Hervorgehoben
ENDIF.
MODIFY SCREEN.
ENDLOOP.
AT SELECTION-SCREEN ON p_ref.
" Berechnung bei Änderung
p_calc = strlen( p_ref ).

13. Drucktaste im Selektionsbild

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
PARAMETERS: p_input TYPE string.
SELECTION-SCREEN END OF BLOCK b1.
" Drucktaste
SELECTION-SCREEN PUSHBUTTON /1(20) btn1 USER-COMMAND cmd1.
SELECTION-SCREEN PUSHBUTTON 25(20) btn2 USER-COMMAND cmd2.
INITIALIZATION.
btn1 = 'Validieren'.
btn2 = 'Zurücksetzen'.
AT SELECTION-SCREEN.
CASE sy-ucomm.
WHEN 'CMD1'.
" Validierung
IF p_input IS INITIAL.
MESSAGE 'Eingabe erforderlich' TYPE 'S' DISPLAY LIKE 'E'.
ELSE.
MESSAGE 'Eingabe OK' TYPE 'S'.
ENDIF.
WHEN 'CMD2'.
" Zurücksetzen
CLEAR p_input.
ENDCASE.

14. Varianten speichern und laden

" Variante programmatisch laden
PARAMETERS: p_var TYPE raldb_vari.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_var.
" Varianten-Auswahl
CALL FUNCTION 'RS_VARIANT_CATALOG'
EXPORTING
report = sy-repid
new_title = 'Variante auswählen'
IMPORTING
variant = p_var.
AT SELECTION-SCREEN.
IF sy-ucomm = 'LOAD_VAR' AND p_var IS NOT INITIAL.
" Variante laden
CALL FUNCTION 'RS_SUPPORT_SELECTIONS'
EXPORTING
report = sy-repid
variant = p_var.
ENDIF.

15. Komplettes Beispiel

REPORT zcomplete_selection.
" Texte
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-b01.
PARAMETERS: p_bukrs TYPE bukrs OBLIGATORY.
SELECT-OPTIONS: s_gjahr FOR bkpf-gjahr DEFAULT sy-datum(4).
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-b02.
SELECT-OPTIONS: s_kunnr FOR bsid-kunnr,
s_lifnr FOR bsik-lifnr.
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-b03.
PARAMETERS: p_alv AS CHECKBOX DEFAULT 'X',
p_detail AS CHECKBOX,
p_test AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK b3.
" Drucktasten
SELECTION-SCREEN FUNCTION KEY 1.
SELECTION-SCREEN FUNCTION KEY 2.
" Globale Daten
DATA: gt_data TYPE TABLE OF bsid.
INITIALIZATION.
" Funktionstastentexte
sscrfields-functxt_01 = 'Dokumentation'.
sscrfields-functxt_02 = 'Alle löschen'.
AT SELECTION-SCREEN.
CASE sscrfields-ucomm.
WHEN 'FC01'.
" Dokumentation anzeigen
CALL FUNCTION 'POPUP_TO_DISPLAY_TEXT'
EXPORTING
titel = 'Hilfe'
textline1 = 'Dieses Programm erstellt einen Bericht.'
textline2 = 'Wählen Sie Ihre Kriterien.'.
WHEN 'FC02'.
" Alle Felder löschen
CLEAR: s_kunnr[], s_lifnr[].
ENDCASE.
AT SELECTION-SCREEN ON p_bukrs.
" Buchungskreis validieren
SELECT SINGLE bukrs FROM t001
WHERE bukrs = @p_bukrs
INTO @DATA(lv_bukrs).
IF sy-subrc <> 0.
MESSAGE e010(zmsg) WITH p_bukrs.
ENDIF.
START-OF-SELECTION.
" Daten laden
IF p_test = abap_true.
WRITE: / 'Testmodus - keine Daten geladen'.
RETURN.
ENDIF.
SELECT * FROM bsid
WHERE bukrs = @p_bukrs
AND gjahr IN @s_gjahr
AND kunnr IN @s_kunnr
INTO TABLE @gt_data.
WRITE: / 'Geladene Datensätze:', lines( gt_data ).
END-OF-SELECTION.
" ALV oder klassische Liste
IF p_alv = abap_true.
" ALV anzeigen
TRY.
cl_salv_table=>factory(
IMPORTING r_salv_table = DATA(lo_alv)
CHANGING t_table = gt_data
).
lo_alv->display( ).
CATCH cx_salv_msg.
ENDTRY.
ELSE.
" Klassische Ausgabe
LOOP AT gt_data INTO DATA(ls_data).
WRITE: / ls_data-bukrs, ls_data-kunnr, ls_data-dmbtr.
ENDLOOP.
ENDIF.

Report-Events

EventZeitpunkt
INITIALIZATIONVor Anzeige des Selektionsbilds
AT SELECTION-SCREEN OUTPUTVor jedem PBO
AT SELECTION-SCREEN ON fieldNach Feldänderung
AT SELECTION-SCREEN ON VALUE-REQUESTBei F4
AT SELECTION-SCREEN ON HELP-REQUESTBei F1
AT SELECTION-SCREENAm Ende der Eingabe
START-OF-SELECTIONNach Selektionsbild
END-OF-SELECTIONNach Datenverarbeitung

Wichtige Hinweise / Best Practice

  • OBLIGATORY für Pflichtfelder verwenden.
  • DEFAULT für sinnvolle Vorbelegung.
  • Blöcke mit FRAME für übersichtliche Gruppierung.
  • Validierung in AT SELECTION-SCREEN ON field.
  • MODIF ID für dynamisches Ein-/Ausblenden.
  • SELECT-OPTIONS für flexible Bereichsauswahl.
  • F4-Hilfe mit VALUE-REQUEST anpassen.
  • Textelemente (TEXT-xxx) für Übersetzbarkeit.
  • Varianten für wiederverwendbare Einstellungen.
  • Kombinieren Sie mit ALV für professionelle Ausgabe.