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=BToderNBrelevant). 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-OPTIONSwerden 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
PARAMETERSfür einfache Eingabewerte undSELECT-OPTIONSfür komplexere Selektionskriterien.