BIRT报告可选参数脚本

时间:2016-08-02 09:47:16

标签: javascript sql report birt spagobi

我正在使用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工作室存在问题。它说:

  

子查询返回的值超过1。这是不允许的

有没有BIRT主人?我很乐意帮忙。感谢。

2 个答案:

答案 0 :(得分:1)

这是我用于处理SpagoBI中BIRT报告的可选参数的技术。通过重写查询,我们可以使用单个查询,而无需根据参数值进行修改。

步骤

  1. 重写查询,以便可选参数可以为null或数据库字段等于某个值。对于每个可选参数,您都会有两个'?'在查询中。第一个测试是针对null,第二个测试是测试匹配字段的值。对于所需的参数,您仍然只有一个'?'在查询中。

  2. 在BIRT数据集的参数中,对于可选参数,定义两个匹配的命名参数以对应第一个和第二个'?'在该参数的查询中。必需参数只有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数据集参数的外观。

    enter image description here

答案 1 :(得分: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 +"'))";
}

你可以看到“?”仅在数据集中声明参数时才需要。 没有它我们可以将单行与从子查询返回的多于1的值进行比较。