LDA(=Local Data Area)は個人サイトでも数多く説明されているが
あまりにも説明が不十分なのでここで解説する。
LDAとはプログラム間のデータ交換に利用されるメモリ域であって
大きく分けて次の二つがある。
*LDA
….. ジョブ単位でシステムが自動的に用意される1024バイトの文字のデータ・エリア(=Local Data Area)
データ・エリア
…..データ・エリアと呼ばれるユーザーが明示的に作成して利用するLDAで
オブジェクト・タイプは *DTAARA
CRTDTAARA:データ・エリアの作成
DSPDTAARA:データ・エリアの内容の表示
データ・エリアの更新… CHGDTAARAコマンドでデータ・エリアを更新
データ・エリアからの値の取得… RTVDTAARA によってデータ・エリアの任意の値を取得することができる。
…上記までは多くの方に周知であるが個人サイトで語られていないのは次の重要な部分である。
・LDA は RPG内に記述しておくだけでプログラムの起動と同時にLDAの値が読み込まれるので
特に明示的に読む必要はない。
意図的に読み込みたい場合だけに IN 命令を使って読み込む必要がある。
RPGでの*LDAの記述
0158.00 * *LDA: ローカル・データ・エリア
0159.00 D WKLDA UDS DTAARA(*LDA)
0160.00 D EDTMSG 1 132
0161.00
データ・エリアの記述
162.00 * SPLUSRSYS/OPTIONS データエリア
163.00 D OPTIONS UDS 1024 DTAARA('SPLUSRSYS/OPTIONS')
164.00 D DLTSPL_ 12 12
165.00
…いずれも UDS で記述して DTAARAキー・ワードで *LDA の場合は
DTAARA(*LDA) と宣言しデータ・エリアの場合は
DTAARA(‘SPLUSRSYS/OPTIONS’) のようにして具体的にデータ・エリアの実体を
宣言すること。
・IN命令の使用
RPGの中で下位プログラムをCALL命令などで呼び出していて
その下位プログラムの中でも同じ*LDAまたはデータエリアを更新しているのであれば
下位プログラムの終了後で RPG の IN命令を使って明示的に*LDAまたは
データエリアを読取らないと上位プログラムで定義している*LDAの値は
変わらない。
CALL MYPGM
IN WKLDA
のようにCALL命令が終了した後で IN命令で読取る必要がある。
・LDA の排他制御
LDAが他のプログラムから更新されるのを防ぐには *LOCK を使う
C *LOCK IN LDA
:
(このあいだが排他制御)
:
C UNLOCK LDA
または OUT命令によるLDAの更新まで排他制御が継続する。
・*DEFINE によるLDAとの定義
UDSではなく *DEFINEを使ってLDAと関連づけて定義することが
できる。
先に紹介した
D WKLDA UDS DTAARA(*LDA) D EDTMSG 1 132
は次の*DEFINE による定義と同じである。
C *DTAARA *DEFINE *LDA EDTMSG
・OUTによる明示的なLDAの出力
IN命令で明示的にLDAを読んだのと同じように
OUT命令で明示的にLDAを更新することができる。
C OUT LDA
※個人サイトでテクニックや知り得た情報を公開するのは
とてもよいことであるが多くの個人サイトではマニュアルを
コピーして貼り付けただけとかマニュアルに書かれている
解説をそのままコピーしただけというのが少なくない。
これはIBM iのサイトに限ったことではなく
オープン系でも個人サイトの多くにマニュアルの書き写しが
大変多い。
書いているご本人が理解していないし使った経験もないので
読み手は理解しにくいのは当然だしそのような記事として
公開しても残念ながらあまり意味はない。
文章を読めばそれはマニュアルの書き写しであることが
読み手には一目瞭然である。
やはりご自分で使って実験して自分の言葉で書かないと
読み手には響かない。