印刷リストの出力やバッチ更新なときに
対象とする処理レコードの範囲を動的に指定することが
できる機能が
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(") 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 " *CAT &SHCODEFROM *CAT " + *CAT ' *AND SHCODE *LE ' *CAT " *CAT + &SHCODEEND *CAT ") 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は動的なレコード選択にはかかせない技法である。
_
