バージョン 6.3.3
 —  ファーストステップ  —

インラインサブルーチン

Natural では、プログラム内で直接定義されるインラインサブルーチンと、プログラム外で別のオブジェクトとして格納される外部サブルーチン(このチュートリアルで後述)という 2 種類のサブルーチンが区別されます。

#MARK という名前のユーザー定義変数にアスタリスク(*)を移動するインラインサブルーチンをプログラムに追加します。 このサブルーチンは、従業員が 20 日以上の休暇を取った場合に起動されます。

以下の演習を完了すると、サンプルのアプリケーションは次の構造になります。

Application structure

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


インラインサブルーチンの定義

サブルーチンをプログラムに追加します。

Start of instruction setサブルーチンを定義するには

  1. ユーザー定義変数 #NAME-END の下に次の行を挿入します。

    1 #MARK              (A1)
    

    この変数はサブルーチンで使用されます。 したがって、最初に定義しておく必要があります。

  2. サブルーチンを定義するため、END ステートメントの前に次の行を挿入します。

    DEFINE SUBROUTINE MARK-SPECIAL-EMPLOYEES
      MOVE '*' TO #MARK
    END-SUBROUTINE
    

    このサブルーチンが実行されると、アスタリスク(*)が #MARK に移動します。

    注意:
    ステートメント MOVE '*' TO #MARK の代わりに、ASSIGN または COMPUTE ステートメントの次の変形 #MARK := '*' を使用することもできます。

  3. DISPLAY ステートメントを次のように変更します。

    DISPLAY NAME 3X DEPT 3X LEAVE-DUE 3X '>=20' #MARK
    

    これにより、出力に新しい列が表示されます。 見出しは ">=20" です。 該当する従業員が 20 日以上の休暇を取った場合、列にアスタリスク(*)が表示されます。

Top of page

インラインサブルーチンの実行

インラインサブルーチンの定義が完了したので、インラインサブルーチンを実行するコードを指定できます。

Start of instruction setインラインサブルーチンを実行するには

  1. DISPLAY ステートメントの下に次の行を挿入します。

    IF LEAVE-DUE >= 20 THEN
      PERFORM MARK-SPECIAL-EMPLOYEES
    ELSE
      RESET #MARK
    END-IF
    

    20 日以上の休暇を取った従業員が検出されると、MARK-SPECIAL-EMPLOYEES という名前の新しいサブルーチンが実行されます。 従業員の休暇が 20 日未満の場合、#MARK のコンテンツは空白にリセットされます。

    プログラムは次のようになります。

    DEFINE DATA
    LOCAL
      1 #NAME-START        (A20)
      1 #NAME-END          (A20)
      1 #MARK              (A1)
      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
    *    
        IF LEAVE-DUE >= 20 THEN
          PERFORM MARK-SPECIAL-EMPLOYEES
        ELSE
          RESET #MARK
        END-IF
    *
        DISPLAY NAME 3X DEPT 3X LEAVE-DUE 3X '>=20' #MARK
    *
      END-READ
    *
      IF *COUNTER (RD1.) = 0 THEN
        REINPUT 'No employees meet your criteria.'
      END-IF
    *
    END-REPEAT
    *
    DEFINE SUBROUTINE MARK-SPECIAL-EMPLOYEES
      MOVE '*' TO #MARK
    END-SUBROUTINE
    *
    END
    
  2. プログラムを実行します。

  3. 結果のマップで、「JONES」と入力して Enter キーを押します。

    従業員のリストに列が追加されて表示されます。

  4. Esc キーを押して、出力ウィンドウを閉じます。

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

次の演習「処理ルールとヘルプルーチン」に進みます。

Top of page