Die Parameterschnittstelle 

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    ... <pi> [TYPE <t>|LIKE <f>] ...
            CHANGING ... <pi> [TYPE <t>|LIKE <f>] ...

Der Formalparameter hat keinen eigenen Speicherplatz. Beim Aufruf des Unterprogramms wird nur die Adresse des Aktualparameters an den Formalparameter übergeben. Das Unterprogramms 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, daß sich der Wert eines Aktualparameters automatisch ändert, muß er als Wert übergeben werden.

Eingabeparameter mit Wertübergabe

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

FORM <subr> USING    ... VALUE(<pi>) [TYPE <t>|LIKE <f>] ...

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(<pi>) [TYPE <t>|LIKE <f>] ...

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, daß 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, daß 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.

Generische Typangaben

Folgende Typisierungen erlauben Freiheiten bei der Verwendung von Aktualparametern. Der Aktualparameter muß nur die spezifizierten Teileigenschaften des Formalparameters haben und der Formalparameter übernimmt seine unspezifizierten Eigenschaften vom Aktualparameter.

Typisierung

Prüfung für die Aktualparameter

keine Typangabe

TYPE ANY

Das Unterprogramm akzeptiert alle Typen von Aktualparametern. Alle technischen Eigenschaften des Aktualparameters werden an den Formalparameter übergeben.

TYPE C, N, P oder X

Das Unterprogramm akzeptiert nur Aktualparameter vom Typ C, N, P bzw. X . Die Feldlänge und DECIMALS-Angabe (für Typ P) werden vom Aktualparameter an den Formalparameter übergeben.

TYPE TABLE

Das System prüft, ob der Aktualparameter eine interne Standardtabelle ist. Diese Typisierung ist eine Kurzform von TYPE STANDARD TABLE (siehe unten).

TYPE ANY TABLE

Das System prüft, ob der Aktualparameter eine interne Tabelle ist. Alle Eigenschaften der internen Tabelle (Zeilentyp, Tabellenart, Schlüssel) werden vom Aktualparameter an den Formalparameter übergeben.

TYPE INDEX TABLE

Das System prüft, ob der Aktualparameter eine interne Index-Tabelle (also eine Standard- oder sortierte Tabelle aber keine Hash-Tabelle) ist. Die Eigenschaften der internen Tabelle (Zeilentyp, Tabellenart, Schlüssel) werden vom Aktualparameter an den Formalparameter übergeben.

TYPE STANDARD TABLE

Das System prüft, ob der Aktualparameter eine interne Standard-Tabelle ist. Die restlichen Eigenschaften der internen Tabelle (Zeilentyp, Schlüssel) werden vom Aktualparameter an den Formalparameter übergeben.

TYPE SORTED TABLE

Das System prüft, ob der Aktualparameter eine sortierte interne Tabelle ist. Die restlichen Eigenschaften der internen Tabelle (Zeilentyp, Schlüssel) werden vom Aktualparameter an den Formalparameter übergeben.

TYPE HASHED TABLE

Das System prüft, ob der Aktualparameter eine interne HASH-Tabelle ist. Die restlichen Eigenschaften der internen Tabelle (Zeilentyp, Schlüssel) werden vom Aktualparameter an den Formalparameter übergeben.

Bei der generischen Übergabe von Eigenschaften von Aktual- an Formalparameter ist zu beachten, daß 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.

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 und die technischen Eigenschaften des Aktualparameters müssen mit den Eigenschaften des Formalparameters übereinstimmen.

Typisierung

Technische Eigenschaften des Formalparameters

TYPE D, F, I oder T

Der Formalparameter hat die technischen Eigenschaften dieser vollständig vordefinierten elementaren Typen.

TYPE <type>

Der Formalparameter hat den Typ <type>. Dieser ist ein durch TYPES definierter programminterner Datentyp oder ein Datentyp aus dem ABAP Dictionary.

TYPE REF TO <cif>|DATA

Der Formalparameter ist eine Referenzvariable für die Klasse bzw. das Interface <cif> oder ein Datenobjekt.

TYPE LINE OF <itab>

Der Formalparameter hat den gleichen Typ wie eine Zeile der über TYPES oder im ABAP Dictionary deklarierten internen Tabelle <itab>.

LIKE <f>

Der Formalparameter hat den gleichen Typ wie eine programminternes Datenobjekt <f> oder eine Struktur bzw. eine Datenbanktabelle aus dem ABAP Dictionary.

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, muß 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> aufgefaßt.

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 für Strukturen auch die Typangabe

... <pi> [STRUCTURE <s>] ...

gemacht werden. Dabei ist <s> eine programmlokale Struktur (Datenobjekt, kein Datentyp) oder eine flache Struktur aus dem ABAP Dictionary. Der Formalparameter 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.

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 line.
  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   ... <itabi> [TYPE <t>|LIKE <f>] ...

Die Formalparameter <itabi> 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.