RPG

120. SPECIAL ファイルの紹介

これは RPG を永年開発している人にとっても少しばかり驚くかも知れない話である。
ユーザー制御による SPECIAL ファイルという素晴らしい機能について紹介しよう。
SPECIAL ファイルは米国でもあまり紹介の例がなく、その用途は限定されたもののように
解釈されているのかも知れないが、これは逆であり潜在的なパワーを秘めた機能であると
言ってもよいであろう。
SPECIAL ファイルを理解できれば RPG プログラムの開発範囲はかなり大きく広がってくる。

例えば、ファイル仕様書には WORKSTNDISK などの装置名をいつも下記のように
記述していることであろう。

 FSMP001FM  CF   E             WORKSTN                      
 F                                     SFILE(SFREC01:RRN1)  
 FSHOHIN    IF   E           K DISK                         

装置名はいつも WORSTN, DISK, PRINTER くらいのものである。
ところが SPECIAL という装置記述があることぐらいは RPG解説書で
見たことのある記憶があるかも知れない。
一体、SPECIAL とは、どのようなものであろうか?
実は SPECIAL とは「ユーザー定義による仮想入出力装置」であると
言えるのである。
早速、次の例を見て欲しい。

0001.00 H DEBUG DFTNAME(TESTSPEC) DATEDIT(*YMD/)                                
0002.00 F**********  TEST PGM ********************************************      
0003.00 FSMP001FM  IF   F   20        SPECIAL PGMNAME('TEST.COM/USERIO')        
0004.00 F                                     PLIST(DSPHEAD)                    
0005.00 F*****************************************************************      
0006.00 D IOBUF           DS                                                    
0007.00 D  VAR                    1     20                                      
0008.00                                                                         
0009.00 C*--------------------------------------------------------------------- 
0010.00 C     DSPHEAD       PLIST                                               
0011.00 C                   PARM                    SHCODE           10         
0012.00 C*--------------------------------------------------------------------- 
0013.00 C                   READ      SMP001FM      INBUF                    50 
0014.00 C                   MOVE      *BLANKS       DSP40            40         
0015.00 C     'SHCODE='     CAT(P)    VAR:0         DSP40                       
0016.00 C     DSP40         DSPLY                   ANS               1         
0017.00 C                   SETON                                        LR     
0018.00 C     END           TAG                                                 
【 解説 】

ファイル仕様書では 固定長の 10バイトで ライブラリー TEST.COM の
ユーザー・プログラム USERIOによって制御されるファイルであることを定義している。
ユーザー・プログラム USERIO には DSPHEAD という名前のパラメータ・リストによって
パラメータが渡される。
SPECAIL ファイルからの読み取りは

0013.00 C                   READ      SMP001FM      IOBUF                    50 

によってデータ・ストラクチャー IOBUF に結果の値を、あたかもレコードの
読み取りであるかのように受け取ることができるのである。

【例】ユーザー定義によるSPECIAL 装置記述
0001.00 D ERROR           S              5S 0                                
0002.00 C*----------------------------------------------------+              
0003.00 C*    パラーメータの受取り                                           
0004.00 C*----------------------------------------------------+              
0005.00 C     *ENTRY        PLIST                                            
0006.00 C                   PARM                    OPT               1      
0007.00 C                   PARM                    STATUS            1      
0008.00 C                   PARM                    ERROR             5 0    
0009.00 C                   PARM                    AREA             10      
0010.00 C                   PARM                    SHCODE           10      
0011.00 C*----------------------------------------------------+              
0012.00 C                   SELECT                                           
0013.00 C                   WHEN      OPT = 'O'                              
0014.00 C                   WHEN      OPT = 'W'                              
0015.00 C                   WHEN      OPT = 'R'                              
0016.00 C                   MOVEL     'NV-CF1'      AREA   
0017.00 C                   MOVE      '0'           STATUS                
0017.00 C                   WHEN      OPT = 'C'                              
0018.00 C                   ENDSL                                            
0019.00 C                   RETURN                                           
【 解説 】

親プログラムでは PLIST によってひとつのパラメータ SHCODE しか渡していないが、
受け取る側の装置処理プログラムでは OS400 によって OPT, ... AREA のパラメータが
先頭に追加されて渡されることになる。
AREA がレコード・バッファーに相当するものであり前述のIOBUF に渡される。
STATUS には正常に処理されたことを示す「0」が渡されるが
1= EOF を渡せば親プログラムでは %EOF もそのまま使用することができるし
EOF を示す標識 50 が *ON となる。
2= ERR を渡せば親プログラムはエラー終了であることを検知することもできる。

今回の例では READ 命令しか使用していないが SPECIAL ファイルであっても
OPEN, CLOSE, FEOD, REAAD, WRITE, DELETE, UPDATE の命令を
使用することができる。

実行された RPG 命令に対して オプション OPT には次のような値が入る。

O・・・ファイルのオープン(OPEN または暗黙のオープン)
C・・・ファイルのクローズ(CLOSE または暗黙のクローズ)
R・・・READ 命令
W・・・WRITE 命令
D・・・DELETE 命令
U・・・UPDATE 命令

エラー・コードもセットして親プログラムではそれを参照することもできる。

【 SPECIAL ファイルの応用範囲 】

SPECIAL ファイルは RPG解説書でも詳しくは紹介されておらず、サラッと流されているような
感じを受けるが、オープン系全盛のこの時代にあっては SPECIAL ファイルの使用範囲は
限りなく大きなものとなってくる。

そのいくつかを考えてみよう。

(1) 非同期通信や TCP/IP通信への応用

非同期通信、銀行系や TCP/IP 通信等の記述に苦手な開発者も多いと思う。
しかしこれらの特殊で複雑な通信も別の通信プログラムとしい記述してしまえば
親プログラムでは SPECIAL ファイルとして通常のファイル処理と同じようにして
扱うことができるようになる。

(2) PC や PCサーバーとの通信

ユーザー定義の装置プログラムを工夫すれば FTPによる PC や PCサーバーとの通信も
楽々行えるようになる。

(3) CGI への応用

筆者が特に注目しているのはこの部分である。
HTML テンブレートへの入出力をレコード処理と同じように扱うことができるようになれば
サービス・プログラム (*SRVPGM) を使わなくても HTML とのインターフェースを
ファイル処理に置き換えることができるのである。
HTML もレコード単位の処理となれば命令は簡素なものとなり、さらにパフォーマンスも
劇的に改善することができる。
この点においては SPECIAL ファイルは画期的な可能性を秘めている。
何より HTML であってもレコード単位の処理ができるとは非常にわかりやすく
スマートな解決ではないだろうか?

SPECIAL ファイルとは IBM が用意しておいてくれた、
まさに「SPECIAL 」な機能である !