外部サブルーチン

これまでは、MARK-SPECIAL-EMPLOYEES ステートメントを使用して、サブルーチン DEFINE SUBROUTINE をプログラム内で定義していました。この演習では、サブルーチンを別のオブジェクトとしてプログラムの外部に定義します。

以下の演習を完了すると、サンプルのアプリケーションは次のモジュールで構成されます。

Application structure

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


外部サブルーチンの作成

プログラムの既存のコードを外部サブルーチンで再使用するため、プログラムを新しい名前で保存し、タイプをサブルーチンに変更して、不要な行をすべて削除します。

外部サブルーチンの DEFINE SUBROUTINE ステートメントは、プログラム内のインラインサブルーチンと同じ方法でコーディングします。

Start of instruction set外部サブルーチンを作成するには

  1. プログラムエディタのコマンド行で、次のように入力します。

    SA SUBR01

    現在のプログラムが新しい名前「SUBR01」で保存されます。プログラムは引き続きエディタに表示されます。

  2. 次のコマンドを入力して、新しく作成したオブジェクトをエディタにロードします。

    E SUBR01

    オブジェクトタイプはプログラムのままです。

  3. プログラムを外部サブルーチンに変更するには、次のコマンドを入力します。

    SET TYPE S

    "S" はサブルーチンを表します。

    画面に表示されるオブジェクトタイプが "Subroutine" に変わります。

  4. 行コマンド D を使用して、次の行を除くすべての行を削除します。

    DEFINE DATA
      GLOBAL USING GDA01
      LOCAL USING LDA01
    END-DEFINE
    *
    DEFINE SUBROUTINE MARK-SPECIAL-EMPLOYEES
      MOVE '*' TO #MARK
    END-SUBROUTINE
    *
    END

    テキストのブロックを削除することもできます。これには、次の手順を実行します。

    1. ブロックの最初の行の先頭で、行コマンド「.X」を入力します。

    2. ブロックの最後の行の先頭で、行コマンド「.Y」を入力します。

    3. ENTER キーを押します。

      削除する行のブロックが ".X" および ".Y" でマークされます。(マークを削除するには、コマンド行で「RESET」を入力します。)

    4. マークされたブロックを削除するには、コマンド行で「DX-Y」を入力します。

  5. サブルーチンを格納します。

プログラムからの外部サブルーチンの参照

PERFORM ステートメントは、内部サブルーチンおよび外部サブルーチンの両方を呼び出します。内部サブルーチンがプログラム内で見つからないと、Natural は同じ名前の外部サブルーチンを自動的に実行しようとします。Natural では、サブルーチンコードで定義された名前(サブルーチン名)が検索され、サブルーチンの保存時に指定した名前(Natural オブジェクト名)が検索されるわけではありません。

外部サブルーチンの定義が完了したので、インラインサブルーチン(外部サブルーチンと同じ名前を持つ)をプログラムから削除する必要があります。

Start of instruction setプログラムで外部サブルーチンを使用するには

  1. サブルーチンが現在表示されているエディタのコマンド行で次のように入力して、プログラムエディタに戻ります。

    E PGM01
  2. 次の行を削除します。

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

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

    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
    *
        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
    *
    END
  3. プログラムを実行します。

  4. 開始名として「"JONES"」と入力し、ENTER キーを押します。

    結果のリストには、20 日以上の休暇を取った各従業員にアスタリスクが引き続き表示されます。

  5. プログラムエディタに戻るには、MORE プロンプトで「EDIT」と入力します。

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

次の演習に進みます。サブプログラム