Anfang des InhaltsbereichsBenennung 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   ... <pi>... ]
               [CHANGING... <pi>... ].

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 Unterprogramm ADDIT und OUT am Ende des Programms definiert. ADDIT wird vom Programm aus aufgerufen und OUT wird von ADDIT aus aufgerufen. Die Unterprogramm 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   ... <pi>... ]
                       [CHANGING... <pi>... ] [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 <sub> 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 (siehe Speicherstrukturen eines ABAP-Programms). 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   ... <pi>... ]
                                       [CHANGING... <pi>... ]
                                       [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 Performanweisung 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> <subr 2>.... <subr n>.

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