Anfang des Inhaltsbereichs

Suchhilfen im Datenbankprogramm Dokument im Navigationsbaum lokalisieren

Mit der Anweisung

PARAMETERS <p> AS SEARCH PATTERN FOR TABLE <node>.

wird im Selektions-Include ein Rahmen für die eventuell angegebene Suchhilfe auf dem Selektionsbild definiert.

Dem Datenbankprogramm werden die von der Suchhilfe gefundene Schlüsselfelder (Werteliste) in der internen Tabelle <ldb>_SP zur Verfügung gestellt und statt dem Unterprogramm PUT_<root> wird das Unterprogramm PUT_<ldb>_SP aufgerufen, wobei <ldb> der Namen der logischen Datenbank ist.

Im Unterprogramm PUT_<ldb>_SP kann die logische Datenbank aufgrund der Informationen aus der internen Tabelle den eigentlichen Datenbankzugriff effektiv durchführen und das Ereignis GET <root> mit der Anweisung PUT_<root> auslösen, wobei <root> der Name des Wurzelknotens ist. Häufig ist es auch sinnvoll, aus PUT_<ldb>_SP das Unterprogramm PUT_<root> aufzurufen, das dann die Datenselektion vornimmt und dort mit PUT <root> das zugehörige GET-Ereignis auszulösen. Die Anweisung PUT <root> sollte aus technischen Gründen aber immer in einem Unterprogramm stehen, deren Name mit PUT_<root> beginnt. Die Struktur der internen Tabelle <ldb>_SP und anderer automatisch generierter Tabellen wird als Kommentar in den Quelltext des Datenbankprogramms generiert. Außerdem wird die Verwendung dieser Tabellen ebenfalls im Quelltext dokumentiert.

Beispiel

Wir betrachten eine logische Datenbank ZZF mit dem Wurzelknoten KNA1, die mit der Suchhilfe DEBI verknüpft ist.

Das Selektions-Include DBZZFSEL enthalte folgende Zeilen:

SELECT-OPTIONS SKUNNR FOR KNA1-KUNNR.

PARAMETERS P_SP AS SEARCH PATTERN FOR NODE KNA1.

Im Quelltext des Datenbankprogramms erscheinen nun weitere Kommentarzeilen, die darauf hinweisen, daß folgende Tabellen und Felder angelegt wurden:

Interne Tabelle ZZF_SP:

Diese Tabelle hat folgenden Datentyp:

DATA: BEGIN OF ZZF_SP OCCURS 1000,
         KUNNR             LIKE KNA1-KUNNR,
       END   OF ZZF_SP.

Die Suchhilfeabgrenzungen des Benutzers erzeugen in den versorgten Ausgabefelden der Suchhilfe eine Trefferliste. Diese Trefferliste steht dem Datenbankprogramm in der Tabelle ZZF_SP zur Verfügung.

Interne Tabelle SP_FIELDS:

Wenn der logischen Datenbank eine Sammelsuchhilfe zugeordnet ist, versorgt eine elementare Suchhilfe in der Regel nur einen Teil der Ausgabefelder der Sammelsuchhilfe. Welche Felder versorgt wurden, kann das Programm der Tabelle SP_FIELDS entnehmen. Die Struktur ist:

DATA: BEGIN OF SP_FIELDS OCCURS 10.
        INCLUDE STRUCTURE RSSPFIELDS.
DATA: END   OF SP_FIELDS.

Das Feld SP_FIELDS-SUPPLIED ist ungleich SPACE genau dann, wenn dem in SP_FIELDS-FIELDNAME stehendem Feld ein Wert durch die Suchhilfe zugewiesen wurde.

Interne Tabelle SP_TABLES:

Falls die Suchhilfe Felder aus verschiedenen Tabellen enthält, kann das Programm der Tabelle SP_TABLES entnehmen, welche Tabellen durch die Suchhilfe berücksichtigt wurden. Die Struktur ist:

DATA: BEGIN OF SP_TABLES OCCURS 10.
        INCLUDE STRUCTURE RSSPTABS.
DATA: END   OF SP_TABLES.

Das Feld SP_TABLES-SUPPLIED ist ungleich SPACE, wenn der in SP_FIELDS-TABLENAME stehenden Tabelle ein Wert durch die Suchhilfe zugewiesen wurde.

Feld SP_EVENTS:

Dies ist ein Feld der Länge 200. Jedes Byte in SP_EVENTS steht für eine Tabelle in der Struktur der logischen Datenbank (das erste Zeichen steht beispielsweise für den Wurzelknoten). Der Inhalt der einzelnen Positionen hat folgende Bedeutung für den entsprechenden Knoten:

Wenn der Benutzer auf dem Selektionsbild in der Suchhilfe nach allen Lieferanten abgrenzt, deren Sortierfeld mit ABC beginnt und dies für die Kundennummern 17, 125 und 230 zutrifft, sind obige Tabellen wie folgt gefüllt:

ZZF_SP:

KUNNR

17

125

230

SP_FIELDS:

FIELDNAME

SUPPLIED

KUNNR

X

SP_TABLES:

TABLENAME

SUPPLIED

KNA1

X

Das auskommentierte Unterprogramm PUT_ZZF_SP kann nun zum Beispiel wie folgt modifiziert und aktiviert werden, um die Datensätze aus der internen Tabelle ZZF_SP zu verwenden:

FORM PUT_ZZF_SP.

  CASE SP_EVENTS(1).
    WHEN 'X' OR 'M'.
      PERFORM PUT_KNA1_SP.
    WHEN OTHERS.
      PERFORM PUT_KNA1.
    ENDCASE.

ENDFORM.

FORM PUT_KNA1_SP.

  SELECT * FROM KNA1 FOR ALL ENTRIES IN ZZF_SP
                     WHERE KUNNR = ZZF_SP_KUNNR.
    PUT KNA1.
  ENDSELECT.

ENDFORM.

Über die Tabelle GET_EVENTS wird überprüft, ob das Anwendungsprogramm eine GET-Anweisung für KNA1 enthält oder ob die Suchhilfe entsprechende Werte für Schlüsselfelder zugewiesen hat. Falls dem so ist, wird PUT_KNA1_SP aufgerufen, wo eine SELECT-Schleife über KNA1 ausgeführt wird, in der die Zeilen gelesen werden, die den Schlüsselfeldern in ZZF_SP entsprechen. In der SELECT-Schleife wird die Anweisung PUT KNA1 ausführt.

Eine andere Möglichkeit wäre:

FORM PUT_ZZF_SP.

        * Füllen der Selektionstabelle aus ZZF_SP

          IF SP_EVENTS(1) NE SPACE.
            CLEAR SKUNNR. REFRESH SKUNNR.
            MOVE: 'I'  TO SKUNNR-SIGN,
                  'EQ' TO SKUNNR-OPTION.
            LOOP AT ZZF_SP.
              MOVE ZZF_SP-KUNNR TO SKUNNR-LOW.
              APPEND SKUNNR.
            ENDLOOP.
          ENDIF.

        * Datenselektion und Aufruf GET KUNNR

          READ TABLE GET_EVENTS WITH KEY 'KNA1'.
          IF SY-SUBRC = 0 AND GET_EVENTS-KIND NE SPACE.
            PERFORM PUT_KUNNR.
          ENDIF.

Hier wird die Selektionstabelle SKUNNR für KNA1 gelöscht und mit den Werten aus ZZF_SP gefüllt. Über die Tabelle GET_EVENTS wird überprüft, ob das Anwendungsprogramm eine GET-Anweisung für KNA1 enthält. Falls dem so ist, wird das Unterprogramm PUT_KUNNR aufgerufen. Dort werden die Daten aus KNA1 entsprechend der Selektionstabelle SKUNNR gelesen und PUT KNA1 ausgeführt.

Beim Datenbankzugriff mit Suchhilfe sollte natürlich auch zusätzlich von den Möglichkeiten der freien Abgrenzungen und der Feldselektion Gebrauch gemacht werden.

Suchhilfen können auch zur Performanceverbesserung verwendet werden. Mit Hilfe der internen Tabellen GET_EVENTS, SP_FIELDS und SP_TABLES sowie der Struktur SP_EVENTS ist es möglich, im Datenbankprogramm jeweils verschiedene Datenbankzugriffe zu programmieren, je nachdem welche Tabellen und Felder verwendet und versorgt werden. Beispielsweise kann man Views oder Joins verwenden und die gelesenen Sätze in internen Tabellen sammeln, um die internen Tabellen später zu verarbeiten und dabei die jeweiligen GET-Ereignisse auszulösen.

Ende des Inhaltsbereichs