!--a11y-->

プロシージャのデータ宣言では、そのプロシージャ内でのみ表示可能なローカルなデータ型およびオブジェクトが登録されます。データ型およびデータオブジェクトには、動的および静的という 2 つの種類があります。動的データオブジェクトはサブルーチンの実行中のみ存在しますが、静的なオブジェクトはサブルーチンの実行後も存在し、次回サブルーチンが呼び出されるまで値を保持します。フィールドシンボルは、ローカルにしか宣言できません。サブルーチンには特別な種類のデータオブジェクト、ローカルデータスタックのグローバルデータのコピー、を使用することができます。フィールドシンボルを使ってこれらを定義およびアドレスします。
TYPES 命令および DATA 命令を使用してサブルーチン内で宣言されたローカルデータ型およびローカルデータオブジェクトは、サブルーチンが終了すると削除され、サブルーチンが呼び出されるたびに再登録されます。
すべてのサブルーチンは、独自のローカルな名前空間を持ちます。グローバルなデータ型またはデータオブジェクトと同じ名前でローカルデータ型またはローカルデータオブジェクトを宣言すると、そのサブルーチン内からはグローバルなデータ型やデータオブジェクトにアクセスできません。ローカルデータ型またはローカルデータオブジェクトは、同じ名前のグローバルなデータ型またはデータオブジェクトを隠します。すなわち、サブルーチン内でデータ型またはデータオブジェクトの名前を使用すると、ローカルに宣言したオブジェクトが存在する場合は常にこれにアドレスして、存在しない場合はグローバルに宣言したオブジェクトにアドレスします。これを回避するには、ローカルデータ型およびローカルデータオブジェクトに別の名前を割り当てる必要があります。たとえば、すべてのローカルデータに"L" で始まる名前を付けます。

REPORT demo_mod_tech_data_types .
TYPES
word(10) TYPE c.
DATA text TYPE word.
text = '1234567890'.WRITE / text.
PERFORM datatest.
WRITE / text.
FORM
datatest.
TYPES word(5) TYPE c.
DATA text TYPE word.
text = 'ABCDEFGHJK'.WRITE /
text.
ENDFORM.
プログラム実行すると、以下が表示されます。
1234567890
ABCDE
1234567890
この例では、データ型 WORD と、データ型 WORD のデータオブジェクト TEXT がメインプログラムで宣言されています。TEXT に値を割り当てて一覧に書き込むと、内部サブルーチン DATATEST が呼び出されます。サブルーチン内部では、データ型 WORD と、データ型 WORD のデータオブジェクト TEXT がローカルで宣言されています。グローバルなデータ型とデータオブジェクトは隠されます。グローバルな定義が再度有効になるのは、サブルーチンの終了後です。
サブルーチンの終了後もローカルデータオブジェクトの値を保持する場合は、DATA 命令ではなく STATICS 命令を使って宣言する必要があります。STATICS 命令で宣言するデータオブジェクトはグローバルに定義されますが、そのオブジェクトは定義されたサブルーチンだけでローカルに認識されます。

REPORT demo_mod_tech_statics.
PERFORM
datatest1.
PERFORM
datatest1.
SKIP.
PERFORM
datatest2.
PERFORM
datatest2.
FORM
datatest1.
TYPES f_word(5) TYPE c.
DATA f_text TYPE f_word VALUE
'INIT'.
WRITE f_text.
f_text = '12345'.
WRITE f_text.
ENDFORM.
FORM
datatest2.
TYPES f_word(5) TYPE c.
STATICS f_text TYPE f_word VALUE
'INIT'.
WRITE f_text.
f_text = 'ABCDE'.
WRITE f_text.
ENDFORM.
プログラム実行すると、以下が表示されます。
INIT 12345 INIT 12345
INIT ABCDE ABCDE ABCDE
この例では、2 つの類似するサブルーチン DATATEST1 および DATATEST2 が定義されています。DATATEST2 では、データオブジェクト F_TEXT を宣言するのに DATA 命令ではなく STATICS 命令が使用されています。DATATEST1 を呼び出すたびに F_TEXT は再度初期化されますが、DATATEST2 の値は維持されます。STATICS 命令の VALUE オプションは、DATATEST2 の最初の呼出時にのみ機能します。
FIELD-SYMBOLS 命令を使用してサブルーチン内で宣言されたフィールドシンボルはローカルです。ローカルフィールドシンボルには以下の規則が適用されます。
キ サブルーチン外部ではローカルフィールドシンボルにアドレスできません。
キ サブルーチンを呼び出す際、たとえ最後のサブルーチン呼出時にローカルフィールドシンボルに項目を割り当てた場合であっても、ローカルフィールドシンボルはすべて未割当となります。
キ ローカルフィールドシンボルには、グローバルフィールドシンボルと同じ名前を付けることができます。その場合ローカルフィールドシンボルはグローバルフィールドシンボルを隠します。
キ 構造化フィールドシンボルをローカルで宣言することもできます。構造化フィールドシンボルにはローカル構造を設定することができ、ユーザはローカル項目を割り当てることができます。
サブルーチンでは、ローカルスタックにグローバルデータのローカルコピーを登録することができます。そのためには、ローカルフィールドシンボルおよび ASSIGN バリアントの以下のバリアントを使用します。
ASSIGN LOCAL COPY OF <f> TO <FS>.
スタックに、指定されたグローバル項目 <f> のコピーが配置されます。サブルーチンでは、フィールドシンボル <FS> にアドレスすることにより、グローバルデータを変更せずにこのコピーにアクセスして変更することができます。
ASSIGN COMPONENT を除く ASSIGN 命令のすべてのバリアントで、LOCAL COPY OF オプションを使用することができます。
サブルーチンで使用されるその他の ASSIGN 命令のバリアントには、次のようなものがあります。
ASSIGN LOCAL COPY OF INITIAL <f> TO <FS>.
この命令は、項目内容をコピーせずに、グローバル項目 <f> の初期化コピーをスタックに登録します。
ASSIGN LOCAL COPY OF INITIAL LINE OF <itab> TO <FS>.
この命令は、グローバル内部テーブル <itab> の行の初期コピーをスタックに登録します。
ASSIGN LOCAL COPY OF INITIAL LINE OF (<f>) TO <FS>.
この命令は、グローバル内部テーブル <itab> の行の初期コピーをスタックに登録します。内部テーブルは、項目 <f> の内容として動的に指定されます。

REPORT demo_mod_tech_assign_local_cop.
DATA text(5) TYPE c VALUE 'Text1'.
PERFORM routine.
WRITE text.
FORM
routine.
FIELD-SYMBOLS <fs>
TYPE ANY.
ASSIGN LOCAL COPY OF text TO <fs>.
WRITE <fs>.
<fs> = 'Text2'.
WRITE <fs>.
ASSIGN text TO <fs>.
WRITE <fs>.
<fs> = 'Text3'.
ENDFORM.
出力は以下のようになります。
Text1 Text2 Text1 Text3
TEXT をプログラム FORMPOOL のサブルーチン ROUTINE の <FS> に割り当てることによって、項目 TEXT のコピーをローカルデータスタックに配置します。<FS> をアドレスすることによって、このコピーの読込および変更を行うことができます。グローバル項目 TEXT は、ローカル項目の操作の影響を受けません。LOCAL COPY OF オプションなしで項目をフィールドシンボルに割り当てると、直接グローバル項目をポイントします。この場合、フィールドシンボルを使った操作はグローバル項目に影響を与えます。