Freie Abgrenzungen im Datenbankprogramm 

Mit der Anweisung

SELECTION-SCREEN DYNAMIC SELECTIONS FOR NODE|TABLE <node>.

wird im Selektions-Include ein Knoten <node> einer logischen Datenbank für freie Abgrenzungen vorgesehen.

Um die freien Abgrenzungen in den SELECT-Anweisungen des Unterprogramms PUT_<node> zu verwenden, muß das Datenobjekt DYN_SEL verwendet werden. Das Datenobjekt DYN_SEL wird automatisch im logischen Datenbankprogramm wie folgt generiert:

TYPE-POOLS RSDS.

DATA DYN_SEL TYPE RSDS_TYPE.

Diese Anweisungen müssen nicht selbst programmiert werden. Das Datenobjekt DYN_SEL steht nur dem Datenbankprogramm, aber nicht einem verknüpften ausführbaren Programm zur Verfügung.

Der Typ RSDS_TYPE dieses Datenobjekts ist in der Typgruppe RSDS wie folgt definiert:

TYPE-POOL RSDS.

* WHERE-clauses ------------------------------

TYPES: RSDS_WHERE_TAB LIKE RSDSWHERE OCCURS 5.

TYPES: BEGIN OF RSDS_WHERE,
         TABLENAME LIKE RSDSTABS-PRIM_TAB,
         WHERE_TAB TYPE RSDS_WHERE_TAB,
       END OF RSDS_WHERE.

TYPES: RSDS_TWHERE TYPE RSDS_WHERE OCCURS 5.

* Expressions Polish notation ---------------

TYPES: RSDS_EXPR_TAB LIKE RSDSEXPR OCCURS 10.

TYPES: BEGIN OF RSDS_EXPR,
         TABLENAME LIKE RSDSTABS-PRIM_TAB,
         EXPR_TAB TYPE RSDS_EXPR_TAB,
       END OF RSDS_EXPR.

TYPES: RSDS_TEXPR  TYPE RSDS_EXPR  OCCURS 10.

* Selections as RANGES-tables -----------------

TYPES: RSDS_SELOPT_T LIKE RSDSSELOPT OCCURS 10.

TYPES: BEGIN OF RSDS_FRANGE,
         FIELDNAME LIKE RSDSTABS-PRIM_FNAME,
         SELOPT_T TYPE RSDS_SELOPT_T,
       END OF RSDS_FRANGE.

TYPES: RSDS_FRANGE_T TYPE RSDS_FRANGE OCCURS 10.

TYPES: BEGIN OF RSDS_RANGE,
         TABLENAME LIKE RSDSTABS-PRIM_TAB,
         FRANGE_T TYPE RSDS_FRANGE_T,
       END OF RSDS_RANGE.

TYPES: RSDS_TRANGE TYPE RSDS_RANGE OCCURS 10.

* Definition of RSDS_TYPE

TYPES: BEGIN OF RSDS_TYPE,
         CLAUSES TYPE RSDS_TWHERE,
         TEXPR   TYPE RSDS_TEXPR,
         TRANGE  TYPE RSDS_TRANGE,
       END OF RSDS_TYPE.

RSDS_TYPE ist also eine tiefe Struktur mit folgenden Komponenten:

CLAUSES

CLAUSES enthält die vom Benutzer eingegebenen freien Abgrenzungen (oder eventuelle programmspezifische Selektionskriterien) in der Form von internen Tabellen, die direkt in dynamischen WHERE-Klauseln verwendet werden können.

Clauses ist eine interne Tabelle, die wiederum eine interne Tabelle WHERE_TAB als Komponente hat. Die Spalte CLAUSES-TABLENAME enthält in jeder Zeile den Namen eines Knotens, für den freie Abgrenzungen vorgesehen sind. Zu jeder dieser Knoten enthalten die Tabellen WHERE_TAB die Selektionsbedingungen der freien Abgrenzungen. Das Format der Tabellen WHERE_TAB ist so definiert, daß sie direkt in dynamischen WHERE-Klauseln eingesetzt werden können.

Um WHERE_TAB in der logischen Datenbank zu verwenden, muß die dynamische WHERE-Klausel für jeden Knoten <node>, der für freie Abgrenzungen vorgesehen ist, im Unterprogramm PUT_<node> entsprechend programmiert werden. Dazu muß die zu <node> passende interne Tabelle WHERE_TAB aus dem Datenobjekt DYN_SEL gelesen werden. Das folgende Beispiel zeigt, wie ein lokales Datenobjekt des Unterprogramms hierfür verwendet werden kann:

Die Tabelle SCARR sei der Wurzelknoten der logischen Datenbank ZHK und die Tabelle SPFLI der einzige Nachfolger.

Das Selektions-Include DBZHKSEL enthalte folgende Zeilen:

SELECT-OPTIONS S_CARRID FOR SCARR-CARRID.

SELECT-OPTIONS S_CONNID FOR SPFLI-CONNID.

SELECTION-SCREEN DYNAMIC SELECTIONS FOR TABLE SCARR.

Das Unterprogramm PUT_SCARR des Datenbankprogramms SAPDBZHK verwendet die freien Abgrenzungen wie folgt:

FORM PUT_SCARR.

  STATICS: DYNAMIC_SELECTIONS TYPE RSDS_WHERE,
           FLAG_READ.

  IF FLAG_READ = SPACE.
    DYNAMIC_SELECTIONS-TABLENAME = 'SCARR'.
    READ TABLE DYN_SEL-CLAUSES
               WITH KEY DYNAMIC_SELECTIONS-TABLENAME
               INTO DYNAMIC_SELECTIONS.
    FLAG_READ = 'X'.
  ENDIF.

  SELECT * FROM SCARR
         WHERE  CARRID IN S_CARRID
         AND   (DYNAMIC_SELECTIONS-WHERE_TAB).

    PUT SCARR.

  ENDSELECT.

ENDFORM.

Die Zeile der internen Tabelle DYN_SEL-CLAUSES, für welche die Spalte DYN_SEL-CLAUSES-TABLENAME den Wert SCARR enthält, wird in die lokale Hilfsstruktur DYNAMIC_SELECTIONS gelesen. Über die STATICS-Anweisungen und das Feld FLAG_READ wird dafür gesorgt, daß die Tabelle DYN_SEL nur ein einziges mal pro Programmausführung gelesen werden muß. Die Tabelle DYNAMIC_SELECTIONS-WHERE_TAB wird in der dynamischen WHERE-Klausel verwendet.

Jedes ausführbare Programm, das ZHK als logische Datenbank verwendet und eine NODES- oder TABLES-Anweisung für SCARR oder SPFLI enthält, bietet auf seinem Selektionsbild die Möglichkeit freier Abgrenzungen für die Felder der Tabelle SCARR und die logische Datenbank liest wegen der dynamischen WHERE-Klausel nur die Zeilen, die den Selektionsbedingungen auf dem Selektionsbild und den freien Abgrenzungen genügen.

TEXPR

TEXPR enthält die Selektionen der freien Abgrenzungen in einem internen Format (polnische Notation), welches für die beiden Funktionsbausteine FREE_SELECTIONS_INIT und FREE_SELECTIONS_DIALOG zum programmgesteuerten Erfassen freier Abgrenzungen verwendet werden kann (für mehr Informationen siehe die Dokumentation dieser Funktionsbausteine).

TRANGE

TRANGE enthält die Selektionen der freien Abgrenzungen in der Form von RANGES-Tabellen, die mit dem IN-Operator in WHERE-Klauseln oder logischen Ausdrücken verwendet werden können.

TRANGE ist eine interne Tabelle, die wiederum eine interne Tabelle FRANGE_T als Komponente hat. Die Spalte TABLENAME der Tabelle TRANGE enthält in jeder Zeile den Namen eines Knotens, für den freie Abgrenzungen vorgesehen sind. Zu jeden dieser Knoten enthalten die Tabellen FRANGE_T die Selektionsbedingungen der freien Abgrenzungen in der Form von RANGES-Tabellen. FRANGE_T besteht daher aus einer Spalte FIELDNAME, welche die Felder des Knotens enthält, für welche die RANGES-Tabellen gelten, und aus einer Komponente SELOPT_T, welche die RANGES-Tabellen enthalten.

TRANGE ermöglicht es also gezielt auf die Selektionen für einzelne Felder der Knoten zuzugreifen. Weiterhin sind Abgrenzungen im RANGES-Format leichter manipulierbar als Abgrenzungen im WHERE-Klausel-Format. Das folgende Beispiel zeigt, wie man hierfür lokale Datenobjekte des entsprechenden Unterprogramms PUT_<node> einsetzen kann:

Die Tabelle SCARR sei der Wurzelknoten der logischen Datenbank ZHK und die Tabelle SPFLI der einzige Nachfolger.

Das Selektions-INCLUDE DBZHKSEL enthalte folgende Zeilen:

SELECT-OPTIONS S_CARRID FOR SCARR-CARRID.

SELECT-OPTIONS S_CONNID FOR SPFLI-CONNID.

SELECTION-SCREEN DYNAMIC SELECTIONS FOR TABLE SCARR.

Das Unterprogramm PUT_SCARR des Datenbankprogramms SAPDBZHK verwendet die freien Abgrenzungen wie folgt:

FORM PUT_SCARR.

  STATICS: DYNAMIC_RANGES TYPE RSDS_RANGE,
           DYNAMIC_RANGE1 TYPE RSDS_FRANGE,
           DYNAMIC_RANGE2 TYPE RSDS_FRANGE,
           FLAG_READ.

  IF FLAG_READ = SPACE.

    DYNAMIC_RANGES-TABLENAME = 'SCARR'.
    READ TABLE DYN_SEL-TRANGE
               WITH KEY DYNAMIC_RANGES-TABLENAME
               INTO DYNAMIC_RANGES.

    DYNAMIC_RANGE1-FIELDNAME = 'CARRNAME'.
    READ TABLE DYNAMIC_RANGES-FRANGE_T
               WITH KEY DYNAMIC_RANGE1-FIELDNAME
               INTO DYNAMIC_RANGE1.

    DYNAMIC_RANGE2-FIELDNAME = 'CURRCODE'.
    READ TABLE DYNAMIC_RANGES-FRANGE_T
               WITH KEY DYNAMIC_RANGE2-FIELDNAME
               INTO DYNAMIC_RANGE2.

    FLAG_READ = 'X'.

  ENDIF.

  SELECT * FROM SCARR
         WHERE  CARRID   IN S_CARRID
         AND    CARRNAME IN DYNAMIC_RANGE1-SELOPT_T
         AND    CURRCODE IN DYNAMIC_RANGE2-SELOPT_T.

    PUT SCARR.

  ENDSELECT.

ENDFORM.

Die Zeile der internen Tabelle DYN_SEL-TRANGE, für welche die Spalte DYN_SEL-CLAUSES-TABLENAME den Wert SCARR enthält, wird in die lokale Hilfstabelle DYNAMIC_RANGES gelesen. Die geschachtelten Tabellen DYNAMIC_RANGES-FRANGE_T werden je nach Inhalt von DYNAMIC_RANGES-FIELDNAME in die lokalen Hilfstabellen DYNAMIC-RANGE1 und DYNAMIC-RANGE2 gelesen. Über die STATICS-Anweisungen und das Feld FLAG_READ wird dafür gesorgt, daß die Tabellen nur ein einziges mal pro Programmausführung gelesen werden müssen. Die geschachtelten Tabellen SELOPT_T dieser Hilfstabellen enthalten nun die RANGES-Tabellen für die Datenbankspalten CARRNAME und CURRCODE.

In der SELECT-Anweisung werden die Tabellen SELOPT_T direkt als Selektionstabellen eingesetzt. Da CARRNAME und CURRCODE die einzigen weiteren Spalten der Datenbanktabelle SCARR sind, erfüllt diese logische Datenbank die gleiche Funktionalität wie die aus obigem Beispiel zur Komponente CLAUSES.