M |
|||||||||||||
CALLNAT
operand1 |
[USING ]
|
operand2 | (AD =
|
O |
) | ||||||||
A |
|||||||||||||
nX |
|||||||||||||
Dieses Dokument behandelt folgende Themen:
Eine Erläuterung der in dem Syntax-Diagramm verwendeten Symbole entnehmen Sie dem Abschnitt Syntax-Symbole.
Verwandte Statements: CALL
| CALL FILE
|
CALL LOOP
|
DEFINE SUBROUTINE
|
ESCAPE
|
FETCH
|
PERFORM
Gehört zur Funktionsgruppe: Aufrufen von Programmen und Unterprogrammen
Das Statement CALLNAT
dient dazu, ein Natural-Subprogramm
zur Ausführung aufzurufen. Ein Natural-Subprogramm kann nur über ein
CALLNAT
-Statement aufgerufen werden; es kann nicht selbständig
ausgeführt werden.
Wenn das CALLNAT
-Statement ausgeführt wird, wird die
Ausführung des aufrufenden Objekts (d.h. des Objekts, das das
CALLNAT
-Statement enthält) unterbrochen und das aufgerufene
Subprogramm ausgeführt. Die Ausführung des Subprogramms dauert an, bis entweder
sein END
-Statement erreicht ist oder die Verarbeitung des
Subprogramms durch die Ausführung eines ESCAPE ROUTINE
-Statements
gestoppt wird. In beiden Fällen wird dann die Verarbeitung des aufrufenden
Objekts mit dem nächsten Statement nach dem CALLNAT
-Statement
fortgesetzt.
Anmerkungen:
Operanden-Definitionstabelle:
Operand | Mögliche Struktur | Mögliche Formate | Referenzierung erlaubt | Dynam. Definition | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand1 | C | S | A | ja | nein | |||||||||||||||
operand2 | C | S | A | G | A | U | N | P | I | F | B | D | T | L | C | G | O | ja | ja |
Syntax-Element-Beschreibung:
operand1 |
Subprogramm-Name:
Als operand1 geben Sie den Namen des Subprogramms an, das aufgerufen werden soll. Dieser kann entweder als 1 bis 8 Zeichen lange Konstante angegeben werden oder — falls je nach Programmlogik unterschiedliche Subprogramme aufgerufen werden sollen — als alphanumerische Variable mit Länge 1 bis 8. Der Name des Subprogramms darf ein Und-Zeichen (&) enthalten;
zur Ausführungszeit wird dieses Zeichen durch den aus einem Zeichen bestehenden
Code ersetzt, der dem aktuellen Wert der Systemvariablen
|
|
---|---|---|
operand2 |
Parameter:
Werden Parameter an das Subprogramm übergeben, muss die Struktur
der Parameterliste in einem Standardmäßig erfolgt die Übergabe der Parameter durch
Referenzierung ("By Reference"), d.h. die Daten werden über
Adress-Parameter übergeben, die Parameterwerte selbst werden nicht übertragen.
Es besteht aber auch die Möglichkeit, die Parameterwerte selbst zu übergeben.
Hierzu definieren Sie die betreffenden Felder im
Anmerkung: Für beide Arten der Parameterübergabe sind folgende Punkte zu beachten:
Anmerkung: Wenn die Option
|
|
AD= |
Attribut-Definition:
Wenn operand2 eine Variable ist, können Sie sie wie folgt kennzeichnen: |
|
AD=O |
Nicht modifizierbar, siehe Session-Parameter
Anmerkung: |
|
AD=M |
Modifizierbar, siehe Session-Parameter
Dies ist die Standardeinstellung. |
|
AD=A | Nur für Eingabe, siehe Session-Parameter
AD=A .
|
|
Wenn
operand2 eine Konstante ist, kann der
Session-Parameter AD nicht explizit
angegeben werden. Für Konstanten gilt immer AD=O .
|
||
nX |
Mit der Notation Ein zu überspringender Parameter muss mit dem Schlüsselwort
|
Dynamische Variablen können als Parameter an ein aufgerufenes
Programmobjekt (CALLNAT
, PERFORM
) übergeben werden.
Eine Übergabe durch Referenzierung ("Call By Reference") ist möglich, weil dynamische Variablen einen zusammenhängenden Wertebereich darstellen.
Bei einer Übergabe der Parameterwerte selbst ("Call By
Value") wird die Variablen-Definition des Aufrufenden als
Ausgangsoperand und die Parameter-Definition als Zieloperand zugewiesen. Ein
"Call By Value Result "bewirkt des weiteren eine Umkehrung der
Zuordnung. Bei "Call By Reference" müssen beide Definitionen
DYNAMIC
sein. Wenn nur
eine von ihnen DYNAMIC
ist, wird ein Laufzeitfehler hervorgerufen.
Bei "Call By Value (Result)" sind alle Kombinationen möglich.
Die folgende Tabelle veranschaulicht die gültigen Kombinationen statisch und dynamisch definierter Variablen des Aufrufenden und statisch und dynamisch definierter Parameter hinsichtlich der Übertragung von Parametern.
operand2 vom Aufrufenden | Parameter-Definition | |
---|---|---|
Statisch | Dynamisch | |
Statisch | ja | nein |
Dynamisch | nein | ja |
Die Formate der dynamischen Variablen A oder B müssen miteinander übereinstimmen.
operand2 vom Aufrufenden | Parameter-Definition | |
---|---|---|
Statisch | Dynamisch | |
Statisch | ja | ja |
Dynamisch | ja | ja |
Anmerkung:
Bei statischen/dynamischen oder dynamischen/statischen Definitionen
kann es vorkommen, dass ein Wert nach den Datenübertragungsregeln der
entsprechenden Zuweisungen abgeschnitten wird.
Aufrufendes Programm:
** Example 'CNTEX1': CALLNAT ************************************************************************ DEFINE DATA LOCAL 1 #FIELD1 (N6) 1 #FIELD2 (A20) 1 #FIELD3 (A10) END-DEFINE * CALLNAT 'CNTEX1N' #FIELD1 (AD=M) #FIELD2 (AD=O) #FIELD3 'P4 TEXT' * WRITE '=' #FIELD1 '=' #FIELD2 '=' #FIELD3 * END
Aufgerufenes Subprogramm CNTEX1N
:
** Example 'CNTEX1N': CALLNAT (called by CNTEX1) ************************************************************************ DEFINE DATA PARAMETER 1 #FIELDA (N6) 1 #FIELDB (A20) 1 #FIELDC (A10) 1 #FIELDD (A7) END-DEFINE * * #FIELDA := 4711 * #FIELDB := 'HALLO' * #FIELDC := 'ABC' * WRITE '=' #FIELDA '=' #FIELDB '=' #FIELDC '=' #FIELDD * END
Aufrufendes Programm:
** Example 'CNTEX2': CALLNAT ************************************************************************ DEFINE DATA LOCAL 1 #ARRAY1 (N4/1:10,1:10) 1 #NUM (N2) END-DEFINE * * CALLNAT 'CNTEX2N' #ARRAY1 (2:5,*) * FOR #NUM 1 TO 10 WRITE #NUM #ARRAY1(#NUM,1:10) END-FOR * END
Aufgerufenes Subprogramm CNTEX2N
:
** Example 'CNTEX2N': CALLNAT (called by CNTEX2) ************************************************************************ DEFINE DATA PARAMETER 1 #ARRAY (N4/1:4,1:10) LOCAL 1 I (I2) END-DEFINE * * FOR I 1 10 #ARRAY(1,I) := I #ARRAY(2,I) := 100 + I #ARRAY(3,I) := 200 + I #ARRAY(4,I) := 300 + I END-FOR * END