メニューボタン
IBMi海外記事2017.08.17

共通表式はクエリー チェーンを置き換えることができる

Ted Holt 著

データベースとプログラムに対して、モダナイゼーションのための労力が集中的に向けられることがあります。それは結構なことですが、モダナイゼーションを行うべき対象は、他にもいろいろあります。Query for IBM iをよりモダンなクエリー ツールに置き換えることも重要です。しかし、人々が頼りにしているクエリーを使って、何を行うのでしょうか。さらに言えば、クエリー チェーンを使って、何を行うのでしょうか。
クエリー チェーンは、順次実行される一連のクエリーであり、一時物理ファイルでデータを統合および再フォーマットし、結果として生じるデータ セットを、しばしばレポート形式で生成します。次のような短いCLプログラムを目にすることが、よくあります。

技術情報code06

この例では、最初の3つのクエリーは、物理ファイルをサマリー情報とともにロードします。最後のクエリーはすべてのデータを結合し、レポートを作成します。

クエリー 目的 入力ファイル 出力ファイル
SA001Q 昨年1年間の品目ごとの販売合計 INVHDR, INVLINE SA001OUT
SA002Q 過去1年間の品目ごとの販売合計 INVHDR, INVLINE SA002OUT
SA003Q 当会計年度の年初来の品目ごとの販売合計 INVHDR, INVLINE SA003OUT
SA004Q 1日の請求書の品目を出力する INVHDR, INVLINE, SA001OUT, SA002OUT, SA003OUT  

レポートは次のようなものになります。

技術情報code07

幸いなことに、そのようなクエリー チェーンをもっとモダンなもの、つまりSQLベースのものに変換することは難しいことではありません。それを行う1つの方法について以下で説明します。
まず、Retrieve Query Management Query(RTVQMQRY)コマンドを使用して各クエリーをSQLに変換します。RTVQMQRYはクエリー定義を読み取り、同等のSQLをソース物理ファイルへ書き込みます。

技術情報code08

ここでは、ライブラリーMYLIBのソース物理ファイルSQLSRCのメンバーSA001QSQLに、クエリーSA001Qと同等のSQLを書き込むことにしました。必ずALWQRYDFN(*YES)を指定するようにしてください。これは、RTVQMQRYにクエリー定義オブジェクトを検索させるパラメーターであるためです。
クエリーSA001Qに対応して生成されたSQLソース コードを以下に示します。

技術情報code09

SELECTより前の行は無視してください。このSELECTステートメントを、出力ファイルからとられた名前を付けた共通表式として新しいソース メンバーにコピー ペーストします。必要に応じて修正します。

技術情報code10

私は相関名QUANTITY01を追加する必要がありました。クエリーでそのフィールドがそう呼ばれていたからです。また、ライブラリー名を削除し、ORDER BY節も削除しました。これは必要ありません。
4つのクエリーをすべて変換し、コピー ペーストし、SQLソースを調整した後、結果として次のようになりました。

技術情報code11

赤色で示されているところは修正した箇所です。ライブラリー名を削除していることにも注目してください。 私がライブラリー リストの使用に熱心であるためです。実際、作業ファイルからライブラリー名を削除する 必要がありました 。そうしなければ、メインのSELECT(最後のSELECT)は、同じ名前の共通表式ではなく、物理ファイルSA001OUT、SA002OUT、およびSA003OUTを読み込んだことでしょう。
ここから先はあなた次第です。必要ならSQLを修正します。新たなSQLをストアード プロシージャーに入れてもよいですし、それをRPGプログラムに埋め込んでもよいですし、GUIクエリー ツールでそれを実行してもよいでしょう。
クエリー チェーンをSQLに変換する方法は、このやり方だけではありませんが、これは簡単かつ単純な方法と言えるでしょう。おそらく、この方法も、クエリーを用いた方法も動作上あまり変わりないのかもしれませんが、とにかく、1つのやり方を覚えたことにはなるでしょう。

あわせて読みたい記事

PAGE TOP