2010年7月31日(土) 19:36 JST

HOME > i am BEST > 伝統のRPG/ILE RPG/SQL RPG で一番遅いのは??

伝統のRPG/ILE RPG/SQL RPG で一番遅いのは??

  • 2010年2月 1日(月) 05:16 JST
  • 投稿者:
    hidehi

埋め込み 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 の全文は(この記事の文字数の問題で紙幅が尽きてしまったので。。)次回に載せますのでお楽しみに。

トラックバック

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

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

iForumサポーター

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