これまでは、DEFINE SUBROUTINE
ステートメントを使用して、サブルーチン MARK-SPECIAL-EMPLOYEES
をプログラム内で定義していました。 この演習では、サブルーチンを別のオブジェクトとしてプログラムの外部に定義します。
以下の演習を完了すると、サンプルのアプリケーションは次のモジュールで構成されます。
このドキュメントには次の演習が含まれています。
外部サブルーチンのコードを指定するエディタを起動します。
外部サブルーチンの DEFINE SUBROUTINE
ステートメントは、プログラム内のインラインサブルーチンと同じ方法でコーディングします。
外部サブルーチンを作成するには
ライブラリワークスペースで、プログラムも含まれているライブラリ(TUTORIAL ノード)を選択します。
コンテキストメニューから、
を選択します。空のエディタウィンドウが表示されます。
次のように入力します。
DEFINE DATA GLOBAL USING GDA01 LOCAL USING LDA01 END-DEFINE * DEFINE SUBROUTINE MARK-SPECIAL-EMPLOYEES MOVE '*' TO #MARK END-SUBROUTINE * END
サブルーチンを格納します。
[名前を付けて Stow]ダイアログボックスが表示されます。
外部サブルーチンの名前として「SUBR01」と入力し、
ボタンを選択します。ライブラリワークスペースで、新しい外部サブルーチンが Subroutines ノードに表示されます。 論理ビューには、コード MARK-SPECIAL-EMPLOYEES
で定義されたサブルーチンの名前が表示されます。 他のすべてのビューには、SUBR01
という名前が表示されます。
外部サブルーチンを入力したエディタウィンドウを閉じます。
PERFORM
ステートメントは、内部サブルーチンおよび外部サブルーチンの両方を呼び出します。 内部サブルーチンがプログラム内で見つからないと、Natural は同じ名前の外部サブルーチンを自動的に実行しようとします。 Natural では、サブルーチンコードで定義された名前(サブルーチン名)が検索され、サブルーチンの保存時に指定した名前(Natural
オブジェクト名)が検索されるわけではありません。
外部サブルーチンの定義が完了したので、インラインサブルーチン(外部サブルーチンと同じ名前を持つ)をプログラムから削除する必要があります。
プログラムで外部サブルーチンを使用するには
プログラムエディタに戻ります。
次の行を削除します。
DEFINE SUBROUTINE MARK-SPECIAL-EMPLOYEES MOVE '*' TO #MARK END-SUBROUTINE
プログラムは次のようになります。
DEFINE DATA GLOBAL USING GDA01 LOCAL USING LDA01 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 * END
プログラムを実行します。
開始名として「JONES」と入力し、Enter キーを押します。
結果のリストには、20 日以上の休暇を取った各従業員にアスタリスクが引き続き表示されます。
Esc キーを押して、出力ウィンドウを閉じます。
プログラムを格納します。
次の演習「サブプログラム」に進みます。