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

サブプログラム

サブプログラムを起動する CALLNAT ステートメントを含めるようにプログラムを拡張します。 サブプログラムでは、メインプログラムで識別された従業員が、デモデータベースの一部でもある VEHICLES ファイルに対する FIND 要求のベースとなります。 その結果、メインプログラムからの従業員情報だけでなくサブプログラムからの自動車情報も出力に含まれます。

新しいサブプログラムでは、追加のローカルデータエリアおよびパラメータデータエリアを作成する必要があります。

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

Application structure

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


ローカルデータエリアの変更

前に作成したローカルデータエリアに他のフィールドを追加します。 これらのフィールドは、後で作成するサブプログラムで使用します。

Start of instruction setローカルデータエリアに他のフィールドを追加するには

  1. ローカルデータエリアに戻ります。

  2. #NAME-END を含む行を選択します。

  3. コンテキストメニューから、[挿入]>[データフィールド]を選択します。

    または:
    次のツールバーボタンを選択します。

    Insert data field

    [データフィールドの定義]ダイアログボックスが表示されます。

  4. 次のフィールドを定義します。

    レベル 名前 フォーマット 長さ
    1 #PERS-ID A 8
    1 #MAKE A 20
    1 #MODEL A 20

    フィールドを定義した後に、[追加]ボタンを選択します。

  5. すべてのフィールドを定義した後に、[終了]ボタンを選択します。

    ローカルデータエリアが次のように表示されます。

    Local data area

  6. ローカルデータエリアを格納します。

Top of page

既存のローカルデータエリアからのパラメータデータエリアの作成

パラメータデータエリア(PDA)は、Natural プログラムおよび後で作成するサブプログラム間で受け渡すデータパラメータを指定するために使用します。 パラメータデータエリアは、サブプログラムで参照されます。

ローカルデータエリアにわずかな変更を加えるだけで、パラメータデータエリアを作成できます。つまり、ローカルデータエリアの 2 つのデータフィールドを削除してから、変更したデータエリアをパラメータデータエリアとして保存します。 元のローカルデータエリアはそのまま残ります。

注意:
また、[オブジェクト]メニューの[新規作成]>[パラメータデータエリア]を選択して、パラメータデータエリアを作成することもできます。

Start of instruction setパラメータデータエリアを作成するには

  1. ローカルデータエリアで、フィールド #NAME-START および #NAME-END を削除します。

  2. [オブジェクト]メニューの[名前を付けて保存]を選択します。

    [名前をつけて保存]ダイアログボックスが表示されます。 パラメータデータエリアの名前として「PDA01」と指定します。

  3. プログラムも含むライブラリ(TUTORIAL ノード)が選択されていることを確認します。

  4. [タイプ]ドロップダウンリストボックスの[パラメータ]を選択します。

  5. [OK]ボタンを選択します。

    新しい名前とタイプがエディタウィンドウのタイトルバーに表示されます。 ライブラリワークスペースで、新しいパラメータデータエリアが Parameter Data Areas ノードに表示されます。

    パラメータデータエリアが次のように表示されます。

    Parameter data area

  6. パラメータデータエリアを格納します。

  7. パラメータデータエリアのエディタウィンドウを閉じます。

Top of page

異なるビューを含む別のローカルデータエリアの作成

2 つ目のローカルデータエリアを作成し、VEHICLES データベースファイルの DDM からフィールドをインポートします。 この DDM もシステムライブラリ SYSEXDDM に用意されています。

このローカルデータエリアは、サブプログラムで参照されます。

Start of instruction setローカルデータエリアを作成するには

  1. ライブラリワークスペースで、プログラムも含まれているライブラリ(TUTORIAL ノード)を選択します。

  2. コンテキストメニューから、[新規作成]>[ローカルデータエリア]を選択します。

    または:
    次のツールバーボタンを選択します。

    Local data area

    エディタウィンドウが表示されます。

  3. [挿入]メニューの[インポート]を選択します。

    [データフィールドのインポート]ダイアログボックスが表示されます。

  4. [ライブラリ]ドロップダウンリストボックスから[SYSEXDDM]を選択します。

    [DDM]オプションボタンを選択します。

    [オブジェクト]リストボックスで、VEHICLES という名前のサンプル DDM を選択します。

  5. Ctrl キーを押して、[インポータブルデータ]リストボックスで次のフィールドを選択します。

    PERSONNEL-ID
    CAR-DETAILS
    MAKE
    MODEL

  6. [インポート]ボタンを選択します。

    [ビューの定義]ダイアログボックスが表示されます。

  7. ビューの名前として「VEHICLES-VIEW」と指定します。

  8. [OK]ボタンを選択します。

  9. [終了]ボタンを選択して、[データフィールドのインポート]ダイアログボックスを閉じます。

  10. 新しいローカルデータエリアを格納します。

  11. ローカルデータエリアの名前を指定するよう指示されたら、「LDA02」と入力し、[OK]ボタンを選択します。

    ローカルデータエリアが次のように表示されます。

    Local data area

  12. ローカルデータエリアのエディタウィンドウを閉じます。

Top of page

サブプログラムの作成

パラメータデータエリアおよびローカルデータエリアを使用して VEHICLES ファイルから情報を取得するサブプログラムを作成します。 サブプログラムではプログラム PGM01 から渡された職員 ID を受け取り、VEHICLES ファイルの検索ベースとしてこの ID を使用します。

Start of instruction setサブプログラムを作成するには

  1. ライブラリワークスペースで、プログラムも含まれているライブラリ(TUTORIAL ノード)を選択します。

  2. コンテキストメニューから、[新規作成]>[サブプログラム]を選択します。

    エディタウィンドウが表示されます。

  3. 次のように入力します。

    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 ファイルの検索ベースとしてこの値が使用されます。

  4. サブプログラムを格納します。

  5. サブプログラムの名前を指定するよう指示されたら、「SPGM01」と入力し、[OK]ボタンを選択します。

  6. サブプログラムのエディタウィンドウを閉じます。

Top of page

プログラムからのサブプログラムの参照

サブプログラムは、CALLNAT ステートメントを使用してメインプログラムから呼び出されます。 サブプログラムは、CALLNAT ステートメントによってのみ呼び出すことができます。単独で実行することはできません。 サブプログラムには、呼び出し側オブジェクトが使用するグローバルデータエリアへのアクセスがありません。

メインプログラムから指定のサブプログラムへは、サブプログラムの DEFINE DATA PARAMETER ステートメントで参照される一連のパラメータを介してデータが渡されます。

サブプログラムのパラメータデータエリアで定義される変数は、CALLNAT ステートメントの変数と同じ名前でなくてもかまいません。 パラメータはアドレスによって渡されるため、順序、フォーマット、および長さが一致していれば十分です。

定義したサブプログラムが使用されるように、メインプログラムを変更します。

Start of instruction setメインプログラムでサブプログラムを使用するには

  1. プログラムエディタに戻ります。

  2. DISPLAY ステートメントの直前に、次のように挿入します。

    RESET #MAKE #MODEL
    CALLNAT 'SPGM01' PERSONNEL-ID #MAKE #MODEL
    

    RESET ステートメントにより、#MAKE および #MODEL の値が空値に設定されます。

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

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

    結果のリストは次のようになります。

    
                                                                                
                    *** 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          
                                                                                
                                                                                
    
  6. Esc キーを押して、出力ウィンドウを閉じます。

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

これで、チュートリアルがすべて完了しました。

Top of page