2018年2月アーカイブ

static QueryのWhere句をパラメータの条件によって変更させたい場合があります。
例えば、特定のパラメータ値が選択されている時だけある条件を追加するなどのような場合です。
しかし、レポートデザイナーは基本的には異なるクエリを動的に変更することができません。
つまり、データソース毎にStatic Queryを使用することになります。
このような場合、以下のようにSQLの記述を工夫することでWhere句を動的に表現できます。

SELECT * FROM TABLENAME
WHERE 1=1
AND (
(条件式1
AND 検索クエリ1
)
OR
(条件式2
AND 検索クエリ2
)
OR
(条件式3
AND 検索クエリ3
)
)
;

上記の場合、条件式の最初にTRUEになった検索クエリがWhere句に適用されます。
ネストさせることでより条件を複雑にすることもできます。

SELECT * FROM TABLENAME
WHERE 1=1
AND (
(条件式1-1
(条件式1-2
AND 検索クエリ1
)
)
OR
(条件式2
(条件式1-2
AND 検索クエリ1
)
)
OR
(条件式3
(条件式1-2
AND 検索クエリ1
)
)
)
;

例えば、以下のように記述した場合param1がaの場合はCOLUMN1、bの場合はCOLUMN2、cの場合はCOLUMN3のようにパラメータの値によってWhere句を変更することができます。

SELECT * FROM TABLENAME
WHERE 1=1
AND (
('a' = ${param1}
AND COLUMN1 = ${param1}
)
OR
('b' = ${param1}
AND COLUMN2 = ${param1}
)
OR
('c' = ${param1}
AND COLUMN3 = ${param1}
)
)
;

条件式は「=」や「!=」だけでなく「IN」なども使用できます。
パラメータ未設定の判定には、「=''」や「!=''」、または、「IS NULL」や「IS NOT NULL」で可能です。
※「=NULL」や「!=NULL」は正常に動作しません。

レポートデザイナというよりはSQLのTIPSですが
このようなクエリの記述を応用して、よりきめ細かなレポート動作を実現できます。
PentahoレポートデザイナーではQuery Scriptingを使用し、Static Queryの結果であるデータオブジェクトを加工することができます。使用可能なQuery言語はGroovy、ECMA Scriptの2つです。Query Scriptingの基本的な使用方法はQuery Scriptingを使用するをご参照ください。


ここでは、Groovyを使用してサンプルレポートのBar Line Chart.prptのクエリ結果を加工してみましょう。

1.まずは、サンプルレポートを開きます。
ようこそ画面からCharts>Bar Lineを選択するか、メニューのHelp>Sample Reports>Charts>Bar Lineを選択しレポートを開きます。

2.レポートをプレビューします。
180202001.PNG

今回は「Classic Cars」の名称Groovyで変更してみましょう。

3.JDBCデータソースを開き「プレビュー」ボタンをクリックし、変更する前のデータセットを確認します。確認が終わり次第プレビューを閉じます。
180202002.PNG

4.Query Scriptingタブをクリックします。
Scripting LanguageにGroovyを選択し、「Template」ボタンをクリックします。
今回はStatic Queryの結果を加工するため、postProcessResultメソッド内に下記Groovy(Java)を追加します。
--
   for (int i=0;i<tableModel.getRowCount();i++) {
String s =tableModel.getValueAt(i,1);
if ("Classic Cars".equals(s)){
tableModel.setValueAt("Bus",i,1);
}
}
--
上記処理はテーブルモデルの2列目(indexは1)の各行から順にデータを取得し、
取得した文字列が"Classic Cars"の場合は文字列"Bus"を格納するコードです。
180202003.PNG

5.再度プレビューして「Classic Cars」が「Bus」に変わっていることを確認してみましょう。
180202004.PNG

6.問題なければJDBCデータソースの編集を「OK」ボタンで閉じて、レポートをプレビューしてみましょう。以下のように「Classic Cars」が「Bus」に変わっていることが確認できます。
180202005.PNG

Groovyを使用することで、レポートデザイナーの機能としてはないCSV取り込み、CSVデータとJDBCデータソースのテーブル結合なども可能です。
このように自由度や拡張性が高いことがレポートデザイナーの良さでもあります。
Javaで実現できる処理はレポートデザイナー内でも実現できるため、細かなカスタマイズも非常に簡単に実装することができます。

Query Scriptingを使用する

|
PentahoレポートデザイナーではQuery Scriptを使用し、Static Queryの結果であるデータオブジェクトを加工することができます。使用可能なQuery言語はGroovy、ECMA Scriptの2つです。

ここではGroovyを使用し、Query Scriptingの使用方法をご説明します。

1.新規レポートの場合は、Data>Add Datasource>JDBCより、すでにJDBCデータソースをレポートに追加している場合は、データタブから「JDBC:接続名」をダブルクリックし、JDBCデータソースダイアログを開きます。

2.Query ScriptingタブをクリックしScripting LanguageにGroovyを選択します。

3.「Template」ボタンを押下すると、呼び出されるメソッドのテンプレートが入力されます。
入力が完了すれば以下のよになります。
Query Scriptingの使用方法.PNG

4.必要なタイミングで呼び出されるメソッド内に、必要な処理を追記します。

def initQuery()
{
  //すべての初期化ロジックをここに配置します。これは準備するのに最適な空間です
  //複雑なルックアップテーブルまたはこのスクリプトのグローバル変数を埋める。
  //このメソッドは、初期化中に一度呼び出されます。この機能は、
  //関連するクエリが使用されている場合にのみ呼び出されます。
}

def shutdownQuery()
{
  //すべてのシャットダウンロジックをここに配置します。永続的なリソースを使用する場合
  //ファイルや接続のように、ここで閉じてください。
  //このメソッドは、データソースのシャットダウン中に一度呼び出されます。それ
  //関連するクエリが発生した場合にのみ呼び出されます。
}


def computeQuery(query、queryName、dataRow)
{
  //データソースのクエリに使用されるクエリ文字列を計算します。
  //クエリには静的に定義されたクエリ(MQL-text)が含まれています。
  // queryNameは、設計時に与えられたこのクエリの論理名です
  // dataRowには、クエリを実行するために使用されるすべてのパラメータが含まれています

  return query;
}

def computeQueryFields(query、queryName)
{
  //キャッシュに影響を与える可能性のある追加フィールドを返します。書き換えた場合
  // 'computeQuery'関数で動的にクエリを実行し、すべてのフィールドを含める
  //クエリやクエリの計算に含めることができます。
  //
  //キャッシュを必要としない場合は、<null>を返します。
  return new String[0];
}

def postProcessResult(query、queryName、dataRow、tableModel)
{
  //オプションでクエリ結果を後処理します。通常、あなたはしません
  //与えられたテーブルモデルを直接操作しますが、コピーすることもできます
  //データを新しいモデルに入れたり、カスタムテーブルモデルでラップすることができます
  //独自の作成の実装。

  //プロセス内で元の表モデルを破棄した場合は、
  //適切に閉じるか、リソースがリークする可能性があります。
  return tableModel;
}

2018年3月

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

月別 アーカイブ