データベース

44. 動的レコード選択: OPNQRYF の正しい使い方

印刷リストの出力やバッチ更新なときに
対象とする処理レコードの範囲を動的に指定することが
できる機能が

OPNQRYF コマンド

である。(=Open Query File)
_

OPNQRYファイルの使用に慣れると
動的なレコード選択が自由にできるようになる。
IBM の「データ・ベース・プログラミング」には
典型的な OPNQRYF コマンドの使用例として

OVRDBF FILE(FILEA) SHARE(*YES)
OPNQRYF FILE(FILEA) QRYSLT(’CODE *EQ "D" ’)
CALL PGM(PGMB)
CLOF OPNID(FILEA)
DLTOVR FILE(FILEA)

が紹介されているがこれだけでは実務には使えない。
IBMマニュアルのとおりに使ってみて動作しないと
困惑する人が多いのではないかとして
実際の正しい使用方法を紹介することにした。

OPNQRYFコマンドの QRYSLTキー・ワードには
固定情報しか示されていないからである。
IBMのサンプルではOPNDIDの指定もされていないが
実際のOPQNQRYFの実行にはOPNIDの指定は必須である。
OVRDBFの指定もOPNSCOPE(*JOB)の指定が必要である。

そこで実際にOPNQRYFを使用するには

 DCL        VAR(&QUOT) TYPE(*CHAR) LEN(1) VALUE(X'7D')
 DCL        VAR(&QRYSLT) TYPE(*CHAR) LEN(128)
  :
 OVRDBF     FILE(SHOHIN) SHARE(*YES) OPNSCOPE(*JOB)
 CHGVAR     VAR(&QRYSLT) VALUE('SHCODE *GE ' +          
              *CAT &QUOT *CAT &SHCODEFROM *CAT &QUOT +  
              *CAT ' *AND SHCODE *LE ' *CAT &QUOT *CAT +
              &SHCODEEND *CAT  &QUOT)                   
 OPNQRYF    FILE((SHOHIN)) QRYSLT(&QRYSLT) KEYFLD(*FILE) OPNID(QRYF)
 CALL                OBJLIB/PRTPGM
 CLOF       OPNID(QRYF)              
 DLTOVR     FILE(SHOHIN) LVL(*JOB) 

[解説]

のように変数 &QRYSLT として組み込まなければならない。
また IBMマニュアルには書かれていないが処理するRPG/COBOLプログラムが
キーつきのファイルとして読み込んで処理しているのであれば
必ず

KEYFLD(*FILE)

も指定しておかないと実行時にエラーとなってしまう。
さらにIBMのサンプル・ソースでは OPNIDが指定されていないが

OPNIDの指定も必須である

OPENIDは何であっても良いが上のサンプルでは
覚えやすいのと他と混同のないように QRYF というOPNIDを
指定するようにした。

また、これは

                        商品マスター一覧表  (PSHOHIN2)     
                                                           
選択項目を入力して,実行キーを押してください。             
                                                           
商品コード  . . . . . . . . . .                  から      
  . . . . . . . . . . . . . . .   9999999999     まで      
出力  . . . . . . . . . . . . .   *PRINT        *PRINT, *  

このようなコマンド入力によって商品コードの範囲を
指定して出力する業務に適している。

このように OPNQRYF コマンドを利用すれば
動的なレコード選択の業務を作るのはやさしくなる。
次に実行するプログラムはすべてのレコードを読んで処理するように
しておいてOPNQRYFで実際に読むファイルを選択するように
すれば品質の良いシンプルなバッチ処理の構造とすることができる。
OPNQRYFは動的なレコード選択にはかかせない技法である。
 
 _