RPG

89. RPG から C/400の関数を使用するには?

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 を指定してコンパイルしてもかまわない。

【例】C/400の rand 関数を ILE-RPG から呼び出して使用する。
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 にバインドされているかが
明記されているので参照されたい。