Anfang des Inhaltsbereichs

Hintergrunddokumentation Überblick über das Coding von Funktionsbausteinen  Dokument im Navigationsbaum lokalisieren

Namenskonventionen

Wenn Sie eine Funktionsgruppe anlegen, erzeugt die Workbench automatisch ein Rahmenprogramm, globale Daten und Quelltext. Das System benutzt das Format SAPL<FGRP> für das Rahmenprogramm, wobei <FRGP> der Name der Funktionsgruppe ist. Für jeden Funktionsbaustein legt das System automatisch eine Include-Datei an, und ordnet dieser einen Namen mit dem Schema L<FGRP>U<NN> zu.

Beispiel

Im Include-Programm der Funktionsgruppe FGRP beispielsweise liegt der erste Funktionsbaustein im Include LFGRPU01. Die folgenden Bausteine finden sich in den Include-Programmen LFGRPU02, LFGRPU03, LFGRPU04 usw.

Funktionsbausteine programmieren

Ist die Schnittstelle des Funktionsbausteins festgelegt, so kann mit der Programmierung des Funktionsbausteins begonnen werden. Öffnen Sie Ihren Funktionsbaustein im Object Navigator (Transaktion SE80) und wählen Sie das Register Quelltext.

Hinweis

Die definierten Parameter und Ausnahmen erscheinen als Kommentare am Anfang des Quelltextes:

Einige Besonderheiten der Programmierung von Funktionsbausteinen:

Datenbehandlung in Funktionsbausteinen

      Export- und Importparameter werden nicht im Quelltext des Funktionsbausteins deklariert. Das System übernimmt diese Aufgabe und verwendet dazu ein INCLUDE-Programm, das eine Liste der definierten Parameter als Kommentarzeilen in den Quelltext einfügt .

      Lokale Datentypen und Objekte können Sie in Funktionsbausteinen genauso wie in Unterprogrammen deklarieren. 

      Sie können Datendeklarationen mit den Anweisungen TYPES und DATA in L<FRGP>TOPschreiben. Diese Daten sind dann global für alle Funktionsbausteine einer Gruppe. Das System legt die Daten beim ersten Aufrufen eines Funktionsbausteins in einer Gruppe an. Es werden immer die Werte des zuletzt aufgerufenen Funktionsbausteins gesichert.

Unterprogramme von Funktionsbausteinen aus aufrufen

Sie können verschiedene Unterprogramme von Funktionsbausteinen aus aufrufen.

      Sie können das Programm-Coding interner Unterprogramme eines Funktionsbausteins direkt hinter die Anweisung ENDFUNCTION schreiben.  Diese Unterprogramme können zwar auch von allen Funktionsbausteinen der Gruppe aus aufgerufen werden. Empfehlenswert ist es jedoch, sie nur von dem Funktionsbaustein aus aufzurufen, in den Sie die Unterprogramme eingefügt haben. Dadurch wird eine bessere Übersichtlichkeit gewährleistet.

      Möchten Sie interne Unterprogramme erstellen, die von allen Funktionsbausteinen der Funktionsgruppe <fgrp> aus aufgerufen werden können, verwenden Sie spezielle INCLUDE-Programme L<fgrp>F<XX>.

      Sie können beliebige externe Unterprogramme aufrufen.

Ausnahmen auslösen

Innerhalb eines Funktionsbausteins sind alle Ausnahmen durch ihre definierten Bezeichner verfügbar. Die Ausnahmen können vom System oder vom aufrufenden Programm behandelt wird. Darüber entscheiden Sie erst beim Funktionsaufruf, etwa durch Zuweisung eines numerischen Wertes an die entsprechenden Ausnahmen. Näheres finden Sie dazu unter Funktionsbausteine aus Ihrem Coding aufrufen

Ausnahmen können mit zwei ABAP-Anweisungen ausgelöst werden:

Syntax

RAISE <Ausnahme>.

MESSAGE..... RAISING <Ausnahme>.

Die Wirkung dieser Anweisungen hängt davon ab, ob die Ausnahme vom aufrufenden Programm oder vom System verarbeitet wird:

      falls die RAISE-Anweisung die Ausnahme auslöst und das aufrufende Programm die Verarbeitung der Ausnahme aufnimmt, so wird die Ausführung des Funktionsbausteins beendet und der numerische Wert, der dieser Ausnahme beim Aufruf zugewiesen wurde, ins Systemfeld SY-SUBRC gestellt. Wird aber die Ausnahme nicht vom aufrufenden Programm behandelt, erzeugt das System einen Laufzeitfehler.

      Wenn Sie die MESSAGE… RAISING-Anweisung benutzen und damit das System die Ausnahme verarbeitet, wird kein Laufzeitfehler erzeugt. Die Verarbeitung wird fortgesetzt und das System zeigt eine Nachricht mit dem definierten Typen an. Dazu müssen Sie die MESSAGE-ID in der ersten Anweisung des INCLUDE-Programms L<FGRP>TOPangeben. Die MESSAGE… RAISING-Anweisung trägt in die folgenden Systemfelder Werte ein:

       SY‑MSGID (Meldungskennung)

       SY‑MSGTY (Meldungstyp)

       SY‑MSGNO (Meldungsnummer)

       SY‑MSGV1 bis SY‑MSGV4 (Inhalt der Felder <F1> bis <F4>, die in die Meldung eingeschlossen sind).

Für weitere Information lesen Sie auch die Schlüsselwortdokumentation zu MESSAGE.

Beispiel

In diesem Beispiel verwenden wir den folgenden Funktionsbaustein:

function my_divide

*“-----------------------------------------------

*“*“Local interface:

*“         IMPORTING

*“               VALUE(Z1) TYPE F

*“               VALUE(M1) TYPE F

*“         EXPORTING

*“               VALUE(RES) TYPE F

*“         EXCEPTIONS

*“               DIV_ZERO

*“------------------------------------------------

     if n1 eq 0.

        raise div_zero.

     else.

        res = z1 / n1.

     endif.

endfunction.

Wenn N1 nicht gleich Null ist, wird Z1 durch N1 dividiert. Andernfalls wird die Ausnahme DIV_ZERO ausgelöst.

Das Programm MDTEST ruft die Funktion MY_DIVIDE auf:

report mdtest.

data: result type f.

call function ‘MY_DIVIDE’

     exporting

        z1 = 6

        n1 = 4

     importing

        res = result

     exceptions

        div_zero = 1

        others = 2.

if sy-sybrc eq 0.

     write: / ‘Result =’ , result.

else.

     write ‘Division by zero’.

endif.

Nach der Ausführung sieht die Ausgabe so aus: Result = 1,500000

Wenn Sie N1 = 4 durch N1 = 0 ersetzen, verarbeitet das Programm MDTEST die Ausnahme DIV_ZERO, indem es SY-SUBRC den Wert 1 zuweist. Die Ausgabe ist: Division by zero.

Sie können Ausnahmen auch über Ausnahmeklassen auslösen. Dazu müssen Sie das Kennzeichen Ausnahmeklassen markieren.

Beispiel

function fb_exception_test.

*"---------------------------------------------------------

*"*"Local Interface:

*"  IMPORTING

*"     REFERENCE(P1) TYPE  I

*"     REFERENCE(P2) TYPE  I

*"  EXPORTING

*"     REFERENCE(P3) TYPE  I

*"     VALUE(P4) TYPE  I

*"  RAISING

*"      CX_SY_ZERODIVIDE

*"---------------------------------------------------------

 

  if p2 = 0.

    raise exception type cx_sy_zerodivide.

  else.

    p3 = p1 / p2.

  endif.

 

endfunction.  

 

Ende des Inhaltsbereichs