Natural では、プログラム内で直接定義されるインラインサブルーチンと、プログラム外で別のオブジェクトとして格納される外部サブルーチン(このチュートリアルで後述)という 2 種類のサブルーチンが区別されます。
#MARK
という名前のユーザー定義変数にアスタリスク(*)を移動するインラインサブルーチンをプログラムに追加します。 このサブルーチンは、従業員が 20 日以上の休暇を取った場合に起動されます。
以下の演習を完了すると、サンプルのアプリケーションは次の構造になります。
このドキュメントには次の演習が含まれています。
サブルーチンをプログラムに追加します。
サブルーチンを定義するには
ユーザー定義変数 #NAME-END
の下に次の行を挿入します。
1 #MARK (A1)
この変数はサブルーチンで使用されます。 したがって、最初に定義しておく必要があります。
サブルーチンを定義するため、END
ステートメントの前に次の行を挿入します。
DEFINE SUBROUTINE MARK-SPECIAL-EMPLOYEES MOVE '*' TO #MARK END-SUBROUTINE
このサブルーチンが実行されると、アスタリスク(*)が #MARK
に移動します。
注意:
ステートメント MOVE '*' TO #MARK
の代わりに、ASSIGN
または COMPUTE
ステートメントの次の変形 #MARK := '*'
を使用することもできます。
DISPLAY
ステートメントを次のように変更します。
DISPLAY NAME 3X DEPT 3X LEAVE-DUE 3X '>=20' #MARK
これにより、出力に新しい列が表示されます。 見出しは ">=20" です。 該当する従業員が 20 日以上の休暇を取った場合、列にアスタリスク(*)が表示されます。
インラインサブルーチンの定義が完了したので、インラインサブルーチンを実行するコードを指定できます。
インラインサブルーチンを実行するには
DISPLAY
ステートメントの下に次の行を挿入します。
IF LEAVE-DUE >= 20 THEN PERFORM MARK-SPECIAL-EMPLOYEES ELSE RESET #MARK END-IF
20 日以上の休暇を取った従業員が検出されると、MARK-SPECIAL-EMPLOYEES
という名前の新しいサブルーチンが実行されます。 従業員の休暇が 20 日未満の場合、#MARK
のコンテンツは空白にリセットされます。
プログラムは次のようになります。
DEFINE DATA LOCAL 1 #NAME-START (A20) 1 #NAME-END (A20) 1 #MARK (A1) 1 EMPLOYEES-VIEW VIEW OF EMPLOYEES 2 FULL-NAME 3 NAME (A20) 2 DEPT (A6) 2 LEAVE-DATA 3 LEAVE-DUE (N2) END-DEFINE * RP1. REPEAT * INPUT USING MAP 'MAP01' * IF #NAME-START = '.' THEN ESCAPE BOTTOM (RP1.) END-IF * IF #NAME-END = ' ' THEN MOVE #NAME-START TO #NAME-END END-IF * RD1. READ EMPLOYEES-VIEW BY NAME STARTING FROM #NAME-START ENDING AT #NAME-END * IF LEAVE-DUE >= 20 THEN PERFORM MARK-SPECIAL-EMPLOYEES ELSE RESET #MARK END-IF * DISPLAY NAME 3X DEPT 3X LEAVE-DUE 3X '>=20' #MARK * END-READ * IF *COUNTER (RD1.) = 0 THEN REINPUT 'No employees meet your criteria.' END-IF * END-REPEAT * DEFINE SUBROUTINE MARK-SPECIAL-EMPLOYEES MOVE '*' TO #MARK END-SUBROUTINE * END
プログラムを実行します。
結果のマップで、「JONES」と入力して Enter キーを押します。
従業員のリストに列が追加されて表示されます。
Esc キーを押して、出力ウィンドウを閉じます。
プログラムを格納します。
次の演習「処理ルールとヘルプルーチン」に進みます。