DFU, Query, SQL

69. QUERYで動的にレコード選択するには

QUERYは非常に便利なユーティリティである。
しかし情報システム室での利用は多いがエンド・ユーザーにまで
解放している例は少ない。
なぜなら動的なレコード選択がエントー・ユーザーには
向いていないからである。
ここでは自由に範囲選択を指定してQUERYを実行できる方法を紹介する。

_

■ QUERYのレコード選択指定

RUNQRYでレコード選択 = *YES を指定すると

                                 レコードの選択                             
                                                                             
  比較条件を入力し実行キー。新しいグループを始めるには OR を指定してください 
    テスト: EQ, NE, LE, GE, LT, GT, RANGE, LIST, LIKE, IS, ISNOT...         
                                                                             
 AND/OR   フィールド       テスト     値 (フィールド, 数値,'文字',または ...)   
         T01.SHSCOD        GE     '    '                                     
  AND    T01.SHSCOD        LE     '9999'                                     
  AND    T01.SHCODE        GE     '          '                               
  AND    T01.SHCODE        LE     '9999999999'                               
                                                                             
                                                                             

のようなレコード選択画面が表示されて確かにレコード選択を指定することは
できるのだがこれはフィールド名の判断が必要なのでエンド・ユーザーに見せるには
適していない。

そこでQUERYの動的レコード選択の方法として

・コマンドなどの入力画面を作成する

・エントー・ユーザーの入力値に対して

  OVRDBF でレコード選択を指定する
OPNQRYF を指定してレコード選択を指定する…などの方法が考えられるのだが
いずれの方法でも不可であって
QUERYでは

・OVRDBF コマンドはQUERYの実行には効かない。
 ・OPNQRYF コマンドもQUERYには効力がない。

ということで一般的な方法ではQUERYを動的にレコード選択を反映させることができない。

■ CPYFRMQRYF を使ってQUERYの動的レコード選択を実現する

CPYFRMQRYFコマンドがIBMによって提供されていてこれは OPNQRYFの内容のデータを
反映したデータを出力するコマンドである。
_

OPNQRYFの一時変更を反映したデータを指定されたファイルとして出力するコマンドが
CPYFRMQRYFである。
 一方、QUERYにはOVRDBFやOPNQRYFは一時的変更には効かないが FILEパラメータを指定すると
読み取るファイルを一時変更することができる機能がある。
RUNQRY FILEパラメータを指定すれば読取りファイルを一時変更して読取ることができる。
これらを使えば次のようにOPNQRYFの指定をQUERYに反映して動的なレコード選択を
実現することができる。
このサンプルはわかりやすくするために最低眼の機能しか示していないが
OPNQRYFに動的に値を指定するようにすればよい。

[ サンプルCLP: TESTQRY ]

ソースはこちらから

0001.00              PGM                                                         
0002.00 /*-------------------------------------------------------------------*/  
0003.00 /*   TESTQRY    :  OPNQRYF で QUERY を使う                           */  
0004.00 /*                                                                   */  
0005.00 /*   2024/04/05  作成                                                */  
0006.00 /*-------------------------------------------------------------------*/  
0007.00                                                                          
0008.00              OPNQRYF    FILE((QTRFIL/SHOHIN)) QRYSLT('SHSCOD *EQ +       
0009.00                           ''0001''') KEYFLD((SHCODE)) OPNID(FILE) +      
0010.00                           OPNSCOPE(*JOB)                                 
0011.00              CPYFRMQRYF FROMOPNID(FILE) TOFILE(QTEMP/OPNQRY) +           
0012.00                           MBROPT(*REPLACE) CRTFILE(*YES)                 
0013.00              RUNQRY     QRY(*NONE) QRYFILE((QTEMP/OPNQRY)) +             
0014.00                           OUTTYPE(*DISPLAY)                              
0015.00              CLOF       OPNID(FILE)                                      
0016.00              ENDPGM     


                                                   

[解説]

最初に OPNQRYFを使って動的にレコード選択を指定する。
その指定を受けてCPYFRMQRYFでQTEMPの作業ファイルに選択されたレコードを出力する。
最後にRUNQRYを使ってファイルをこの作業ファイルを指定してQUERY出力を行なう。
このQUERYではすべてのレコードを出力するように作られているが
実際はCPYFRMQRYFで抽出されたレコードのみが出力される。
つまりOPNQRYFで指定した範囲指定が反映されているのである。

_

※QUERYは便利なユーティリティであるが指定ファイルの範囲指定はできないものと思われているが
この方法を使えばコマンドからなどでエンド・ユーザーが範囲指定してQUERYを実行することができるようになる。
印刷プログラムはできるだけQUERYで済ますようにできれば社内の開発工数を大幅に減らすことができる。