PERFORM
subroutine-name
|
|
|
|
M
|
|
|
|
|||
| 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 | CALLNAT | DEFINE
SUBROUTINE | ESCAPE | FETCH
Gehört zur Funktionsgruppe: Aufrufen von Programmen und Subprogrammen
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