RPG

246. QCMDEXC より楽々カンタンな system コマンドを使おう !!

RPGプログラムの中でCLコマンドを実行するのは
API:QCMDEXC を呼出して実行するのが、これまでの定番であった。
しかし

                CALL 'QCMDEXC'
                PARM              CMD
                PARM              CMDLEN   155

のようにして実行コマンドはコンパイル時の配列に用意して ... と何だか面倒とは思わないだろうか ?
第一、コマンドを実行するために、いちいち QCMDEXC を呼び出すのは
見た目にもどうもスマートではないし、実行コマンドは配列として離れたところに記述されているので、
この QCMDEXC の部分のソースを眺めたところで
どのようなコマンドが実行されているのか、すぐにはわからない。
これが今の時代には合わない。現代のソースはもっとわかりやすくなくてはならない。

C言語であればプログラム中でコマンドを実行するのは簡単である。
system 関数の中にコマンドを代入するだけでよい。

system('DSPLIB QGPL');

で、できあがりである。
それでは ILE-RPG でも同じように、このシステム関数を利用することができないのだろうか ?
答えは YES である。
H-仕様書に BNDDIR('QC2LE') を記述しておくだけで C言語が参照している
標準ライブラリーを ILE-RPG でも参照することができる。
そこで次のような ILE-RPGソースを完成させることができる。

【 サンプルRPG: TESTLIB 】
0001.00 H DFTNAME(TESTLIB) DATEDIT(*YMD/) BNDDIR('QC2LE')                      
0002.00 F**********  ライブラリーの表示 ***************************************
0003.00 F*                                                                     
0004.00 F**********************************************************************
0005.00 D SYSTEM          PR            10I 0 EXTPROC('system')                
0006.00 D   PATH                          *   VALUE OPTIONS(*STRING)           
0007.00  /FREE                                                                 
0008.00    SYSTEM('DSPLIB QGPL');                                              
0009.00  /END-FREE                                                             
0010.00 C                   SETON                                        LR    
0011.00 C                   RETURN                                             
        ***************** データの終わり **************************************
【コンパイル】
CRTBNDRPG PGM(MYLIB/TESTLIB) SRCFILE(MYSRCLIB/QRPGLESRC) DFTACTGRP(*NO)
 ACTGRP(*NEW) AUT(*ALL)                            
【解説】
SYSTEM('DSPLIB QGPL');                          

がコマンド DSPLIB QGPL を実行している部分であるが、 見た目そのままでありわかりやすいはずである。