RPG

395. フリー・フォーマットでコマンドを実行する

フリー・フォーマットを利用するとコマンドの実行も
格段と見やすくわかりやすくなる。
これまではRPGからコマンドを呼び出して実行するとなると
お決まりのように QCMDEXC を次のように呼び出して
実行していたはずである。

[例1] QCMDEXCを使用する例

0001.00 H DFTNAME(TESTOVR1) DATEDIT(*YMD/)
          :
0005.00 D CMR             S             80    DIM(2) CTDATA PERRCD(1)
          :
0014.00 C******************************************************          
0015.00 C     OVRDBF        BEGSR                                        
0016.00 C******************************************************          
0017.00 C                   MOVE      CMR(1)        CMDSTR           80  
0018.00 C     CMDSTR        CAT(P)    FILLIB:0      CMDSTR               
0019.00 C     CMDSTR        CAT       '/':0         CMDSTR               
0020.00 C     CMDSTR        CAT(P)    FILE:0        CMDSTR               
0021.00 C     CMDSTR        CAT       CMR(2):0      CMDSTR               
0022.00 C*----------------------------------------------------+          
0023.00 C                   CALL      'QCMDEXC'                          
0024.00 C                   PARM                    CMDSTR               
0025.00 C                   PARM      80            CMDLEN           15 5
0026.00 C*----------------------------------------------------+          
0027.00 C                   ENDSR                                        
0028.00 ** CMR                       
0029.00 OVRDBF SHOHIN TOFILE(        
0030.00 ) SECURE(*YES) OVRSCOPE(*JOB)                                     

これをフリー・フォーマットで記述すると

[例2] フリー・フォーマットの例

0001.00 H DFTNAME(TESTOVR2) DATEDIT(*YMD/) BNDDIR('QC2LE')              
0002.00                                                                 
0003.00 D CMD             S             80A                             
0004.00 D*( CMD           のプロトタイプ宣言 )                          
0005.00 D CMD             PR            10I 0 EXTPROC('system')         
0006.00 D   PATH                          *   VALUE OPTIONS(*STRING)    
            :
                                                                 
0008.00 C******************************************************         
0009.00 C     OVRDBF        BEGSR                                       
0010.00 C******************************************************         
0011.00  /FREE                                                          
0012.00    CMD = 'OVRDBF FILE(SHOHIN) TOFILE(' + %TRIMR(FILLIB) + '/' + 
0013.00          %TRIMR(FILE) + ') SECURE(*YES) OVRSCOPE(*JOB)';        
0014.00    SYSTEM(CMD);                                                 
0015.00  /END-FREE                                                      
0016.00 C                   ENDSR                                       

[解説]

QCMDEXC を使わずにC言語のsystemコマンドを使ってコマンドを記述している。

0012.00    CMD = 'OVRDBF FILE(SHOHIN) TOFILE(' + %TRIMR(FILLIB) + '/' + 
0013.00          %TRIMR(FILE) + ') SECURE(*YES) OVRSCOPE(*JOB)';

の記述はCLPをコーディングするよりも短くて直感的でわかりやすい。

このようにRPGソースの中でコマンドを呼び出して実行したい場合は
C言語のsystemコマンドをフリー・フォーマットで記述するとこんなに簡単で
わかりやすく覚えてしまうともう以前のQCMDEXCには戻れない。

 BNDDIR('QC2LE')

を H-仕様書に宣言することによってC言語のライブラリーをRPGプログラムから
利用することができるのでRPGの幅が広がるはずである。
C言語は数多くの関数が提供されていると思われているが
実はC言語の文法はごくわずかであってライブラリー関数と呼ばれる多くの関数が
あるためにC言語の幅を広げている。
RPGでもC言語のライブラリー関数のディリクトリー: QC2LEを宣言することに
よってC言語のライブラリーを利用することができる。

C言語というと何やらポインタという難しい概念があって難しい言語と
思われがちであるがRPGにもポインタの利用は可能である。
RPGによるポインタの利用方法は別の機会に解説する。