2010年9月10日(金) 09:18 JST

HOME > SE的 > V5以前では動かないSQLRPGを作ってみた

V5以前では動かないSQLRPGを作ってみた

  • 2010年6月 6日(日) 17:40 JST
  • 投稿者:
    hyahagi

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解説書」に書いてあります。

私見ですが、新しい機能を利用することによるメリット/デメリットを次のように考えています。

  • メリット
    • 一般的にプログラムの可読性が向上する。
    • コーディングのワークロードが削減できる。
    • 場合によってはパフォーマンスが向上する。
  • デメリット
    • 新しい機能を学習する必要がある。
    • 他に古いバージョンのOSが稼動している場合、下方互換性が無くなる。(C言語の様に/DEFINEディレクティブで制御するという手はありますが)

基本的には無闇に新しい機能を利用するのは避けるべきだと思っています。

しかし、2010年現在、サイクルやレポート機能を使ったプログラムを読める人間が少ないように、IBM i が今後10年、20年と存続していれば、いずれRPG IIIやRPG/400を読める人も少なくなるかもしれません。また、新しいコーディング手法を知らないと、使ってよい(使わないともったいない)機能と、そうではない機能が判断できなくなってしまいますね。

まだしばらくは第一線の(RPG)プログラマーでいたいと思う今日この頃でした。それではまた。(^-^)/

.

トラックバック

このエントリのトラックバックURL:
http://www.iforum.ne.jp/trackback.php/20100606174022147
表示形式
コメント投稿

コメントは投稿者の責任においてなされるものであり,サイト管理者は責任を負いません。

iForumサポーター

      iFourmの趣旨にご賛同いただき、ご支援いただける企業または個人を募集しています。詳しくは、info@iforum.ne.jp へお願いします。