Parameterübergabe an Unterprogramme 

Wenn ein Unterprogramm eine Parameterschnittstelle hat, müssen alle Formalparameter der Schnittstelle beim Aufruf des Unterprogramms mit den Werten aus Aktualparametern versorgt werden. Die Aktualparameter werden hinter den Zusätzen USING oder CHANGING der Anweisung PERFORM angegeben.

Bei der Wertübergabe spielt einzig und allein die Reihenfolge der Aktualparameter in der PERFORM-Anweisung eine Rolle. Der Wert des ersten Aktualparameters wird an den ersten Formalparameter des Unterprogramms übergeben usw. Die Zusätze USING und CHANGING sind völlig gleichbedeutend. Es genügt entweder nur die Angabe von USING oder nur die Angabe von CHANGING. Aus Dokumentationsgründen empfiehlt sich aber die gleiche Aufteilung wie in der Definition der Schnittstelle im Unterprogramm.

Aktualparameter können beliebige Datenobjekte oder Feldsymbole des aufrufenden Programms sein, deren technischen Eigenschaften mit der Typisierung des entsprechenden Formalparameters verträglich sind. Bei der Angabe von Aktualparametern ist zu beachten, daß solche, die an Formalparameter mit Referenzübergabe übergeben werden, und solche, die an Ausgabeparameter mit Wertübergabe übergeben werden, vom Unterprogramm geändert werden können. Es ist dafür zu sorgen, daß nur Datenobjekte, die geändert werden sollen, an der entsprechenden Stelle der Aktualparameterliste stehen.

Falls ein Unterprogramm TABLES-Parameter in der Schnittstelle enthält, so müssen vor den USING- bzw. CHANGING-Parametern hinter dem TABLES-Zusatz der PERFORM-Anweisung interne Tabellen als Aktualparameter aufgeführt werden. TABLES-Parameter in Unterprogrammen werden aus Kompatibilitätsgründen weiterunterstützt, sollten aber nicht mehr verwendet werden.

Offsetangaben für Aktualparameter wirken wie Offsetangaben für Feldsymbole: Es können Speicherbereiche ausgewählt werden, die außerhalb der Grenzen des angegebenen Aktualparameters liegen.

PROGRAM form_test.

DATA: a1 TYPE p DECIMALS 3,
      a2 TYPE i,
      a3 TYPE d,
      a4 TYPE spfli-carrid,
      a5(1) TYPE c.

...

PERFORM subr USING a1 a2 a3 a4 a5.

...

PERFORM subr CHANGING a1 a2 a3 a4 a5.

...

PERFORM subr USING a1 a2 a3
             CHANGING a4 a5.

...

FORM subr USING
            value(f1) TYPE p
            value(f2) TYPE i
            f3        LIKE a3
          CHANGING
            value(f4) TYPE spfli-carrid
            f5.
...
ENDFORM.

In diesem Beispiel wird ein Unterprogramm SUBR mit einer Parameterschnittstelle bestehend aus fünf Formalparametern F1 bis F5 definiert. Das Unterprogramm wird dreimal intern aufgerufen. Als Aktualparameter werden die Datenobjekte A1 bis A5 verwendet. Die drei Unterprogrammaufrufe sind völlig gleichwertig. Solange die Reihenfolge der Aktualparameter erhalten bleibt sind auch noch weitere gleichwertige PERFORM-Anweisung denkbar. Bei jedem Aufruf wird A1 an F1, A2 an F2 usw. übergeben und bei Beendigung des Unterprogramms erhalten A3, A4 und A5 die aktuellen Werte von F3, F4 und F5. Der dritte Unterprogrammaufruf dokumentiert im Programm, was die Parameterschnittstelle des Unterprogramms anzeigt, daß nämlich nur A4 und A5 geändert werden. Bei Referenzparameter F3 hängt es aber noch von der Programmierung des Unterprogramms ab, ob A3 nicht doch geändert wird.

Das folgende Beispiel zeigt die Vererbung der technischen Eigenschaften von Aktualparametern an generische typisierte Formalparameter.

REPORT demo_mod_tech_describe.

DATA:
  date1      TYPE d,             date2      TYPE t,
  string1(6) TYPE c,             string2(8) TYPE c,
  number1    TYPE p DECIMALS 2,  number2    TYPE p DECIMALS 0,
  count1     TYPE i,             count2     TYPE i.

PERFORM typetest USING date1 string1 number1 count1.
SKIP.
PERFORM typetest USING date2 string2 number2 count2.

FORM typetest USING now
                    txt TYPE c
                    value(num) TYPE p
                    int TYPE i.
  DATA: t(1) TYPE c.
  DESCRIBE FIELD now TYPE t.
  WRITE: / 'Type of NOW is', t.
  DESCRIBE FIELD txt LENGTH t.
  WRITE: / 'Length of TXT is', t.
  DESCRIBE FIELD num DECIMALS t.
  WRITE: / 'Decimals of NUM are', t.
  DESCRIBE FIELD int TYPE t.
  WRITE: / 'Type of INT is', t.
ENDFORM.

Die Ausgabe sieht so aus:

Type of NOW is D
Length of TXT is 6
Decimals of NUM are 2
Type of INT is I

Type of NOW is T
Length of TXT is 8
Decimals of NUM are 0
Type of INT is I

Ein Unterprogramm TYPETEST wird zweimal mit unterschiedlichen Aktualparametern aufgerufen. Alle Aktual- und Formalparameter sind verträglich und während der Syntaxprüfung wird keine Fehlermeldung ausgegeben. Wäre das Datenobjekt COUNT2 mit Typ F anstatt mit Typ I deklariert worden, hätte die Syntaxprüfung einen Fehler ergeben, da der Formalparameter INT mit Typ I typisiert ist. Die Formalparameter mit generischen Typisierungen haben je nach Aktualparameter verschiedene technische Eigenschaften.