サブプログラムを起動する CALLNAT
ステートメントを含めるようにプログラムを拡張します。 サブプログラムでは、メインプログラムで識別された従業員が、デモデータベースの一部でもある VEHICLES
ファイルに対する FIND
要求のベースとなります。 その結果、メインプログラムからの従業員情報だけでなくサブプログラムからの自動車情報も出力に含まれます。
新しいサブプログラムでは、追加のローカルデータエリアおよびパラメータデータエリアを作成する必要があります。
以下の演習を完了すると、サンプルのアプリケーションは次のモジュールで構成されます。
このドキュメントには次の演習が含まれています。
前に作成したローカルデータエリアに他のフィールドを追加します。 これらのフィールドは、後で作成するサブプログラムで使用します。
ローカルデータエリアに他のフィールドを追加するには
ローカルデータエリアに戻ります。
E LDA01
#NAME-END
の下に次のフィールドを定義します。
レベル([L]列) | 名前 | フォーマット([F]列) | 長さ |
---|---|---|---|
1 | #PERS-ID |
A | 8 |
1 | #MAKE |
A | 20 |
1 | #MODEL |
A | 20 |
ローカルデータエリアが次のように表示されます。
Local LDA01 Library TUTORIAL DBID 11177 FNR 8 Command > + I T L Name F Length Miscellaneous All -- -------------------------------- - ---------- -------------------------> 1 #NAME-START A 20 1 #NAME-END A 20 1 #PERS-ID A 8 1 #MAKE A 20 1 #MODEL A 20 ----------------------------------------------------------------- S 5 L 1 |
ローカルデータエリアを格納します。
パラメータデータエリア(PDA)は、Natural プログラムおよび後で作成するサブプログラム間で受け渡すデータパラメータを指定するために使用します。 パラメータデータエリアは、サブプログラムで参照されます。
ローカルデータエリアにわずかな変更を加えるだけで、パラメータデータエリアを作成できます。つまり、ローカルデータエリアの 2 つのデータフィールドを削除してから、変更したデータエリアをパラメータデータエリアとして保存します。 元のローカルデータエリアはそのまま残ります。
パラメータデータエリアを作成するには
ローカルデータエリアで、フィールド #NAME-START
および #NAME-END
を削除します。
データエリアエディタのコマンド行で、次のように入力します。
SA PDA01
現在のデータエリアが新しい名前 PDA01
で保存されます。 既存のローカルデータエリアは、引き続きエディタに表示されます。
次のコマンドを入力して、新しく作成したデータエリアをエディタにロードします。
E PDA01
ローカルデータエリアをパラメータデータエリアに変更するには、次のコマンドを入力します。
SET TYPE A
"A" はパラメータデータエリアを表します。
オブジェクトタイプが "Parameter" に変わります。 これは、画面の左上に示されます。 パラメータデータエリアが次のように表示されます。
Parameter PDA01 Library TUTORIAL DBID 11177 FNR 8 Command > + I T L Name F Length Miscellaneous All -- -------------------------------- - ---------- -------------------------> 1 #PERS-ID A 8 1 #MAKE A 20 1 #MODEL A 20 ----------------------------------------------------------------- S 3 L 1 |
パラメータデータエリアを格納します。
2 つ目のローカルデータエリアを作成し、VEHICLES
データベースファイルの DDM からフィールドをインポートします。
このローカルデータエリアは、サブプログラムで参照されます。
ローカルデータエリアを作成するには
データエリアエディタのコマンド行で、次のコマンドを入力します。
CLEAR
データエリアエディタが空になります。
データエリアのタイプを変更するには、コマンド行で次のように入力します。
SET TYPE L
"L" はローカルデータエリアを表します。
編集エリアの最初の行で、T 列から開始して次のように入力します。
.V(VEHICLES)
Enter キーを押します。
VEHICLES
ビューが表示されます。
SYSGDA 4461: Mark fields to incorporate into data area. Local Library TUTORIAL DBID 11177 FNR 8 View VEHICLES I T L Name F Length Miscellaneous - - -- -------------------------------- - ---------- ------------------------- 2 REG-NUM A 15 /* CAR'S REGISTR. NUMBE 2 CHASSIS-NUM I 4 /* MANUFACTURER NUMBER 2 PERSONNEL-ID A 8 /* IDENT. OF CAR USER G 2 CAR-DETAILS /* DESCRIPTION OF THE C 3 MAKE A 20 3 MODEL A 20 3 COLOR A 10 3 COLOUR A 10 2 YEAR N 4.0 /* MANUFACTURING YEAR 2 CLASS A 1 /* P=PRIVAT 2 LEASE-PUR A 1 /* L=LEASED 2 DATE-ACQ N 8.0 /* DATE THE CAR WAS ACQ 2 CURR-CODE A 3 /* CURRENCY OF CAR COST M 2 MAINT-COST P 7.0 (1:60)/* MAINTENANCE COST 2 MODEL-YEAR-MAKE A 24 /* YEAR + CAR MAKE /* SP - - -- -------------------------------- - ---------- ------------------------- |
I 列に任意の文字を入力して、次のフィールドをマークします。
PERSONNEL-ID
CAR-DETAILS
MAKE
MODEL
必須フィールドをすべてマークしたら、データエリアエディタに戻るため Enter キーを押します。
ローカルデータエリアが次のように表示されます。
Local Library TUTORIAL DBID 11177 FNR 8 Command > + I T L Name F Length Miscellaneous All -- -------------------------------- - ---------- -------------------------> V 1 VEHICLES-VIEW VEHICLES 2 PERSONNEL-ID A 8 /* IDENT. OF CAR USER G 2 CAR-DETAILS /* DESCRIPTION OF THE CAR 3 MAKE A 20 3 MODEL A 20 ----------------------------------------------------------------- S 5 L 1 |
コマンド行で次のように入力して、新しいローカルデータエリアを保存します。
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
」と入力します。
プログラムを格納します。
これで、チュートリアルがすべて完了しました。