BIRT 报告可选参数脚本
BIRT report optional parameter script
我正在使用 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;
}
我有 2 个参数,regionparam 和 cityparam,第二个是可选的。我试图以这种方式修改查询,当未设置 cityparam 时,我将 C."CITY" 与选定区域中的所有可能值进行比较。生成的查询在我的 PGadmin 中有效。但是在 SpagoBI studio 中存在问题。它说:
Subquery returned more than 1 value. This is not permitted
有BIRT高手吗?我很乐意提供帮助。谢谢
我又一次解决了我的问题。 :)
首先从数据集中删除你的可选参数。我们将在 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 +"'))";
}
正如你看到的“?”仅当在数据集中声明参数时才需要。
没有它我们可以将单行与子查询返回的 1 个以上的值进行比较。
这是我在 SpagoBI 中用于处理 BIRT 报告的可选参数的技术。通过重写查询,我们可以利用单个查询而不需要根据参数值修改它。
步数
重写查询,使可选参数可以为空或数据库字段等于某个值。对于每个可选参数,您将有两个“?”在查询中。第一个测试是针对 null 的,第二个测试是测试一个值是否匹配一个字段。对于必需的参数,您仍然只有一个“?”在查询中。
在BIRT Data Set的参数中,对于可选参数,定义两个匹配的命名参数来对应第一个和第二个'?'在对该参数的查询中。必需参数将只有 1 个命名参数映射到它们。
以下是现有报告中的简化示例。
示例 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 数据集的参数如下所示,包含三个可选参数。
我正在使用 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;
}
我有 2 个参数,regionparam 和 cityparam,第二个是可选的。我试图以这种方式修改查询,当未设置 cityparam 时,我将 C."CITY" 与选定区域中的所有可能值进行比较。生成的查询在我的 PGadmin 中有效。但是在 SpagoBI studio 中存在问题。它说:
Subquery returned more than 1 value. This is not permitted
有BIRT高手吗?我很乐意提供帮助。谢谢
我又一次解决了我的问题。 :) 首先从数据集中删除你的可选参数。我们将在 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 +"'))";
}
正如你看到的“?”仅当在数据集中声明参数时才需要。 没有它我们可以将单行与子查询返回的 1 个以上的值进行比较。
这是我在 SpagoBI 中用于处理 BIRT 报告的可选参数的技术。通过重写查询,我们可以利用单个查询而不需要根据参数值修改它。
步数
重写查询,使可选参数可以为空或数据库字段等于某个值。对于每个可选参数,您将有两个“?”在查询中。第一个测试是针对 null 的,第二个测试是测试一个值是否匹配一个字段。对于必需的参数,您仍然只有一个“?”在查询中。
在BIRT Data Set的参数中,对于可选参数,定义两个匹配的命名参数来对应第一个和第二个'?'在对该参数的查询中。必需参数将只有 1 个命名参数映射到它们。
以下是现有报告中的简化示例。
示例 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 数据集的参数如下所示,包含三个可选参数。