埋め込み SQL はそのまま SQL を指定できるので、F 仕様書での処理ファイルの指定よりもいろんなメリットがあります。
当然 SQL の豊富な機能がそのまま使えるわけですし、それによって RPG プログラムのロジックを簡素化できたりすることもあります。
RPG はプレゼンテーション(印刷も 5250表示も他ファイルへの書き出しも "プレゼンテーション" ですね)ロジックもしくはコントロール(条件やループを使った処理の制御)の役割に専念できる("MVC" ですね)ようにもできますね。
また、SQL はその文を単体で実行することができるので、STRSQL や「SQL スクリプトの実行」などですぐにデータ処理の検証ができます。
少なくとも処理データの取得のロジックには間違いがないかどうか、の確認が早い段階からできるようになりますね。
さらに、SQL のスキルをつけると Java (JDBC) でも VBS (ADO) でもはたまた C や C++ でもとデータアクセス部分はなんでも SQL なわけですから、いろんなスキルの土台にもなります。
今回は前回に引き続いて、より SQL の機能を利用しての埋め込み SQL への書き換え例を 紹介したいと思います。
今回は RPG/400 もあわせて比較してみようと思います。今回も EOL の例題を例に取って見てみましょう。
もともとの EOL に載っているのは RPGⅢ なんですが、RPG/400 に書き換えたものが ↓ になります。
H Y
FJUMIDP IF E K DISK
F JUMIDP KRENAMEJUMIDR
FQPRINT O F 132 OF PRINTER
*
E KIN 4 11 0
*見出し印刷
C EXCPTMIDASI
*受注見出しファイルの読み込み
C DO *HIVAL
C READ JUMIDP 99
C N99 EXSR MIDSUB
C N99 END
*合計処理
C XFOOTKIN KIN,4
C EXCPTSAISHU
*終了処理
C SETON LR
C RETRN
*サブルーチン定義
C MIDSUB BEGSR
C MOVE JHDATE HI 20
*第一旬の集計
C HI IFGE 1
C HI ANDLE10
C Z-ADD1 I 10
C END
*第二旬の集計
C HI IFGE 11
C HI ANDLE20
C Z-ADD2 I 10
C END
*第三旬の集計
C HI IFGE 21
C HI ANDLE31
C Z-ADD3 I 10
C END
C ADD JHKING KIN,I
C ENDSR
*
OQPRINT E 02 MIDASI
O 6 'RPG040'
O 43 ' **** 受注集計表 **** '
O 77 '作成日'
O UDATE Y 86
O 95 'ページ'
O PAGE Z 100
O E 0406 MIDASI
O 28 '** 1 - 10 **'
O 47 '** 11 - 20 **'
O 66 '** 21 - 31 **'
O 85 '** 1 - 31 **'
O E 0 SAISHU
O KIN,1 J 29
O KIN,2 J 48
O KIN,3 J 67
O KIN,4 J 86
↓ が ILE RPG で書き直したものになります。
字下げがあると、処理のまとまりをわかりやすく記述することができますね。フリー・フォーマットのいいところです。
H DATEDIT(*YMD)
*
FJUMIDP IF E K DISK
F RENAME(JUMIDP:JUMIDR)
FQPRINT O F 132 PRINTER OFLIND(*INOF)
*
D KIN S 11 0 DIM(4)
*
D WKDATE DS
D JHDATE
D Hi 5 6 0
*
D i S 1 0
*
/free
//見出し印刷
except MIDASI ;
//受注見出しファイルの読み込み
DoU (%EOF) ;
read JUMIDP ;
If (%EOF) ;
leave ;
else ;
exsr SR_MID ;
EndIf ;
EndDo ;
//合計処理
KIN(4) = %xfoot(KIN) ;
except SAISHU ;
//終了処理
*inLR = *on ;
Return ;
//サブルーチン定義
BegSR SR_MID ;
SELECT ;
//第一旬の集計
when (Hi <= 10) ;
i = 1 ;
//第二旬の集計
when (Hi <= 20) ;
i = 2 ;
//第三旬の集計
when (Hi <= 31) ;
i = 3 ;
endSL ;
KIN(i) += JHKING ;
EndSR ;
/end-free
*
OQPRINT E MIDASI 02
O 6 'RPG040'
O 43 ' **** 受注集計表 **** '
O 77 '作成日'
O UDATE Y 86
O 95 'ページ'
O PAGE Z 100
O E MIDASI 04 06
O 28 '** 1 - 10 **'
O 47 '** 11 - 20 **'
O 66 '** 21 - 31 **'
O 85 '** 1 - 31 **'
O E SAISHU 0
O KIN(1) J 29
O KIN(2) J 48
O KIN(3) J 67
O KIN(4) J 86
実はこのサブルーチンでの集計処理はひとつの SQL 文で結果を得ることができるんです。
以前 CASE の使い方についてちょっとご紹介しましたが、そこで「CASE 式はカラムが指定できるところにはみんな使えるので、GROUP BY などで使用することもある」とふれました。
その利用例が ↓ になります。カラム(の一部)を条件によって分類し、関連してカラムを集計したりすることができるわけですね。
SELECT CASE WHEN DEC(SUBSTR(jhdate,5,2)) < 11 THEN 1 WHEN DEC(SUBSTR(jhdate,5,2)) < 21 THEN 2 WHEN DEC(SUBSTR(jhdate,5,2)) <= 31 THEN 3 ELSE NULL END AS HI, SUM(jhking) FROM Jumidp GROUP BY CASE WHEN DEC(SUBSTR(jhdate,5,2)) < 11 THEN 1 WHEN DEC(SUBSTR(jhdate,5,2)) < 21 THEN 2 WHEN DEC(SUBSTR(jhdate,5,2)) <= 31 THEN 3 ELSE NULL END ;
旬毎に 3つに分けられた合計金額が、旬をあらわす番号(配列に利用できますね)とともにこの一文の実行結果として手に入ります。
この SQL をカーソルに指定すれば、そもそも RPG で必要だった集計計算をするサブルーチンが必要なくなってしまう、ということになりますね。
では、SQL を使用して書き換えた ILE RPG の全文は(この記事の文字数の問題で紙幅が尽きてしまったので。。)次回に載せますのでお楽しみに。