グローバルデータエリア

グローバルデータエリア(GDA)で定義されたデータは、複数のプログラム、外部サブルーチン、およびヘルプルーチンで共有することができます。

グローバルデータエリアにあるデータ要素の値に加えた変更は、そのグローバルデータエリアを参照するすべての Natural オブジェクトに影響を与えます。したがって、グローバルデータエリアのソースを変更した場合は、そのグローバルデータエリアを参照する、作成済みのすべての Natural オブジェクトをもう一度格納する必要があります。オブジェクトを格納する順序は重要です。まず、グローバルデータエリアを格納してから、プログラムを格納する必要があります。この順序を逆にすると、グローバルデータエリアにある新しい要素を検出できなくなるため、プログラムを格納できなくなります。

プログラムおよび後で作成する外部サブルーチンで共有するグローバルデータエリアを作成します。グローバルデータエリアのベースとして、作成済みのローカルデータエリアの一部の情報を使用します。

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

Application structure

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


既存のローカルデータエリアからのグローバルデータエリアの作成

既存のデータエリアを編集し、それを異なる名前および異なるタイプで保存することにより、既存のデータエリアから新しいデータエリアを作成できます。元のデータエリアは変更されないまま残り、新しいデータエリアを編集できます。フィールド #NAME-START および #NAME-END はグローバルデータエリアには必要ないため、削除します。

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

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

    E LDA01
  2. データエリアを新しい名前で保存するには、データエリアエディタのコマンド行で次のように入力します。

    SA GDA01

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

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

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

    SET TYPE G

    "G" はグローバルデータエリアを表します。

    オブジェクトタイプが "Global" に変わります。これは、画面の上に示されます。

  5. ESC キーを押して、編集モードに入ります。行コマンド D を使用して、次のフィールドを削除します。

    #NAME-START
    #NAME-END

  6. グローバルデータエリアは次のようになります。

                           Press <ESC> to enter command mode                        
     Mem: GDA01    Lib: TUTORIAL Type: GLOBAL     Bytes:   351  Line:    1 of:   8  
    C T L  Name of Datafield                F     Length Index/Comment             M
      *    *** Top of Data Area ***                                                 
         1 #MARK                            A          1                            
      V  1 EMPLOYEES-VIEW                                EMPLOYEES                  
         2 PERSONNEL-ID                     A          8                            
      G  2 FULL-NAME                                                                
         3 NAME                             A         20                            
         2 DEPT                             A          6                            
      G  2 LEAVE-DATA                                                               
         3 LEAVE-DUE                        N          2                            
      *    *** 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. グローバルデータエリアを格納します。

ローカルデータエリアへの適合

グローバルデータエリアに含まれるフィールドは、ローカルデータエリアに必要ありません。したがって、#NAME-START および #NAME-END を除くすべてのフィールドをローカルデータエリアから削除します。

Start of instruction setフィールドを削除するには

  1. データエリアエディタのコマンド行で次のように入力して、ローカルデータエリアに戻ります。

    E LDA01
  2. #NAME-START および #NAME-END を除くすべてのフィールドを、行コマンド Dを使用して削除します。

    ビューのトップレベルのエントリ(ビュー名の前にある "V" で示される)を削除すると、このビューに属するすべてのフィールドが自動的に削除されます。

  3. 変更したローカルデータエリアを格納します。

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

    Command:                                                                       
     Mem: LDA01    Lib: TUTORIAL Type: LOCAL      Bytes:    85  Line:      of:   2 
    C T    Comment                                                                 
      *    *** Top of Data Area ***                                                
         1 #NAME-START                      A         20                           
         1 #NAME-END                        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

プログラムからのグローバルデータエリアの参照

グローバルデータエリアを格納すると、Natural プログラムから参照できます。

定義したグローバルデータエリアも使用するように、プログラムの DEFINE DATA ステートメントを変更します。

Start of instruction setプログラムでグローバルデータエリアを使用するには

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

    E PGM01
  2. LOCAL USING LDA01 の上の行に、次のように挿入します。

    GLOBAL USING GDA01

    グローバルデータエリアは、常にローカルデータエリアより先に定義する必要があります。そのようにしないと、エラーが発生します。

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

    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
    *
    DEFINE SUBROUTINE MARK-SPECIAL-EMPLOYEES
      MOVE '*' TO #MARK
    END-SUBROUTINE
    *
    END
  3. プログラムを実行します。

  4. 以前(DEFINE DATA ステートメントでグローバルデータエリアを参照しなかった場合)と同じ結果であることを確認するため、開始名として「"JONES"」と入力し、ENTER キーを押します。

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

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

次の演習に進みます。外部サブルーチン