Show TOC Anfang des Inhaltsbereichs

Die Parameterschnittstelle  Dokument im Navigationsbaum lokalisieren

Die Zusätze USING und CHANGING der FORM-Anweisung definieren die Formalparameter eines Unterprogramms. Die Reihenfolge der Zusätze ist fest vorgegeben. Hinter jedem Zusatz kann eine beliebig lange Liste von Formalparametern aufgeführt sein. Beim Aufruf eines Unterprogramms müssen alle Formalparameter mit den Werten aus Aktualparametern gefüllt werden und können nach der Beendigung des Unterprogramms ihre Werte an die entsprechenden Aktualparameter zurückgeben.

Formalparameter verhalten sich innerhalb des Unterprogramms wie dynamische lokale Daten. Sie können also wie normale, mit DATA deklarierte, lokale Datenobjekte verwendet werden und verdecken geichnamige globale Datenobjekte. Der Startwert zu Beginn der Ausführung des Unterprogramms ist der übergebene Wert des zugehörigen Aktualparameters.

Wir unterscheiden folgende Formalparameter:

Parameter mit Referenzübergabe

Diese Parameter werden ohne die Angabe VALUE hinter USING oder CHANGING aufgeführt:

FORM subr USING    p1 [{TYPE type}|{LIKE field}]

                   p2 [{TYPE type}|{LIKE field}]

                   ...
          CHANGING p1 [{TYPE type}|{LIKE field}]

                   p2 [{TYPE type}|{LIKE field}]

                   ...

Der Formalparameter hat keinen eigenen Speicherplatz. Beim Aufruf des Unterprogramms wird nur die Adresse des Aktualparameters an den Formalparameter übergeben. Das Unterprogramm arbeitet mit dem Feld des aufrufenden Programms. Ändert sich der Wert des Formalparameters, ändert sich auch der Inhalt des Aktualparameters im aufrufenden Programm.

Bei der Referenzübergabe sind USING und CHANGING völlig gleichwertig. Für Dokumentationszwecke sollte USING für Formalparameter verwendet werden, die nicht im Unterprogramm geändert werden, und CHANGING für Formalparameter, die im Unterprogramm geändert werden.

Um zu verhindern, dass sich der Wert eines Aktualparameters automatisch ändert, muss er als Wert übergeben werden.

Eingabeparameter mit Wertübergabe

Diese Parameter werden mit der Angabe VALUE hinter USING aufgeführt:

FORM subr USING VALUE(p1) [{TYPE type}|{LIKE field}]

                VALUE(p2) [{TYPE type}|{LIKE field}]

                ...

Der Formalparameter belegt eigenen Speicherplatz. Beim Aufruf des Unterprogramms wird der Wert des Aktualparameters an den Formalparameter übergeben. Ändert sich der Wert des Formalparameters hat dies keine Auswirkung auf den Aktualparameter.

Ausgabeparameter mit Wertübergabe

Diese Parameter werden mit der Angabe VALUE hinter CHANGING aufgeführt:

FORM subr CHANGING VALUE(p1) [{TYPE type}|{LIKE field}]

                   VALUE(p2) [{TYPE type}|{LIKE field}]

                   ...

Der Formalparameter belegt eigenen Speicherplatz. Beim Aufruf des Unterprogramms wird der Wert des Aktualparameters an den Formalparameter übergeben. Nach erfolgreicher Beendigung des Unterprogramms, d.h bei Erreichen der ENDFORM-Anweisung oder bei Verlassen des Unterprogramms durch die Anweisungen CHECK oder EXIT, wird der aktuelle Wert des Formalparameters in den Aktualparameter kopiert.

Wenn das Unterprogramm durch eine Fehlermeldung vorzeitig beendet wird, wird kein Wert zurückgegeben. Die Beendigung eines Unterprogramms durch eine Fehlermeldung ist nur dann sinnvoll, wenn es während der PAI-Verarbeitung eines Bildschirmbilds aufgerufen wird, also aus PAI-Modulen, aus dem Ereignisblock AT SELECTION-SCREEN oder nach einem interaktiven Listenereignis.

Typisierung von Formalparametern

Formalparameter können alle gültigen ABAP-Datentypen haben. Zum Typisieren von Formalparameter dient der TYPE- bzw. LIKE-Zusatz . Die Typangabe kann generisch oder vollständig sein. Bei generischer Typangabe wird ein Formalparameter gar nicht oder nur teilweise typisiert und übernimmt die restlichen Eigenschaften beim Aufruf des Unterprogramms vom entsprechenden Aktualparameter. Bei vollständiger Typangabe werden alle technischen Eigenschaften eines Formalparameters schon bei der Unterprogrammdefinition festgelegt.

Die folgenden Aussagen zur Typisierung gelten im übertragenen Sinn auch für die Parameterschnittstellen der anderen Prozeduren, also Funktionsbausteinen und Methoden.

Bei typisierten Formalparametern wird überprüft, ob beim Aufruf des Unterprogramms ein verträglicher Aktualparameter verwendet wird. Bei programminternen Unterprogrammaufrufen erfolgt diese Überprüfung schon bei der Syntax-Prüfung, bei externen Unterprogrammaufrufen aber erst zur Laufzeit.

Die Typisierung stellt sicher, dass ein Unterprogramm immer mit den Datentypen arbeitet, die es benötigt. Generische Formalparameter erlauben eine große Freiheit beim Aufruf von Unterprogrammen, da beliebige Daten übergeben werden können. Entsprechend eingeschränkt sind die Möglichkeiten der Datenverarbeitung im Unterprogramm, da nur Operationen durchgeführt werden können, die für alle Datentypen möglich sind. Schon allein die Zuordnung zweier Datenobjekte funktioniert nicht zwischen allen Datentypen. Umgekehrt sorgt eine strenge Typisierung dafür, dass in einem Unterprogramm nur erlaubte Operationen stattfinden. Dafür können nur noch die passenden Daten beim Aufruf übergeben werden. Falls ein Unterprogramm strukturierte Daten komponentenweise behandeln soll, ist die entsprechende Typisierung zwingend vorgeschrieben.

Formalparameter können generisch oder vollständig typisiert werden.

 

Generische Typangaben

Bei der generischen Typangabe wird einer der in der Schlüsselwortdokumentation aufgeführten generischen Datentypen, wie z.B. any, c, numeric oder index table angegeben. Ein  Aktualparameter muss nur die spezifizierten Teileigenschaften des Formalparameters haben und der Formalparameter übernimmt seine unspezifizierten Eigenschaften vom Aktualparameter.

Bei der generischen Übergabe von Eigenschaften von Aktual- an Formalparameter ist zu beachten, dass die Übergabe dynamisch zur Laufzeit erfolgt und daher nicht statisch im Programmtext erkennbar ist. Beispielsweise kann ein übernommener Tabellenschlüssel nicht statisch im Unterprogramm angesprochen werden, sehr wohl aber dynamisch.

Beispiel

TYPES: BEGIN OF line,
        col1(1) TYPE c,
        col2(1) TYPE c,
      END OF line.

DATA: wa TYPE line,
      itab TYPE HASHED TABLE OF line WITH UNIQUE KEY col1,
      key(4) TYPE c VALUE 'col1'.

wa-col1 = 'X'. INSERT wa INTO TABLE itab.
wa-col1 = 'Y'. INSERT wa INTO TABLE itab.

PERFORM demo USING itab.

FORM demo USING p TYPE ANY TABLE.
  ...
  READ TABLE p WITH TABLE KEY (key) = 'X' INTO wa.
  ...
ENDFORM.

Im Unterprogramm wird der Tabellenschlüssel dynamisch angesprochen. Eine statische Ansprache

READ TABLE p WITH TABLE KEY col1 = 'X' INTO wa.

ist dagegen syntaktisch nicht möglich, da der Formalparameter P erst zur Laufzeit den Schlüssel der Tabelle itab übernimmt.

Vollständige Typangabe

Bei folgenden Typisierungen werden die technischen Eigenschaften des Formalparameters vollständig bestimmt. Hinter TYPE  kann ein beliebiger nicht-generischer Typ nicht-generischer Datentyp aus dem ABAP Dictionary, ein bereits mit TYPES definierter nicht-generischer programmlokaler Typ oder ein nicht-generischer eingebauter ABAP-Typ ( d, f, i, string, t, xstring) angegeben werden. Auch die Angabe eines bereits deklariertes Datenobjekt dobj hinter LIKE  ist eine vollständige Typangabe.

Die technischen Eigenschaften des Aktualparameters müssen mit den Eigenschaften des Formalparameters übereinstimmen.

Bei der vollständigen Typisierung von Formalparametern kann statisch auf sämtliche Eigenschaften des Formalparameters zugegriffen werden, da sie im Programmtext bekannt sind.

Strukturierte Formalparameter

Da Formalparameter jeden gültigen ABAP-Datentyp haben können ist die Behandlung strukturierter Formalparameter, also Strukturen und interne Tabellen mit strukturiertem Zeilentyp kein Problem wenn der Formalparameter entsprechend vollständig typisiert ist. Die Komponenten der Struktur sind im Unterprogramm statisch ansprechbar.

Generische Strukturen

Wenn ein strukturierter Aktualparameter generisch an einen nicht entsprechend strukturierten Formalparameter übergeben wird, kann im Unterprogramm nicht statisch auf die einzelnen Komponenten zugegriffen werden. Bei internen Tabellen können dann nur Zeilenoperationen durchgeführt werden.

Um dynamisch auf die Komponenten einer generisch übergebenen Struktur zuzugreifen, muss man mit Feldsymbolen und der Zuweisung

ASSIGN COMPONENT idx|name OF STRUCTURE s TO <fs>.

arbeiten. idx wird als Komponentennummer, der Inhalt von name als Komponentenname der generischen Struktur s aufgefasst.

Beispiel

REPORT demo_mod_tech_assign_component.

DATA: BEGIN OF line,
        col1 TYPE c VALUE 'X',
        col2 TYPE c VALUE 'Y',
      END OF line.

DATA comp(4) TYPE c VALUE 'COL1'.

PERFORM demo USING line.

FORM demo USING p TYPE any.
  FIELD-SYMBOLS <fs> TYPE ANY.
  ASSIGN COMPONENT comp OF STRUCTURE p TO <fs>.
  WRITE <fs>.
  ASSIGN COMPONENT 2 OF STRUCTURE p TO <fs>.
  WRITE <fs>.
ENDFORM.

Die Listenausgabe ist:

X Y

Die Komponenten col1 und col2 der generisch übergebenen Struktur von p werden dem Feldsymbol <fs> zugewiesen. Eine direkte Ansprache der Komponenten ist weder statisch noch dynamisch möglich.

Aufgeprägte Strukturen

Statt eine Typisierung mit TYPE oder LIKE durchzuführen, kann aus Kompatibilitätsgründen für Strukturen auch noch die Typangabe

... p1 [STRUCTURE s] ...

... p2 [STRUCTURE s] ...

gemacht werden. Dabei ist s eine programmlokale Struktur (Datenobjekt, kein Datentyp) oder eine flache Struktur aus dem ABAP Dictionary. Der jeweilige Formalparameter p1 p2 … wird entsprechend s strukturiert und es kann im Unterprogramm auf die einzelnen Komponenten zugegriffen werden. Bei der Übergabe eines Aktualparameters wird lediglich überprüft, ob die Länge des Aktualparameters mindestens die Länge der Struktur ist. Mit STRUCTURE lassen sich also strukturierte Sichten auf beliebige Aktualparameter aufprägen.

Beispiel

REPORT demo_mod_tech_structure.

DATA: BEGIN OF line,
        col1(1) TYPE c,
        col2(1) TYPE c,
      END OF line.

DATA text(2) TYPE c VALUE 'XY'.

PERFORM demo USING text.

FORM demo USING p STRUCTURE text.
  WRITE: p-col1, p-col2.
ENDFORM.

Die Listenausgabe ist:

X Y

Hier wird der Zeichenkette text die Struktur line aufgeprägt.

Der TABLES-Zusatz

Aus Kompatibilitätsgründen zu vorhergehenden Releases ist in der Parameterschnittstelle folgender Zusatz vor den Zusätzen USING und CHANGING erlaubt:

FORM subr TABLES   ... itab1 [TYPE t|LIKE f] ...

                   ... itab2 [TYPE t|LIKE f] ...

Die Formalparameter itab1 itab2 … werden als interne Standard-Tabellen mit Kopfzeile definiert. Wenn eine interne Tabelle ohne Kopfzeile als Aktualparameter für solche einen Formalparameter verwendet wird, wird im Unterprogramm eine lokale Kopfzeile für den Formalparameter generiert. Wird eine interne Tabelle mit Kopfzeile als Aktualparameter verwendet, werden der Tabellenkörper und der Tabellenarbeitsbereich an das Unterprogramm übergeben. Bei mit TABLES definierten Formalparametern ist keine Wertübergabe möglich. Um auf die Komponenten strukturierter Zeilen zuzugreifen müssen auch TABLES-Parameter entsprechend typisiert werden.

Seit Release 3.0 sollte statt des TABLES-Zusatzes immer USING oder CHANGING mit der entsprechenden Typisierung für interne Tabellen verwendet werden, wobei aus Performance-Gründen bei internen Tabellen möglichst keine Wertübergabe definiert werden sollte.

 

 

Ende des Inhaltsbereichs