ループおよびラベルを追加してプログラムを強化します。
以下の演習を完了すると、サンプルのアプリケーションを構成するモジュールは前のドキュメントと同じになります。
このドキュメントには次の演習が含まれています。
現時点では、マップが表示され、リストが表示された時点でプログラムは終了します。 プログラムを再スタートしなくても新しい従業員リストを直ちに表示できるようにするため、対応するプログラムコードを REPEAT
ループに挿入します。
繰り返しループを定義するには
END-DEFINE
の下に次の行を挿入します。
RP1. REPEAT
REPEAT
は、繰り返しループの開始を定義します。 RP1.
は、繰り返しループを終了するときに使用されるラベルです(以下で定義)。
END
ステートメントの前に次の行を挿入して、繰り返しループの終了を定義します。
END-REPEAT
INPUT USING MAP 'MAP01'
の下に、次の行を挿入します。
IF #NAME-START = '.' THEN ESCAPE BOTTOM (RP1.) END-IF
IF
ステートメントは、END-IF
で終了する必要があり、#NAME-START
フィールドの内容をチェックします。 このフィールドに「.」(ピリオド)を入力すると、ループの終了に ESCAPE BOTTOM
ステートメントが使用されます。 ループの後にある最初のステートメント(この場合は END
)から処理が続行します。
ループにラベル(ここでは RP1
)を割り当てると、このループを ESCAPE BOTTOM
ステートメントで参照できます。 ループはネストすることができるため、どのループを終了するか指定する必要があります。 指定がない場合は、最も内側にあるアクティブなループが終了します。
プログラムは次のようになります。
DEFINE DATA LOCAL 1 #NAME-START (A20) 1 #NAME-END (A20) 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 * READ EMPLOYEES-VIEW BY NAME STARTING FROM #NAME-START ENDING AT #NAME-END * DISPLAY NAME 3X DEPT 3X LEAVE-DUE * END-READ * END-REPEAT * END
注意:
読みやすくするため、REPEAT
ループのコンテンツはインデントされています。
プログラムを実行します。
結果のマップで、開始名の入力を求めるフィールドに「JONES」と入力し、Enter キーを押します。
結果のリストに、"Jones" という名前の従業員が表示されます。 Enter キーを押します。 REPEAT
ループにより、マップが再表示されます。 終了名にも「JONES」と入力されていることがわかります。
マップを終了するには、開始名の入力を求めるフィールドに「.」(ピリオド)を入力し、Enter キーを押します。 このフィールドに表示されたままになっている名前の残りの文字は、必ず削除してください。
プログラムを格納します。
データベースで検出できない開始名をユーザーが入力したときに表示するメッセージを定義します。
指定の従業員が見つからない場合に表示するメッセージを定義するには
READ
ステートメントを含む行にラベル RD1.
を追加します。行は次のようになります。
RD1. READ EMPLOYEES-VIEW BY NAME
END-READ
の下に次の行を挿入します。
IF *COUNTER (RD1.) = 0 THEN REINPUT 'No employees meet your criteria.' END-IF
READ
ループで検出されたレコード数をチェックするため、システム変数 *COUNTER
を使用します。 この変数の値が 0 である(指定した名前の従業員が見つからない)と、REINPUT
ステートメントで定義されたメッセージがマップ下部に表示されます。
READ
ループを識別するため、ループにラベル(ここでは RD1.
)を割り当てます。 データベースにアクセスする複雑なプログラムでは多くのループが含まれている場合があるため、参照するループを指定する必要があります。
プログラムは次のようになります。
DEFINE DATA LOCAL 1 #NAME-START (A20) 1 #NAME-END (A20) 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 * DISPLAY NAME 3X DEPT 3X LEAVE-DUE * END-READ * IF *COUNTER (RD1.) = 0 THEN REINPUT 'No employees meet your criteria.' END-IF * END-REPEAT * END
プログラムを実行します。
結果のマップで、デモデータベースで定義されていない開始名(「XYZ」など)を入力し、Enter キーを押します。
マップにメッセージが表示されます。
マップを終了するには、開始名の入力を求めるフィールドに「.」(ピリオド)を入力し、Enter キーを押します。 このフィールドに表示されたままになっている名前の残りの文字は、必ず削除してください。
または:
Esc キーを押します。
プログラムを格納します。
次の演習「インラインサブルーチン」に進みます。