Verknüpfung mit logischen Datenbanken 

Beim Anlegen eines Programms vom Typ 1 kann in den Programmattributen der Name einer logischen Datenbank angegeben werden. Eine logische Datenbank ist ein spezielles ABAP-Programm, das den Inhalt bestimmter Datenbanktabellen liest und kombiniert. Eine logische Datenbank kann mit beliebig vielen ausführbaren Programmen verknüpft werden. Falls bei der Festlegung der Programmattribute ein Stern (*) für die logische Datenbank angegeben wird, verwendet das System eine Standarddatenbank, die nur die Aufbereitung des Selektionsbilds steuert, jedoch keine Daten liest.

Programmausführung mit und ohne logischer Datenbank

Bei der Ausführung eines Reports, der mit einer logischen Datenbank verknüpft ist, kann man sich beide Programme als ein einziges ausführbares ABAP-Programm denken, dessen Verarbeitungsblöcke in bestimmter vorgegebener Reihenfolge vom Systemprogramm aufgerufen werden (siehe Abbildung unter Logische Datenbanken und Contexte).

Eine logische Datenbank stellt hauptsächlich die Funktionen Selektionsbildaufruf und Dateneinlesen zur Verfügung. Falls eine passende logische Datenbank im System vorhanden ist, müssen diese Aktionen also nicht mehr im eigentlichen Report programmiert werden.

Ein ausführbares Programm, das keine logische Datenbank verwendet, sondern sein Selektionsbild selbst definiert und die Daten selbst mit Open SQL-Anweisungen (SELECT) von der Datenbank liest, wird manchmal auch SQL-Report genannt.

Ein reiner SQL-Report kommt unter Umständen mit einem einzigen Verarbeitungsblock, dem Standardereignisblock START-OF-SELECTION, aus. Dann und nur dann verhält sich ein ausführbares Programm wie ein klassisches, sequentiell verarbeitetes Programm. Wenn aber das Selektionsbild im Programm behandelt werden soll, z.B. Vorfüllen der Eingabefelder vor dem Aufruf oder Überprüfung der Eingabewerte nach dem Aufruf, müssen schon weitere Verarbeitungsblöcke (INITIALIZATION, AT SELECTION-SCREEN) verwendet werden. Bei Verwendung einer logischen Datenbank muß schließlich vollständig ereignisorientiert programmiert werden. Das wichtigste Ereignis in Verbindung mit logischen Datenbanken ist GET. Zu diesem Zeitpunkt überstellt die logische Datenbank einen eingelesenen Satz an den entsprechenden Verarbeitungsblock im Report.

Eine Zusammenstellung der Ereignisse und ihr zeitlicher Ablauf findet sich unter Ereignisblöcke in ausführbaren Programmen. Selbstverständlich können in jedem Ereignisblock zusätzliche Datenbankzugriffe mit Open SQL-Anweisungen programmiert werden.

Das folgende Beispiel vergleicht zwei einfache Reports zum Lesen von Daten aus den hierarchischen Datenbanktabellen SPFLI und SFLIGHT. Einer verwendet keine logische Datenbank und einer verwendet die logische Datenbank F1S. Beide erzeugen die gleiche Listenausgabe.

Report ohne logische Datenbank:

REPORT demo_program_read_tables_1.

DATA: wa_spfli TYPE spfli,
      wa_sflight TYPE sflight.

SELECT-OPTIONS: sel_carr FOR wa_spfli-carrid.

SELECT carrid connid cityfrom cityto
       FROM spfli
       INTO CORRESPONDING FIELDS OF wa_spfli
       WHERE carrid IN sel_carr.

  WRITE: / wa_spfli-carrid,
           wa_spfli-connid,
           wa_spfli-cityfrom,
           wa_spfli-cityto.

  SELECT fldate
         FROM sflight
         INTO CORRESPONDING FIELDS OF wa_sflight
         WHERE carrid = wa_spfli-carrid
           AND connid = wa_spfli-connid.

    WRITE: / wa_sflight-fldate.

  ENDSELECT.

ENDSELECT.

Das Programm kommt ohne explizite Definition von Verarbeitungsblöcken aus. Alle nichtdeklarativen Anweisungen gehören automatisch zum Ereignisblock START-OF-SELECTION. Das Selektionsbild, die Arbeitsbereiche für die Datenübernahme und die SELECT-Anweisungen müssen im Programm selbst programmiert werden.

Report mit logischer Datenbank:

Die logische Datenbank F1S ist in den Attributen Reports eingetragen:

REPORT demo_program_read_tables_2.

NODES: spfli, sflight.

GET spfli FIELDS carrid connid cityfrom cityto.

  WRITE: / spfli-carrid,
           spfli-connid,
           spfli-cityfrom,
           spfli-cityto.

GET sflight FIELDS fldate.

  WRITE: / sflight-fldate.

Im Vergleich zum Report ohne logische Datenbank sieht man, daß dieses Programm keine Aufgaben übernehmen muß außer der Listenausgabe. Selektionsbild und Lesen der Daten übernimmt die logische Datenbank. Die Anweisung NODES deklariert die Arbeitsbereiche, in denen die logische Datenbank die gelesenen Daten übergibt.

Steuerung der logischen Datenbank aus dem Report

Der Verwender einer logischen Datenbank steuert das Selektionsbild und die Lesetiefe der logischen Datenbank. Mit NODES-Anweisungen werden die Knoten der logischen Datenbank angebeben, die der Report verarbeiten will. Für diese Knoten werden im Programm Tabellenarbeitsbereiche, d.h. Datenobjekte mit gleichem Namen und gleicher Struktur wie der entsprechende Knoten, deklariert. Auf dem Selektionsbild der logischen Datenbank erscheinen nur Eingabefelder für die mit NODES deklarierten Knoten.

Die Definition von GET-Ereignisblöcken steuert die Lesetiefe der logischen Datenbank. Es muß nicht für jeden mit NODES deklarierten Knoten auch ein GET-Ereignisblock programmiert werden Die logische Datenbank liest immer die notwendigen Daten, also zumindest die Schlüsselfelder, entlang eines Zweigs des Hierarchiebaums bis zum tiefsten Knoten, für den ein GET-Ereignisblock definiert wird. Falls eine bestimmter Knoten nicht zur Verarbeitung vorgesehen ist, übergeht die logische Datenbank auch die entsprechenden untergeordneten Teile des Hierarchiebaums.

Ein GET-Ereignisblock kennt sowohl die Felder des gerade aktuellen Knotens als auch die eingelesenen Felder aller übergeordneten Tabellen, die sich auf dem aktuellen Zugriffspfad befinden. Erst am Ende der Abarbeitung einer Hierarchiestufe setzt, die logische Datenbank den Tabellenarbeitsbereich im Report auf HEX-Null.

Durch das Abbrechen der Verarbeitung eines GET-Ereignisblocks (EXIT, CHECK), kann die Lesetiefe der logischen Datenbank dynamisch beschränkt weren. Beim Abbruch eines GET-Ereignisblocks überspringt die logische Datenbank auch die in der zugrundeliegenden Hierarchie untergeordneten Teile.

Durch die Angabe einer Feldliste bei der Definition des GET-Ereignisblocks kann das Programm die Menge der pro Knoten eingelesen Daten steuern. Dies setzt voraus, daß der entsprechende Knoten in der logischen Datenbank auch für die Feldselektion vorgesehen ist.

Beispiele zur Lesetiefe bei der logischen Datenbank F1S:

NODES: spfli, sflight, sbook.
  ...
  GET spfli.

Die logische Datenbank liest keine Daten aus den Tabelle SFLIGHT und SBOOK.

NODES: spfli, sbook.
  ...
  GET sbook.

Die logische Datenbank liest Daten aus den Tabellen SPFLI und SFLIGHT, da sie sich auf dem Zugriffspfad des Knotens SBOOK befinden. Auf die Daten aus SFLIGHT kann jedoch im Report nicht zugegriffen werden.

Vorteile bei der Verwendung logischer Datenbanken

Logische Datenbanken ersparen es, das Selektionsbild und die Datenbeschaffung aus Datenbanktabellen in jedem Report erneut zu programmieren. Im Report muß nicht angegeben werden, wie diese Informationen besorgt, sondern sie müssen lediglich verarbeitet und auf dem Ausgabebild ausgegeben werden.

Ein ausführbares Programm (Report) kann immer nur mit einer logischen Datenbanken zusammenarbeiten, aber jede logische Datenbank kann von mehreren Reports verwendet werden. Dies hat erhebliche Vorteile gegenüber der Methode, Datenbankzugriffe mit SELECT-Anweisungen in die einzelnen Reportprogramme zu integrieren. Gleiche Zugriffspfade müssen nur einmal kodiert werden. Das gleiche gilt für das Kodieren von Berechtigungsprüfungen.

Bei der Verwendung von logischen Datenbanken profitieren die meisten Reports von folgenden Eigenschaften:

· eine leicht zu bedienende und standardisierte Benutzungsoberfläche

· Prüffunktionen, mit denen die Benutzereingabe auf Vollständigkeit, Korrektheit und Plausibilität geprüft werden kann

· sinnvolle Datenselektion

· zentrale Berechtigungsprüfungen für Datenbankzugriffe

· gute Performance der Lesezugriffe (zum Beispiel mit Views), während die von der Anwendungslogik bestimmte, hierarchische Datensicht erhalten bleibt.

Auch bei der Verwendung zentraler logischer Datenbanken bleibt die Flexibilität des Programms gewährleistet, da

· weiterhin für jedes Programm eigene Selektionsbilder angelegt und gestaltet werden können

· in jedem Ereignisblock beliebige Funktionalität programmiert werden kann, z.B. ausgiebige Benutzerdialoge für weitere Berechtigungs- oder Plausibilitätsprüfungen auf dem Selektionsbild.

Logische Datenbanken programmieren

Logische Datenbanken werden mit dem Werkzeug Logical Database Builder der ABAP Workbench bearbeitet (Transaktion SLDB oder Werkzeuge ® ABAP Workbench ® Entwicklung ® Programmierumfeld ® Logical Database Builder). Mehr Informationen zur Programmierung logischer Datenbanken findet sich unter Logische Datenbanken.