RPGの命令はどのようにになっているのか考えたことはないだろうか?
今日はその秘密を少しだけ紹介しよう。
実は RPGの入出力演算命令はR関数というもので構成されている。
C言語に興味のない方でもこの記事は読んで頂ければRPGの仕組みが
よく理解できるはずである。
これらのR関数を使えばC言語でRPGと同じ演算を実現することができる。
例えばCOBOLではRPGのCHAIN命令と同じ機能の命令を使うことはできないが
R関数を使えばC言語でも CHAINや SETLL、READE, READP などの
命令と同じ処理を行うことができる。
_
RPGの技術者であってもIBM iの技術者であるからには
このような C言語のライブラリー関数が用意されていることを
知っておくのも悪くはないだろう。
| R関数 | 内容 | RPG命令 |
|---|---|---|
| _Racquire() | プログラム装置の獲得 | ACQ |
| _Rclose() | ファイルのクローズ | CLOSE |
| _Rcommit() | 現行レコードのコミット | COMMIT |
| _Rdelete() | レコードの削除 | DELETE |
| _Rdevatr() | 装置属性の取得 | – |
| _Rfeod() | データの終わりの強制 | FEOD |
| _Rformat() | レコード・フォーマット名の設定 | |
| _Riofbk() | 入出力フィードバック情報の取得 | INFDS |
| _Rlocate() | レコードの位置指定 | SETLL, SETGT |
| _Ropen() | レコード・ファイルをオープンする | OPEN |
| _Ropnfbk() | オープン・フィードバック情報 | OPNFBK |
| _Rreadd() | 相対レコード番号によるレコード | RRN CHAIN |
| _Rreadindv() | 送信勧誘 | INVOKE |
| _Rreadk() | キーによるレコードの読み取り | KEY READ |
| _Rreadd() | 相対レコード番号によるレコードの読み取り | RRN READ |
| _Rreadk() | キーによるレコードの読み取り | KEY READ |
| _Rreadn() | 次のレコードの読み取り | READ |
| _Rreadnc() | サブファイル内の次の変更済みレコードの読み取り | READC |
| _Rreadp() | 前のレコードの読み取り | READP |
| _Rrlslck() | レコード・ロックの解除 | UNLOCK |
| _Rrollbck() | コミットメント制御の変更のロールバック | ROLLBK |
| _Rupdate() | レコードの更新 | UPDATE |
| _Rwrite() | レコードの書き込み | WRITE |
| _Rwrited() | レコード・ディレクトリーの書き込み | WRITE SFLREC |
| _Rwriterd() | レコードの書き込みと読み取り | EXFMT |
| _Rwrread() | レコードの書き込みと読み取り (分離バッファー) | EXFMT |
[解説]
実はRPGの入出力命令はこのようなプロシージャーとして内部では構成されている。
このR関数の型は recio.h で宣言されている。(QSYSINC/H(RECIO) )
この中でも EXFMT やSFLレコードの READC まで用意されているのは少し驚きでもある。
_Rwrited()はSFLレコードのRRN出力である。
つまりRPGのDSPFやデータ・ベースに対する入出力命令はすべて RECIO の中で
R関数として定義されているプロシージャーである。
なお_Rformat()は対応するRPG命令はないが入出力のレコード名を宣言するためのものである。
R関数があるのは依然より知られていたし現在、利用もされているが
現在、㈱オフィスクアトロではPythonに提供するIBM iのインターフェースとして
R関数の解析と利用を進めている。
R関数はプロシージャーとして定義されているのでPythonからも利用することが
できる。もちろんそのままでPythonから利用してもよいのだが
後の記事で紹介するがR関数を使用するには独自の知識を必要とする。
まず C言語によってR関数を使ってDSPFやPRTFの操作の方法を追って紹介することにする。
またR関数を使えばCLPでもRPGと同じ入出力を行うこともできるはずである。
恐らくCLPでもSFL(=サブファイル)を扱うことができるよになるだろう。
これも追って実験したい。
_
