サブプログラムを起動する CALLNAT ステートメントを含めるようにプログラムを拡張します。サブプログラムでは、メインプログラムで識別された従業員が、デモデータベースの一部でもある VEHICLES ファイルに対する FIND 要求のベースとなります。その結果、メインプログラムからの従業員情報だけでなくサブプログラムからの自動車情報も出力に含まれます。
新しいサブプログラムでは、追加のローカルデータエリアおよびパラメータデータエリアを作成する必要があります。
以下の演習を完了すると、サンプルのアプリケーションは次のモジュールで構成されます。

このドキュメントには次の演習が含まれています。
前に作成したローカルデータエリアに他のフィールドを追加します。これらのフィールドは、後で作成するサブプログラムで使用します。
ローカルデータエリアに他のフィールドを追加するには
ローカルデータエリアに戻ります。
E LDA01
必要に応じて ESC キーを押し、編集モードに切り替えます。
#NAME-END の下に(行コマンド I を使用し、結果のウィンドウで[Data Field]を選択して)次のフィールドを定義します。
| レベル | Name | フォーマット | データ長 |
|---|---|---|---|
| 1 | #PERS-ID |
A | 8 |
| 1 | #MAKE |
A | 20 |
| 1 | #MODEL |
A | 20 |
すべてのフィールドが追加されたら、ESC キーを押します。
ローカルデータエリアが次のように表示されます。
Press <ESC> to enter command mode
Mem: LDA01 Lib: TUTORIAL Type: LOCAL Bytes: 376 Line: 5 of: 5
C T L Name of Datafield F Length Index/Comment M
* *** Top of Data Area ***
1 #NAME-START A 20
1 #NAME-END A 20
1 #PERS-ID A 8
1 #MAKE A 20
1 #MODEL A 20
* *** End of Data Area ***
F 1 HELP F 2 CHOICE F 3 QUIT F 4 SAVE F 5 STOW F 6 CHECK
F 7 READ F 8 CLEAR F 9 MEM TYPE F10 GEN F11 FLD TYPE F12 |
ローカルデータエリアを格納します。
パラメータデータエリア(PDA)は、Natural プログラムおよび後で作成するサブプログラム間で受け渡すデータパラメータを指定するために使用します。パラメータデータエリアは、サブプログラムで参照されます。
ローカルデータエリアにわずかな変更を加えるだけで、パラメータデータエリアを作成できます。つまり、ローカルデータエリアの 2 つのデータフィールドを削除してから、変更したデータエリアをパラメータデータエリアとして保存します。元のローカルデータエリアはそのまま残ります。
パラメータデータエリアを作成するには
ローカルデータエリアで、行コマンド D を使用してフィールド #NAME-START および #NAME-END を削除します。
データエリアエディタのコマンド行で、次のように入力します。
SA PDA01
現在のデータエリアが新しい名前「PDA01」で保存されます。既存のローカルデータエリアは、引き続きエディタに表示されます。
次のコマンドを入力して、新しく作成したデータエリアをエディタにロードします。
E PDA01
ローカルデータエリアをパラメータデータエリアに変更するには、次のコマンドを入力します。
SET TYPE A
"A" はパラメータデータエリアを表します。
オブジェクトタイプが "Parameter" に変わります。これは、画面の上に示されます。パラメータデータエリアが次のように表示されます。
Command:
Mem: PDA01 Lib: TUTORIAL Type: PARAMETER Bytes: 116 Line: of: 3
C T Comment
* *** Top of Data Area ***
1 #PERS-ID A 8
1 #MAKE A 20
1 #MODEL A 20
* *** End of Data Area ***
F 1 HELP F 2 CHOICE F 3 QUIT F 4 SAVE F 5 STOW F 6 CHECK
F 7 READ F 8 CLEAR F 9 MEM TYPE F10 GEN F11 FLD TYPE F12 |
パラメータデータエリアを格納します。
2 つ目のローカルデータエリアを作成し、VEHICLES データベースファイルの DDM からフィールドをインポートします。
このローカルデータエリアは、サブプログラムで参照されます。
ローカルデータエリアを作成するには
データエリアエディタのコマンド行で、次のコマンドを入力します。
CLEAR
データエリアエディタが空になります。
データエリアのタイプを変更するには、コマンド行で次のように入力します。
SET TYPE L
"L" はローカルデータエリアを表します。
ESC キーを押して、編集モードに切り替えます。次に、データエリアの先頭を示す行の最初の列で、次の行コマンドを入力します。
V
結果のウィンドウで次のように入力し、ENTER キーを押します。
+------------------- View Definition -------------------+ ¦Name of View: VEHICLES-VIEW ¦ ¦Name of DDM: VEHICLES ¦ ¦Comment: ¦ +-------------------------------------------------------+ |
表示されるウィンドウに、指定された DDM のフィールドが表示されます。
Press <ESC> to enter command mode
Mem: empty Lib: TUTORIAL Type: LOCAL Bytes: 0 Line: 0 of: 0
C T Comment
V * *** Top of Data Area ***
* *** End of Data Area ***
+------------------------------- DDM: VEHICLES --------------------------------+
¦ 1 AA REG-NUM A 15 N D ¦
¦ 1 AB CHASSIS-NUM B 4 F ¦
¦ 1 AC PERSONNEL-ID A 8 D ¦
¦ G 1 CD CAR-DETAILS ¦
¦ 2 AD MAKE A 20 N D ¦
¦ 2 AE MODEL A 20 N ¦
+------------------------------------------------------------------------------+
F 1 HELP F 2 CHOICE F 3 QUIT F 4 SAVE F 5 STOW F 6 CHECK
F 7 READ F 8 CLEAR F 9 MEM TYPE F10 GEN F11 FLD TYPE F12 |
、1 番目の列に「"X"」を入力して、以下のフィールドをマークします。
PERSONNEL-ID
CAR-DETAILS
MAKE
MODEL
必須フィールドをすべてマークしたら、ENTER キーを押します。
ローカルデータエリアが次のように表示されます(方向キーを使用して、データエリアの上部にスクロールします)。
Press <ESC> to enter command mode
Mem: Lib: TUTORIAL Type: LOCAL Bytes: 485 Line: 0 of: 5
C T Comment
* *** Top of Data Area ***
V 1 VEHICLES-VIEW VEHICLES
2 PERSONNEL-ID A 8
G 2 CAR-DETAILS
3 MAKE A 20
3 MODEL A 20
* *** End of Data Area ***
F 1 HELP F 2 CHOICE F 3 QUIT F 4 SAVE F 5 STOW F 6 CHECK
F 7 READ F 8 CLEAR F 9 MEM TYPE F10 GEN F11 FLD TYPE F12 |
コマンド行で次のように入力して、新しいローカルデータエリアを保存します。
SA LDA02
新しいローカルデータエリアを格納します。
パラメータデータエリアおよびローカルデータエリアを使用して VEHICLES ファイルから情報を取得するサブプログラムを作成します。サブプログラムではプログラム PGM01 から渡された職員 ID を受け取り、VEHICLES ファイルの検索ベースとしてこの ID を使用します。
サブプログラムを作成するには
データエリアエディタのコマンド行で、次のコマンドを入力します。
E N
"N" はサブプログラムを表します。
空のプログラムエディタが起動されます。オブジェクトタイプはサブプログラムに設定されています。
次のように入力します。
DEFINE DATA PARAMETER USING PDA01 LOCAL USING LDA02 END-DEFINE * FD1. FIND (1) VEHICLES-VIEW WITH PERSONNEL-ID = #PERS-ID MOVE MAKE (FD1.) TO #MAKE MOVE MODEL (FD1.) TO #MODEL ESCAPE BOTTOM END-FIND * END
このサブプログラムから、従業員の社用車の車種およびモデルが特定の職員 ID に対して返されます。
FIND ステートメントは、検索条件 #PERS-ID に基づいて、データベースから一連のレコード(ここでは 1 レコード)を選択します。
フィールド #PERS-ID には、プログラム PGM01 から渡された PERSONNEL-ID の値が入ります。サブプログラムでは、VEHICLES ファイルの検索ベースとしてこの値が使用されます。
サブプログラムを格納します。
STOW SPGM01
サブプログラムは、CALLNAT ステートメントを使用してメインプログラムから呼び出されます。サブプログラムは、CALLNAT ステートメントによってのみ呼び出すことができます。単独で実行することはできません。サブプログラムには、呼び出し側オブジェクトが使用するグローバルデータエリアへのアクセスがありません。
メインプログラムから指定のサブプログラムへは、サブプログラムの DEFINE DATA
PARAMETER ステートメントで参照される一連のパラメータを介してデータが渡されます。
サブプログラムのパラメータデータエリアで定義される変数は、CALLNAT ステートメントの変数と同じ名前でなくてもかまいません。パラメータはアドレスによって渡されるため、順序、フォーマット、および長さが一致していれば十分です。
定義したサブプログラムが使用されるように、メインプログラムを変更します。
メインプログラムでサブプログラムを使用するには
コマンド行で次のように入力して、プログラムエディタに戻ります。
E PGM01
DISPLAY ステートメントの直前に、次のように挿入します。
RESET #MAKE #MODEL CALLNAT 'SPGM01' PERSONNEL-ID #MAKE #MODEL
RESET ステートメントにより、#MAKE および #MODEL の値が空値に設定されます。
DISPLAY ステートメントを含む行を削除し、次のように置き換えます。
WRITE TITLE
/ '*** PERSONS WITH 20 OR MORE DAYS LEAVE DUE ***'
/ '*** ARE MARKED WITH AN ASTERISK ***'//
*
DISPLAY 1X '//N A M E' NAME
1X '//DEPT' DEPT
1X '/LV/DUE' LEAVE-DUE
' ' #MARK
1X '//MAKE' #MAKE
1X '//MODEL' #MODEL
WRITE TITLE ステートメントで定義されたテキストが、各出力ページの先頭に表示されます。WRITE TITLE ステートメントは、デフォルトのページタイトルを無効にします。各ページの先頭にこれまで表示されていた情報(ページ番号、日時)は表示されなくなります。各スラッシュ(/)により、後続の情報が新しい行に表示されます。
サブプログラムから追加の自動車情報が返されるため、出力列のサイズを変更する必要があります。ヘッダーは短くなります。アスタリスクを表示する列(#MARK)には、ヘッダーは表示されません。列間には 1 文字分の空白が挿入されます(1X)。ヘッダー内の各スラッシュにより、後続の情報が同じ列の新しい行に表示されます。
プログラムは次のようになります。
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
*
RESET #MAKE #MODEL
CALLNAT 'SPGM01' PERSONNEL-ID #MAKE #MODEL
*
WRITE TITLE
/ '*** PERSONS WITH 20 OR MORE DAYS LEAVE DUE ***'
/ '*** ARE MARKED WITH AN ASTERISK ***'//
*
DISPLAY 1X '//N A M E' NAME
1X '//DEPT' DEPT
1X '/LV/DUE' LEAVE-DUE
' ' #MARK
1X '//MAKE' #MAKE
1X '//MODEL' #MODEL
*
END-READ
*
IF *COUNTER (RD1.) = 0 THEN
REINPUT 'No employees meet your criteria.'
END-IF
*
END-REPEAT
*
END
プログラムを実行します。
開始名として「"JONES"」と入力し、ENTER キーを押します。
結果のリストは次のようになります。
MORE
*** PERSONS WITH 20 OR MORE DAYS LEAVE DUE ***
*** ARE MARKED WITH AN ASTERISK ***
LV
N A M E DEPT DUE MAKE MODEL
-------------------- ------ --- - -------------------- --------------------
JONES SALE30 25 * CHRYSLER IMPERIAL
JONES MGMT10 34 * CHRYSLER PLYMOUTH
JONES TECH10 11 GENERAL MOTORS CHEVROLET
JONES MGMT10 18 FORD ESCORT
JONES TECH10 21 * GENERAL MOTORS BUICK
JONES SALE00 30 * GENERAL MOTORS PONTIAC
JONES SALE20 14 GENERAL MOTORS OLDSMOBILE
JONES COMP12 26 * DATSUN SUNNY
JONES TECH02 25 * FORD ESCORT 1.3
プログラムエディタに戻るには、MORE プロンプトで「EDIT」と入力します。
プログラムを格納します。
これで、チュートリアルがすべて完了しました。