共通表式はクエリー チェーンを置き換えることができる
データベースとプログラムに対して、モダナイゼーションのための労力が集中的に向けられることがあります。それは結構なことですが、モダナイゼーションを行うべき対象は、他にもいろいろあります。Query for IBM iをよりモダンなクエリー ツールに置き換えることも重要です。しかし、人々が頼りにしているクエリーを使って、何を行うのでしょうか。さらに言えば、クエリー チェーンを使って、何を行うのでしょうか。
クエリー チェーンは、順次実行される一連のクエリーであり、一時物理ファイルでデータを統合および再フォーマットし、結果として生じるデータ セットを、しばしばレポート形式で生成します。次のような短いCLプログラムを目にすることが、よくあります。
この例では、最初の3つのクエリーは、物理ファイルをサマリー情報とともにロードします。最後のクエリーはすべてのデータを結合し、レポートを作成します。
クエリー | 目的 | 入力ファイル | 出力ファイル |
SA001Q | 昨年1年間の品目ごとの販売合計 | INVHDR, INVLINE | SA001OUT |
SA002Q | 過去1年間の品目ごとの販売合計 | INVHDR, INVLINE | SA002OUT |
SA003Q | 当会計年度の年初来の品目ごとの販売合計 | INVHDR, INVLINE | SA003OUT |
SA004Q | 1日の請求書の品目を出力する | INVHDR, INVLINE, SA001OUT, SA002OUT, SA003OUT |
レポートは次のようなものになります。
幸いなことに、そのようなクエリー チェーンをもっとモダンなもの、つまりSQLベースのものに変換することは難しいことではありません。それを行う1つの方法について以下で説明します。
まず、Retrieve Query Management Query(RTVQMQRY)コマンドを使用して各クエリーをSQLに変換します。RTVQMQRYはクエリー定義を読み取り、同等のSQLをソース物理ファイルへ書き込みます。
ここでは、ライブラリーMYLIBのソース物理ファイルSQLSRCのメンバーSA001QSQLに、クエリーSA001Qと同等のSQLを書き込むことにしました。必ずALWQRYDFN(*YES)を指定するようにしてください。これは、RTVQMQRYにクエリー定義オブジェクトを検索させるパラメーターであるためです。
クエリーSA001Qに対応して生成されたSQLソース コードを以下に示します。
SELECTより前の行は無視してください。このSELECTステートメントを、出力ファイルからとられた名前を付けた共通表式として新しいソース メンバーにコピー ペーストします。必要に応じて修正します。
私は相関名QUANTITY01を追加する必要がありました。クエリーでそのフィールドがそう呼ばれていたからです。また、ライブラリー名を削除し、ORDER BY節も削除しました。これは必要ありません。
4つのクエリーをすべて変換し、コピー ペーストし、SQLソースを調整した後、結果として次のようになりました。
赤色で示されているところは修正した箇所です。ライブラリー名を削除していることにも注目してください。 私がライブラリー リストの使用に熱心であるためです。実際、作業ファイルからライブラリー名を削除する 必要がありました 。そうしなければ、メインのSELECT(最後のSELECT)は、同じ名前の共通表式ではなく、物理ファイルSA001OUT、SA002OUT、およびSA003OUTを読み込んだことでしょう。
ここから先はあなた次第です。必要ならSQLを修正します。新たなSQLをストアード プロシージャーに入れてもよいですし、それをRPGプログラムに埋め込んでもよいですし、GUIクエリー ツールでそれを実行してもよいでしょう。
クエリー チェーンをSQLに変換する方法は、このやり方だけではありませんが、これは簡単かつ単純な方法と言えるでしょう。おそらく、この方法も、クエリーを用いた方法も動作上あまり変わりないのかもしれませんが、とにかく、1つのやり方を覚えたことにはなるでしょう。