C400

145. RPGの入出力を行うR関数

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