Show TOC Anfang des Inhaltsbereichs

Benennung des Unterprogramms  Dokument im Navigationsbaum lokalisieren

Mit der Anweisung PERFORM lassen sich sowohl Unterprogramme aufrufen, die im gleichen ABAP-Programm kodiert sind (interne Aufrufe), als auch Unterprogramme, die in anderen ABAP-Programmen kodiert sind (externe Aufrufe).

Der Name des Unterprogramms kann auch dynamisch zur Laufzeit angegeben werden und man kann ein Unterprogramm aus einer Liste aufrufen.

Interne Unterprogrammaufrufe

Für den Aufruf eines im gleichen Programm definierten Unterprogramms genügt die statische Angabe des Unterprogrammnamens in der Anweisung PERFORM:

PERFORM subr [USING    p1 p2... ]
             [CHANGING
p1 p2... ].

Das interne Unterprogramm hat Zugriff auf alle globalen Daten des Aufrufers.

Beispiel

REPORT demo_mod_tech_perform_int.

DATA: num1 TYPE i,
      num2 TYPE i,
      sum  TYPE i.

num1 = 2. num2 = 4.
PERFORM addit.

num1 = 7. num2 = 11.
PERFORM addit.

FORM addit.
  sum = num1 + num2.
  PERFORM out.
ENDFORM.

FORM out.
  WRITE: / 'Sum of', num1, 'and', num2, 'is', sum.
ENDFORM.

Die Ausgabe sieht so aus:

Sum of          2 and          4 is          6

Sum of          7 and         11 is         18

In diesem Beispiel werden die beiden internen Unterprogramme addit und out am Ende des Programms definiert. addit wird vom Programm aus aufgerufen und out wird von addit aus aufgerufen. Die Unterprogramme haben Zugriff auf die globalen Felder num1, num2 und sum.

 

Externe Unterprogrammaufrufe

Das Hauptanwendungsgebiet von Unterprogrammen ist die Modularisierung und Strukturierung lokaler Programme. Jedes Unterprogramm kann aber auch extern von einem anderen ABAP-Programm aufgerufen werden. Im Extremfall können ABAP-Programme angelegt werden, die keine anderen Verarbeitungsböcke enthalten außer Unterprogrammen. Solche Programme sind nicht ausführbar, sondern dienen anderen ABAP-Programmen als Subroutine-Pool für externe Unterprogramme.

Um Funktionalität global zur Verfügung zu stellen sollten statt externer Unterprogramme jedoch immer Funktionsbausteine verwendet werden. Funktionsbausteine werden mit dem Werkzeug Function Builder der ABAP Workbench zentral gepflegt, sie werden in einer Bibliothek geführt und sie verfügen über ein abgesichertes Freigabeverfahren.

Zur Kapselung Funktionalität und Daten dienen die Klassen von ABAP Objects mit ihren Attributen und Methoden. Bei allen Anforderungen, die über reine Funktionalität hinausgehen, können globale Klassen statt externer Unterprogrammaufrufe eingesetzt werden.

Bei externen Unterprogrammaufrufen muß der Name des Programms bekannt sein, in dem das Unterprogramm definiert ist:

PERFORM subr(prog) [USING    p1 p2... ]
                   [CHANGING
p1 p2... ] [IF FOUND].

Der Programmname prog wird statisch angegeben. Durch die Verwendung der Option IF FOUND läßt sich ein Laufzeitfehler verhindern, wenn das Programm prog kein Unterprogramm subr enthält. Dann ignoriert das System die PERFORM-Anweisung.

Beim Aufruf eines externen Unterprogramms, wird das gesamte Programm, in dem das Unterprogramm definiert ist, in den internen Modus des aufrufenden Programms geladen, falls es sich noch nicht dort befindet. Um Speicherplatz zu sparen, sollte daher der externe Aufruf von Unterprogrammen die in verschiedenen Programmen definiert, sind auf ein Minimum beschränkt werden.

Beispiel

Ein Programm enthält z.B. folgendes Unterprogramm:

REPORT formpool.

FORM header.
  WRITE: / 'Program started by', sy-uname,
         / 'on host', sy-host,
           'date:', sy-datum, 'time:', sy-uzeit.
  
ULINE.
ENDFORM.

Das Unterprogramm läßt sich von einem anderen Programm aus aufrufen:

REPORT demo_mod_tech_perform_ext.

PERFORM header(demo_mod_tech_formpool_1) IF FOUND.

In diesem Beispiel werden zwischen dem aufrufenden Programm und dem Unterprogramm keine Daten übergeben.

Dynamische Benennung des Unterprogramms

Der Name des Unterprogramms und bei externen Aufrufen auch der Name des Programms, in dem es gespeichert ist, lassen sich dynamisch angeben:

PERFORM (fsubr)[IN PROGRAM (fprog)][USING    p1 p2... ]
                                   
[CHANGING p1 p2... ]
                                   [IF FOUND].

Der Name des Unterprogramms und der Name des externen Programms sind Inhalt der Felder fsubr und fprog. Durch die Verwendung der Option IF FOUND läßt sich ein Laufzeitfehler verhindern, wenn kein Unterprogramm des Namens in fsubr gefunden wird. Wenn keine runden Klammern verwendet werden, wirkt diese Variante der PERFORM -Anweisung wie die statische Benennung.

Beispiel

Ein Programm enthält folgende Unterprogramme:

PROGRAM formpool.

FORM sub1.
  WRITE: / 'Subroutine 1'.
ENDFORM.

FORM sub2.
  WRITE: / 'Subroutine 2'.
ENDFORM.

Dynamische Benennung dieser Unterprogramme:

PROGRAM form_test.

DATA: progname(8) TYPE c VALUE 'FORMPOOL',
      subrname(8) TYPE c.

subrname = 'SUB1'.
PERFORM (subrname) IN PROGRAM (progname) IF FOUND.

SUBRNAME = 'SUB2'.
PERFORM (subrname) IN PROGRAM (progname) IF FOUND.

Die Ausgabe sieht so aus:

Subroutine 1

Subroutine 2

Das Character-Feld progname enthält den Namen des Programms, in dem das Unterprogramm definiert ist. Im Character-Feld subrname stehen die Namen der Unterprogramme.

Unterprogramme aus einer Liste aufrufen

Ein bestimmtes Unterprogramm aus einer Liste von Unterprogrammen läßt sich so aufrufen:

PERFORM idx OF subr1 subr2 ... subrn.

Es wird das Unterprogramm aufgerufen, das in der Unterprogramm-Liste an der Position idx steht. Diese Variante der PERFORM-Anweisung kann nur für interne Aufrufe und nur für Unterprogramme ohne Parameterschnittstelle verwendet werden. Das Feld idx kann eine Variable oder ein Literal sein.

Beispiel

REPORT demo_mod_tech_perform_list.

DO 2 TIMES.
  PERFORM sy-index OF sub1 sub2.
ENDDO.

FORM sub1.
  WRITE / 'Subroutine 1'.
ENDFORM.

FORM sub2.
  WRITE / 'Subroutine 2'.
ENDFORM.

Die Ausgabe sieht so aus:

Subroutine 1

Subroutine 2

In diesem Beispiel werden die zwei internen Unterprogramme sub1 und sub2 nacheinander aus einer Liste aufgerufen.

 

 

 

 

Ende des Inhaltsbereichs