サブプログラム

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

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

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

Application structure

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


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

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

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

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

    E LDA01
  2. 必要に応じて ESC キーを押し、編集モードに切り替えます。

  3. #NAME-END の下に(行コマンド I を使用し、結果のウィンドウで[Data Field]を選択して)次のフィールドを定義します。

    レベル Name フォーマット データ長
    1 #PERS-ID A 8
    1 #MAKE A 20
    1 #MODEL A 20

    すべてのフィールドが追加されたら、ESC キーを押します。

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

                           Press <ESC> to enter command mode                        
     Mem: LDA01    Lib: TUTORIAL Type: LOCAL      Bytes:   376  Line:    5 of:   5  
    C T L  Name of Datafield                F     Length Index/Comment             M
      *    *** Top of Data Area ***                                                 
         1 #NAME-START                      A         20                            
         1 #NAME-END                        A         20                            
         1 #PERS-ID                         A          8                            
         1 #MAKE                            A         20                            
         1 #MODEL                           A         20                            
      *    *** End of Data Area ***                                                 
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
      F 1 HELP     F 2 CHOICE   F 3 QUIT     F 4 SAVE     F 5 STOW     F 6 CHECK    
      F 7 READ     F 8 CLEAR    F 9 MEM TYPE F10 GEN      F11 FLD TYPE F12
  4. ローカルデータエリアを格納します。

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

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

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

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

  1. ローカルデータエリアで、行コマンド D を使用してフィールド #NAME-START および #NAME-END を削除します。

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

    SA PDA01

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

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

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

    SET TYPE A

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

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

    Command:                                                                      
     Mem: PDA01    Lib: TUTORIAL Type: PARAMETER  Bytes:   116  Line:      of:   3
    C T    Comment                                                                
      *    *** Top of Data Area ***                                               
         1 #PERS-ID                         A          8                          
         1 #MAKE                            A         20                          
         1 #MODEL                           A         20                          
      *    *** End of Data Area ***                                               
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
      F 1 HELP     F 2 CHOICE   F 3 QUIT     F 4 SAVE     F 5 STOW     F 6 CHECK  
      F 7 READ     F 8 CLEAR    F 9 MEM TYPE F10 GEN      F11 FLD TYPE F12
  5. パラメータデータエリアを格納します。

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

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

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

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

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

    CLEAR

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

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

    SET TYPE L

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

  3. ESC キーを押して、編集モードに切り替えます。次に、データエリアの先頭を示す行の最初の列で、次の行コマンドを入力します。

    V
  4. 結果のウィンドウで次のように入力し、ENTER キーを押します。

    +------------------- View Definition -------------------+
    ¦Name of View:          VEHICLES-VIEW                   ¦
    ¦Name of DDM:           VEHICLES                        ¦
    ¦Comment:                                               ¦
    +-------------------------------------------------------+

    表示されるウィンドウに、指定された DDM のフィールドが表示されます。

                           Press <ESC> to enter command mode                        
     Mem: empty    Lib: TUTORIAL Type: LOCAL      Bytes:     0  Line:    0 of:   0  
    C T    Comment                                                                  
    V *    *** Top of Data Area ***                                                 
      *    *** End of Data Area ***                                                 
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
                                                                                    
    +------------------------------- DDM: VEHICLES --------------------------------+
    ¦    1  AA  REG-NUM                           A         15  N D                ¦
    ¦    1  AB  CHASSIS-NUM                       B          4  F                  ¦
    ¦    1  AC  PERSONNEL-ID                      A          8    D                ¦
    ¦  G 1  CD  CAR-DETAILS                                                        ¦
    ¦    2  AD  MAKE                              A         20  N D                ¦
    ¦    2  AE  MODEL                             A         20  N                  ¦
    +------------------------------------------------------------------------------+
                                                                                    
                                                                                    
                                                                                    
      F 1 HELP     F 2 CHOICE   F 3 QUIT     F 4 SAVE     F 5 STOW     F 6 CHECK    
      F 7 READ     F 8 CLEAR    F 9 MEM TYPE F10 GEN      F11 FLD TYPE F12
  5. 、1 番目の列に「"X"」を入力して、以下のフィールドをマークします。

    PERSONNEL-ID
    CAR-DETAILS
    MAKE
    MODEL

  6. 必須フィールドをすべてマークしたら、ENTER キーを押します。

    ローカルデータエリアが次のように表示されます(方向キーを使用して、データエリアの上部にスクロールします)。

                           Press <ESC> to enter command mode                      
     Mem:          Lib: TUTORIAL Type: LOCAL      Bytes:   485  Line:    0 of:   5
    C T    Comment                                                                
      *    *** Top of Data Area ***                                               
      V  1 VEHICLES-VIEW                                 VEHICLES                 
         2 PERSONNEL-ID                     A          8                          
      G  2 CAR-DETAILS                                                            
         3 MAKE                             A         20                          
         3 MODEL                            A         20                          
      *    *** End of Data Area ***                                               
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
                                                                                  
      F 1 HELP     F 2 CHOICE   F 3 QUIT     F 4 SAVE     F 5 STOW     F 6 CHECK  
      F 7 READ     F 8 CLEAR    F 9 MEM TYPE F10 GEN      F11 FLD TYPE F12
  7. コマンド行で次のように入力して、新しいローカルデータエリアを保存します。

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

サブプログラムの作成

パラメータデータエリアおよびローカルデータエリアを使用して 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

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

サブプログラムは、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. プログラムを格納します。

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