Beispiele zu Unterprogrammen 

Beispiel zur Referenzübergabe von Parametern

REPORT demo_mod_tech_example_1.

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

num1 = 2. num2 = 4.
PERFORM addit USING num1 num2 CHANGING sum.

num1 = 7. num2 = 11.
PERFORM addit USING num1 num2 CHANGING sum.

FORM addit
       USING add_num1   TYPE any
             add_num2   TYPE any
       CHANGING add_sum TYPE any.

  add_sum = add_num1 + add_num2.
  PERFORM out USING add_num1 add_num2 add_sum.

ENDFORM.

FORM out
       USING out_num1 TYPE any
             out_num2 TYPE any
             out_sum  TYPE any.

  WRITE: / 'Sum of', out_num1, 'and', out_num2, 'is', out_sum.

ENDFORM.

Die Ausgabe sieht so aus:

Sum of          2 and          4 is          6

Sum of          7 and         11 is         18

Hier werden die Aktualparameter NUM1, NUM2 und SUM über Referenz an die Formalparameter des Unterprogramms ADDIT übergeben. Nach dem Ändern von ADD_SUM werden die letztere dann an die Formalparameter OUT_NUM1, OUT_NUM2 und OUT_SUM des Unterprogramms OUT übergeben.

Eingabeparameter, die im Unterprogramm geändert werden, werden automatisch auch im aufrufenden Porgramm geändert werden. Um dies zu verhindern, müssen Sie den Parameter mit USING und als Wert übergeben.

Beispiel zur Wertübergabe von Parametern

REPORT demo_mod_tech_example_2.

DATA: num  TYPE i VALUE 5,
      fac  TYPE i VALUE 0.

PERFORM fact USING num CHANGING fac.

WRITE: / 'Factorial of', num, 'is', fac.

FORM fact
       USING value(f_num) TYPE i
       CHANGING f_fact    TYPE i.

  f_fact = 1.
  WHILE f_num GE 1.
    f_fact = f_fact * f_num.
    f_num = f_num - 1.
  ENDWHILE.

ENDFORM.

Die Ausgabe sieht so aus:

Factorial of          5 is        120

Um sicher zu gehen, daß ein Eingabeparameter im aufrufenden Programm nicht geändert wird, obwohl er im Unterprogramm geändert wird, können Daten als Wert übergeben werden. In diesem Beispiel wird die Fakultät einer Zahl NUM berechnet. Der Aktualparameter NUM wird an den Formalparameter F_NUM des Unterprogramms übergeben. Obwohl F_NUM im Unterprogramm verändert wird, behält der Aktualparameter NUM seinen alten Wert. Der Ausgabeparameter FAC wird über Referenz übergeben.

Beispiel für Ausgabeparameter

REPORT demo_mod_tech_example_3.

DATA: op1  TYPE i,
      op2  TYPE i,
      res  TYPE i.

op1 = 3.
op2 = 4.

PERFORM multip
          USING op1 op2
          CHANGING res.

WRITE: / 'After subroutine:',
       / 'RES=' UNDER 'RES=', res.

FORM multip
       USING value(o1) TYPE any
             value(o2) TYPE any
     CHANGING value(r) TYPE any.

  r = o1 * o2.
  WRITE: / 'Inside subroutine:',
         /  'R=', r, 'RES=', res.

ENDFORM.

Die Ausgabe sieht so aus:

Inside subroutine:

R=         12 RES=          0

After subroutine:

              RES=         12

Um einen geänderten Formalparameter erst nach erfolgreicher Fertigstellung des Unterprogramms zurückzugeben, verwendet man einen CHANGING-Parameter mit Wertübergabe. In diesem Beispiel werden die Aktuallparameter OP1 und OP2 als Wert über USING an die Formalparameter O1 und O2 übergeben. Der Aktualparameter RES wird als Wert über CHANGING an den Formalparameter R übergeben. Durch die Ausgabe von R und RES auf das Ausgabebild vom Unterprogramm aus, wird deutlich, daß RES vor der Anweisung ENDFORM unverändert ist. Der Inhalt ändert sich erst nach Beendigung des Unterprogramms.

Beispiel zur Übergabe von Feldleisten

REPORT demo_mod_tech_example_4.

TYPES: BEGIN OF line,
         name(10)   TYPE c,
         age(2)     TYPE n,
         country(3) TYPE c,
       END OF line.

DATA who TYPE line.

who-name = 'Otto'. who-age = '10'. who-country = 'D'.

PERFORM components CHANGING who.

WRITE: / who-name, who-age, who-country.

FORM components
       CHANGING value(person) TYPE line.

  WRITE: / person-name, person-age, person-country.
  person-name = 'Mickey'.
  person-age = '60'.
  person-country = 'USA'.

ENDFORM.

Die Ausgabe sieht so aus:

Otto       10 D

Mickey     60 USA

Der Aktualparameter WHO mit dem benutzerdefinierten, strukturierten Datentyp LINE, wird an den Formalparameter PERSON übergeben. Der Formalparameter PERSON wird mit TYPE LINE typisiert. Da LINE ein benutzerdefinierter Datentyp ist, ist der Typ von PERSON vollständig bestimmt. Auf die Komponenten von PERSON wird im Unterprogramm zugegriffen und sie werden geändert. Anschließend werden sie an die Komponenten von WHO im aufrufenden Programm zurückgegeben.

Beispiel zur Übergabe von internen Tabellen

REPORT demo_mod_tech_example_5.

DATA: BEGIN OF line,
        col1 TYPE i,
        col2 TYPE i,
      END OF line.

DATA itab LIKE STANDARD TABLE OF line.

PERFORM fill CHANGING itab.

PERFORM out  USING    itab.

FORM fill CHANGING f_itab LIKE itab.

  DATA f_line LIKE LINE OF f_itab.

  DO 3 TIMES.
    f_line-col1 = sy-index.
    f_line-col2 = sy-index ** 2.
    APPEND f_line TO f_itab.
  ENDDO.

ENDFORM.

FORM out USING value(f_itab) LIKE itab.

  DATA f_line LIKE LINE OF f_itab.

  LOOP AT f_itab INTO f_line.
    WRITE: / f_line-col1, f_line-col2.
  ENDLOOP.

ENDFORM.

Die Ausgabe sieht so aus:

         1          1

         2          4

         3          9

Formalparameter von Unterprogrammen können als interne Tabellen typisiert werden. In diesem Beispiel haben die Unterprogramme FILL und OUT jeweils einen als interne Tabelle typisierten Formalparameter. Eine interne Tabelle ohne Kopfzeile wird an die Unterprogramme übergeben.In beiden Unterprogrammen wird ein Arbeitsbereich F_LINE als lokales Datenobjekt angelegt wird. Wäre ITAB eine Tabelle mit Kopfzeile, müßte ITAB durch ITAB[] in den Anweisungen PERFORM und FORM ersetzt werden.

Beispiel für TABLES-Parameter

Dieses Beispiel wird der Vollständigkeit halber angegeben. Der TABLES-Parameter wird nur noch aus Kompatiblitätsgründen unterstützt.

REPORT demo_mod_tech_example_6.

TYPES: BEGIN OF line,
         col1 TYPE i,
         col2 TYPE i,
       END OF line.

DATA: itab TYPE STANDARD TABLE OF line WITH HEADER LINE,
      jtab TYPE STANDARD TABLE OF line.

PERFORM fill TABLES itab.

MOVE itab[] TO jtab.

PERFORM out TABLES jtab.

FORM fill TABLES f_itab LIKE itab[].

  DO 3 TIMES.
    f_itab-col1 = sy-index.
    f_itab-col2 = sy-index ** 2.
    APPEND f_itab.
  ENDDO.

ENDFORM.

FORM out TABLES f_itab LIKE jtab.

  LOOP AT f_itab.
    WRITE: / f_itab-col1, f_itab-col2.
  ENDLOOP.

ENDFORM.

Die Ausgabe sieht so:

         1          1

         2          4

         3          9

In diesem Beispiel werden eine interne Tabelle ITAB mit Kopfzeile und eine interne Tabelle JTAB ohne Kopfzeile deklariert. Der Aktualparameter ITAB wird über TABLES an den Formalparameter F_ITAB des Unterprogramms FILL übergeben. Die Kopfzeile wird mitübergeben. Nach dem Kopieren des Tabellenkörpers von ITAB nach JTAB, wird der Aktualparameter JTAB über TABLES an den Formalparameter F_ITAB des Unterprogramms OUT übergeben. Die nicht übergebene Kopfzeile F_ITAB wird im Unterprogramm automatisch generiert.