ABAP SELECT-OPTIONS: Komplexe Selektionskriterien definieren

kategorie
ABAP-Statements
Veröffentlicht
autor
Johannes

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 der LOW- und HIGH-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:

  1. SIGN (Character 1): Enthält ‘I’ für Inklusiv (Include) oder ‘E’ für Exklusiv (Exclude).
  2. 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)
  3. LOW: Der untere Grenzwert oder der Einzelwert. Der Datentyp wird vom Feld in der FOR-Klausel geerbt.
  4. HIGH: Der obere Grenzwert (nur bei OPTION = BT oder NB relevant). Gleicher Datentyp wie LOW.

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 der WHERE-Klausel verwendet.
  • Verwende PARAMETERS für einfache Eingabewerte und SELECT-OPTIONS für komplexere Selektionskriterien.