5ヶ月のご無沙汰です、hyahagiです。(^-^;)
前回(Java編)、前々回(VBS編)と簡単なSQLプログラムをご紹介しました。今回はいよいよRPGでSQLを使ってみたいと思います。
ただし、普通に作ってもつまらないので、V6R1以降の新機能を使ってみました。V5R4以前ではコンパイルすらできないILE-RPGプログラムをご照覧ください。
.
普通に得意先マスター(TOKMSP)を読み込み、見出し、明細、合計を印刷するプログラムです。(「XXXXXXX」はライブラリー名)
まずは印刷装置ファイルを作成します。こちらは特に変わったところはありません。
1 A REF(XXXXXXX/TOKMSP) 2 A R HEADER 3 A SKIPB(2) 4 A 30'*** 得意先マスター ***' 5 A CHRSIZ(2.0 1.0) 6 A 101DATE 7 A EDTCDE(Y) 8 A 111TIME 9 A 121'PAGE' 10 A +1PAGNBR 11 A SPACEA(2) 12 * 13 A 2'№' 14 A 10'得意先名' 15 A 34'住所1' 16 A 55'住所2' 17 A 79'当年売上高' 18 A 99'前年売上高' 19 A 120'最終入金日' 20 A SPACEA(1) 21 * 22 A 2'-----' 23 A 10'--------------------' 24 A 34'--------------------' 25 A 55'--------------------' 26 A 79'-----------' 27 A 99'-----------' 28 A 120'------------' 29 A SPACEA(2) 30 * 31 A R DETAIL 32 A SPACEA(1) 33 A TKBANG R 2 34 A TKNAKJ R 10 35 A TKADR1 R 34 36 A TKADR2 R 55 37 A TKNURI R +4EDTCDE(J) 38 A TKZURI R +8EDTCDE(J) 39 A TKNYUK R 122EDTCDE(Y) 40 * 41 A R TRAILER 42 A SPACEB(2) 43 A @TKNURI 13 0 73EDTCDE(J) 44 A @TKZURI 13 0 93EDTCDE(J) 45 A 113'件数' 46 A @COUNT 9 0 119EDTCDE(J)
SQLRPGのソースコードを次に示します。 CRTSQLRPGI OBJ(SQLRPGLE)でコンパイルします。
1 HMAIN(SQLSamplePGM) // MAINキーワードはV6R1以降 2 * 3 DSQLSamplePGM PR EXTPGM('SQLRPGLE') 4 PSQLSamplePGM B 5 * 6 FCustMast IF E DISK TEMPLATE // TEMPLATEキーワードはV6R1以降 7 F EXTDESC('XXXXXXX/TOKMSP') // EXTDESCキーワードはV6R1以降 8 FPRTFILE O E PRINTER OFLIND(overflowind) 9 F EXTDESC('XXXXXXX/PRTFILE') 10 * 11 DSQLSamplePGM PI 12 * 13 Doverflowind S N 14 Ddb_record DS LIKEREC(TOKMSR) // LIKERECキーワードはV5R2以降 15 Dprint_header DS LIKEREC(HEADER:*OUTPUT) 16 Dprint_detail DS LIKEREC(DETAIL:*OUTPUT) 17 Dprint_trailer DS LIKEREC(TRAILER:*OUTPUT) 18 * 19 /FREE 20 EXEC SQL DECLARE C1 CURSOR FOR SELECT * FROM TOKMSP; 21 EXEC SQL OPEN C1; 22 23 overflowind = *ON; 24 CLEAR print_trailer; 25 26 FOR print_trailer.@COUNT = 0; 27 EXEC SQL FETCH C1 INTO :db_record; 28 IF overflowind; 29 WRITE HEADER print_header; 30 CLEAR overflowind; 31 ENDIF; 32 IF SQLCODE <> 0; 33 WRITE TRAILER print_trailer; 34 LEAVE; 35 ENDIF; 36 EVAL-CORR print_detail = db_record; // EVAL-CORR命令はV5R4以降 37 WRITE DETAIL print_detail; 38 print_trailer.@TKNURI += db_record.TKNURI; // 「+=」演算子はV5R2以降 39 print_trailer.@TKZURI += db_record.TKZURI; 40 ENDFOR; 41 42 EXEC SQL CLOSE C1; 43 44 /END-FREE 45 * 46 PSQLSamplePGM E
出力結果は↓な感じです。
スプール・ファイルの表示 ファイル . . . : PRTFILE ページ/行 1/2 制御 . . . . . . 桁 1 - 127 検索 . . . . . . *...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8....+....9....+....0....+....1....+....2....+.. *** 得意先マスター *** 10/06/06 17:53:49 PAGE 00 № 得意先名 住所1 住所2 当年売上高 前年売上高 最終入 * ----- -------------------- -------------------- -------------------- ----------- ----------- -------- 01010 阿井旅館 東京都渋谷区 桜ヶ丘29 4,086,300 6,615,600 88/04/ 01020 阿井工業 東京都渋谷区 渋谷1-3 2,713,600 4,483,700 88/06/ 01030 相川工業 東京都世田谷区 若林4-24 243,000 796,600 88/06/ 01040 阿井旅行社 東京都品川区 東五反田1-11 18,083,100 27,670,700 88/04/ 01050 阿井食品K.K 東京都荒川区 荒川5-42 2,697,600 4,279,600 88/01/ 01060 阿井自動車 東京都港区 芝公園1-2 2,819,100 4,599,900 88/05/ 01070 相川カメラ 東京都新宿区 四谷1-16 2,011,700 3,914,500 88/06/ 01080 相川広告K.K 東京都渋谷区 広尾3-9 1,461,700 2,205,800 88/02/ 01090 相川電機K.K 東京都北区 滝の川7-17 4,731,400 7,135,500 88/05/ 01100 相川楽器店 東京都港区 虎ノ門3-21 2,973,300 4,800,100 88/06/ 01110 相川設計事務所 東京都文京区 本郷1-25 2,564,000 4,380,700 88/06/ 01120 相川商事 東京都葛飾区 新小岩2-20 1,730,800 3,281,400 88/03/ 01130 愛工芸社 東京都港区 南麻布1-10 3,409,100 5,799,600 88/04/ 01140 相川塗装店 東京都練馬区 高野台2-14 779,300 1,901,200 88/01/ 01150 相川運輸K.K 東京都杉並区 西荻3-23 133,300 644,800 88/06/ 01160 相川病院 東京都目黒区 目黒4-23 480,900 1,115,300 88/03/ 続く ... F3= 終了 F12= 取消し F19= 左 F20= 右 F24= キーの続き データ行で印刷桁の調整が行われた。
同じコードをV5R4でコンパイルすると、RPGコンパイラの前にSQLプリコンパイラでおこられます。
レコード *...+... 1 ...+... 2 ...+... 3 ...+... 4...+... 5 ...+... 6 ...+... 7 ... 6 FCustMast IF E DISK TEMPLATE 27 EXEC SQL FETCH C1 INTO :db_record; (中略) SQL1001 30 6 CUSTMAST の外部ファイル定義が見つからない。 SQL0312 30 27 桁 51 変数 DB_RECORD が定義されていないか使用可能であ りません。
---
今回は敢えてV6R1の新しい機能を使ったコーディングにしていますが、もちろんV5でも同様のプログラムは作成できます。どのリリースでどんな機能が拡張されたかの詳細は、Information Centerの「ILE-RPG解説書」に書いてあります。
私見ですが、新しい機能を利用することによるメリット/デメリットを次のように考えています。
基本的には無闇に新しい機能を利用するのは避けるべきだと思っています。
しかし、2010年現在、サイクルやレポート機能を使ったプログラムを読める人間が少ないように、IBM i が今後10年、20年と存続していれば、いずれRPG IIIやRPG/400を読める人も少なくなるかもしれません。また、新しいコーディング手法を知らないと、使ってよい(使わないともったいない)機能と、そうではない機能が判断できなくなってしまいますね。
まだしばらくは第一線の(RPG)プログラマーでいたいと思う今日この頃でした。それではまた。(^-^)/
.
この記事にはトラックバック・コメントがありません。
コメントは投稿者の責任においてなされるものであり,サイト管理者は責任を負いません。