サブプログラムを起動する CALLNAT
ステートメントを含めるようにプログラムを拡張します。 サブプログラムでは、メインプログラムで識別された従業員が、デモデータベースの一部でもある VEHICLES
ファイルに対する FIND
要求のベースとなります。 その結果、メインプログラムからの従業員情報だけでなくサブプログラムからの自動車情報も出力に含まれます。
新しいサブプログラムでは、追加のローカルデータエリアおよびパラメータデータエリアを作成する必要があります。
以下の演習を完了すると、サンプルのアプリケーションは次のモジュールで構成されます。
このドキュメントには次の演習が含まれています。
前に作成したローカルデータエリアに他のフィールドを追加します。 これらのフィールドは、後で作成するサブプログラムで使用します。
ローカルデータエリアに他のフィールドを追加するには
ローカルデータエリアに戻ります。
#NAME-END
を含む行を選択します。
コンテキストメニューから、
を選択します。または:
次のツールバーボタンを選択します。
[データフィールドの定義]ダイアログボックスが表示されます。
次のフィールドを定義します。
レベル | 名前 | フォーマット | 長さ |
---|---|---|---|
1 | #PERS-ID |
A | 8 |
1 | #MAKE |
A | 20 |
1 | #MODEL |
A | 20 |
フィールドを定義した後に、
ボタンを選択します。すべてのフィールドを定義した後に、
ボタンを選択します。ローカルデータエリアが次のように表示されます。
ローカルデータエリアを格納します。
パラメータデータエリア(PDA)は、Natural プログラムおよび後で作成するサブプログラム間で受け渡すデータパラメータを指定するために使用します。 パラメータデータエリアは、サブプログラムで参照されます。
ローカルデータエリアにわずかな変更を加えるだけで、パラメータデータエリアを作成できます。つまり、ローカルデータエリアの 2 つのデータフィールドを削除してから、変更したデータエリアをパラメータデータエリアとして保存します。 元のローカルデータエリアはそのまま残ります。
注意:
また、 メニューの を選択して、パラメータデータエリアを作成することもできます。
パラメータデータエリアを作成するには
ローカルデータエリアで、フィールド #NAME-START
および #NAME-END
を削除します。
メニューの を選択します。
[名前をつけて保存]ダイアログボックスが表示されます。 パラメータデータエリアの名前として「PDA01」と指定します。
プログラムも含むライブラリ(TUTORIAL ノード)が選択されていることを確認します。
[タイプ]ドロップダウンリストボックスの[パラメータ]を選択します。
ボタンを選択します。
新しい名前とタイプがエディタウィンドウのタイトルバーに表示されます。 ライブラリワークスペースで、新しいパラメータデータエリアが Parameter Data Areas ノードに表示されます。
パラメータデータエリアが次のように表示されます。
パラメータデータエリアを格納します。
パラメータデータエリアのエディタウィンドウを閉じます。
2 つ目のローカルデータエリアを作成し、VEHICLES
データベースファイルの DDM からフィールドをインポートします。 この DDM もシステムライブラリ SYSEXDDM
に用意されています。
このローカルデータエリアは、サブプログラムで参照されます。
ローカルデータエリアを作成するには
ライブラリワークスペースで、プログラムも含まれているライブラリ(TUTORIAL ノード)を選択します。
コンテキストメニューから、
を選択します。または:
次のツールバーボタンを選択します。
エディタウィンドウが表示されます。
メニューの を選択します。
[データフィールドのインポート]ダイアログボックスが表示されます。
[ライブラリ]ドロップダウンリストボックスから[SYSEXDDM]を選択します。
[DDM]オプションボタンを選択します。
[オブジェクト]リストボックスで、VEHICLES という名前のサンプル DDM を選択します。
Ctrl キーを押して、[インポータブルデータ]リストボックスで次のフィールドを選択します。
PERSONNEL-ID
CAR-DETAILS
MAKE
MODEL
ボタンを選択します。
[ビューの定義]ダイアログボックスが表示されます。
ビューの名前として「VEHICLES-VIEW」と指定します。
ボタンを選択します。
[データフィールドのインポート]ダイアログボックスを閉じます。
ボタンを選択して、新しいローカルデータエリアを格納します。
ローカルデータエリアの名前を指定するよう指示されたら、「LDA02」と入力し、
ボタンを選択します。ローカルデータエリアが次のように表示されます。
ローカルデータエリアのエディタウィンドウを閉じます。
パラメータデータエリアおよびローカルデータエリアを使用して VEHICLES
ファイルから情報を取得するサブプログラムを作成します。 サブプログラムではプログラム PGM01
から渡された職員 ID を受け取り、VEHICLES
ファイルの検索ベースとしてこの ID を使用します。
サブプログラムを作成するには
ライブラリワークスペースで、プログラムも含まれているライブラリ(TUTORIAL ノード)を選択します。
コンテキストメニューから、
を選択します。エディタウィンドウが表示されます。
次のように入力します。
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
ファイルの検索ベースとしてこの値が使用されます。
サブプログラムを格納します。
サブプログラムの名前を指定するよう指示されたら、「SPGM01」と入力し、
ボタンを選択します。サブプログラムのエディタウィンドウを閉じます。
サブプログラムは、CALLNAT
ステートメントを使用してメインプログラムから呼び出されます。 サブプログラムは、CALLNAT
ステートメントによってのみ呼び出すことができます。単独で実行することはできません。 サブプログラムには、呼び出し側オブジェクトが使用するグローバルデータエリアへのアクセスがありません。
メインプログラムから指定のサブプログラムへは、サブプログラムの DEFINE DATA PARAMETER
ステートメントで参照される一連のパラメータを介してデータが渡されます。
サブプログラムのパラメータデータエリアで定義される変数は、CALLNAT
ステートメントの変数と同じ名前でなくてもかまいません。 パラメータはアドレスによって渡されるため、順序、フォーマット、および長さが一致していれば十分です。
定義したサブプログラムが使用されるように、メインプログラムを変更します。
メインプログラムでサブプログラムを使用するには
プログラムエディタに戻ります。
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 キーを押します。
結果のリストは次のようになります。
*** 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
Esc キーを押して、出力ウィンドウを閉じます。
プログラムを格納します。
これで、チュートリアルがすべて完了しました。