Jede Anweisung
SELECT-optionS seltab FOR f.
deklariert im Programm eine Selektionstabelle, die mit der Spalte f einer Datenbanktabelle oder einem programmlokalen Feld f verknüpft ist. Eine Selektionstabelle ist ein internes Tabellenobjekt der Tabellenart Standard-Tabelle mit Standardschlüssel und mit Kopfzeile. In Selektionstabellen werden komplexe Selektionen auf standardisierte Weise abgespeichert. Sie können auf verschiedene Weise eingesetzt werden. Ihr Hauptzweck ist es, mit Hilfe des WHERE-Zusatzes in Open SQL-Anweisungen die Selektionskriterien direkt in Datenbankabgrenzungen umzusetzen.
Neben Selektionstabellen, die mit SELECT-optionS angelegt werden, kann die Anweisung RANGESverwendet werden um interne Tabellen mit der Struktur von Selektionstabellen anzulegen. Diese Tabellen können mit Einschränkungen wie echte Selektionstabellen verwendet werden.
Der Zeilentyp einer Selektionstabelle ist eine Struktur mit den vier Komponenten: sign, option, low und high. Jede gefüllte Zeile einer Selektionstabelle stellt eine Unterbedingung für das gesamte Selektionskriterium dar. Die Komponenten im Einzelnen:
· sign
sign hat den Datentyp c und die Länge 1. Der Inhalt von sign bestimmt für jede Zeile, ob das Ergebnis der Zeilenbedingung in der Gesamtergebnismenge aller Zeilen ein- oder ausgeschlossen wird. Die möglichen Werte sind I und E.
– I bedeutet “inclusive” (Einschlusskriterium)
– E bedeutet “exclusive” (Ausschlusskriterium)
· option
option hat den Datentyp c und die Länge 2. option enthält den Selektionsoperator. Es gibt folgende Operatoren:
– Ist high leer, können EQ, NE, GT, LE, LT, CP und NP verwendet werden. Die Operatoren sind die gleichen wie bei logischen Ausdrücken. Die Operatoren CP und NP haben aber nicht den vollen Funktionsumfang wie in normalen logischen Ausdrücken. Sie sind nur zulässig, wenn Maskenzeichen ( '*' oder '+' ) in den Eingabefeldern benutzt werden. Falls Maskenzeichen auf dem Selektionsbild eingegeben verwendet werden, wird automatisch der Operator CP verwendet. Als Fluchtsymbol ist # definiert.
– Ist highgefüllt, können BT (BeTween) und NB (Not Between) verwendet werden. Diese Operatoren entsprechen BETWEEN und NOT BETWEEN beim Prüfen von Intervallzugehörigkeit. Es können keine Maskenzeichen verwendet werden.
· low
low hat den gleichen Datentyp wie die Spalte der Datenbanktabelle, mit der das Selektionskritierium verknüpft ist.
– Ist high leer, definiert der Inhalt von low einen Einzelfeldvergleich. In Verbindung mit dem Operator im Feld option, gibt er eine Bedingung für die Datenbankselektion an.
– Ist highgefüllt, geben die Inhalte von low und high eine Ober- und Untergenze für ein Intervall an. In Verbindung mit dem Operator im Feld option, gibt das Intervall eine Bedingung für die Datenbankselektion an (Intervallselektion).
· high
high hat den gleichen Datentyp wie der Spaltentyp der Datenbanktabelle, mit der das Selektionskritierium verbunden ist. Der Inhalt von high gibt die Obergrenze für eine Intervallselektion an.
Enthält die Selektionstabelle mehr als eine Zeile, wird bei der Bildung des gesamten Selektionskriteriums nach folgenden Regeln vorgegangen:
...
1. Es wird die Vereinigungsmenge der “Inklusiv”-Mengen, d.h. aller Zeilen mit sign gleich I gebildet.
2. Davon wird die Vereinigungsmenge der “Exklusiv”-Mengen, d.h. aller Zeilen mit sign gleich E abgezogen.
3. Besteht die Selektionstabelle nur aus Zeilen, in denen das Feld sign gleich E ist, werden alle Daten ausgewählt, die außerhalb des in den Zeilen definierten Bestands liegen.
Mit folgenden Varianten der TYPES- oder DATA-Anweisung können interne Tabellen des gleichen Typs wie Selektionstabellen angelegt werden:
TYPES|DATA rangetab TYPE RANGE OF type.
oder
TYPES|DATA rangetab LIKE RANGE OF obj.
Es werden interne Standard-Tabellen definiert, deren Zeilentyp eine Struktur mit folgendem Aufbau ist:
· sign(1) TYPE c
· option(2) TYPE c
· low TYPE type bzw. LIKE obj
· high TYPE type bzw. LIKE obj
Solcherart definierte Tabellen haben die gleiche Struktur wie Selektionstabellen, jedoch nicht deren Funktionalität. Sie sind nicht Bestandteile des Selektionsbildes. Es werden keine entsprechenden Eingabefelder generiert und diese Tabellen können nicht in einem durch die Anweisung
SUBMIT prog WITH rangetab IN table.
aufgerufenen Programm prog als Datenschnittstelle verwendet werden. Umgekehrt kann aber die Tabelle table im aufrufenden Programm sehr wohl mit obigen Anweisungen angelegt werden. Dies ist auch gleichzeitig die Hauptaufgabe dieser Tabellen, nämlich beim Aufruf ausführbarer Programme Daten an deren echte Selektionstabellen zu übergeben, ohne dass das Selektionsbild zur Anzeige gebracht werden muss.
Obige Tabellen sind zwar wie echte Selektionstabellen in der WHERE-Klausel von Open SQL-Anweisungen und mit dem Operator IN in logischen Ausdrücken verwendbar, sie sind aber nicht mit einer Datenbanktabelle verknüpft. sie
· werden nicht wie Selektionskriterien an logische Datenbanken übergeben.
· können nicht mit der Kurzform von Selektionstabellen in logischen Ausdrücken verwendet werden.
· können nicht wie Selektionstabellen in GET-Ereignissen verwendet werden.
REPORT demo_sel_screen_tables_ranges.
DATA: s_carrid
TYPE RANGE
OF spfli-carrid,
s_carrid_wa LIKE LINE OF s_carrid.
s_carrid_wa-sign = 'I'.
s_carrid_wa-option = 'EQ'.
s_carrid_wa-low =
'AA'.
APPEND s_carrid_wa TO s_carrid.
SUBMIT
demo_selection_screen_ldb_1 WITH carrid IN s_carrid
VIA
SELECTION-SCREEN AND RETURN.
Es wird eine Selektionstabelle s_carrid unter Bezug auf die Spalte CARRID der Datenbanktabelle SPFLI angelegt. Die Felder s_carrid-low und s_carrid-high haben den gleichen Typ wie CARRID. Der Arbeitsbereich der internen Tabelle s_carrid wird gefüllt und der Tabelle angehängt. Dann wird ein Programm demo2aufgerufen. Falls demo2 mit der logischen Datenbank F1S verknüpft ist, enthält sein Selektionsbild die Felder des Selektionskriteriums CARRID aus der logischen Datenbank. Diese Felder werden mit dem Inhalt der internen Tabelle gefüllt.