Selektionstabellen 

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 RANGES verwendet werden um interne Tabellen mit der Struktur von Selektionstabellen anzulegen. Diese Tabellen können mit Einschränkungen wie echte Selektionstabellen verwendet werden.

Struktur von Selektionstabellen

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 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" (Einschlußkriterium)

– E bedeutet "exclusive" (Ausschlußkriterium)

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 und es ist kein Fluchtsymbol definiert.

– Ist HIGH gefüllt, können BT (BeTween) und NB (Not Between) verwendet werden. Diese Operatoren entsprechen BETWEEN und NOT BETWEEN beim Prüfen von Intervallzugehörigkeit.

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 HIGH gefü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 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.

RANGES-Tabellen

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:

Mit der Anweisung RANGES können ebenfalls interne Tabellen des gleichen Typs wie Selektionstabellen angelegt werden.

RANGES <rangetab> FOR <f>.

Diese Anweisung ist nichts anderes als eine Kurzform der folgenden Anweisungen:

DATA: BEGIN OF <rangetab> OCCURS 0,
         sign(1) TYPE c,
         option(2) TYPE c,
         low  LIKE <f>,
         high LIKE <f>,
      END OF <rangetab>.

Da die Anweisung eine veraltete Form der Definition von internen Tabellen mit Kopfzeilen wiedergibt abkürzt und Kopfzeilen nicht verwendet werden sollten statt RANGES obige Varianten der TYPES- und DATA-Anweisung verwendet werden.

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 daß das Selektionsbild zur Anzeige gebracht werden muß.

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

Obsolete Version:

REPORT demo_sel_screen_tables_ranges.

RANGES s_carrid1 FOR spfli-carrid.

s_carrid1-sign = 'I'.
s_carrid1-option = 'EQ'.
s_carrid1-low = 'LH'.

APPEND s_carrid1.

SUBMIT demo_selection_screen_ldb_1 WITH carrid IN s_carrid1
VIA SELECTION-SCREEN AND RETURN.

Korrekte Version:

REPORT demo_sel_screen_tables_ranges.

DATA: s_carrid2 TYPE RANGE OF spfli-carrid,
s_carrid2_wa LIKE LINE OF s_carrid2.

s_carrid2_wa-sign = 'I'.
s_carrid2_wa-option = 'EQ'.
s_carrid2_wa-low = 'AA'.

APPEND s_carrid2_wa TO s_carrid2.

SUBMIT demo_selection_screen_ldb_1 WITH carrid IN s_carrid2
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 DEMO2 aufgerufen. 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.