|
|
|
|
|
||||||||||
|
|
|
M |
|
|
|||||||||
CALLNAT
operand1 |
[USING]
|
operand2 | (AD=
|
O |
) | ||||||||
A |
|||||||||||||
nX |
|||||||||||||
Dieser Abschnitt 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 Subprogrammen
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:
| 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. Die Groß-/Kleinschreibung des Namens wird nicht verändert. 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