RPGサイクルを使って記述すると先の商品マスター一覧表は
次のように書き換えることができる。
[PRT002:商品マスター一覧表]
ソースはこちらから
0001.00 H DFTNAME(PRT002) DATEDIT(*YMD/) 0002.00 F********** 商品マスター一覧表 ********************************** 0003.00 FSHOHINL1 IP E K DISK 0004.00 FHINSHU IF E K DISK 0005.00 FQPRINT O F 132 PRINTER OFLIND(*INOF) 0006.00 F FORMLEN(66) 0007.00 F FORMOFL(62) 0008.00 F***************************************************************** 0009.00 0010.00 D HDR S 32 DIM(1) CTDATA PERRCD(1) 見出し 0011.00 D LIN S 1 DIM(132) 0012.00 0013.00 ISHOHINR 01 0014.00 I SHSCOD L1 0015.00 0016.00 C ADD 1 KENSU 7 0 件数 0017.00 C****************************************************** 0018.00 C *INZSR BEGSR 0019.00 C****************************************************** 0020.00 C MOVEA *ALL'-' LIN 0021.00 C ENDSR 0022.00 OQPRINT H L1 2 06 0023.00 O OR OF 0024.00 O UDATE Y 8 0025.00 O 14 ' 作成 ' 0026.00 O HDR(1) 82 0027.00 O 128 'PAGE.' 0028.00 O PAGE Z 131 0029.00 O H L1 1 0030.00 O OR OF 0031.00 O 12 ' 品種コード ' 0032.00 O SHSCOD 16 0033.00 O 24 ' 品種名 ' 0034.00 O HNSNAM 38 0035.00 O H L1 1 0036.00 O OR OF 0037.00 O LIN 132 0038.00 O H L1 1 0039.00 O OR OF 0040.00 O 12 ' 商品コード ' 0041.00 O 34 ' 商品名 ' 0042.00 O 68 ' 単価 ' 0043.00 O H L1 1 0044.00 O OR OF 0045.00 O LIN 132 0046.00 O D 01 2 0047.00 O SHCODE 11 0048.00 O SHNAME 46 0049.00 O SHTANK J 70 0050.00 O T LR 1 0051.00 O 40 ' 処理件数 ' 0052.00 O 57 '. . . . . . . . .' 0053.00 O KENSU 2 65 0054.00 ** HDR 0055.00 商品マスター一覧表
[解説]
ほとんど演算命令は無いも同然で
0016.00 C ADD 1 KENSU 7 0 件数
くらいが演算と言える。
前のプログラムに比べて圧倒的にソースは少なくて
それだけ効果的であり何よりバグの発生する可能性も少なくなっている。
それではRPGサイクルの書き方を説明すると
0003.00 FSHOHINL1 IP E K DISK
のファイル仕様書では IP (=Input Primary) としてファイル : SHOHINL1 は
READ 命令もなしで自動的に読み込まれてすべて読みこみが終わると
プログラムは自動的に終了する。つまり READ命令は必要ない。
LR標識をセットする必要はない。
IPだけでデータの読み込みも終了も自動である。
次に入力仕様書では
0013.00 ISHOHINR 01 0014.00 I SHSCOD L1
として SHSCODが変わったから特別な標識 L1 がシステムによってオンにセットされることを
意味している。
従って自分で品種コードを比較することも必要ない。
データの切れ目の判定も自動である。
次に出力仕様書であるが
0022.00 OQPRINT H L1 2 06 0023.00 O OR OF
の H はヘッダーつまり見出し行を意味しており L1(=品種コードの改変)またはOF(=ページ溢れ)が
起こったときに改ページして印刷することを意味している。
参考までに L1 の代わりに 1P という標識も指定することができる。
1Pというのは 1 Pageの意味。文字通り最初のページだけの出力を意味する。
H 1P OR OF
と指定すると最初のページとオーバーフローしたときの条件というわけである。
0046.00 O D 01
は、明細出力でレコード 01 が読み込まれる毎に印刷することを意味している。
先に
部門コード 品種コード 商品コード =========== =========== ========================== 01 0001 SH-001 01 0002 SH-003 02 0002 NV-004 : : :
の場合を指摘したが部門コードに L2, 品種コードに L1 を指定しておけば
部門コードが変わったときは自動的にL1もオンになる。
従ってすべての場合がRPGサイクルによって考慮されているので
プログラマーがすべての場合を場合わけして考慮する必要はない。
このようにRPGサイクルを利用すると印刷出力は驚くほど簡単なものとなる。
これは簡単な事例であるがもっと複雑な場合もRPGサイクルてで記述することができる。
簡単な場合はRPGサイクルで記述できるが複雑な場合はやはり自分で
記述しなければならない、というようなことはない。
複雑な事例の場合ほどRPGサイクルはその効果を発揮する。
RPGサイクルが重要なことは簡単になるだけでなく優れた品質になることである。
プログラマーが失念しているような条件下であってもRPGサイクルは多くを
カバーしている。
つまりIBMによって帳票出力のためにかなり考え出された構造である。
RPGとは RPG=Report Programming Generator (報告書作成機能) であったことを
思い出して欲しい。
RPGは開発生産性が高いと言われるのはこのような場合でもある。
JavaやCOBOLではとてもこのようなことはできない。
Javaでもあまりにもプログラムの品質が低いので STRUTS というRPGサイクルのような
メイン・ルーチンを隠蔽する手法が考え出されたがかえって STRUTSを学習するという
難易度を高めてしまった。
C++ ではWindowsがイベント発生都度にメッセージをプログラムに送信して
C++がそれを受取る仕組みであった。
それでC++ではメッセージをLOOPして監視するのがメイン・ルーチンであった。
VC++ではこのメイン・ルーチンをMicrosoft のMFCに隠蔽してしまって
ユーザー(開発者)はメッセージに対するハンドラー・プログラムだけ書きなさいと
いうふうに変えてしまった。VisualBASICもJavaも同じである。
RPGはユーザーでメイン・ルーチンも書けるしRPGサイクルに任せてしまうことも
できる。オープン系からRPGに来た人が最初に悩むのがRPGノメイン・ルーチンである。
それまでのJavaなどのオープン言語ではメイン・ルーチンがない。
つまりメイン・ルーチンを扱うことができなかった人は正常なプログラム言語の
理解ができていなかったのでRPGに来て初めてメイン・ルーチンの存在を知ることになった。
これはJavaなどによる弊害である。
RPGサイクルも理解しにくいのはメイン・ルーチンが隠されてしまっているからである。
しかしVisualBASICやVC++などはメイン・ルーチンがない、と言っても
実はMicrosoftがメッセージ処理のメイン・ルーチンを隠蔽しているだけのことであり
ちゃんとメイン・ルーチンは内部で存在している。
もうひとつのRPGサイクルの誤解は「RPGサイクルはRPGの基礎である」と多くのサイトで
語られていることである。
確かに昔はRPGサイクルはRPGで報告書を出力するときに利用されていて
最初に学習することが多かったが現在ではそれはRPGの利用の大半がバッチ処理の
報告書印刷が中心であった30年以上前の話であって現在では対話式処理どころか
Web化の時代である。
それに必ずしもRPGサイクルを使わなくてもSETLL & READE で処理することも
できる時代になっている。短いステップ数で仕上げることも大事なのだが
より一層大事なことは誰にでもわかりやすいロジックにするほうが重要なのである。
基礎であるというのはたとえ話にしても古すぎる。
RPGサイクルの利用も今や効果的なテクニックのひとつに過ぎない。
最後に EXCEPT という例外出力のRPG演算命令があるが元々は上記のように D(=明細出力)が
本来の趣旨であったのが演算命令中でも例外的に出力できるようにしたのが
EXCEPT である。