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

サブプログラム

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

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

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

Application structure

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


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

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

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

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

    E LDA01
  2. #NAME-END の下に次のフィールドを定義します。

    レベル([L]列) 名前 フォーマット([F]列) 長さ
    1 #PERS-ID A 8
    1 #MAKE A 20
    1 #MODEL A 20

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

    Local     LDA01     Library TUTORIAL                       DBID 11177 FNR     8
    Command                                                                     > +
    I T L  Name                             F Length     Miscellaneous             
    All -- -------------------------------- - ---------- ------------------------->
         1 #NAME-START                      A         20                           
         1 #NAME-END                        A         20                           
         1 #PERS-ID                         A          8                           
         1 #MAKE                            A         20                           
         1 #MODEL                           A         20                           
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
    ----------------------------------------------------------------- S 5    L 1
  3. ローカルデータエリアを格納します。

Top of page

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

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

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

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

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

  2. データエリアエディタのコマンド行で、次のように入力します。

    SA PDA01

    現在のデータエリアが新しい名前 PDA01 で保存されます。 既存のローカルデータエリアは、引き続きエディタに表示されます。

  3. 次のコマンドを入力して、新しく作成したデータエリアをエディタにロードします。

    E PDA01
  4. ローカルデータエリアをパラメータデータエリアに変更するには、次のコマンドを入力します。

    SET TYPE A

    "A" はパラメータデータエリアを表します。

    オブジェクトタイプが "Parameter" に変わります。 これは、画面の左上に示されます。 パラメータデータエリアが次のように表示されます。

    Parameter PDA01     Library TUTORIAL                       DBID 11177 FNR     8
    Command                                                                     > +
    I T L  Name                             F Length     Miscellaneous             
    All -- -------------------------------- - ---------- ------------------------->
         1 #PERS-ID                         A          8                           
         1 #MAKE                            A         20                           
         1 #MODEL                           A         20                           
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
    ----------------------------------------------------------------- S 3    L 1
  5. パラメータデータエリアを格納します。

Top of page

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

2 つ目のローカルデータエリアを作成し、VEHICLES データベースファイルの DDM からフィールドをインポートします。

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

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

  1. データエリアエディタのコマンド行で、次のコマンドを入力します。

    CLEAR

    データエリアエディタが空になります。

  2. データエリアのタイプを変更するには、コマンド行で次のように入力します。

    SET TYPE L

    "L" はローカルデータエリアを表します。

  3. 編集エリアの最初の行で、T 列から開始して次のように入力します。

    .V(VEHICLES)
  4. Enter キーを押します。

    VEHICLES ビューが表示されます。

    SYSGDA 4461: Mark fields to incorporate into data area.                        
    Local               Library TUTORIAL                       DBID 11177 FNR     8
    View VEHICLES                                                                  
    I T L  Name                             F Length     Miscellaneous             
    - - -- -------------------------------- - ---------- ------------------------- 
         2 REG-NUM                          A         15 /* CAR'S REGISTR. NUMBE   
         2 CHASSIS-NUM                      I          4 /* MANUFACTURER NUMBER    
         2 PERSONNEL-ID                     A          8 /* IDENT. OF CAR USER     
      G  2 CAR-DETAILS                                   /* DESCRIPTION OF THE C   
         3 MAKE                             A         20                           
         3 MODEL                            A         20                           
         3 COLOR                            A         10                           
         3 COLOUR                           A         10                           
         2 YEAR                             N        4.0 /* MANUFACTURING YEAR     
         2 CLASS                            A          1 /* P=PRIVAT               
         2 LEASE-PUR                        A          1 /* L=LEASED               
         2 DATE-ACQ                         N        8.0 /* DATE THE CAR WAS ACQ   
         2 CURR-CODE                        A          3 /* CURRENCY OF CAR COST   
      M  2 MAINT-COST                       P        7.0 (1:60)/* MAINTENANCE COST 
         2 MODEL-YEAR-MAKE                  A         24 /* YEAR + CAR MAKE /* SP  
                                                                                   
                                                                                   
    - - -- -------------------------------- - ---------- ------------------------- 
  5. I 列に任意の文字を入力して、次のフィールドをマークします。

    PERSONNEL-ID
    CAR-DETAILS
    MAKE
    MODEL

  6. 必須フィールドをすべてマークしたら、データエリアエディタに戻るため Enter キーを押します。

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

    Local               Library TUTORIAL                       DBID 11177 FNR     8
    Command                                                                     > +
    I T L  Name                             F Length     Miscellaneous             
    All -- -------------------------------- - ---------- ------------------------->
      V  1 VEHICLES-VIEW                                 VEHICLES                  
         2 PERSONNEL-ID                     A          8 /* IDENT. OF CAR USER     
      G  2 CAR-DETAILS                                   /* DESCRIPTION OF THE CAR 
         3 MAKE                             A         20                           
         3 MODEL                            A         20                           
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
                                                                                   
    ----------------------------------------------------------------- S 5    L 1
  7. コマンド行で次のように入力して、新しいローカルデータエリアを保存します。

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

Top of page

サブプログラムの作成

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

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

  1. データエリアエディタのコマンド行で、次のコマンドを入力します。

    E N

    "N" はサブプログラムを表します。

    空のプログラムエディタが起動されます。 オブジェクトタイプはサブプログラムに設定されています。

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

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

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

    STOW SPGM01

Top of page

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

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

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

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

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

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

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

    E PGM01
  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 キーを押します。

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

    MORE                                                                        
                                                                                
                    *** 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. プログラムエディタに戻るには、MORE プロンプトで「EDIT」と入力します。

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

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

Top of page