RDiでRPGⅢを書きました。
変数のテスト
C仕様書で変数を利用してみます。
RPGⅢでは、変数の定義(型と桁数を決める)と同時に利用できます。
下記の例では300行目にCOUNTという変数を定義と同時にゼロにしてから0を足しています。
少数部分に0を定義してますので、COUNTはパック10進数になります。
コンパイルリストの相互参照表をみると、フィールド名がCOUNT(パック10進数)を300行目で定義し、400行目で利用しているのがわかります。
RPGⅢの変数は複数回、定義できる!
300行目の内容と同じものを500行目に追加するとどうなるでしょう。
同じ変数を複数回、定義してるので、通常はコンパイルエラーになりそうだけども
コンパイルエラーになりません!
相互参照表には
定義が2つあることになっています。
RPGⅢの変数は後で定義できる!
300行目の変数の定義部分を消します。
定義してないのにZ-ADDで計算しているのでエラーになりそうだけども
コンパイルエラーになりません!
相互参照表には
300行目は定義(D)ではなく、変更(M)になりました。
もともとは、定義(D)かつ変更(M)で、「300D」でしたが、定義部分がなくなり、「300M」になりました。
つまり、変数の値を変更するより後の行に定義があっても問題ありません。
属性が異なる定義をすると
同じフィールド名(変数名)で桁数が異なる定義をしました。
どちらが有効になるのでしょうか、
相互参照表には
先に定義した20桁になっています。
ただし、コンパイルエラーになります。
ソースリスト
ここまでコンパイルはACS上で行っていましたが、RDiのバッチコマンドでコンパイルしてみました。
エラーリストにエラーが表示され、クリックすると対象の行がわかります。
RPGⅢの変数は
変数の定義はソース上ならどこでもOKです。通常は最初に1回だけ定義します。既存の誰かが作ったソースをみると、たまに重複してたり、あとに書いてあるソースがあります。たぶん、コピペによって作られたものかと思います。
同じ変数名で属性が異なる定義はコンパイルエラーになります。
↑これは重要なことですが、RPGに関係なく、「同じ名前で属性が異なる変数」をシステム内で使うべきではないです。
RDBのテーブル間でリレーションがあるものは、同じ名前で同じ属性ですよね。例えば、受注見出しテーブルの「受注ID」と受注明細テーブルの「受注ID」は属性が異なったらおかしいです。
(ただし、RPGのファイルの場合、上記の「受注ID」のフィールド名は、ファイルが異なると別の名前で定義します。フィールド名はファイル名に依存してプレフィックスをつけます。)
外部で定義した変数の取り込み
F仕様書で外部定義を指定することで、外部で定義した変数をRPGのなかに取り込む(宣言)することができます。
以下の物理ファイル(T01P)をF仕様書で読み込むことにしました。
F仕様書に物理ファイルを参照する宣言(宣言のみで参照してないのでコンパイルエラーになります)
コンパイルリストのソースリストには、F仕様書で指定した物理ファイルのフィールド名が追加されます。
相互参照表をみると
A000001行とA000002行にフィールドを宣言したことがわかります。
ただし、参照してないので警告がついています。
物理ファイルをREADするように変更してコンパイルします。
(下記の700行目でREADできた瞬間に、フィールドT01010とT01020にREADした値がセットされます。)
ソースリストは
相互参照表は一部のフィールドは参照してない警告がでますが
正常にコンパイル完了しました。
RPGⅢは外部からのインプットを処理(加工)し、外部へアウトプットします。
そのとき、変数(フィールド)をRPGのなかではなく、外部の定義済みの定義を利用することができます。
外部の定義とは物理ファイルのDDSや、画面ファイルのDDS、印刷ファイルのDDSです。
以上です。