DFU, Query, SQL

46. (2) QUERY/400 と SQL

QUERY/400 は SQLをベースとするライセンス・プログラムである。
IBM iではQUERY/400が提供されているためSQLを知らなくても
QUERY/400で簡単にデータ・ベース検索ができる。
そのため IBM iのユーザーでは SQLを知らない人が多いのは
QUERY/400が普及していてあまりにも簡単にデータ・ベース検索が
できてしまうので SQLを必要としなくなったせいであろう。

しかしQUERY/400SQLベースであることが理解できれば
次のことも理解できる。

 

1. QUERY/400が導入されていないIBM i環境でも *QRYDFNプログラムの実行は可能である。

QUERY/400SQLベースであるということは API : QSQROUTE によって
*QRYDFN (ユーザーが作成したQUERY適用業務プログラム)は動作していることになり
QSQROUTE はどのようなIBM i環境でも導入されている。
従って *QRYDFNQUERY/400が導入されていない環境でも動作することができる。
(ただし作成はできない)

2. *QRYDFN から SQL文を抽出することができる。

*QRYDFNはSQLベースであるので RTVQMQRY コマンドによって *QRYDFNの内部に含まれている
SQL文を抽出することができる。

[例]

ライブラリーR610OBJの *QRYDFN:@BUHINM から*QMQRYソースを抽出して
ライブラリーR610SRCのソース・ファイル QQMQRYSRC に入れる

                    QUERY 管理機能プログラム検索  (RTVQMQRY)             
                                                                         
 選択項目を入力して,実行キーを押してください。                          
                                                                         
 QUERY 管理機能プログラム  . . . > @BUHINM        名前                   
  ライブラリー  . . . . . . . . . . . >   R610OBJ      名前 , *LIBL, *CURLIB  
 ソース・ファイル  . . . . . . . > QQMQRYSRC      名前                   
  ライブラリー  . . . . . . . . . . . >   R610SRC      名前 , *LIBL, *CURLIB  
 ソース・メンバー  . . . . . . .   *QMQRY         名前 , *QMQRY          
 QRYDFN からの情報使用可能   . . > *YES          *NO, *YES, *ONLY        

   

抽出された *QMQRYSRCは次のとおり

0001.00 H QM4 05 Q 01 E V W E R 01 03 25/20/02 08:18                              
0002.00 V 1001 050  部品マスター一覧表                                            
0003.00 V 5001 004 *HEX                                                           
0004.00 SELECT                                                                    
0005.00   ALL       BHNCOD, BHNAME, BHKBN, BHZKBN, BHBASE, BHTANI, BHTANT, BMKATA,
0006.00             BHMKCD, BHBAIK, BHTEHA, BHZUBN                                
0007.00   FROM      QTRFIL/BUHINM T01                                             

この *QMQRYSRCから *QMQRYオブジェクト( QUERY管理機能)を生成することができる

                    QUERY 管理機能プログラム作成  (CRTQMQRY)                   
                                                                               
 選択項目を入力して,実行キーを押してください。                                
                                                                               
 QUERY 管理機能プログラム  . . .   @BUHINM        名前                         
  ライブラリー  . . . . . . . . . . .     R610OBJ      名前 , *CURLIB               
 ソース・ファイル  . . . . . . .   QQMQRYSRC      名前                         
  ライブラリー  . . . . . . . . . . .     R610SRC      名前 , *LIBL, *CURLIB        
 ソース・メンバー  . . . . . . .   *QMQRY         名前 , *QMQRY                
 テキスト ' 記述 ' . . . . . . .   *SRCMBRTXT                                  
                                                                               
 分類順序  . . . . . . . . . . .   *SRC           名前 , *SRC, *JOBRUN, *JOB...
  ライブラリー  . . . . . . . . . . .     *LIBL        名前 , *LIBL, *CURLIB        
 言語 ID . . . . . . . . . . . .   *SRC          *JOB, *JOBRUN...              

[解説]

これは QMQRYSRCソースからのコンパイルでオブジェクト : @BUHINM *QMQRY
作成している。

生成された *QMQRYオブジェクトは STRQMQRYコマンドによって実行することができる

                    QUERY 管理機能プログラム開始  (STRQMQRY)           
                                                                       
 選択項目を入力して,実行キーを押してください。                        
                                                                       
 QUERY 管理機能プログラム  . . .   @BUHINM        名前                 
  ライブラリー  . . . . . . . . . . .     R610OBJ      名前 , *LIBL, *CURLIB
 出力  . . . . . . . . . . . . .   *             *, *PRINT, *OUTFILE   

実行の結果は次のとおり

                                                            報告書の表示                                                            
 QUERY. . . . .:   R610OBJ/@BUHINM           幅 . . . .:       246                                                                 
 書式 . . . . .:   *SYSDFT                   桁 . . . .:         1                                                                 
 制御 . . . . .                                                                                                                    
  行    ....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8....+....9....+....0....+....1....+....2...
           部品番号      部品名                部品区分    在庫区分    基準在庫数    管理単位    担当者 コード  メーカー 型番            
          ------------  --------------------  ----------  ----------  ------------  ----------  ------------  -------------------- 
 000001   AD-D15FF       超小型アダプター     1           1                 1,000   KO                                             
 000002   BUH-001        金型パイプ 001       2           2                 1,800   KG          2101          SANWA TEST           
 000003   BUH-002        5mmネジ           1                            48,000   KG                                             
 000004   BUH-003        台座 500 X 250       1                            25,000   KO                                             
 000005   BUH-004        六角平ネジ 60 MM     1                             3,000   KO                                             
 000006   BUH-005        表示端末             2                               200   KG                                             
 000007   DIS-001        磁気ディスク装置     1                                 0   KG                                             
 000008   DIS-002        フロッピー 8 インチ     1                                 0   KO                                             
 000009   DIS-003        ディスケット 5 インチ   1                                 0   KO                                             
 000010   EKI-054        液晶表示装置         2                                 0   KO                                             
 000011   MAN-087        マニュアル一式       2                                 0   KO                        MAN123               
 000012   MF333         コンピュター アクセサリー        2                               100   KO                                             
 000013   TEN-033        テンプレート 001     1                            12,500   KO                        SHARP 001            
 000014   TEN-034        台座200金         1                             1,500   MM                                             
 000015   TEN-035        発光ダイオード       2                           100,000   MM                                             
 ******    * * * * *   データの終わり   * * * * *                                                                                                                                                                      

…これで QUERY/400の実体はSQLであることを実感して頂けたと思う。

[追]

これが初めての人は *QRYDFN のソースが抽出できることに驚いたかも知れない。

QMQRYSRCを解析してカスタマイズすれば動的なQueryの実行を実現することができる。
   QMQRYSRCのソースの最初の部分は*QMQRYの出力書式を表しているので
この部分を変更すれば印刷書式も変更することができる。

このことを利用してかつて QUERYプロンプトという名前のツールを作成したことがある。
このQUERYプロンプトは実行時にQUERYにパラメータを範囲指定できるというものであり
弊社の最初のツールとなった。
   QUERYプロンプトも機会があればこのサイトのToolsで公開してみたい。