RPGサイクルがなかなか新しい技術者に受け入れられないのは
RPGサイクルの説明者がRPGサイクルの本質を十分、理解していないからである。
インターネットを調べてみると長々とした文章や図ばかりで
明らかにIBMマニュアルの書き写しばかりである。
RPGソース・コードの例は全く見られない。
これでは読者に理解されないのも無理はない。
RPGサイクルを「暗黙の処理」とか「RPGの基本」とか抽象的な言葉だけで
読者に理解を求めるのは無理である。
若い技術者が解説を読んで理解できなくても慌てる必要はない。
書き手が理解していないまま書いているのだから
読み手が理解できるはずはない。
そこでRPGサイクルをもう少し具体的なソースを基に学習してみよう。
最初にRPGサイクルを使わない方法で集計する演算プログラムを紹介する。
[実行]
20/08/21 作成 商品マスター一覧表 PAGE 品種コード 0001 品種名 カラーTV ------------------------------------------------------------------------------------------------------------------------------- 商品コード 商品名 単価 ------------------------------------------------------------------------------------------------------------------------------- A004 TEST A004 134,000 RX-AZ1 液晶テレビ 80 インチ 300,000 TH-19VS30 コンパクトTVBS19 120,000 TH-21VS30 コンパクトTVBS21 128,000 TH-25GF10 衛星放送内蔵TV25 168,000 TH-25GV10 ビデオ内蔵型TV25 255,000 TH-25VS30 コンパクトTVBS25 11,300 TH-29GF10 カラーTV画王BS29 220,000 TH-29GV10 ビデオ内蔵型TV29 280,000 TH-33VS35 カラーTV画王BS33 350,000 * 小計 * 1,966,300 : :
[ PRT004:集計プログラム ]
ソースはこちらから
0001.00 H DFTNAME(PRT004) DATEDIT(*YMD/) 0002.00 F********** 商品マスター一覧表 ( 集計 )************************** 0003.00 FSHOHINL1 IF 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 D SHOKEI S 9P 0 0013.00 D GOKEI S 9P 0 0014.00 0015.00 C*----------------------------------------------------+ 0016.00 C SETKEY KLIST 0017.00 C KFLD SHSCOD 0018.00 C KFLD SHCODE 0019.00 C*----------------------------------------------------+ 0020.00 C MOVEA *ALL'-' LIN 0021.00 C MOVE *LOVAL SHCODE 0022.00 C *LOVAL SETLL SHOHINL1 0023.00 C DO *HIVAL 0024.00 C SETOFF 50 0025.00 C READ SHOHINL1 50 0026.00 C 50 LEAVE 0027.00 C SHSCOD IFNE BEFCOD 0028.00 C BEFCOD IFNE *BLANKS 0029.00 C*-------------------------------------------------------------------------+ 0030.00 C SETON 43 | 0031.00 C EXSR OUTPUT | 0032.00 C*-------------------------------------------------------------------------+ 0033.00 C ADD SHOKEI GOKEI 0034.00 C Z-ADD 0 SHOKEI 0035.00 C ENDIF 0036.00 C MOVE SHSCOD BEFCOD 0037.00 C *LIKE DEFINE SHSCOD BEFCOD 0038.00 C SETOFF 40 0039.00 C SHSCOD CHAIN HINSHU 99 0040.00 C ENDIF 0041.00 C*( 明細印刷 ) 0042.00 C*-------------------------------------------------------------------------+ 0043.00 C SETON 42 | 0044.00 C EXSR OUTPUT | 0045.00 C*-------------------------------------------------------------------------+ 0046.00 C ADD 1 KENSU 7 0 件数 0047.00 C ADD SHTANK SHOKEI 0048.00 * 0049.00 C ENDDO 0050.00 C*-------------------------------------------------------------------------+ 0051.00 C SETON LR4943 | 0052.00 C EXSR OUTPUT | 0053.00 C*-------------------------------------------------------------------------+ 0054.00 C RETURN 0055.00 C****************************************************** 0056.00 C OUTPUT BEGSR 0057.00 C****************************************************** 0058.00 C N40 SETON 4041 0059.00 C EXCEPT 0060.00 C OF SETOFF 40OF 0061.00 C SETOFF 414243 0062.00 C SETOFF 444546 0063.00 C SETOFF 474849 0064.00 C ENDSR 0065.00 OQPRINT E 41 2 06 0066.00 O UDATE Y 8 0067.00 O 14 ' 作成 ' 0068.00 O HDR(1) 82 0069.00 O 128 'PAGE.' 0070.00 O PAGE Z 131 0071.00 O E 41 1 0072.00 O 12 ' 品種コード ' 0073.00 O SHSCOD 16 0074.00 O 24 ' 品種名 ' 0075.00 O HNSNAM 38 0076.00 O E 41 1 0077.00 O LIN 132 0078.00 O E 41 1 0079.00 O 12 ' 商品コード ' 0080.00 O 34 ' 商品名 ' 0081.00 O 68 ' 単価 ' 0082.00 O E 41 1 0083.00 O LIN 132 0084.00 O E 42 2 0085.00 O SHCODE 11 0086.00 O SHNAME 46 0087.00 O SHTANK J 70 0088.00 O E 43 2 0089.00 O 50 '* 小計 *' 0090.00 O SHOKEI J 70 0091.00 O E 49 1 0092.00 O 51 '** 合計 **' 0093.00 O GOKEI J 70 0094.00 O E 49 1 0095.00 O 40 ' 処理件数 ' 0096.00 O 57 '. . . . . . . . .' 0097.00 O KENSU 2 65 0098.00 ** HDR 0099.00 商品マスター一覧表
[解説]
小計: SHOKEI と合計: GOKEI に単価を集計していて品種コードが変わると小計を出力して
最後には合計も出力している。
これをRPGサイクルを使って記述すると次のようになる。
[PRT005:集計プログラム ]
ソースはこちらから
0001.00 H DFTNAME(PRT005) 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 D SHOKEI S 9P 0 0013.00 D GOKEI S 9P 0 0014.00 0015.00 ISHOHINR 01 0016.00 I SHSCOD L1 0017.00 0018.00 C ADD 1 KENSU 7 0 件数 0019.00 C ADD SHTANK SHOKEI 0020.00 CL1 ADD SHOKEI GOKEI 0021.00 C****************************************************** 0022.00 C *INZSR BEGSR 0023.00 C****************************************************** 0024.00 C MOVEA *ALL'-' LIN 0025.00 C ENDSR 0026.00 OQPRINT H L1 2 06 0027.00 O OR OF 0028.00 O UDATE Y 8 0029.00 O 14 ' 作成 ' 0030.00 O HDR(1) 82 0031.00 O 128 'PAGE.' 0032.00 O PAGE Z 131 0033.00 O H L1 1 0034.00 O OR OF 0035.00 O 12 ' 品種コード ' 0036.00 O SHSCOD 16 0037.00 O 24 ' 品種名 ' 0038.00 O HNSNAM 38 0039.00 O H L1 1 0040.00 O OR OF 0041.00 O LIN 132 0042.00 O H L1 1 0043.00 O OR OF 0044.00 O 12 ' 商品コード ' 0045.00 O 34 ' 商品名 ' 0046.00 O 68 ' 単価 ' 0047.00 O H L1 1 0048.00 O OR OF 0049.00 O LIN 132 0050.00 O D 01 2 0051.00 O SHCODE 11 0052.00 O SHNAME 46 0053.00 O SHTANK J 70 0054.00 O T L1 2 0055.00 O 50 '* 小計 *' 0056.00 O SHOKEI JB 70 0057.00 O T LR 1 0058.00 O 51 '** 合計 **' 0059.00 O GOKEI J 70 0060.00 O T LR 1 0061.00 O 40 ' 処理件数 ' 0062.00 O 57 '. . . . . . . . .' 0063.00 O KENSU 2 65 0064.00 ** HDR 0065.00 商品マスター一覧表
[解説]
RPGサイクルを使って集計すると驚くほど簡単なソースで出来上がってしまう。
0019.00 C ADD SHTANK SHOKEI 0020.00 CL1 ADD SHOKEI GOKEI
のたった2行だけで集計処理は完結する。
CL1 というのは合計演算と呼ばれており L1 の標識がオンになると
次の明細行:
0018.00 C ADD 1 KENSU 7 0 件数 0019.00 C ADD SHTANK SHOKEI
を実行する前に合計演算
0020.00 CL1 ADD SHOKEI GOKEI
が実行されるという仕組みである。
このような処理がユーザーが書いたプログラムの背景で行われている。
つまり(どの処理を行うかという)前後関係をユーザーが記述しなくても
合計演算は明細演算より先に行われる。
しかもデータが読み込まれる前である。
データが読み込まれる前なのでフィールド値は変わっていない。
レコードをREADなどで読取っていないのに品種コードの値が変化したことを
検知することはユーザー(私達)がいくら工夫してもできない。
これは OS内部の処理であるからこそ可能になることなのだ。
RPGのマニュアルには文章としてこのような内部で行われる処理を
長々と説明されているのだが文章だけ読んでも恐らく読者は容易には
理解できない。
このようにしてRPGサイクルを使わない例とRPGサイクルを使った例を
比較して初めて理解できるというものである。
今回の例でRPGサイクルをどこよりも理解できたと思う。
これはRPGサイクルの利用のまだ入り口にしか過ぎないのだが
多くの紹介サイトではRPGサイクルは RPGの基礎であると称しながら
適切なサンブル・ソースを全く示していない。
ほとんどがIBMマニュアルからの書き写しに過ぎない。
書き手も理解していないので読み手はもっと理解できない。
今後は古くて新しいRPGサイクルを使ったテクニックもこのサイトで
紹介していきたい。
今回、初めてRPGサイクルをご覧になった方はぜひ自分のファイルで
上記のサンプル・プログラムを改造して動作させて欲しい。
RPGサイクルは理論で学習するよりも試して体感して
身につくし実感できるものである。
最後に読者へのクイズとして
小計: SHOKEI の値を消去している演算命令がここには見つからない。
これは小職の書き忘れではない。
小計: SHOKEI は正しく消去されている。
それで一体、どこで消去されているのだろうか?
RPGソースをよく眺めて考えて欲しい。