Anfang des Inhaltsbereichs

Aufruf über Funktionsbaustein Dokument im Navigationsbaum lokalisieren

Seit Release 4.5A können logische Datenbanken eigenständig aus jedem beliebigen ABAP-Programm aufgerufen werden. Zuvor war nur die Verknüpfung mit ausführbaren Programmen möglich, wobei die Verarbeitungsblöcke der logischen Datenbank und des Programms von der ABAP-Laufzeitumgebung gesteuert wurden.

Um logische Datenbanken aus anderen Programmen heraus aufzurufen, verwendet man den Funktionsbaustein LDB_PROCESS. Dieser Funktionsbaustein ermöglicht es, die logische Datenbank als Routine zur Datenbeschaffung zu benutzen. Es können mehrere logische Datenbanken gleichzeitig aufgerufen werden und eine logische Datenbank kann in einem ausführbaren Programm mehrfach aufgerufen werden. Zuvor war die Verwendung mehrere logischer Datenbanken bzw. die mehrfache Verwendung einer logischen Datenbank nur durch den Aufruf von ausführbaren Programmen über SUBMIT möglich. Diese Programme mußten mit den entsprechenden logischen Datenbanken verknüpft sein und die gelesenen Daten z.B. über das ABAP-Memory an den Aufrufer übergeben.

Beim Aufruf einer logischen Datenbank über den Funktionsbaustein LDB_PROCESS wird das Selektionsbild der logischen Datenbank nicht angezeigt, sondern über Schnittstellenparameter des Funktionsbausteins gefüllt. Die logische Datenbank löst im Aufrufer keine GET-Ereignisse aus, sondern die gelesenen Daten werden während dem Aufruf an sogenannte Callback-Routinen übergeben. Der Aufruf einer logischen Datenbank über LDB_PROCESS entkoppelt also die Datenbeschaffung von der vorhergehenden Selektionsbildvearbeitung und der nachfolgenden Datenaufbereitung.

Die logischen Datenbanken müssen hierfür nicht angepaßt werden, mit folgenden Einschränkungen: Bei nicht angepaßten Logischen Datenbanken erlaubt der Funktionsbaustein es nicht, dieselbe logische Datenbank mehrmals hintereinander aufzurufen. Außerdem wird das Unterprogramm PAI nicht aufgerufen, so daß dort programmierte Prüfungen von Selektionskriterien und Parametern nicht ausgeführt werden. Diese Einschränkungen können dadurch umgangen werden, daß im Datenbankprogramm die Unterprogramme LDB_PROCESS_INIT und LDB_PROCESS_CHECK_SELECTIONS eingefügt werden.

Laufzeitverhalten

Die Unterprogramme der logischen Datenbank werden beim Aufruf über den Funktionsbaustein LDB_PROCESS in folgender Reihenfolge aufgerufen:

  1. LDB_PROCESS_INIT
  2. INIT
  3. LDB_PROCESS_CHECK_SELECTIONS
  4. PUT <node>.

Alle Unterprogramme, die bei der Verknüpfung mit ausführbaren Programmen der Selektionsbildverarbeitung dienen, werden nicht aufgerufen und die Laufzeitumgebung löst keine Reporting-Ereignisse im aufrufenden Programm aus. Die PUT-Anweisungen der logischen Datenbank lösen stattdessen Aktionen im Funktionsbaustein aus, die zum Aufruf von Callback-Routinen im aufrufenden Programm führen. Der Funktionsbaustein fängt sozusagen die Ereignisse der Laufzeitumgebung ab.

Die Parameter von LDB_PROCESS

Die Import-Parameter des Funktionsbausteins sind:

Name der aufzurufenden logischen Datenbank.

Name einer Variante um das Selektionsbild der logischen Datenbank zu füllen. Die Variante muß dem Datenbankprogramm der logischen Datenbank zugeordnet sein. Die Daten werden so übergeben, wie mit dem Zusatz WITH SELECTION-TABLE bei einem Programmaufruf über SUBMIT.

In diesem Parameter können für die Knoten der Logischen Datenbank, die im Selektions-Include für freie Abgrenzungen vorgesehen zusätzliche Abgrenzungen zum Tabellenparameter SELECTIONS übergeben werden. Der Datentyp des Parameters RSDS_TEXPR ist in der Typgruppe RSDS definiert. Die Daten werden so übergeben, wie mit dem Zusatz WITH FREE SELECTION bei einem Programmaufruf über SUBMIT.

In diesem Parameter kann für die Knoten der logischen Datenbank, die im Selektions-Include für freie Feldselektion vorgesehen sind eine Liste der benötigten Felder übergeben werden. Der Datentyp des Parameters ist die tiefe interne Tabelle RSFS_FIELDS aus der Typgruppe RSFS. Die Komponente TABLENAME enthält den Namen des Knotens und die tiefe Komponente FIELDS enthält die Namen der zu lesenden Felder.

Die Tabellen-Parameter des Funktionsbausteins sind:

In diesem Parameter werden die Namen von Knoten und Ereignissen Callback-Routinen zugeordnet. Der Parameter bestimmt, zu welchen Knoten die logische Datenbank Daten lesen, zu welchen Zeitpunkten und an welche Callback-Routinen sie diese Daten sie die Daten überstellt (siehe unten).

In diesem Parameter können Eingabewerte für die Selektionskriterien und Parameter des Selektionsbilds der logischen Datenbank übergeben werden. Der Datentyp des Parameters entspricht der Struktur RSPARAMS im ABAP Dictionary. Die Daten werden so übergeben, wie mit dem Zusatz WITH SELECTION-TABLE bei einem Programmaufruf über SUBMIT.

Bei der gleichzeitigen Übergabe von Abgrenzungen über mehrere Parameter überschreiben in SELECTIONS und EXPRESSIONS übergebene Werte die Werte in VARIANT.

Lesetiefe und Callback-Routinen

Bei der Verknüpfung einer logischen Datenbank mit einem ausführbaren Programm bestimmen die GET-Anweisungen die Lesetiefe der logischen Datenbank. Beim Aufruf über den Funktionsbaustein LDB_PROCESS wird die Lesetiefe durch an den Parameter CALLBACK übergebene Knotennamen bestimmt. Für jeden Knoten, für den Daten angefordert werden, kann zu zwei Zeitpunkten eine Callback-Routine ausgeführt werden. Diese Zeitpunkte entsprechen GET und GET LATE in ausführbaren Programmen. Im Tabellen-Parameter CALLBACK werden für jeden Knoten der Namen der zugehörigen Callback-Routine und die gewünschten Zeitpunkte angegeben. Eine Callback-Routine ist ein Unterprogramm im aufrufenden oder einem anderen Programm, das zum entsprechenden Ereignis ausgeführt werden soll.

Für das Ereignis GET wird die Callback-Routine direkt nach dem Lesen der Daten des Knotens und vor der Bearbeitung des darunterliegenden Teilbaums aufgerufen. Für das Ereignis GET_LATE wird die Callback-Routine nach Bearbeitung des darunterliegenden Teilbaums aufgerufen.

Der Zeilentyp des Tabellen-Parameters CALLBACK ist die flache Struktur LDBCB aus dem ABAP Dictionary mit folgenden Komponenten:

Name des zu lesenden Knotens der logischen Datenbank.

Flag (Inhalt X oder SPACE), um die zugehörige Callback-Routine zum Ereignis GET aufzurufen.

Flag (Inhalt X oder SPACE), um die zugehörige Callback-Routine zum Ereignis GET LATE aufzurufen.

Namen des ABAP-Programms, in der die Callback-Routine definiert ist.

Namen der Callback-Routine.

Bei der Übergabe einer internen Tabelle an den Parameter CALLBACK muß zu jedem Knoten mindestens eine der Spalten GET oder GET_LATE mit X gefüllt sein, es können aber auch beide gefüllt sein.

Eine Callback-Routine ist ein Unterprogramm, das mit folgender Parameterschnittstelle definiert werden muß:

FORM <subr> USING <node> LIKE LDBCB-LDBNODE
                  <wa>   [TYPE <t>]
                  <evt>
                  <check>.

Die Parameter werden bei ihrem Aufruf durch den Funktionsbaustein LDB_PROCESS gefüllt und haben folgende Bedeutung:

Ausnahmen von LDB_PROCESS

Eine logische Datenbank darf nicht nochmals aufgerufen werden, solange ein anderer Aufruf noch nicht beendet ist. Ansonsten wird die Ausnahme ausgelöst.

Eine logische Datenbank darf nur mehrfach hintereinander aufgerufen werden, wenn ihr Datenbankprogramm das Unterprogramm LDB_PROCESS_INIT enthält, ansonsten wird die Ausnahme ausgelöst.

Eine Fehlerbehandlung im Unterprogramm LDB_PROCESS_CHECK_SELECTIONS des Datenbankprogramms kann diese Ausnahme auslösen. Die Fehlermeldung wird in den üblichen Systemfeldern SY-MSG.. zur Verfügung gestellt.

Die übrigen Ausnahmen sind in der Dokumentation des Funktionsbausteins beschrieben.

Beispiel

Beispiel

REPORT demo_logical_database.

DATA wa_spfli TYPE spfli.
SELECT-OPTIONS s_carr FOR wa_spfli-carrid.

DATA: callback TYPE TABLE OF ldbcb,
      callback_wa LIKE LINE OF callback.

DATA: seltab TYPE TABLE OF rsparams,
      seltab_wa LIKE LINE OF seltab.

callback_wa-ldbnode     = 'SPFLI'.
callback_wa-get         = 'X'.
callback_wa-get_late    = 'X'.
callback_wa-cb_prog     = sy-repid.
callback_wa-cb_form     = 'CALLBACK_SPFLI'.
APPEND callback_wa TO callback.

CLEAR callback_wa.
callback_wa-ldbnode     = 'SFLIGHT'.
callback_wa-get         = 'X'.
callback_wa-cb_prog     = sy-repid.
callback_wa-cb_form     = 'CALLBACK_SFLIGHT'.
APPEND callback_wa TO callback.

seltab_wa-kind = 'S'.
seltab_wa-selname = 'CARRID'.

LOOP AT s_carr.
  MOVE-CORRESPONDING s_carr TO seltab_wa.
  APPEND seltab_wa TO seltab.
ENDLOOP.

CALL FUNCTION 'LDB_PROCESS'
     EXPORTING
          ldbname                     = 'F1S'
          variant                     = ' '
     TABLES
          callback                    = callback
          selections                  = seltab
     EXCEPTIONS
          ldb_not_reentrant           = 1
          ldb_incorrect               = 2
          ldb_already_running         = 3
          ldb_error                   = 4
          ldb_selections_error        = 5
          ldb_selections_not_accepted = 6
          variant_not_existent        = 7
          variant_obsolete            = 8
          variant_error               = 9
          free_selections_error       = 10
          callback_no_event           = 11
          callback_node_duplicate     = 12
          OTHERS                      = 13.

IF sy-subrc <> 0.
  WRITE: 'Exception with SY-SUBRC', sy-subrc.
ENDIF.

FORM callback_spfli USING name  TYPE ldbn-ldbnode
                          wa    TYPE spfli
                          evt   TYPE c
                          check TYPE c.
  CASE evt.
    WHEN 'G'.
      WRITE: / wa-carrid, wa-connid, wa-cityfrom, wa-cityto.
      ULINE.
    WHEN 'L'.
      ULINE.
  ENDCASE.
ENDFORM.

FORM callback_sflight USING name  TYPE ldbn-ldbnode
                            wa    TYPE sflight
                            evt   TYPE c
                            check TYPE c.
  WRITE: / wa-fldate, wa-seatsocc, wa-seatsmax.
ENDFORM.

Das Programm soll Daten über die logische Datenbank F1S lesen. Die Struktur von F1S ist:

Diese Grafik wird im zugehörigen Text erklärt

Zuerst wird ein programmspezifisches Selektionsbild definiert. Nur hierfür ist das Datenobjekt WA_SPFLI nötig. Dann werden passende Variablen für die Schnittstelle deklariert.

Die interne Tabelle CALLBACK wird so gefüllt, daß für die zwei Knoten SPFLI und SFLIGHT verschiedene Callback-Routinen im aufrufenden Programm aufgerufen werden. Für den Knoten SPFLI soll die entsprechende Routine zu GET und GET_LATE, für SFLIGHT nur zu GET aufgerufen werden.

Die interne Tabelle SELTAB wird für die Selektionen des Knotens SPFLI mit Werten aus der Selektionstabelle S_CARR des programmspezifischen Selektionsbilds gefüllt.

Der Funktionsbaustein LDB-PROCESS wird mit diesen Parametern aufgerufen.

Die Unterprogramme CALLBACK_SPFLI und CALLBACK_SFLIGHT dienen als Callback-Routinen. Da die Schnittstellenparameter WA vollständig typisiert sind, kann auf die einzelnen Komponenten der Arbeitsbereiche zugegriffen werden. In CALLBACK_SPFLI werden die Ereignisse GET und GET LATE unterschiedlich behandelt.

Der Anfang der Listenausgabe ist zum Beispiel:

Diese Grafik wird im zugehörigen Text erklärt

Ende des Inhaltsbereichs