商品マスターを品種コード順に分類して品種コードで改ページする一覧表を
作成してみよう。
RPGサイクルを使わずにREAD命令だけでこれを実現しようとすると
普通に誰でもが思いつくのが次のような方法である。
[PRT003: 商品マスター一覧表]
ソースはこちらから
0001.00 H DFTNAME(PRT003) 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 0013.00 C*----------------------------------------------------+ 0014.00 C SETKEY KLIST 0015.00 C KFLD SHSCOD 0016.00 C KFLD SHCODE 0017.00 C*----------------------------------------------------+ 0018.00 C MOVEA *ALL'-' LIN 0019.00 C MOVE *LOVAL SHCODE 0020.00 C *LOVAL SETLL SHOHINL1 0021.00 C DO *HIVAL 0022.00 C SETOFF 50 0023.00 C READ SHOHINL1 50 0017.00 C*----------------------------------------------------+ 0018.00 C MOVEA *ALL'-' LIN 0019.00 C MOVE *LOVAL SHCODE 0020.00 C *LOVAL SETLL SHOHINL1 0021.00 C DO *HIVAL 0022.00 C SETOFF 50 0023.00 C READ SHOHINL1 50 0024.00 C 50 LEAVE 0025.00 C SHSCOD IFNE BEFCOD 0026.00 C MOVE SHSCOD BEFCOD 0027.00 C *LIKE DEFINE SHSCOD BEFCOD 0028.00 C SETOFF 40 0029.00 C SHSCOD CHAIN HINSHU 99 0030.00 C ENDIF 0031.00 C*( 明細印刷 ) 0032.00 C*-------------------------------------------------------------------------+ 0033.00 C SETON 42 | 0034.00 C EXSR OUTPUT | 0035.00 C*-------------------------------------------------------------------------+ 0036.00 C ADD 1 KENSU 7 0 件数 0037.00 * 0038.00 C ENDDO 0039.00 C*-------------------------------------------------------------------------+ 0040.00 C SETON LR49 | 0041.00 C EXSR OUTPUT | 0042.00 C*-------------------------------------------------------------------------+ 0043.00 C RETURN 0044.00 C****************************************************** 0045.00 C OUTPUT BEGSR 0046.00 C****************************************************** 0047.00 C N40 SETON 4041 0048.00 C EXCEPT 0049.00 C OF SETOFF 40OF 0050.00 C SETOFF 414243 0051.00 C SETOFF 444546 0052.00 C SETOFF 474849 0053.00 C ENDSR 0054.00 OQPRINT E 41 2 06 0055.00 O UDATE Y 8 0056.00 O 14 ' 作成 ' 0057.00 O HDR(1) 82 0058.00 O 128 'PAGE.' 0059.00 O PAGE Z 131 0060.00 O E 41 1 0061.00 O 12 ' 品種コード ' 0062.00 O SHSCOD 16 0063.00 O 24 ' 品種名 ' 0064.00 O HNSNAM 38 0065.00 O E 41 1 0066.00 O LIN 132 0067.00 O E 41 1 0068.00 O 12 ' 商品コード ' 0069.00 O 34 ' 商品名 ' 0070.00 O 68 ' 単価 ' 0071.00 O E 41 1 0072.00 O LIN 132 0073.00 O E 42 2 0074.00 O SHCODE 11 0075.00 O SHNAME 46 0076.00 O SHTANK J 70 0077.00 O E 49 1 0078.00 O 40 ' 処理件数 ' 0079.00 O 57 '. . . . . . . . .' 0080.00 O KENSU 2 65 0081.00 ** HDR 0082.00 商品マスター一覧表
実行結果
スプール・ファイルの表示 ファイル . . . : QPRINT ページ/行 1/6 制御 . . . . . . 桁 1 - 127 検索 . . . . . . *...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8....+....9....+....0....+....1....+....2....+.. 20/08/24 作成 商品マスター一覧表 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 20/08/24 作成 商品マスター一覧表 PAGE 品種コード 0002 品種名 ビデオデッキ ------------------------------------------------------------------------------------------------------------------------------- 商品コード 商品名 単価 続く ... F3= 終了 F12= 取消し F19= 左 F20= 右 F24= キーの続き
[解説]
これは数学の解法で言えば最も初歩的で不細工な方法である。
DO-*HIVAL で READ で回して品種コードが変わったかと調べているだけである。
0025.00 C SHSCOD IFNE BEFCOD 0026.00 C MOVE SHSCOD BEFCOD 0027.00 C *LIKE DEFINE SHSCOD BEFCOD 0028.00 C SETOFF 40 0029.00 C SHSCOD CHAIN HINSHU 99 0030.00 C ENDIF
品種コードを比較するだけの単純な例であればこれでも足りるのだが
複雑な事例になればこの方法ではバグを生じる可能性がかなり高い。
部門コード 品種コード 商品コード =========== =========== ========================== 01 0001 SH-001 01 0002 SH-003 02 0002 NV-004 : : :
このような場合、つまり部門コード順、品種コード順、商品コード順に並べて
品種コードで改ページするという場合は部門コードが01から02に変わっても
品種コードは 0002 から 0002 と変わっていない例が発生している。
プログラマーはこのような場合も想定したロジックを組む必要があるが
先の事例では汎用的であるとは言えない。
さらに複雑な事例になるとロジックはますます複雑なものとなってしまう。
比較ではなくREADEなどで構造化する方法もあるがロジックとして決して
やさしくはない。