これは RPG を永年開発している人にとっても少しばかり驚くかも知れない話である。
ユーザー制御による SPECIAL ファイルという素晴らしい機能について紹介しよう。
SPECIAL ファイルは米国でもあまり紹介の例がなく、その用途は限定されたもののように
解釈されているのかも知れないが、これは逆であり潜在的なパワーを秘めた機能であると
言ってもよいであろう。
SPECIAL ファイルを理解できれば RPG プログラムの開発範囲はかなり大きく広がってくる。
例えば、ファイル仕様書には WORKSTN
や DISK
などの装置名をいつも下記のように
記述していることであろう。
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
に結果の値を、あたかもレコードの
読み取りであるかのように受け取ることができるのである。
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 ファイルは RPG解説書でも詳しくは紹介されておらず、サラッと流されているような
感じを受けるが、オープン系全盛のこの時代にあっては SPECIAL ファイルの使用範囲は
限りなく大きなものとなってくる。
そのいくつかを考えてみよう。
(1) 非同期通信や TCP/IP通信への応用
非同期通信、銀行系や TCP/IP 通信等の記述に苦手な開発者も多いと思う。
しかしこれらの特殊で複雑な通信も別の通信プログラムとしい記述してしまえば
親プログラムでは SPECIAL ファイルとして通常のファイル処理と同じようにして
扱うことができるようになる。
(2) PC や PCサーバーとの通信
ユーザー定義の装置プログラムを工夫すれば FTPによる PC や PCサーバーとの通信も
楽々行えるようになる。
(3) CGI への応用
筆者が特に注目しているのはこの部分である。
HTML テンブレートへの入出力をレコード処理と同じように扱うことができるようになれば
サービス・プログラム (*SRVPGM)
を使わなくても HTML とのインターフェースを
ファイル処理に置き換えることができるのである。
HTML もレコード単位の処理となれば命令は簡素なものとなり、さらにパフォーマンスも
劇的に改善することができる。
この点においては SPECIAL ファイルは画期的な可能性を秘めている。
何より HTML であってもレコード単位の処理ができるとは非常にわかりやすく
スマートな解決ではないだろうか?