Show TOC Anfang des Inhaltsbereichs

Funktionsbausteine anlegen  Dokument im Navigationsbaum lokalisieren

Funktionsbausteine und ihre Rahmenprogramme, die Funktionsgruppen, werden ausschließlich mit dem Werkzeug Function Builder der ABAP Workbench angelegt. Die entsprechende Dokumentation Anlegen neuer Funktionsbausteine geht detailliert darauf ein. Im folgenden wird das Anlegen eines Funktionsbausteins anhand eines Beispiels aus der Sicht der ABAP-Programmierung nachvollzogen.

Beispiel

Es soll ein Funktionsbaustein READ_SPFLI_INTO_TABLE angelegt werden, der unter Einschränkung auf eine bestimmte Fluggesellschaft Daten aus der Datenbanktabelle SPFLI in eine interne Tabelle liest und die interne Tabelle an den Aufrufer übergibt.

Funktionsgruppe und Funktionsbaustein

Für den Funktionsbaustein wird eine neue Funktionsgruppe DEMO_SPFLI angelegt (siehe Eine Funktionsgruppe anlegen). Dann wird der neue Funtionsbaustein angelegt (siehe Einen Funktionsbaustein anlegen).

Parameterschnittstelle

Die Schnittstellenparameter von Funktionsbausteinen können prinzipiell genauso typisiert werden wie die Parameterschnittstelle von Unterprogrammen. Da Funktionsbausteine systemweit eingesetzt werden, sind in der Schnittstelle von Funktionsbausteinen aber nur Bezüge auf systemweit bekannte Datentypen möglich. Dies sind die elementaren ABAP-Datentypen, die systemweit bekannten generischen Typen (z.B. any table ) und die im ABAP Dictionary definierten Typen. Es ist kein LIKE-Bezug auf rahmenprogramminterne Datentypen möglich.

Der Funktionsbaustein READ_SPFLI_INTO_TABLE benötigt einen Import-Parameter für die Einschränkung auf eine Fluggesellschaft. Bei der Typisierung kann man sich auf das Schlüsselfeld CARRID der Datenbanktabelle SPFLI beziehen:

Diese Grafik wird im zugehörigen Text erklärt

Unter Bezugsfeld/-struktur kann eine Spalte einer Datenbanktabelle, eine Komponente einer Dictionary-Struktur oder eine gesamte Dictionary-Struktur angegeben werden. Der Importparameter ID wird optional gemacht und mit einem Vorschlagswert versehen.

Folgende Typisierung des Import-Parameters hat den gleichen Effekt:

Diese Grafik wird im zugehörigen Text erklärt

Unter Bezugstyp können alle systemweit bekannten generischen und vollständigen Datentypen angegeben werden. Hier wird direkt auf den elementaren Dictionary-Typ (bzw. auf das Datenelement) S_CARR_ID Bezug genommen, mit dem auch die Spalte SPFLI-CARRID typisiert ist.

Für die Übergabe der Daten an den Aufrufer benötigt der Funktionsbaustein einen Export-Parameter vom Typ einer internen Tabelle. Für diese interne Tabelle wird im ABAP Dictionary ein systemweiter Tabellentyp SPFLI_TAB mit dem Zeilentyp SPFLI definiert:

Diese Grafik wird im zugehörigen Text erklärt

Dieser Datentyp wird zur Typisierung des Export-Parameters ITAB verwendet:

Diese Grafik wird im zugehörigen Text erklärt

Die interne Tabelle wird als Wert übergeben. Nur interne Tabellen, die über Tabellen-Parameter übergeben werden, können ausschließlich als Referenz übergeben werden.

Ausnahmen

Der Funktionsbaustein soll eine Ausnahme auslösen, falls er zur übergebenen Einschränkung keine Daten in der Datenbanktabelle SPFLI findet. Hierfür wird eine Ausnahme NOT_FOUND vorgesehen:

Diese Grafik wird im zugehörigen Text erklärt

Quelltext

Nach der Definition der Parameterschnittstelle und der Ausnahmen kann man den Programmtext des Funktionsbausteins schreiben. Hierfür wählt man im Function Builder Quelltext. Der ABAP-Editor wird direkt für das Include-Programm LfgrpUxx (siehe Funktionsgruppen) geöffnet, in dem der Funktionsbaustein programmiert wird:

Diese Grafik wird im zugehörigen Text erklärt

Zwischen FUNCTION und ENDFUNCTION kann die Funktionalität des Funktionsbausteins programmiert werden. Die Definition der Parameterschnittstelle und der Ausnahmen wird hier nochmals in Kommentarzeilen angezeigt. Die wirkliche Codierung wurde vom Function Builder unsichtbar für den Programmierer an anderer Stelle generiert.

Daten in Funktionsbausteinen

Mit TYPES und DATA können lokale Datentypen und -objekte deklariert werden. Die Schnittstellenparameter verhalten sich ebenfalls wie lokale Datenobjekte. Weiterhin hat man innerhalb eines Funktionsbausteins Zugriff auf alle globalen Daten des Rahmenprogramms. Diese Daten müssen im Include-Programm LfgrpTOP definiert werden. Über Springen Globale Daten öffnet man dieses Include-Programm im Function Builder. Die globalen Daten verhalten sich wie Instanzattribute von Klassen. Beim ersten Aufruf eines Funktionsbausteins einer Funktionsgruppe, werden die Daten im Speicher erzeugt und können von allen Funktionsbausteinen der Funktionsgruppe geändert werden. Das System erhält die Werte bis zum nächsten Aufruf eines Funktionsbausteins.

Unterprogrammaufrufe

Unterprogramme dienen der programmlokalen Modularisierung. Auch Funktionsbausteine können von der Unterprogrammtechnik Gebrauch machen, indem Unterprogramme im entsprechenden Rahmenprogramm definiert werden.

Falls Unterprogramme nur in einem einzigen Funktionsbaustein aufgerufen werden sollen, definiert man sie am besten im gleichen Include-Programm wie den Funktionsbaustein selbst nach der ENDFUNCTION-Anweisung. Solche Unterprogramme können zwar auch von allen Funktionsbausteinen der Funktionsgruppe aufgerufen werden, sollten jedoch aus Gründen der Übersichtlichkeit nur von dem voranstehenden Funktionsbaustein aus aufgerufen werden.

Falls Unterprogramme von mehreren Funktionsbausteinen einer Funktionsgruppe aufgerufen werden sollen, definiert man sie am besten in einem der hierfür vorgesehen Include-Programme LfgrpFxx.

Ausnahmen auslösen

Zum Auslösen von Ausnahmen enthält ABAP zwei Anweisungen, die nur in Funktionsbausteinen verwendet werden können, nämlich

RAISE except.

und

MESSAGE..... RAISING except.

Die Wirkung dieser Anweisungen richtet sich danach, ob das aufrufende Programm die Ausnahme behandelt oder nicht. Das aufrufende Programm behandelt eine Ausnahme, falls der Name der Ausnahme except oder OTHERS hinter der Option EXCEPTION der Anweisung CALL FUNCTIONangegeben ist.

Falls das aufrufende Programm die Ausnahme nicht behandelt,

·         bricht die Anweisung RAISE das Programm ab und schaltet in den Fehlersuchemodus um.

·         zeigt die Anweisung MESSAGE..... RAISING die spezifizierte Nachricht an. Die Verarbeitung wird in Abhängigkeit vom Nachrichtentyp fortgesetzt.

Falls das aufrufende Programm die Ausnahme behandelt, geben beide Anweisungen die Programmsteuerung an das aufrufende Programm zurück. Es findet keine Wertübergabe statt. Die Anweisung MESSAGE..... RAISING zeigt keine Nachricht an, sondern füllt stattdessen die Systemfelder sy-msgid, sy-msgty, sy-msgno und sy-msgv1 bis sy-msgv4.

Programmtext von READ_SPFLI_INTO_TABLE

Der gesamte Programmtext von READ_SPFLI_INTO_TABLE könnte wie folgt aussehen:

FUNCTION read_spfli_into_table.

*"------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"       IMPORTING
*"             VALUE(ID) LIKE  SPFLI-CARRID DEFAULT 'LH '
*"       EXPORTING
*"             VALUE(ITAB) TYPE  SPFLI_TAB
*"       EXCEPTIONS
*"              NOT_FOUND
*"------------------------------------------------------------

  SELECT * FROM spfli INTO TABLE itab WHERE carrid = id.

  IF sy-subrc NE 0.
    MESSAGE e007(at) RAISING not_found.
  
ENDIF.

ENDFUNCTION.

Der Funktionsbaustein liest alle Daten aus der Datenbanktabelle SPFLI, bei denen das Schlüsselfeld CARRID gleich dem Import-Parameter id ist in die interne Tabelle spfli_tab. Falls keine entsprechenden Daten gefunden werden, wird die Ausnahme NOT_FOUND mit MESSAGE ... RAISING ausgelöst. Ansonsten wird die Tabelle als Export-Parameter an den Aufrufer übergeben.

Aufruf von READ_SPFLI_INTO_TABLE

Das folgende Programm ruft den Funktionsbaustein READ_SPFLI_INTO_TABLE auf:

REPORT demo_mod_tech_fb_read_spfli.

PARAMETERS carrier TYPE s_carr_id.

DATA: jtab TYPE spfli_tab,
      wa   LIKE LINE OF jtab.

CALL FUNCTION 'READ_SPFLI_INTO_TABLE'
     EXPORTING
          id        = carrier
     IMPORTING
          itab      = jtab
     EXCEPTIONS
          not_found = 1
          OTHERS    = 2.

CASE sy-subrc.
  WHEN 1.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno.
  WHEN 2.
    MESSAGE e702(at).
ENDCASE.

LOOP AT jtab INTO wa.
  WRITE: /  wa-carrid, wa-connid, wa-cityfrom, wa-cityto.
ENDLOOP.

Die Aktualparameter carrier und jtab haben die gleichen Datentypen wie die entsprechenden Schnittstellenparameter des Funktionsbausteins. Die Ausnahme NOT_FOUND wird behandelt, wobei die gleiche Nachricht ausgegeben wird, die auch der Funktionsbaustein bei einer Nichtbehandlung ausgegeben hätte.

Ende des Inhaltsbereichs