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(=サブファイル)を扱うことができるよになるだろう。
これも追って実験したい。
_