PERFORM
subroutine-name
|
M
|
|||||||||
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
|
CALLNAT
|
DEFINE SUBROUTINE
|
ESCAPE
|
FETCH
Gehört zur Funktionsgruppe: Aufrufen von Programmen und Unterprogrammen
Das Statement PERFORM
dient dazu, eine
Natural-Subroutine aufzurufen.
Eine aufgerufene Subroutine kann ihrerseits mit einem
PERFORM
-Statement eine andere Subroutine aufrufen. Wieviele Ebenen
eine derartige Verschachtelung mehrerer PERFORM
-Statements
erreichen darf, hängt vom benötigten Speicherplatz ab.
Eine Subroutine kann auch sich selbst aufrufen (rekursive Subroutine). Falls eine rekursive externe Subroutine Datenbankzugriffe beinhaltet, sorgt Natural automatisch dafür, dass diese als getrennte logische Operationen durchgeführt werden.
Siehe CALLNAT
-Statement.
Operanden-Definitionstabelle:
Operand | Mögliche Struktur | Mögliche Formate | Referenzierung erlaubt | Dynam. Definition | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 | |
---|---|---|
subroutine-name
|
Aufzurufende Subroutine:
Für einen Subroutinen-Namen (maximal 32 Zeichen) gelten dieselben Namenskonventionen wie für Benutzervariablen (siehe Namenskonventionen für Benutzervariablen in der Dokumentation Natural benutzen). Der Subroutine-Name ist unabhängig vom Namen des Moduls, in dem die Subroutine definiert wird (er kann identisch sein, muss es aber nicht unbedingt sein). Die aufzurufende Subroutine muss mit einem Innerhalb eines Objekts können nicht mehr als 50 externe Subroutinen referenziert werden. Von einer Subroutine
benutzbare Daten:
|
|
operand2
|
Übergabe von Parametern an die externe
Subroutine:
Wenn Sie mit dem Wenn Parameter übergeben werden, 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, Parameter By Value zu übergeben,
d.h. die Parameterwerte selbst zu übergeben. Hierzu definieren Sie die
betreffenden Felder im
Anmerkung: Bei beiden Arten der Parameterübergabe sind folgende Punkte zu beachten:
Anmerkung: |
|
AD= |
Definition von Attributen:
Wenn operand2 eine Variable ist, können Sie sie folgendermaßen 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
AD nicht explizit angegeben werden. Für Konstanten gilt
immer AD=O .
|
||
nX
|
Angabe zu überspringender
Parameter:
Mit der Notation
Ein zu überspringender Parameter muss mit dem
Schlüsselwort |
** Example 'PEREX1': PERFORM (as inline subroutine) ************************************************************************ DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 NAME 2 ADDRESS-LINE (A20/2) 2 PHONE * 1 #ARRAY (A75/1:4) 1 REDEFINE #ARRAY 2 #ALINE (A25/1:4,1:3) 1 #X (N2) INIT <1> 1 #Y (N2) INIT <1> END-DEFINE * LIMIT 5 FIND EMPLOY-VIEW WITH CITY = 'BALTIMORE' MOVE NAME TO #ALINE (#X,#Y) MOVE ADDRESS-LINE(1) TO #ALINE (#X+1,#Y) MOVE ADDRESS-LINE(2) TO #ALINE (#X+2,#Y) MOVE PHONE TO #ALINE (#X+3,#Y) IF #Y = 3 RESET INITIAL #Y /* PERFORM PRINT /* ELSE ADD 1 TO #Y END-IF AT END OF DATA /* PERFORM PRINT /* END-ENDDATA END-FIND * DEFINE SUBROUTINE PRINT WRITE NOTITLE (AD=OI) #ARRAY(*) RESET #ARRAY(*) SKIP 1 END-SUBROUTINE * END
Ausgabe des Programms PEREX1
:
JENSON LAWLER FORREST 2120 HASSELL 4588 CANDLEBERRY AVE 37 TENNYSON DRIVE #206 BALTIMORE BALTIMORE 998-5038 629-0403 881-3609 ALEXANDER NEEDHAM 409 SENECA DRIVE 12609 BUILDERS LANE BALTIMORE BALTIMORE 345-3690 641-9789
Programm, das das PERFORM
-Statement enthält:
** Example 'PEREX2': PERFORM (as external subroutine) ************************************************************************ DEFINE DATA LOCAL 1 EMPLOY-VIEW VIEW OF EMPLOYEES 2 NAME 2 ADDRESS-LINE (A20/2) 2 PHONE * 1 #ALINE (A25/1:4,1:3) 1 #X (N2) INIT <1> 1 #Y (N2) INIT <1> END-DEFINE * LIMIT 5 * FIND EMPLOY-VIEW WITH CITY = 'BALTIMORE' MOVE NAME TO #ALINE (#X,#Y) MOVE ADDRESS-LINE(1) TO #ALINE (#X+1,#Y) MOVE ADDRESS-LINE(2) TO #ALINE (#X+2,#Y) MOVE PHONE TO #ALINE (#X+3,#Y) IF #Y = 3 RESET INITIAL #Y /* PERFORM PEREX2E #ALINE(*,*) /* ELSE ADD 1 TO #Y END-IF AT END OF DATA /* PERFORM PEREX2E #ALINE(*,*) /* END-ENDDATA END-FIND * END
Externe Subroutine PEREX3
mit vom Programm
PEREX2
aufgerufenen Parametern:
** Example 'PEREX3': SUBROUTINE (external subroutine with parameters) ************************************************************************ DEFINE DATA PARAMETER 1 #ALINE (A25/1:4,1:3) END-DEFINE * DEFINE SUBROUTINE PEREX2E WRITE NOTITLE (AD=OI) #ALINE(*,*) RESET #ALINE(*,*) SKIP 1 END-SUBROUTINE * END
Ausgabe des Programms PEREX2
:
JENSON LAWLER FORREST 2120 HASSELL 4588 CANDLEBERRY AVE 37 TENNYSON DRIVE #206 BALTIMORE BALTIMORE 998-5038 629-0403 881-3609 ALEXANDER NEEDHAM 409 SENECA DRIVE 12609 BUILDERS LANE BALTIMORE BALTIMORE 345-3690 641-9789