グローバルデータエリア(GDA)で定義されたデータは、複数のプログラム、外部サブルーチン、およびヘルプルーチンで共有することができます。
グローバルデータエリアにあるデータ要素の値に加えた変更は、そのグローバルデータエリアを参照するすべての Natural オブジェクトに影響を与えます。 したがって、グローバルデータエリアのソースを変更した場合は、そのグローバルデータエリアを参照する、作成済みのすべての Natural オブジェクトをもう一度格納する必要があります。 オブジェクトを格納する順序は重要です。 まず、グローバルデータエリアを格納してから、プログラムを格納する必要があります。 この順序を逆にすると、グローバルデータエリアにある新しい要素を検出できなくなるため、プログラムを格納できなくなります。
プログラムおよび後で作成する外部サブルーチンで共有するグローバルデータエリアを作成します。 グローバルデータエリアのベースとして、作成済みのローカルデータエリアの一部の情報を使用します。
以下の演習を完了すると、サンプルのアプリケーションは次のモジュールで構成されます。
このドキュメントには次の演習が含まれています。
既存のデータエリアを編集し、それを異なる名前および異なるタイプで保存することにより、既存のデータエリアから新しいデータエリアを作成できます。 元のデータエリアは変更されないまま残り、新しいデータエリアを編集できます。 フィールド #NAME-START
および #NAME-END
はグローバルデータエリアには必要ないため、削除します。
注意:
また、 メニューの を選択して、グローバルデータエリアを作成することもできます。
グローバルデータエリアを作成するには
ローカルデータエリアに戻ります。
メニューの を選択します。
[名前をつけて保存]ダイアログボックスが表示されます。
グローバルデータエリアの名前として「GDA01」と指定します。
プログラムも含むライブラリ(TUTORIAL ノード)が選択されていることを確認します。
[タイプ]ドロップダウンリストボックスの[グローバル]を選択します。
ボタンを選択します。
新しい名前とタイプがエディタウィンドウのタイトルバーに表示されます。 ライブラリワークスペースで、新しいグローバルデータエリアが Global Data Areas ノードに表示されます。
Ctrl キーを押して、次のフィールドを選択します。
#NAME-START
#NAME-END
コンテキストメニューから、
を選択します。または:
Delete キーを押します。
グローバルデータエリアは次のようになります。
グローバルデータエリアを格納します。
プログラムおよび後で定義する外部サブルーチンで、グローバルデータエリアを検出できるようになりました。
グローバルデータエリアのエディタウィンドウを閉じます。
グローバルデータエリアに含まれるフィールドは、ローカルデータエリアに必要ありません。 したがって、#NAME-START
および #NAME-END
を除くすべてのフィールドをローカルデータエリアから削除します。
フィールドを削除するには
ライブラリワークスペースでローカルデータエリア LDA01
を選択し、コンテキストメニューから を選択します。
または:
ライブラリワークスペースで、ローカルデータエリア LDA01
をダブルクリックします。
#NAME-START
および #NAME-END
を除くすべてのフィールドを、結果のデータエリアエディタで選択します。
コンテキストメニューから、
を選択します。または:
Delete キーを押します。
変更したローカルデータエリアを格納します。
ローカルデータエリアが次のように表示されます。
グローバルデータエリアを格納すると、Natural プログラムから参照できます。
定義したグローバルデータエリアも使用するように、プログラムの DEFINE DATA
ステートメントを変更します。
データエリアエディタをバックグラウンドで開いたままにします。
プログラムでグローバルデータエリアを使用するには
プログラムエディタに戻ります。
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
プログラムを実行します。
前(DEFINE DATA
ステートメントでグローバルデータエリアを参照していない場合)と同じ結果になることを確認するため、開始名に「JONES」と入力して、Enter キーを押します。
Esc キーを押して、出力ウィンドウを閉じます。
プログラムを格納します。
次の演習「外部サブルーチン」に進みます。