PERFORM subroutine-name |
M |
|||||||||
operand1 | (AD= |
O |
) | |||||||
A |
||||||||||
nX |
このドキュメントでは、次のトピックについて説明します。
構文図で使用されている記号については、「構文記号」を参照してください。
関連ステートメント:CALL
| CALL FILE
| CALL LOOP
| CALLNAT
| DEFINE SUBROUTINE
| ESCAPE
| FETCH
関連機能グループ:プログラムおよびルーチンの呼び出し
PERFORM
ステートメントは、Natural サブルーチンを呼び出すために使用します。
呼び出し先サブルーチン内で他のサブルーチンを呼び出すための PERFORM
ステートメントを指定することもできます(ネストのレベル数は、要求されるメモリのサイズによって制限されます)。
サブルーチンは自分自身を呼び出すことができます(再帰サブルーチン)。再帰的に呼び出される外部サブルーチン内にデータベース処理が含まれている場合、Natural はデータベース処理が論理的に分割されるようにします。
CALLNAT
ステートメントを参照してください。
オペランド定義テーブル:
オペランド | 構文要素 | フォーマット | オペランド参照 | ダイナミック定義 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
operand1 |
C | S | A | G | A | U | N | P | I | F | B | D | T | L | C | G | O | ○ | ○ |
構文要素の説明:
構文要素 | 説明 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
subroutine-name |
呼び出すサブルーチン:
サブルーチン名(最大 32 文字)については、ユーザー定義変数と同じ命名規則が適用されます。 サブルーチン名は、該当のサブルーチンが定義されているモジュールの名前に依存しません(同じ名前にすることは可能ですが、同じ名前にする必要はありません)。 呼び出すサブルーチンは、 1 つのオブジェクト内で 50 個までの外部サブルーチンを参照できます。 サブルーチンで使用可能なデータ
|
||||||||||
operand1 |
渡されるパラメータ:
パラメータを渡す場合、 デフォルトでは、パラメータは"参照によって"渡されます。つまり、データはアドレスパラメータを介して転送され、パラメータ値自体は移動されません。ただし、パラメータを"値によって"渡す、つまり実際のパラメータ値を渡すこともできます。そのためには、これらのフィールドをサブルーチンの
注意: いずれのパラメータ引き渡し方法にも、次が適用されます。
注意: |
||||||||||
AD= |
|
||||||||||
nX |
省略されるパラメータ:
表記 省略されるパラメータは、サブルーチンの |
** 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
プログラム 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
PERFORM
ステートメントを含むプログラム:
** 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
プログラム PEREX2
から呼び出されるパラメータを含む外部サブルーチン PEREX3
:
** 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
プログラム 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