0

SpagoBI を使用しており、オプションのパラメーターを使用してレポートを作成しようとしています。beforeOpen() スクリプトに問題があります。これがクエリです。

select C."CUSTOMERNAME", C."CITY", D."YEAR", P."NAME"
from "CUSTOMER" C, "DAY" D, "PRODUCT" P, "TRANSACTIONS" T 
where C."CUSTOMERID" = T."CUSTOMERID"
and D."DAYID" = T."DAYID"
and P."PRODUCTID" = T."PRODUCTID"
and C."REGION" in (?)

そしてスクリプト

if (params["cityparam"].value != null){ 
  this.queryText = this.queryText + "and C.\"CITY\" in ( ?,'" +params["cityparam"].value + "')"; 
}
else{
  var str = reportContext.getParameterValue("regionparam");
  q3 = this.queryText + "and C.\"CITY\" in  (?,( select \"CUSTOMER\".\"CITY\" from \"CUSTOMER\" where \"CUSTOMER\".\"REGION\" in  ('"+ str +"')))";
  this.queryText =q3; 
}

regionparam と cityparam の 2 つのパラメーターがあり、2 番目のパラメーターはオプションです。この方法でクエリを変更しようとしています。cityparam が設定されていない場合、C."CITY" を選択した地域で可能なすべての値と比較しています。生成されたクエリは私の PGadmin で機能します。しかし、SpagoBI スタジオには問題があります。それは言う:

サブクエリが複数の値を返しました。これは許可されていません

BIRTマスターはありますか?お役に立てれば幸いです。ありがとう。

4

2 に答える 2

1

これは、SpagoBI で BIRT レポートのオプション パラメータを処理するために私が使用している手法です。クエリを書き直すことで、パラメーター値に基づいて変更することなく、単一のクエリを利用できます。

手順

  1. オプションのパラメーターが null になるか、データベース フィールドが何らかの値と等しくなるように、クエリを書き直してください。オプションのパラメータごとに、2 つの「?」が必要です。クエリで。最初のテストは null に対するもので、2 番目のテストは値がフィールドに一致するかどうかのテストです。必須パラメーターの場合、「?」は 1 つしかありません。クエリで。

  2. BIRT データ セットのパラメーターで、オプションのパラメーターについて、最初と 2 番目の「?」に対応する 2 つの一致する名前付きパラメーターを定義します。そのパラメーターのクエリで。必須パラメーターには、1 つの名前付きパラメーター マッピングのみが含まれます。

以下は、既存のレポートからの単純化されたサンプルです。

ユーザー ステータス、最終ログイン、ロールの 3 つのオプション パラメータを使用した SQL クエリの例 (SQLServer)

SELECT
  ar.role_name,
  au.user_id,
  au.Lname, 
  au.FName, 
  au.Email, 
  au.Last_Login,      
  au.status,
  au.Creation_Date
FROM account_user au                          WITH (NOLOCK)
INNER JOIN account_role ar                    WITH (NOLOCK)
 ON ar.account_id = au.account_id 
 AND ar.role_id = au.role_id
WHERE au.account_id = 9999
 AND ( (? IS NULL) OR (AU.status = ?) ) 
 AND ( (? IS NULL) OR (AU.last_login <= ?) ) 
 AND ( (? is null) OR (ar.role_id = ?))
ORDER  BY role_name, Lname, Fname

以下は、BIRT データ セットのパラメーターが 3 つのオプション パラメーターに対してどのように見えるかを示しています。

ここに画像の説明を入力

于 2016-08-03T20:12:16.097 に答える
0

もう一度、問題を解決することができました。:) まず、データセットからオプションのパラメーターを削除します。beforeOpen() スクリプト内で設定します。これが私のクエリです

select C."CUSTOMERNAME", C."CITY", D."YEAR", P."NAME"
from "CUSTOMER" C, "DAY" D, "PRODUCT" P, "TRANSACTIONS" T 
where C."CUSTOMERID" = T."CUSTOMERID"
and D."DAYID" = T."DAYID"
and P."PRODUCTID" = T."PRODUCTID"

とスクリプト

if (params["cityparam"].value != null){ 
  this.queryText = this.queryText +"and C.\"REGION\" in (?, '" + params["regionparam"].value  + "' ) "
  + "and C.\"CITY\" in ( '" + params["cityparam"].value + "')"; 
}
else{
  var str = reportContext.getParameterValue("regionparam");
  this.queryText = this.queryText +"and C.\"REGION\" in (?, '" + params["regionparam"].value  + "' ) " 
  + "and C.\"CITY\" in  (select \"CUSTOMER\".\"CITY\" from \"CUSTOMER\" where \"CUSTOMER\".\"REGION\" in  ('"+ str +"'))";
}

ご覧のとおり「?」パラメータがデータセットで宣言されている場合にのみ必要です。それがなければ、単一の行をサブクエリから返された複数の値と比較できます。

于 2016-08-03T08:48:50.440 に答える