Die SELECT-OPTIONS
-Anweisung ist ein spezielles ABAP-Schlüsselwort, das Du ausschließlich im Deklarationsteil von
ausführbaren Programmen (REPORT
), Funktionsgruppen oder Modulpools verwendest. Sie dient dazu, komplexe
Selektionskriterien auf dem Standard-Selektionsbild (Dynpro 1000) eines Programms zu definieren.
Im Gegensatz zu einfachen PARAMETERS
, die nur ein einzelnes Eingabefeld erzeugen, erlauben SELECT-OPTIONS
dem
Benutzer zur Laufzeit die Eingabe von:
- Einzelwerten
- Intervallen (Von-Bis-Bereichen)
- Mehreren Einzelwerten und Intervallen (über den Mehrfachselektionsknopf)
- Ausschlüssen von Werten oder Intervallen
- Mustervergleichen (z. B. ‘ABC*’)
Die definierten Selektionsoptionen werden typischerweise in der WHERE
-Klausel von SELECT
-Anweisungen verwendet, um
Datenbankabfragen dynamisch und flexibel zu filtern.
Syntax
SELECT-OPTIONS <selcrit> FOR <feld> [DEFAULT <wert> [TO <wert2>] [OPTION <op>] [SIGN <sg>]] " Standardwerte [OBLIGATORY] " Eingabe erforderlich [NO-EXTENSION] " Keine Mehrfachselektion (nur eine Zeile) [NO INTERVALS] " Keine Intervalleingabe (nur Einzelwerte/-muster) [LOWER CASE] " Kleinschreibung erlauben/beibehalten [MEMORY ID <pid>] " SAP Memory ID für Vorbelegung [VISIBLE LENGTH <vlen>] " Sichtbare Länge der Felder am Bildschirm [MODIF ID <mid>]. " Modifikationsgruppe für dyn. Bildschirmanpassung " [MATCHCODE OBJECT ...] " Veraltet für F4-Hilfe, besser über Dictionary-Bezug in FOR " [NO DATABASE SELECTION] " Meist für interne Zwecke von SAP
<selcrit>
: Der Name des Selektionskriteriums (z. B.s_kunnr
,so_matnr
). Unter diesem Namen wird intern eine Ranges-Tabelle angelegt.FOR <feld>
: Sehr wichtig! Gibt das Datenobjekt an, auf das sich das Kriterium bezieht und dessen **Datentyp ** es erbt. Das ist oft ein Datenbanktabellenfeld (z. B.mara-matnr
) oder eine lokale Variable (my_variable
). Der Typ bestimmt die Eigenschaften derLOW
- undHIGH
-Felder der Ranges-Tabelle und beeinflusst Eingabeprüfungen sowie die F4-Hilfe.
Funktionsweise (Was passiert im Hintergrund?)
Die Anweisung SELECT-OPTIONS <selcrit> FOR ...
deklariert implizit eine interne Tabelle namens <selcrit>
. Diese
Tabelle hat eine feste Struktur (Ranges-Struktur) mit vier Spalten:
SIGN
(Character 1): Enthält ‘I’ für Inklusiv (Include) oder ‘E’ für Exklusiv (Exclude).OPTION
(Character 2): Enthält den Vergleichsoperator. Gängige Werte sind:EQ
: Equals (Gleich)NE
: Not Equal (Ungleich)BT
: Between (Zwischen)NB
: Not Between (Nicht Zwischen)CP
: Contains Pattern (Enthält Muster, z. B.A*
)NP
: Not contains Pattern (Enthält nicht Muster)GT
: Greater Than (Größer als)GE
: Greater Equal (Größer gleich)LT
: Less Than (Kleiner als)LE
: Less Equal (Kleiner gleich)
LOW
: Der untere Grenzwert oder der Einzelwert. Der Datentyp wird vom Feld in derFOR
-Klausel geerbt.HIGH
: Der obere Grenzwert (nur beiOPTION
=BT
oderNB
relevant). Gleicher Datentyp wieLOW
.
Auf dem Selektionsbild gibt der Benutzer Werte ein, die das System dann beim Ausführen des Reports in diese interne
Tabelle <selcrit>
einträgt.
Wichtige Zusätze (Optionen) erklärt
DEFAULT <wert> [TO <wert2>] ...
: Füllt das Kriterium auf dem Bildschirm mit einem oder mehreren Standardwerten vor.OBLIGATORY
: Macht mindestens eine Eingabe in diesem Kriterium zur Pflicht. Das Programm kann ohne Eingabe nicht gestartet werden.NO-EXTENSION
: Blendet den Knopf für die “Mehrfachselektion” (rechts neben den Eingabefeldern) aus. Der Benutzer kann nur die direkt sichtbare Zeile (ein Wert oder ein Intervall) eingeben.NO INTERVALS
: Blendet das “Bis”-Feld (HIGH-Feld) aus. Der Benutzer kann nur Einzelwerte (EQ
,NE
,GT
, etc.) oder Muster (CP
,NP
) eingeben, keine Bereiche (BT
,NB
).LOWER CASE
: Erlaubt die Eingabe von Kleinbuchstaben und verhindert die automatische Umwandlung in Großbuchstaben.
Verwendung in ABAP SQL (Datenbankabfragen)
Die vom Benutzer gefüllte Ranges-Tabelle <selcrit>
wird in der WHERE
-Klausel einer SELECT
-Anweisung mit dem
Operator IN
verwendet, um die Datenbankselektion zu filtern:
SELECT carrid, connid, fldate FROM spfli WHERE carrid IN @s_carrid " s_carrid ist das SELECT-OPTIONS AND connid IN @s_connid " s_connid ist ein weiteres SELECT-OPTIONS INTO TABLE @DATA(lt_flights).
Die Datenbank selektiert dann nur die Zeilen, deren Feldwerte die in der Ranges-Tabelle definierten Bedingungen erfüllen.
Abgrenzung zu PARAMETERS
PARAMETERS
: Definiert ein einzelnes Eingabefeld für genau einen Wert auf dem Selektionsbild.SELECT-OPTIONS
: Definiert komplexere Eingabemöglichkeiten (Bereiche, Mehrfachwerte, Ausschlüsse, Muster) und erzeugt dafür intern eine Tabelle.
Beispiele
1. Standard-Select-Option für Materialnummer
REPORT z_demo_selopt.
TABLES: mara. " Für FOR-Klausel (oder lokale Variable deklarieren)
SELECT-OPTIONS s_matnr FOR mara-matnr.
START-OF-SELECTION. SELECT matnr, mtart, matkl FROM mara WHERE matnr IN @s_matnr " Filtern nach Materialnummern INTO TABLE @DATA(lt_mara).
cl_demo_output=>display( lt_mara ).
(Erzeugt auf dem Selektionsbild Felder für Material von/bis und den Mehrfachselektionsknopf)
2. Datumsbereich mit Standardwert (heute) und Pflichteingabe
SELECT-OPTIONS s_date FOR sy-datum OBLIGATORY DEFAULT sy-datum.
(Erzeugt ein Datumsfeld von/bis, das mit dem heutigen Datum vorbelegt ist und ausgefüllt werden muss)
3. Nur einzelne Fluggesellschaften (keine Bereiche, keine Mehrfachauswahl)
SELECT-OPTIONS s_carrid FOR spfli-carrid NO INTERVALS NO-EXTENSION.
(Erzeugt nur ein einzelnes Eingabefeld für die Airline-ID, ohne “bis”-Feld und ohne Mehrfachselektionsknopf)
Wichtige Hinweise / Best Practice
SELECT-OPTIONS
werden im Deklarationsteil von Programmen definiert, die ein Selektionsbild haben sollen.- Die
FOR
-Klausel ist entscheidend für Typ, Prüfungen und F4-Hilfe. Sie sollte auf ein Dictionary-Feld oder eine Variable mit passendem Typ verweisen. - Die erzeugte Ranges-Tabelle wird mit dem
IN
-Operator in derWHERE
-Klausel verwendet. - Verwende
PARAMETERS
für einfache Eingabewerte undSELECT-OPTIONS
für komplexere Selektionskriterien.