Schlüsselbefehl Select-Options
Siehe Schlüsselbefehl Select.
Mit dem Schlüsselbefehl SELECT-OPTIONS <feld> FOR <typisierungsfeld> wird ein Parameter mit zwei Feldern VON - BIS auf den Bildschirm erzeugt.
Durch die erweiterte Pflege können Einzelwerte und Bereiche (VON-BIS) eingeschlossen und ausgeschlossen werden.
Ein Select-Options-Parameter typisiert auf eine Variable, die vorher im Programm erzeugt sein muss und statt TYPE mit FOR.
Siehe Schlüsselbefehl Parameters.
Rangeaufbau
- Durch den Select-Options-Parameter wird eine interne Tabelle aufgebaut mit den Feldern
- SIGN ('I' oder 'E')
- OPTION ('EQ' oder 'BT')
- LOW (Von-Wert)
- HIGH (Bis-Wert)
Zum Beispiel beim Kundenauftrag gibt es einen Range-Tabellentyp "MSR_T_INSP_VBELN_VL_RANGE".
Er hat die Struktur MSR_S_INSP_VBELN_VL_RANGE.
Die beiden Felder SIGN (Type DDSIGN, CHAR1) und OPTION (Type DDOPTION, CHAR2) sind bei jedem Range gleich.
Die Felder LOW und HIGH haben jeweils den gleichen Typ. Der (Komponenten-)Typ passt sich dem zu typisierenden Datenelement an. Hier beim Kundenauftrag dem Datenelement "VBELN_VL" CHAR10.
Nicht gefüllter Select-Options
- Wird der Select-Options-Parameter nicht gefüllt und auf den Parameter abgefragt, so werden alle Werte dieses Tabellefelders selektiert. Hier reagiert der Select-Options-Parameter anders als der Parameters-Parameter.
- Ein PARAMETERS-Parameter würde hingehen nach dem Initialwert vom Feld abfragen.
Coding
- Die Abfrage auf diesen Parameter erfolgt mit "datum IN s_datum".
Data: lv_datum type datum. Select-Options: s_datum for lv_datum. Select ... into .. from .. where datum in s_datum.
Contain Pattern
Möchte man bei einem Select-Option nach einem 'z*' suchen, kann man das direkt im Selektionsbildschirm eintragen. Möchte man diesen Wert jedoch im Coding vorbelegen, muss die Options "CP" (Contain Pattern) gewählt werden.
Data: lrt_repname type range of PROGNAME,
lrs_repname like line of lrt_repname.
lrs_repname-sign = 'I'.
lrs_repname-option = 'CP'.
lrs_repname-low = 'z*'.
append lrs_repname to lrt_repname.
Würde man die Options "EQ" wählen wie gewohnt
Data: lrt_repname type range of PROGNAME,
lrs_repname like line of lrt_repname.
lrs_repname-sign = 'I'.
lrs_repname-option = 'EQ'.
lrs_repname-low = 'z*'.
append lrs_repname to lrt_repname.
Dann würde das Zeichen "=" zu sehen sein und es kommt nicht zu einer erfolgreichen Selektion.
Extensions bei Select-Options beschränken
Vorsicht bei Tausenden Datensätzen im Select-Options
- Die einzelnen Einträge im Select-Options werden zur Laufzeit in einzelne OR-Bedingungen aufgelöst.
- Der gesamte Datenbankabfragestring kann nur eine maximale Länge haben. Ist diese maximale Länge überschritten, wird es einen Laufzeitfehler geben.
- Besteht bei einer Datenbankabfrage die Gefahr, dass ein Feld Tausende von Datensätzen im Select-Options-Feld beinhalten wird, sollte man besser eine Select-Endselect-Abfrage oder einen „Loop - Select - Endloop“ programmieren.