Show TOC

Die ParameterschnittstelleLocate this document in the navigation structure

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 VALUEUSINGCHANGING hinter oder 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 VALUEUSING hinter 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.  anycnumeric  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.

Tipp
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 (  dfistringtxstring ) 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

Strukturen komponentenweise zuweisen ASSIGN COMPONENT idx|name OF STRUCTURE s TO <fs>. arbeiten.

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

Tipp
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

... p 1 [STRUCTURE s] ...

... p 2 [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.

Tipp
    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   ... itab 1 [TYPE t|LIKE f] ...

... itab 2 [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.