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