QUERYプロンプト
QUERYプロンプトとは
QUERYプロンプトとは拡張QUERYの主要な二つの機能のうちの最初の機能で
QUERY適用業務のレコード選択機能を日本語表示に変換する機能です。
サンプル説明とまったく同じファィル名などを使用されたいのであれば
㈱オフィスクアトロからサンプル・ライブラリーを入手してください。
(ただしサンプル・ライブラリーの入手には開発支援プログラムのご契約が必要です。)
IBM QUERYでは 例えば
[例] RUNQRY QRY(QTROBJ/@SHOHIN) RCDSLT(*YES)
レコードの選択 比較条件を入力し実行キー。新しいグループを始めるには OR を指定してください テスト: EQ, NE, LE, GE, LT, GT, RANGE, LIST, LIKE, IS, ISNOT... AND/OR フィールド テスト 値 (フィールド, 数値,'文字',または ...) T01.SHSCOD GE ' ' AND T01.SHSCOD LE '9999'
【解説】
このように表示されますが T01.SHSCOD のようなフィールド名の表示では
社内のエンド・ユーザーは何を入力すればよいのか判断できません。
この同じQUERYをIBMのRUNQRYではなく拡張QUERYが提供する
RUNQTX コマンドデ
RUNQRX QRY(QTROBJ/@SHOHIN) RCDSLT(*YES) として実行すれば
商品マスター一覧表 (@SHOHIN) 選択項目を入力して,実行キーを押してください。 品種コード . . . . . . . . . . から . . . . . . . . . . . . . . . 9999 まで 出力 . . . . . . . . . . . . . *PRINT *PRINT, *, *OUTFILE ジョブ待ち行列へ投入しますか N Y=YES, N=NO ジョブ待ち行列 . . . . . . . QBATCH 名前 , *JOBD ライブラリー . . . . . . . QGPL 名前 , *LIBL, *CURLIB
のように拡張された日本語でわかりやすく表示されて操作することができます。
先のフィールド名表示の画面に比べれば操作がわかりやすくなっています。
これによってQUERY適用業務も業務アプリケーションの一部として活用することができるようになります。
1. QUERY適用業務の作成
IBM 提供のWRKWRY によってQUERYを作成します。
以下の手順に従って同様な方法でQUERYを作成してください。
ただし QUERYの名前は8文字以内で作成ししてください。
[注意]
最初は簡単なファイルや簡単に記述できるものから始めてください。
慣れないうちから最初から複雑なデータや複雑な操作で始めるような
人は失敗しがちです。
まず基本動作に慣れてから徐々に応用するようにしてください。
QUERY 処理 選択項目を入力して,実行キーを押してください。 オプション . . . . 1 1= 作成, 2= 変更, 3= コピー, 4= 削除 5= 表示, 6= 定義の印刷 8= バッチで実行, 9= 実行 QUERY 定義 . . . . @SHOHIN 名前,リストは F4キー ライブラリー . . QTROBJ 名前, *LIBL, リストは F4キー
【解説】
拡張QUERYはきさんのQUERY適用業務を基礎として拡張しますので
最初にいつものようにQUERY適用業務を作成します。
QUERY 定義 QUERY. . . . . . : @SHOHIN オプション . . . : 変更 ライブラリー . : QTROBJ CCSID. . . . . . : 5035 eポニュ] を入力して実行キーを押すか, F21 を押してすべてを選択してください 1= 選択 PT QUERY 定義オプション > ファイル選択指定 結果のフィールドの定義 > フィールドの選択および順序付け > レコードの選択 > 分類フィールドの選択 照合順序の選択 報告書のカラムの形式指定 計算機能の選択 制御レベルの定義 > 出力タイプおよび出力形式の選択 処理オプションの指定
【解説】
拡張QUERYを作成する元となるQUERYを作成するにあたって
いくつかの参考となるコントを解説します。
[ファイル選択指定]
ファイル選択指定 選択項目を入力して,実行キーを押してください。追加のファイル選択項目を 指定するためには, F9 キーを押してください。 ファイル . . . . . . SHOHIN 名前,リストは F4キー ライブラリー . . . QTRFIL 名前, *LIBL, リストは F4キー メンバー . . . . . . *FIRST 名前, *FIRST, リストは F4キー 様式 . . . . . . . . SHOHINR 名前, *FIRST, リストは F4キー F3= 終了 F4=プロンプト F5= 報告書 F9= ファイルの追加 F12= 取り消し F13= レイアウト F24= キーの続き
【解説】
QUERYで印刷出力する主要なファイル名を最初に指定します。
さらにF9キーを押すと追加の結合ファイルを次のように指定することができます。
[二次ファイルの結合]
ファイル選択指定 選択項目を入力して,実行キーを押してください。追加のファイル選択項目を 指定するためには, F9 キーを押してください。 ファイル . . . . . . SHOHIN 名前,リストは F4キー ライブラリー . . . QTRFIL 名前, *LIBL, リストは F4キー メンバー . . . . . . *FIRST 名前, *FIRST, リストは F4キー 様式 . . . . . . . . SHOHINR 名前, *FIRST, リストは F4キー ファイル ID . . . . . T01 A-Z99, *ID ファイル . . . . . . HINSHU 名前,リストは F4キー ライブラリー . . . QTRFIL 名前, *LIBL, リストは F4キー メンバー . . . . . . *FIRST 名前, *FIRST, リストは F4キー 様式 . . . . . . . . *FIRST 名前, *FIRST, リストは F4キー ファイル ID . . . . . *ID A-Z99, *ID
【解説】
ここでは品種名を表示すめために品種マスター(HINSHU)をF9キーを押して 指定しています。
[結合の指定]
結合タイプの指定 選択項目を入力して,実行キーを押してください。 結合のタイプ . . . . . . . 1 1= 一致レコード 2= 1次ファイルと一致したレコード 3= 1次ファイルと一致しないレコード
【解説】
結合の方法を指定します。
1=一致レコード : 一次ファイルを主として出力します。一致する2次ファイルなくても
すべて出力されます。これが初期値であり一般にはこのオプションを指定して
ください。
2=1次ファイルと一致したレコード : 一致する2次ファイルがあるものだけを出力します。
一致する2次ファイルがない1次ファイルのレコードは
出力されません。
3=1次ファイルと一致しないレコード:上記と逆のパターンであり一致しないものだけが
出力されます。
[ファイルの結合方法の指定]
ファイルの結合方法の指定 ファイルの選択項目の比較方法を入力して,実行キーを押してください。 フィールド テスト フィールド T01.SHSCOD EQ T02.HNSCOD フィールド テキスト LEN DEC T01.SHCODE 商品コード 10 T01.SHNAME 商品名 24 O T01.SHTANK 単価 7 0 T01.SHSCOD 品種コード 4 T02.HNSCOD 品種コード 4
【解説】
対応するキーを記述します。
ここでは商品マスターの品種コード(T01.SHSCOD)が品種マスター(HINSHU)ーの
品種コード(T02.HNSCOD)に一致する(EQ)ことを結合の条件として記述しています。
[フィールドの選択および順序付け]
フィールドの選択および順序付け 報告書に表示したい 500 以内のフィールド名に順序番号 (0-9999) を入力して, 実行キーを押してください。 フィールド テスト フィールド T01.SHSCOD EQ T02.HNSCOD SEQ フィールド テキスト LEN DEC 10 T01.SHCODE 商品コード 10 20 T01.SHNAME 商品名 24 O 30 T01.SHTANK 単価 7 0 40 T01.SHSCOD 品種コード 4 T02.HNSCOD 品種コード 4 50 T02.HNSNAM 漢字 14 O
【解説】
次に出力するフィールドに選択番号を入れて選択します。
品種名を品種マスター(HINSHU)から選択して50を指定しました。
[レコードの選択]
レコードの選択 比較条件を入力し実行キー。新しいグループを始めるには OR を指定してください。 テスト: EQ, NE, LE, GE, LT, GT, RANGE, LIST, LIKE, IS, ISNOT... AND/OR フィールド テスト 値 (フィールド, 数値,'文字',または ...) T01.SHSCOD GE ' ' AND T01 SHSCOD LE '9999'
【解説】
拡張QUERYを利用する上で最も重要であるのがこのレコードの選択です。
レコードの選択は必ず必須として指定してください。
ここではGE (以上)とLE(以下)を指定しています。
レコードの選択では最小値から最大値の範囲を指定してください。
この指定でフィールド名が日本語のテキストに置換えられて
次のようなコマンド・プロンブトの画面むに変換されて表示されます。
[出力タイプおよび出力形式の選択]
出力タイプおよび出力形式の選択 選択項目を入力して,実行キーを押してください。 出力のタイプ . . . . . . . . . . 2 1= 表示 2= 印刷装置 3= データベース・ファイル 出力の形式 . . . . . . . . . . . 1 1= 明細 2= 合計のみ 行折り返し . . . . . . . . . . . N Y=YES, N=NO 折り返し幅 . . . . . . . . . . ブランク, 1-378 レコードの途中で改ページ禁止 . N Y=YES, N=NO 印刷装置 . . . . . . . . *PRINT *PRINT, 名前 用紙サイズ: 長さ . . . . . . . . . ブランク, 1-255 幅 . . . . . . . . . . 132 ブランク, 1-378 開始行 . . . . . . . . . ブランク, 1-255 終了行 . . . . . . . . . ブランク, 1-255 行の間隔 . . . . . . . . 1 1, 2, 3 定義の印刷 . . . . . . . N Y=YES, N=NO 出力のスプール . . . ブランク, Y=YES, N=NO 用紙タイプ . . . . . ブランク,名前, *STD コピー部数 . . . . . 1 ブランク, 1-255 保留 . . . . . . . . ブランク, Y=YES, N=NO カバー・ページの印刷 . . N Y=YES, N=NO カバー・ページのタイトル 標準のページ 見出しの印刷 . . . . . Y Y=YES, N=NO ページ見出し ページ・フッター
【解説】
出力タイプおよび出力形式の選択を指定しておくとQUERYの無駄な出力を省くことができます。
定義の印刷 を N に指定しておくと初期のページにQUERYの定義が印刷されるのを
なくすことができます。
カバー・ページの印刷も N に指定しておくと最初に印刷される無駄なカバー・ページを
なくすことができます。
2. 拡張QUERYの実行
レコードの選択を記述したQUERY適用業務を作成すれば次にそのQUERY適用業務を
RUNQRYコマンドによって実行するのではなく
拡張QUERYが提供する RUNQRYXコマンドによって実行してください。
[RUNQRYX の実行]
拡張 QUERY 実行 (RUNQRYX) 選択項目を入力して,実行キーを押してください。 QUERY . . . . . . . . . . . . . @SHOHIN 名前 , *NONE ライブラリー . . . . . . . . QTROBJ 名前 , *LIBL, *CURLIB QUERY ファイル : ファイル . . . . . . . . . . 名前 , *SAME ライブラリー . . . . . . . *LIBL 名前 , *RUNOPT2, *LIBL... メンバー . . . . . . . . . . *FIRST 名前 , *RUNOPT, *FIRST... 値の続きは+ 報告出力のタイプ . . . . . . . *RUNOPT *RUNOPT, *DISPLAY... 出力書式 . . . . . . . . . . . *RUNOPT *RUNOPT, *DETAIL, *SUMMARY レコード選択 . . . . . . . . . *YES *NO, *YES
商品マスター一覧表 (@SHOHIN) 選択項目を入力して,実行キーを押してください。 品種コード . . . . . . . . . . から . . . . . . . . . . . . . . . 9999 まで 出力 . . . . . . . . . . . . . *PRINT *PRINT, *, *OUTFILE ジョブ待ち行列へ投入しますか N Y=YES, N=NO ジョブ待ち行列 . . . . . . . QBATCH 名前 , *JOBD ライブラリー . . . . . . . QGPL 名前 , *LIBL, *CURLIB
【解説】
フィールド: T01.SHSCOD の表記は「品種コード」に置き換えられていますし
GE は「から」にLEは「まで」とコマンド表示されています。
出力も *PRINT だけでなく * (表示), *OUTFILE(ファイル出力)のオプションも
追加されていますしジョブ待ち行列への投入(SBMJOB)も選択可能です。
しかも操作はRUNQRYの代わりに RUNQRYX で実行しただけです。
特別な移行や変換操作はありませんでした。
これが今までのソリューションとは全く違って進化したソリューションです。
拡張QUERYは指定したQUERY適用業務オブジェクトを直接解析して
必要なコマンドとCLPプログラムをその場で生成して次回以降は
生成済みのコマンドとCLPが起動されますので素早いレスポンスで
実行されます。
なお実行コマンドは元のQUERY適用業務が保管されている同じライブラリーに生成されます。
コマンド: QUERY適用業務と同じ名前で作成されます。
実行CLP : QUERY適用業務名 + 'CL' の形式の名前で生成されます。
次回以降のRUNQRYXの実行ではQUERYプロンプトのコマンドやCLPが存在しているか
検査されます。
十分、新しいコマンド、CLPが見つかればQUERYプロンプトを生成するのではなく
それらを利用して軌道しますので素早いレスポンスで実行することができます。
ただしQUERYプロンプトが生成された後でQUERY適用業務が変更されたのであれば
QUERYプロンプトは再作成されます。
どのようなコマンドとCLPが生成されたのか知りたいときはライブラリーQTEMPを
調べてみてください。
RUNQRYXによってQUERYプロンプトが自動生成されたときのコンドとCLPソースは
ライブラリーQTEMPに保存されています。
ソースの詳細については後で解説します。
3. QUERY プロンプトの作成 (CRTUPDQRY)
QUERYプロンプトの作成をRUNQRYXの自動生成に任せるのではなく
明示的にライブラリーやソース・ファイルを指定して作成したい場合は
このQUERY プロンプトの作成 (CRTUPDQRY)を使って作成すると
保管場所を指定して後からソースを修正することができるようになります。
[更新 QUERY の作成 (CRTUPDQRY)]
更新 QUERY の作成 (CRTUPDQRY) 選択項目を入力して,実行キーを押してください。 QUERY . . . . . . . . . . . . . @UPDTEST 名前 , *NONE ライブラリー . . . . . . . . QTROBJ 名前 , *LIBL, *CURLIB
【解説】
QUERY適用業務の名前とライブラリー名を入力してからF10キーを押すと
続きのパラメータが次のように表示されます。
[更新 QUERY の作成 (CRTUPDQRY)]
更新 QUERY の作成 (CRTUPDQRY) 選択項目を入力して,実行キーを押してください。 QUERY . . . . . . . . . . . . . > @UPDTEST 名前 , *NONE ライブラリー . . . . . . . . > QTROBJ 名前 , *LIBL, *CURLIB 追加のパラメーター コマンド . . . . . . . . . . . *QRY 名前 , *QRY ライブラリー . . . . . . . . *QRYLIB 名前 , *QRYLIB 原始ファイル . . . . . . . . . QCMDSRC 名前 ライブラリー . . . . . . . . QTEMP 名前 , *LIBL, *QRYLIB 原始メンバー . . . . . . . . . *QRY 名前 , *QRY コマンドを処理するプログラム *QRYCL 名前 , *QRY, *QRYCL ライブラリー . . . . . . . . *QRYLIB 名前 , *QRYLIB 原始ファイル . . . . . . . . . QCLSRC 名前 ライブラリー . . . . . . . . QTEMP 名前 , *LIBL, *QRYLIB 原始メンバー . . . . . . . . . *QRYCL 名前 , *QRY, *QRYCL 権限 . . . . . . . . . . . . . *LIBCRTAUT *LIBCRTAUT, *USE, *ALL...
【解説】
QUERYプロンプトのコマンドの名前とオブジェクト・ライブラリー名と
CLPの名前とオブジェクト・ライブラリー名は変更しないでください。
変更されると正しく動作しません。
変更が可能であるのは
コマンドのソース
原始ファイル . . . . . . . . . QCMDSRC 名前 ライブラリー . . . . . . . . QTEMP 名前 , *LIBL, *QRYLIB
CLPのソース
原始ファイル . . . . . . . . . QCLSRC 名前 ライブラリー . . . . . . . . QTEMP 名前 , *LIBL, *QRYLIB
だけです。これらの名前をライブラリーQTEMPではなくユーザー指定の
ライブラリー名に変更すると後でソースを参照したり変更することができるようになります。
次にQUERYプロンプトのサンプル・ソースとその解説を行います。
[コマンド・サンプル・ソース]
0001.00 /* [COMPILE]- 再コンパイルは次のように従ってください - */ 0002.00 /* CRTCMD CMD(QTROBJ/@SHOHIN2) + */ 0003.00 /* PGM(QTROBJ/@SHOHIN2CL) + */ 0004.00 /* SRCFILE(&SRCLIB/QCMDSRC) + */ 0005.00 /* SRCMBR(@SHOHIN2) + */ 0006.00 /* MSGF(EXQRYLIB/PNLMSG) + */ 0007.00 /* PMTOVRPGM(EXQRYLIB/SETDEVOVR) + */ 0008.00 /* AUT(*ALL) */ 0009.00 PARM KWD(SHSCOD01) TYPE(*CHAR) LEN(4) + 0010.00 DFT( ) + 0011.00 CHOICE(PNL0075) + 0012.00 PROMPT(' 品種コード ') 0013.00 PARM KWD(SHSCOD02) TYPE(*CHAR) LEN(4) + 0014.00 DFT(9999 ) + 0015.00 CHOICE(PNL0076) + 0016.00 PROMPT(' ') 0017.00 PARM KWD(OUTPUT) TYPE(*CHAR) LEN(8) RSTD(*YES) + 0018.00 DFT(*PRINT) VALUES(*PRINT * *OUTFILE) + 0019.00 PROMPT(' 出力 ') 0020.00 PARM KWD(PRTDEV) TYPE(*NAME) LEN(10) + 0021.00 SPCVAL((*SAME) (*USRPRF) (*SYSVAL) + 0022.00 (*WRKSTN)) PMTCTL(*PMTRQS) + 0023.00 PROMPT(' 印刷装置 ') 0024.00 PARM KWD(OUTQ) TYPE(OUTQ) PMTCTL(*PMTRQS) + 0025.00 PROMPT(' 出力待ち行列 ') 0026.00 OUTQ: QUAL TYPE(*NAME) LEN(10) SPCVAL((*DEV)) MIN(1) 0027.00 QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) + 0028.00 SPCVAL((*LIBL) (*CURLIB)) + 0029.00 PROMPT(' ライブラリー ') 0030.00 PARM KWD(JOBQ) TYPE(JOBQ) 0031.00 JOBQ: ELEM TYPE(*NAME) LEN(1) RSTD(*YES) DFT(N) + 0032.00 VALUES(Y N) CHOICE(PNL0074) + 0033.00 PROMPT(' ジョブ待ち行列へ投入しますか ') 0034.00 ELEM TYPE(JOBD) + 0035.00 PROMPT(' ジョブ待ち行列 ') 0036.00 JOBD: QUAL TYPE(*NAME) LEN(10) DFT(QBATCH) SPCVAL((*JOBD)) 0037.00 QUAL TYPE(*NAME) LEN(10) DFT(QGPL) SPCVAL((*LIBL) + 0038.00 (*CURLIB)) PROMPT(' ライブラリー ') 0039.00 PARM KWD(RUNPTY) TYPE(*INT2) DFT(30) + 0040.00 PMTCTL(*PMTRQS) PROMPT(' 実行優先順位 ') 0041.00 OUTF: PMTCTL CTL(OUTPUT) COND((*EQ '*OUTFILE')) 0042.00 PARM KWD(OUTFILE) TYPE(OUTFILE) MIN(0) + 0043.00 PMTCTL(OUTF) + 0044.00 PROMPT(' 出力を受け取るファイル ') 0045.00 OUTFILE: QUAL TYPE(*NAME) LEN(10) MIN(1) 0046.00 QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) + 0047.00 SPCVAL((*LIBL) (*CURLIB)) + 0048.00 PROMPT(' ライブラリー ') 0049.00 PARM KWD(OUTMBR) TYPE(OUTMBR) MAX(1) PMTCTL(OUTF) + 0050.00 PROMPT(' 出力メンバー・オプション ') 0051.00 OUTMBR: ELEM TYPE(*NAME) LEN(10) DFT(*FIRST) + 0052.00 SPCVAL((*FIRST)) PROMPT(' メンバー ') 0053.00 ELEM TYPE(*CHAR) LEN(8) RSTD(*YES) DFT(*REPLACE) + 0054.00 VALUES(*REPLACE *ADD) + 0055.00 PROMPT(' レコードの置換または追加 ')
【解説】
QUERYプロンプトで重要であるのはレコード選択の部分です。
0009.00 PARM KWD(SHSCOD01) TYPE(*CHAR) LEN(4) + 0010.00 DFT( ) + 0011.00 CHOICE(PNL0075) + 0012.00 PROMPT(' 品種コード ') 0013.00 PARM KWD(SHSCOD02) TYPE(*CHAR) LEN(4) + 0014.00 DFT(9999 ) + 0015.00 CHOICE(PNL0076) + 0016.00 PROMPT(' ')
【解説】
PROMPT(' 品種コード ')はフィールド T01.SHSCODの欄見出しとして定義されている
日本語テキストが採用されています。
DFT は QUERY適用業務で定義されていた値が省略値として表示されます。
CHOICE(PNL0075)はテキスト「から」(GE)であり
CHOICE(PNL0076)はテキスト「まで」(LE)です。
[CLPサンプル・ソース]
0001.00 PGM PARM(+ 0002.00 &SHSCOD01 + 0003.00 &SHSCOD02 + 0004.00 &OUTPUT + 0005.00 &PRTDEV + 0006.00 &OUTQLIB + 0007.00 &JOBOPT + 0008.00 &RUNPTY + 0009.00 &OUTFLIB + 0010.00 &MBROPT ) 0011.00 /*-------------------------------------------------------------------*/ 0012.00 /* @SHOHIN2CL 商品マスター一覧表 */ 0013.00 /* */ 0014.00 /* 2024/07/09 作成 */ 0015.00 /* [COMIPLE] CRTCLPGM QTROBJ/@SHOHIN2CL SRCFILE(QRYLIB/QCLSRC) */ 0016.00 /* OPTION(*SRCDBG) AUT(*ALL) */ 0017.00 /*-------------------------------------------------------------------*/ 0018.00 DCL VAR(&QRY) TYPE(*CHAR) LEN(10) VALUE('@SHOHIN2') 0019.00 DCL VAR(&QRYLIB) TYPE(*CHAR) LEN(10) VALUE('QTROBJ') 0020.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0021.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) 0022.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) 0023.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) 0024.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) 0025.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0026.00 DCL VAR(&TOMSGQ) TYPE(*CHAR) LEN(10) 0027.00 DCL VAR(&PRTDEV) TYPE(*CHAR) LEN(10) 0028.00 DCL VAR(&OUTPUT) TYPE(*CHAR) LEN(8) 0029.00 DCL VAR(&OUTQLIB) TYPE(*CHAR) LEN(20) 0030.00 DCL VAR(&OUTQ) TYPE(*CHAR) STG(*DEFINED) LEN(10) + 0031.00 DEFVAR(&OUTQLIB 1) 0032.00 DCL VAR(&QUELIB) TYPE(*CHAR) STG(*DEFINED) + 0033.00 LEN(10) DEFVAR(&OUTQLIB 11) 0034.00 DCL VAR(&JOBOPT) TYPE(*CHAR) LEN(23) 0035.00 DCL VAR(&SBMJOB) TYPE(*CHAR) STG(*DEFINED) + 0036.00 LEN(1) DEFVAR(&JOBOPT 3) 0037.00 DCL VAR(&JOBQ) TYPE(*CHAR) STG(*DEFINED) LEN(10) + 0038.00 DEFVAR(&JOBOPT 4) 0039.00 DCL VAR(&JOBLIB) TYPE(*CHAR) STG(*DEFINED) + 0040.00 LEN(10) DEFVAR(&JOBOPT 14) 0041.00 DCL VAR(&RUNPTY) TYPE(*CHAR) LEN(2) 0042.00 DCL VAR(&PTY) TYPE(*DEC) LEN(2 0) 0043.00 DCL VAR(&OUTFLIB) TYPE(*CHAR) LEN(20) 0044.00 DCL VAR(&OUTF) TYPE(*CHAR) LEN(10) 0045.00 DCL VAR(&OUTLIB) TYPE(*CHAR) LEN(10) 0046.00 DCL VAR(&MBROPT) TYPE(*CHAR) LEN(20) 0047.00 DCL VAR(&OUTMBR) TYPE(*CHAR) LEN(10) 0048.00 DCL VAR(&REPLACE) TYPE(*CHAR) LEN(8) 0049.00 DCL VAR(&JOBPTY) TYPE(*DEC) LEN(2 0) 0050.00 DCL VAR(") TYPE(*CHAR) LEN(1) VALUE('''') 0051.00 DCL VAR(&WQUOT) TYPE(*CHAR) LEN(2) 0052.00 DCL VAR(&FILE) TYPE(*CHAR) LEN(10) VALUE(SHOHIN) 0053.00 DCL VAR(&FILLIB) TYPE(*CHAR) LEN(10) VALUE(QTRFIL) 0054.00 DCL VAR(&OBJATR) TYPE(*CHAR) LEN(10) 0055.00 DCL VAR(&SQL) TYPE(*CHAR) LEN(3000) 0056.00 DCL VAR(&QRYSLT) TYPE(*CHAR) LEN(3000) 0057.00 DCL VAR(&SHSCOD01) TYPE(*CHAR) LEN(4) 0058.00 DCL VAR(&SHSCOD02) TYPE(*CHAR) LEN(4) 0059.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0060.00 0061.00 RTVJOBA TYPE(&TYPE) 0062.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */ 0063.00 CHGVAR VAR(&TOMSGQ) VALUE('*SYSOPR ') 0064.00 ENDDO /* バッチ */ 0065.00 ELSE CMD(DO) /* 対話式 */ 0066.00 CHGVAR VAR(&TOMSGQ) VALUE('*TOPGMQ ') 0067.00 ENDDO /* 対話式 */ 0068.00 0069.00 /*---------------------------*/ 0070.00 CALLSUBR SUBR(INZSUBR) 0071.00 /*---------------------------*/ 0072.00 0073.00 /*( 対話式の実行 )*/ 0074.00 IF COND(&SBMJOB *EQ 'N') THEN(DO) /* INTER */ 0075.00 RTVJOBA RUNPTY(&JOBPTY) 0076.00 OPNQRYF FILE((QTRFIL/SHOHIN)) QRYSLT('+ 0077.00 (SHSCOD *GE ' *CAT " *CAT &SHSCOD01 *CAT " *CAT ') *AND + 0078.00 (SHSCOD *LE ' *CAT " *CAT &SHSCOD02 *CAT " *CAT ') + 0079.00 ') OPNID(FILE) OPNSCOPE(*JOB) 0080.00 CPYFRMQRYF FROMOPNID(FILE) TOFILE(QTEMP/@SHOHIN2) + 0081.00 MBROPT(*REPLACE) CRTFILE(*YES) 0082.00 IF COND(&OUTPUT *NE '*OUTFILE') THEN(DO) 0083.00 IF COND(&OUTPUT *EQ '*PRINT ') THEN(CHGVAR + 0084.00 VAR(&OUTPUT) VALUE('*PRINTER')) 0085.00 IF COND(&OUTPUT *EQ '* ') THEN(CHGVAR + 0086.00 VAR(&OUTPUT) VALUE('*DISPLAY')) 0087.00 OVRPRTF FILE(QPQUPRFIL) OUTQ(&QUELIB/&OUTQ) + 0088.00 USRDTA(&QRY) + 0089.00 PAGESIZE(66 132) + 0090.00 OVRFLW(60) + 0091.00 FORMTYPE(*STD) + 0092.00 SECURE(*YES) 0093.00 RUNQRY QRY(&QRYLIB/&QRY) QRYFILE((QTEMP/&QRY)) + 0094.00 OUTTYPE(&OUTPUT) FORMSIZE(*RUNOPT + 0095.00 *RUNOPT) FORMTYPE(*RUNOPT) 0096.00 DLTOVR FILE(QPQUPRFIL) 0097.00 CLOF OPNID(FILE) 0098.00 ENDDO 0099.00 ELSE CMD(DO) 0100.00 IF COND(&REPLACE *EQ '*REPLACE') THEN(CHGVAR + 0101.00 VAR(&REPLACE) VALUE('*RPLFILE')) 0102.00 IF COND(&REPLACE *EQ '*ADD ') THEN(CHGVAR + 0103.00 VAR(&REPLACE) VALUE('*ADDMBR ')) 0104.00 RUNQRY QRY(&QRYLIB/&QRY) QRYFILE((QTEMP/&QRY)) + 0105.00 OUTTYPE(*OUTFILE) OUTFILE(&OUTLIB/&OUTF + 0106.00 &OUTMBR &REPLACE) 0107.00 GOTO RCVMSG 0108.00 ENDDO 0109.00 CHGJOB STSMSG(*NORMAL) 0110.00 RETURN 0111.00 ENDDO /* INTER */ 0112.00 /*( ジョブ待ち行列への投入 )*/ 0113.00 ELSE CMD(DO) /* SBMJOB */ 0114.00 IF COND(&OUTPUT *NE '*OUTFILE') THEN(DO) 0115.00 SBMJOB CMD(PRTQRYDFN QRYDFN(&QRYLIB/@SHOHIN2) + 0116.00 FILE(&FILLIB/&FILE) + 0117.00 OUTPUT(&OUTPUT) APW(QTROBJ/*NONE) + 0118.00 FORMSIZE(66 132) OVRFLW(60) + 0119.00 FORMTYPE(*STD) + 0120.00 INCREL(+ 0121.00 (*IF SHSCOD *GE &SHSCOD01) + 0122.00 (*AND SHSCOD *LE &SHSCOD02) + 0123.00 )) JOB(&QRY) + 0124.00 JOBQ(&JOBLIB/&JOBQ) PRTDEV(&PRTDEV) + 0125.00 OUTQ(&QUELIB/&OUTQ) MSGQ(*WRKSTN) 0126.00 ENDDO 0127.00 ELSE CMD(DO) 0128.00 SBMJOB CMD(PRTQRYDFN QRYDFN(&QRYLIB/@SHOHIN2) + 0129.00 FILE(&FILLIB/&FILE) + 0130.00 OUTPUT(&OUTPUT) + 0131.00 OUTFILE(&OUTLIB/&OUTF) + 0132.00 OUTMBR(&OUTMBR &REPLACE) + 0133.00 INCREL(+ 0134.00 (*IF SHSCOD *GE &SHSCOD01) + 0135.00 (*AND SHSCOD *LE &SHSCOD02) + 0136.00 )) JOB(&QRY) + 0137.00 JOBQ(&JOBLIB/&JOBQ) PRTDEV(&PRTDEV) + 0138.00 OUTQ(&QUELIB/&OUTQ) MSGQ(*WRKSTN) 0139.00 ENDDO 0140.00 GOTO CMDLBL(RCVMSG) 0141.00 ENDDO /* SBMJOB */ 0142.00 0143.00 RCVMSG: 0144.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) + 0145.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 0146.00 MSGFLIB(&MSGFLIB) 0147.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO) 0148.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) + 0149.00 TOMSGQ(&TOMSGQ) MSGTYPE(*ESCAPE) 0150.00 ENDDO 0151.00 ELSE CMD(DO) 0152.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + 0153.00 MSGDTA(&MSGDTA) TOMSGQ(&TOMSGQ) + 0154.00 MSGTYPE(*ESCAPE) 0155.00 ENDDO 0156.00 /******************************/ 0157.00 SUBR SUBR(INZSUBR) 0158.00 /******************************/ 0159.00 IF COND((&PRTDEV *EQ '*SAME') *OR (&PRTDEV *EQ + 0160.00 ' ')) THEN(DO) 0161.00 RTVJOBA PRTDEV(&PRTDEV) 0162.00 ENDDO 0163.00 IF COND(&PRTDEV *EQ '*USRPRF') THEN(DO) 0164.00 RTVUSRPRF USRPRF(*CURRENT) PRTDEV(&PRTDEV) 0165.00 ENDDO 0166.00 IF COND(&PRTDEV *EQ '*WRKSTN') THEN(DO) 0167.00 RTVJOBA PRTDEV(&PRTDEV) 0168.00 ENDDO 0169.00 IF COND(&OUTQ *EQ '*DEV') THEN(DO) 0170.00 CHGVAR VAR(&OUTQ) VALUE(&PRTDEV) 0171.00 CHGVAR VAR(&QUELIB) VALUE('*LIBL') 0172.00 ENDDO 0173.00 ENDSUBR 0174.00 ENDPGM
【解説】
コマンドからのレコード選択パラメータがQUERY適用業務の実行にどのように
制約を加えているのかを理解するのがこのCLPを理解するポイントとなる。
レコード選択パラメータ:
0002.00 &SHSCOD01 + 0003.00 &SHSCOD02 +
に対して
0076.00 OPNQRYF FILE((QTRFIL/SHOHIN)) QRYSLT('+ 0077.00 (SHSCOD *GE ' *CAT " *CAT &SHSCOD01 *CAT " *CAT ') *AND + 0078.00 (SHSCOD *LE ' *CAT " *CAT &SHSCOD02 *CAT " *CAT ') + 0079.00 ') OPNID(FILE) OPNSCOPE(*JOB)
で制約条件を設定して
0080.00 CPYFRMQRYF FROMOPNID(FILE) TOFILE(QTEMP/@SHOHIN2) + 0081.00 MBROPT(*REPLACE) CRTFILE(*YES)
によってライブラリーQTEMPの QTEMP/@SHOHIN2 に抽出されたレコードを出力して
0093.00 RUNQRY QRY(&QRYLIB/&QRY) QRYFILE((QTEMP/&QRY)) + 0094.00 OUTTYPE(&OUTPUT) FORMSIZE(*RUNOPT + 0095.00 *RUNOPT) FORMTYPE(*RUNOPT)
でライブラリーQTEMPの QTEMP/@SHOHIN2をQUERYで読んで出力している。
つまり元のQUERY適用業務は元の定義されたファイルではなく
OPNQRYFによって制約されて抽出されたQTEMPのファイルを読んで出力しているので
結果的にレコードの選択が反映されていることになる。