ループおよびラベル

ループおよびラベルを追加してプログラムを強化します。

以下の演習を完了すると、サンプルのアプリケーションを構成するモジュールは前のドキュメントと同じになります。

Application structure

このドキュメントには次の演習が含まれています。


反復使用の許可

現時点では、マップが表示され、リストが表示された時点でプログラムは終了します。プログラムを再スタートしなくても新しい従業員リストを直ちに表示できるようにするため、対応するプログラムコードを REPEAT ループに挿入します。

Start of instruction set繰り返しループを定義するには

  1. END-DEFINE の下に以下を挿入します。

    RP1. REPEAT

    REPEAT は、繰り返しループの開始を定義します。RP1. は、繰り返しループを終了するときに使用されるラベルです(以下で定義)。

  2. END ステートメントの前に次の行を挿入して、繰り返しループの終了を定義します。

    END-REPEAT
  3. 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 ループのコンテンツはインデントされています。

  4. プログラムを実行します。

  5. 結果のマップで、開始名の入力を求めるフィールドに「"JONES"」と入力し、ENTER キーを押します。

    結果のリストに、"Jones" という名前の従業員が表示されます。ENTER キーを押します。REPEAT ループにより、マップが再表示されます。終了名にも「"JONES"」と入力されていることがわかります。

  6. マップを終了するには、開始名の入力を求めるフィールドに「.」(ピリオド)を入力し、ENTER キーを押します。このフィールドに表示されたままになっている名前の残りの文字は、必ず削除してください。

  7. プログラムを格納します。

情報が見つからないことを示すメッセージの表示

データベースで検出できない開始名をユーザーが入力したときに表示するメッセージを定義します。

Start of instruction set指定の従業員が見つからない場合に表示するメッセージを定義するには

  1. READ ステートメントを含む行にラベル RD1. を追加します。行は次のようになります。

    RD1. READ EMPLOYEES-VIEW BY NAME
  2. 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
  3. プログラムを実行します。

  4. 結果のマップで、デモデータベースで定義されていない開始名(「"XYZ"」など)を入力し、ENTER キーを押します。

    マップにメッセージが表示されます。

  5. マップを終了するには、開始名の入力を求めるフィールドに「.」(ピリオド)を入力し、ENTER キーを押します。このフィールドに表示されたままになっている名前の残りの文字は、必ず削除してください。

  6. プログラムを格納します。

次の演習に進みます。インラインサブルーチン