Anfang des Inhaltsbereichs

Aufbau logischer Datenbanken Dokument im Navigationsbaum lokalisieren

Eine logische Datenbank ist aus drei Teilobjekten aufgebaut (siehe Abbildung), nämlich

Die Struktur definiert die Datensicht der logischen Datenbank. Sie bestimmt sowohl den Aufbau der übrigen Teilobjekte, als auch das Laufzeitverhalten. Die Reihenfolge, in der die Daten dem Verwender geliefert werden, hängt von der Struktur der logischen Datenbank ab.

Die Selektionen definieren ein Selektionsbild als Benutzungsoberfläche für ausführbare Programme, welche die logische Datenbank verwenden. Sein Aufbau wird standardmäßig durch die Struktur bestimmt. Die Selektionen können eigenen Erfordernissen angepaßt und erweitert werden. Bei der Verknüpfung mit ausführbaren Programmen sind die Selektionen der logischen Datenbank Teil des Standardselektionsbilds (Dynpro-Nummer 1000). Beim Aufruf über den Funktionsbaustein LDB_PROCESS werden die Selektionen über Schnittstellenparameter gefüllt.

Das Datenbankprogramm enthält die ABAP-Anweisungen zum Lesen der Daten und ihrer Übergabe an die Verwender der logischen Datenbank . Der Aufbau des Datenbankprogramms ist eine Sammlung spezieller Unterprogramme und wird von der Struktur und den Selektionen bestimmt. Das Datenbankprogramm kann eigenen Erfordernissen angepaßt und erweitert werden.

Andere Komponenten wie Dokumentation, sprachabhängige Texte und benutzerdefinierte Selektionsbilder erweitern die Funktionalität.

Struktur

Die Struktur logischer Datenbanken bildet in der Regel die Fremdschlüssel-Beziehungen hierarchischer Tabellen im SAP-System ab. Die Struktur logischer Datenbanken ist baumartig und folgendermaßen definiert:

· Es gibt genau einen Knoten der höchsten Stufe (Wurzelknoten).

· Jeder Knoten kann einen oder mehrere Nachfolger haben.

· Jeder Knoten kann genau einem anderen Knoten nachfolgen.

Die Knoten müssen im ABAP Dictionary definierte Strukturen oder Datentypen aus einer Typgruppe sein. Normalerweise handelt es sich hierbei um die Strukturen der Datenbanktabellen, deren Daten die logische Datenbank liest und an die Verwender zur weiteren Auswertung übergibt. Es ist jedoch auch möglich, und manchmal sinnvoll, Strukturen aus dem ABAP Dictionary ohne unterliegende Datenbank zu verwenden. Aus technischen Gründen gibt es eine Obergrenze von 300 Knoten in der Struktur einer logischen Datenbank.

Jedes ausführbare ABAP-Programm, das mit einer logischen Datenbank verknüpft ist kann für jeden Knoten der Struktur eine entsprechende GET-Anweisung enthalten. Zur Laufzeit des Programms werden die zugehörigen Ereignisblöcke in der Reihenfolge verarbeitet, wie sie durch die hierarchische Struktur vorgegeben ist. Enthält ein Programm nicht zu jedem Knoten einer logischen Datenbank eine GET-Anweisung, dann werden alle Knoten durchlaufen, die im Pfad von der Wurzel zu den durch GET-Anweisungen benannten Knoten liegen.

Beim Aufruf über den Funktionsbaustein LDB_PROCESS wird die Lesetiefe der logischen Datenbank über einen entsprechenden Schnittstellenparameter gesteuert.

Beispiel

LFA1 sei der Wurzelknoten, LFBK und LFB1 sind Verzweigungen von LFA1; LFC1 ist eine Verzweigung von LFB1.

Diese Grafik wird im zugehörigen Text erklärt

Sind in einem verknüpften ausführbaren Programm GET-Anweisungen für alle Knoten angegeben, treten die GET-Ereignisse in der Reihenfolge LFA1, LFBK, LFB1, LFC1 auf. Ist im Programm nur eine einzige GET-Anweisung für LFB1 angegeben, werden LFA1 und LFB1 durchlaufen.

Selektionen

Die Selektionen einer logischen Datenbank werden mit den üblichen Anweisungen zur Definition von Selektionsbildern definiert, nämlich PARAMETERS, SELECT-OPTIONS und SELECTION-SCREEN. In logischen Datenbanken können dabei mit den Zusätzen VALUE-REQUEST und HELP-REQUEST auch spezifische Eingabe- und Wertehilfen definiert werden. Die Definition des Selektionsbilds geschieht in einem speziellen Include-Programm, dem sogenannten Selektions-Include.

Jedes ausführbare ABAP-Programm, das eine logische Datenbank verwendet, kann diese Selektionen der logischen Datenbank durch programmspezifische Selektionen erweitern. Auf dem Standardselektionsbild erscheinen erst die datenbankspezifischen Selektionen und darunter die programmspezifischen Selektionen.

Bei der Erzeugung des Selektionsbilds eines ausführbaren Programms werden nur die datenbankspezifischen Selektionskriterien und Parameter dargestellt, für deren zugehörige Tabellen auch Schnittstellen-Arbeitsbereiche mit NODES oder TABLES im Programm deklariert sind.

Beispiel

Ein Selektions-Include enthalte die Zeilen:

SELECT-OPTIONS slifnr FOR lfa1-lifnr.
PARAMETERS pbukrs LIKE lfb1-bukrs FOR TABLE lfb1.

Das Selektionskriterium SLIFNR ist dadurch mit Tabelle LFA1, der Parameter PBUKRS mit Tabelle LFB1 verbunden. Wird in einem ausführbaren Programm nur LFA1 aber nicht LFB1 als Schnittstellen-Arbeitsbereich deklariert, erscheint SLIFNR auf dem Selektionsbild, PBUKRS jedoch nicht.

Das Selektionsbild einer logischen Datenbank kann außer statischen Selektionen auch dynamische Selektionen, die sogenannten freien Abgrenzungen (englisch Dynamic Selections), enthalten. Freie Abgrenzungen bieten dem Benutzer die Möglichkeit neben den im Selektions-Include definierten statischen Selektionen, die logische Datenbank anzuweisen , weitere selbstdefinierte Abgrenzungen bei Datenbankzugriffen vorzunehmen. Aus Gründen der Performance sollte immer diese Möglichkeit gewählt werden, statt gelesene Daten im Anwendungsprogramm nachträglich auszusortieren.

Damit die logische Datenbank freie Abgrenzungen für einen Knoten <node> anbieten kann, muß folgende Anweisung im das Selektions-Include stehen:

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

Falls der Knoten <node> vom Verwender angefordert wird, gehören die freien Abgrenzungen zum Selektionsbild. Ein Benutzer hat nach Auswahl der Taste Freie Abgrenzungen die Möglichkeit, für die von der logischen Datenbank vorgesehenen Felder Abgrenzungen zu erfassen. Beim Aufruf über den Funktionsbaustein LDB_PROCESS kann ein entsprechender Parameter übergeben werden. Die Abgrenzungen können im logischen Datenbankprogramm über dynamische Anweisungen zum Einlesen der Daten verwendet werden. Auch die Werte jedes programmspezifischen Selektionskriteriums, welches für einen Knoten definiert wird, der für freie Abgrenzungen vorgesehen ist, werden vor der Datenselektion an die logische Datenbank weitergereicht. Der Benutzer kann den für freie Abgrenzungen vorgesehenen Feldvorrat in Form eines Selektionsviews für die logische Datenbank definieren.

Das Selektionsbild einer logischen Datenbank ist gleichzeitig Teil des Standardselektionsbilds mit der Dynpronummer 1000 eines ausführbaren Programms, das mit der logischen Datenbank verknüpft ist. Es hat ein standardisiertes Layout, wobei Selektionskriterien und Parameter in der Reihenfolge ihrer Deklaration in einzelnen Zeilen erscheinen. Das Layout kann mit der Anweisung SELECTION-SCREEN bearbeitet werden.

Die Laufzeitumgebung generiert das Selektionsbild mit der Dynpronummer 1000 für jedes Programm, für das keine andere Selektionsbildversion in den Programmattributen angegeben wurde. Um zu verhindern, daß bestimmte Eingabefelder des Selektionsbilds einer logischen Datenbank auf dem Selektionsbild erscheinen, können im Selektions-Include Selektionsbildversionen (mit Dynpronummern kleiner 1000) definiert und diese in den Programmattributen eingetragen werden. Dort liefert die Wertehilfetaste einen Überblick über die in einer verknüpften logischen Datenbank definierten Selektionsbildversionen. Selektionsbildversionen werden durch die Anweisungen SELECTION-SCREEN BEGIN|END OF VERSION definiert. Innerhalb dieser Anweisungen können mit SELECTION-SCREEN EXCLUDE die Felder benannt, die nicht auf dem Selektionsbild erscheinen sollen.

Enthalten die Attribute eines ausführbaren Programms die Nummer einer solchen Selektionsbildversion, wird diese in das Standardselektionsbild aufgenommen. Die ausgeschlossenen Eingabefelder werden zwar nicht angezeigt, die zugehörigen Selektionen sind aber immer vorhanden und können programmintern bearbeitet werden oder beim Aufruf über den Funktionsbaustein LDB_PROCESS gefüllt werden.

Datenbankprogramm

Das Datenbankprogramm einer logischen Datenbank <ldb> folgt der Namenskonvention SAPDB<ldb>. Es dient als Container für Unterprogramme, welche die ABAP-Laufzeitumgebung während der Verarbeitung einer logischen Datenbank aufruft. Die Reihenfolge der Aufrufe und ihr Zusammenspiel mit den Ereignissen in ausführbaren Programmen oder dem Funktionsbaustein LDB_PROCESS ergibt sich aus der Struktur der logische Datenbank.

Folgende Unterprogramme sind normalerweise in einem logischen Datenbankprogramm enthalten.

Wird einmalig vor der Verarbeitung der logischen Datenbank aufgerufen, um diese auf eventuelle Mehrfachaufrufe durch den Funktionsbaustein LDB_PROCESS vorzubereiten.

Wird einmalig vor der Bearbeitung der Selektionen aufgerufen.

Wird vor jeder Anzeige des Selektionsbilds aufgerufen, also nur bei Verknüpfung mit ausführbaren Programmen und nicht beim Aufruf über den Funktionsbaustein LDB_PROCESS.

Wird bei einer Benutzeraktion auf dem Selektionsbild aufgerufen, also nur bei Verknüpfung mit ausführbaren Programmen und nicht beim Aufruf über den Funktionsbaustein LDB_PROCESS. Dabei werden die Schnittstellenparameter FNAME und MARK an das Unterprogramm übergeben.

FNAME enthält den Namen eines Selektionskriteriums oder Parameters auf dem Selektionsbild.

MARK beschreibt die vom Benutzer vorgenommene Abgrenzung. MARK = SPACE bedeutet, daß der Benutzer eine einfache Einzelwert- oder Intervallselektion eingegeben hat. MARK = '*' bedeutet, daß der Benutzer auch Eintragungen auf dem Bild Mehrfachselektion vorgenommen hat.

Wird statt des Unterprogramms PAI aufgerufen, wenn die logische Datenbank durch den Funktionsbaustein LDB_PROCESS ohne Selektionsbildverarbeitung aufgerufen wird. Dieses Unterprogramm kann die vom Funktionsbaustein übergebenen Abgrenzungen überprüfen.

Wird einer von der Struktur festgelegten Reihenfolge aufgerufen. In diesem Unterprogramm werden die Daten des Knotens <node> gelesen und über die Anweisung:

PUT <node>.

ein entsprechendes GET-Ereignis in der ABAP-Laufzeitumgebung ausgelöst. Diese Anweisung ist die zentrale Anweisung dieses Unterprogramms. Sie kann nur in einem Unterprogramm einer logischen Datenbank eingesetzt werden, deren Struktur den Knoten <node> enthält, und dessen Name mit PUT_<node> beginnt. Die PUT-Anweisung verzweigt den Programmablauf gemäß der Struktur der logischen Datenbank. Dabei wird die Lesetiefe durch die GET-Anweisungen des Anwendungsprogramms oder den Schnittstellenparameter CALLBACK des Funktionsbausteins LDB_PROCESS bestimmt.

Als erstes wird das Unterprogramm PUT_<root> für den Wurzelknoten bearbeitet. Die Anweisung PUT verzweigt den Programmablauf wie folgt:

      1. Ist das Unterprogramm AUTHORITY_CHECK_<node> im Datenbankprogramm vorhanden, so verzweigt die Anweisung PUT_<node> als erstes zu diesem Unterprogramm.
      2. Danach löst die PUT-Anweisung in der Laufzeitumgebung ein GET-Ereignis aus. Sofern eine zugehörige Anweisung GET <node> in einem verknüpften ausführbaren Programm vorhanden ist, wird der entsprechende Ereignisblock abgearbeitet. Falls der Parameter CALLBACK des Funktionsbausteins LDB_PROCESS entsprechend gefüllt ist, wird die zugehörige Callback-Routine aufgerufen.
      3. Danach verzweigt die PUT-Anweisung den Programmablauf
          1. zum nächsten vorhandenen Unterprogramm eines unmittelbar nachfolgenden Knotens, falls ein tieferliegender Knoten (nicht unbedingt der unmittelbare Nachfolger) des zugehörigen Teilbaums im ausführbaren Programm oder Funktionsbaustein über GET angefordert wird.
          2. zum Unterprogramm eines Knotens der gleichen Ebene, falls der darüberliegende Knoten zu einem solchen verzweigt und falls solch ein Knoten im ausführbaren Programm oder Funktionsbaustein über GET angefordert wird.

Die dortige PUT-Anweisung startet wieder mit Schritt (i). Im Unterprogramm des untersten Knotens eines Teilbaums, der über GET angefordert wird, wird nicht weiter verzweigt, sondern das aktuelle Unterprogramm wird weiter verarbeitet. Ist ein Unterprogramm PUT_<node> vollständig abgearbeitet, kehrt der Programmablauf zur PUT-Anweisung zurück, von der zu dem Unterprogramm PUT_<node> verzweigt wurde.

      1. Nach der Rückkehr von einem untergeordneten Unterprogramm PUT_<node>, löst die PUT-Anweisung das Ereignis GET <node> LATE in der Laufzeitumgebung aus.

Wird automatisch durch die Anweisung PUT <node> aufgerufen. In dieses Unterprogramm kann eine Berechtigungsprüfung für den betroffenen Knoten <node> aus der Struktur der logischen Datenbank eingebaut werden.

Wird bei wird bei einer Selektion über Suchhilfe zur Bearbeitung der in der Suchhilfe ausgewählten Schlüssel aufgerufen. <ldb> ist der Name der logischen Datenbank. Aus diesem Unterprogramm können mit Hilfe der Tabelleneinträge in den Suchhilfetabellen die entsprechenden Einträge aus dem Wurzelknoten <root> gelesen werden. Die Verarbeitung im Programm kann dann mit PUT <root> ausgelöst werden. Das Unterprogramm PUT_<root> wird dann nicht automatisch aufgerufen.

Werden vor einem Ereignis aufgerufen, dessen Name im Schnittstellenparameter EVENT übergeben wird. Zur Zeit kann dem Feld EVENT nur der Wert START-OF-SELECTION zugewiesen werden, um ein Unterprogramm vor diesem Zeitpunkt auszuführen .

Werden nach einem Ereignis aufgerufen, dessen Name im Schnittstellenparameter EVENT übergeben wird. Zur Zeit kann dem Feld EVENT nur der Wert END-OF-SELECTION zugewiesen werden, um ein Unterprogramm nach diesem Zeitpunkt auszuführen .

Werden aufgerufen, wenn der Benutzer auf dem Selektionsbild die Wertehilfe für den Parameter <par> bzw. das Selektionskriterium <selop>, die zu den Selektionen der logischen Datenbank gehören müssen, aufruft.

Werden aufgerufen, wenn der Benutzer auf dem Selektionsbild die Eingabehilfe für den Parameter <par> bzw. das Selektionskriterium <selop>, die zu den Selektionen der logischen Datenbank gehören müssen, aufruft.

Beispiel

Beispiel

In der Struktur der logischen Datenbank sei LFB1 ein Nachfolger von LFA1.

Folgende Selektionskriterien seien im Selektions-Include definiert:

SELECT-OPTIONS: slifnr FOR lfa1-lifnr,
                sbukrs FOR lfb1-bukrs.

Ein möglicher Ausschnitt eines Datenbankprogramms ist dann:

FORM put_lfa1.
  SELECT * FROM lfa1
           WHERE lifnr IN slifnr.
    PUT lfa1.
  ENDSELECT.
ENDFORM.

FORM put_lfb1.
  SELECT * FROM lfb1
           WHERE lifnr =  lfa1-lifnr.
           AND   bukrs IN sbukrs.
    PUT lfb1.
  ENDSELECT.
ENDFORM.

Ein mit der logischen Datenbank verbundenes ausführbares Programm enthalte die Zeilen:

GET lfa1.
  WRITE lfa1-lifnr.

GET lfb1.
  WRITE lfb1-bukrs.

In diesem Beispiel ruft die Laufzeitumgebung nach dem Ereignis START-OF-SELECTION die Routine PUT_LFA1. Über die Anweisung PUT LFA1 wird das Ereignis GET LFA1 ausgelöst. Ist der entsprechende Ereignisblock im Report abgearbeitet, verzweigt PUT LFA1 in das Unterprogramm PUT_LFB1. Von dort wird das Ereignis GET LFB1 im Report ausgelöst. Ist LFB1 der letzte zu lesende Knoten, wird danach mit der Verarbeitung der SELECT-Schleife in PUT_LFB1 fortgefahren. Ansonsten wird zum Unterprogramm PUT_<node> des nächsten Knotens verzweigt. Am Ende der SELECT-Schleife des letzten Knotens wird mit der SELECT-Schleife des darüberliegenden Knotens fortgefahren. Die Programmierung über geschachtelte SELECT-Schleifen dient hier der Verdeutlichung des Ablaufes. In einer reellen logischen Datenbank sollte dies vermieden werden, um die Zahl der Datenbankzugriffe klein zu halten.

Die folgende Abbildung verdeutlicht den Programmablauf:

Diese Grafik wird im zugehörigen Text erklärt

In diesem Beispiel verzweigen die PUT-Anweisungen nicht zu den Unterprogrammen für Berechtigungsprüfungen.

 

 

Ende des Inhaltsbereichs