RPG

139. system 関数を使って RPG からコマンドを実行するには ?

RPG からコマンドや CLP を実行するのには、多くの人は QCMDEXC を重い浮かべるであろう。
しかし、QCMDEXC は、いちいち長さの指定の必要があるので、面倒でもある。
また、コマンドや CLP を実行したときが成功であるのか、エラーであるのかを
判別しにくい。

ここでは最新の方法として C/400 で頻繁に使用される system 関数を呼び出す方法を紹介しよう。
system 関数であれば、コマンド長の指定が必要ないし、エラーであったときの
MSGID を非常に簡単に取り出すことができるのである。
この方法は米国でも繰り返し紹介されているテクニックとして有名である。

0001.00 H DATEDIT(*YMD/) BNDDIR('QC2LE') DFTACTGRP(*NO)                         
0002.00 F******** SYSTEM 関数によるコマンドの実行 ***************************** 
0003.00 F*                                                                      
0004.00 F********************************************************************** 
0005.00 D CMD             PR            10I 0 EXTPROC('system')                 
0006.00 D  CMDSTR                         *   VALUE                             
0007.00 D                                     OPTIONS(*STRING)                  
0008.00 D RC              S             10I 0                                   
0009.00 D MSGID           S              7    IMPORT('_EXCP_MSGID')             
0010.00 D TRUE            C                   0                                 
0011.00  /FREE                                                                  
0012.00      RC = CMD('DSPLIBL *PRINT');                                        
0013.00  /END-FREE                                                              
0014.00 C     RC            IFNE      TRUE                                      
0015.00 C     MSGID         DSPLY                   ANS               1         
0016.00 C                   END                                                 
0017.00 C                   MOVE      *ON           *INLR                       
【 解説 】

system 関数によって DSPLIBL *PRINT を実行するための記述は、かくも簡単に
見やすいものとなる。
エラーが発生したら MSGID には CPFメッセージ識別コードが入る。
Cライブラリーを使用しているが

BNDDIR('QC2LE') DFTACTGRP(*NO)

を指定しているので CRTRPGMOD + CRTPGM として C関数ライブラリーをバインド指定する
必要はない。CRTBNDRPG で十分である。