OS400のリリース・アップに従ってC/400からだけしか使用できないとされているAPI が
増えてきている。最近では RPG から TCP/IP通信や IFSのストリーム・ファイルを
扱いたいという要望も増えてきているのではないだろうか?
はたしてRPGだけでは、もはや限界なのであろうか?
このようなRPG開発者からも C/400のライブラリー関数を使用できるような手法を紹介する。
C/400の多くのライブラリー関数は QSYS/QC2LE というバインド・ディレクトリーに登録されている。
バインド・ディレクトリーとは *SRVPGM を作成するときは登録する登録簿のことである。
CRTPGM などによって *PGM を作成するときには「サービス・プログラムのバインド」
パラメータにバインドする *SRVPGM (=DLLと同じ) を指定してプロシージャーの名前解決を
図るのであるがバインド・ディレクトリーだけを指定しておくと、コンパイラーはバインド・ディレクトリー
の中に登録されている *SRVPGM を検索して自動的にバインドしてくれるのである。
RPG では QSYS/QC2LEというバインド・ディレクトリーを使用すると C/400のライブラリー関数の
多くは RPG の中からプロシージャーとして呼び出すことができる。
次の例では RPGで乱数を発生させるために C/400の rand関数をプロシージャーとして
呼び出している。
H仕様書では BNDDIR を指定しているが、BNDDIR を使用できない低いリリースの場合はCRTPGMコマンドで
バインド・ディレクトリーQSYS/QC2LE を指定してコンパイルしてもかまわない。
0001.00 H DATEDIT(*YMD/) COPYRIGHT('(C) OFFICEQUATTRO CO,.LTD JAPAN 2005-')
0002.00 H BNDDIR('QC2LE')
0003.00 F********** 乱数の発生 *********************************************
0004.00 F********************************************************************
0005.00 D RAND PR 5I 0 EXTPROC('rand')
0006.00 D RANSU S 5I 0 INZ(0)
0007.00 D INTAT8 S 8F INZ
0008.00 C EVAL RANSU = RAND
0009.00 C Z-ADD RANSU DG08 8 0
0010.00 C MOVE DG08 FLD8 8
0011.00 C 'RANDOM=' CAT(P) FLD8:0 DSP40 40
0012.00 C DSP40 DSPLY ANS 1
0013.00 C SETON LR
0014.00 C RETURN
C/400には数多くの関数が用意されている。RPG からC/400のライブラリー関数が使用できるようになると
RPGの使用範囲は、かなり大きなものとなるはずである。
ただし、すべての関数が QSYS/QC2LE にバインドされているわけではない。
特殊な関数を使用する場合には V5R3M0 のAPIやC/400の解説書には、どの DIR にバインドされているかが
明記されているので参照されたい。