Show TOC 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 mussten 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 angepasst werden, mit folgenden Einschränkungen: Bei nicht angepassten Logischen Datenbanken erlaubt der Funktionsbaustein es nicht, dieselbe logische Datenbank mehrmals hintereinander aufzurufen. Außerdem wird das Unterprogramm PAI nicht aufgerufen, so dass dort programmierte Prüfungen von Selektionskriterien und Parametern nicht ausgeführt werden. Diese Einschränkungen können dadurch umgangen werden, dass 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:

·        LDBNAME

Name der aufzurufenden logischen Datenbank.

·        VARIANT

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

·        EXPRESSIONS

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.

·        FIELD_SELECTION

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:

·        CALLBACK

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).

·        SELECTIONS

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:

·        LDBNODE

Name des zu lesenden Knotens der logischen Datenbank.

·        GET

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

·        GET_LATE

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

·        CB_PROG

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

·        CB_FORM

Namen der Callback-Routine.

Bei der Übergabe einer internen Tabelle an den Parameter CALLBACK muss 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 muss:

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:

·        node enthält den Namen des Knotens.

·        wa ist der Arbeitsbereich der für den Knoten gelesenen Daten. Das Programm, das den Funktionsbaustein LDB_PROCESS aufruft, und das Programm, das die Callback-Routine enthält, müssen keine Schnittstellen-Arbeitsbereiche mit NODES oder TABLES deklarieren. Wenn die Callback-Routine nur für einen Knoten verwendet wird, kann man sich mit dem TYPE-Bezug auf den Datentyp des Knotens im ABAP Dictionary beziehen. Nur dann können die einzelnen Komponenten von strukturierten Knoten im Unterprogramm direkt adressiert werden. Falls die Callback-Routine für mehrere Knoten verwendet wird, kann nicht mit dem TYPE-Bezug gearbeitet werden. Dann müssen die Komponenten von strukturierten Knoten über das komponentenweise Zuweisen von Strukturen an Feldsymbole adressiert werden.

·        evt enthält G oder L, je nachdem ob es sich um das Ereignis GET oder GET LATE handelt. Im Unterprogramm kann der Programmverlauf also über den Inhalt von evt entsprechend verzweigt werden.

·        checkerlaubt es der Callback-Routine (allerdings nur wenn evt den Wert G enthält) die weitere Verarbeitung zu beeinflussen. Der Parameter erhält beim Aufruf des Unterprogramms den Wert X. Wenn er beim Verlassen des Unterprogramms den Wert space hat, gilt dies als Kennzeichen, dass der gesamte darunter liegende Teilbaum im Funktionsbaustein LDB_PROCESS nicht bearbeitet werden soll. Dies entspricht dem Verlassen eines GET-Ereignisblocks mit CHECK in ausführbaren Programmen. Diese Möglichkeit dient der Performanceverbesserung wenn dadurch das unnötige Lesen von Daten verhindert werden kann.

Ausnahmen von LDB_PROCESS

·        LDB_ALREADY_RUNNING

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

·        LDB_NOT_REENTRANT

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.

·        LDB_SELECTIONS_NOT_ACCEPTED

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, dass 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_spfliI 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