【问题标题】:BIRT report optional parameter scriptBIRT 报告可选参数脚本
【发布时间】:2016-08-02 09:47:15
【问题描述】:

我正在使用 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 高手?我会很高兴的帮助。谢谢。

【问题讨论】:

    标签: javascript sql report birt spagobi


    【解决方案1】:

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

    步骤

    1. 重写查询,使可选参数可以为空或数据库字段等于某个值。对于每个可选参数,您将有两个“?”在查询中。第一个测试是针对 null 的,第二个测试是一个值与字段匹配的测试。对于必需的参数,您仍然只有一个“?”在查询中。

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

    【讨论】:

    • 哇。太简单。谢谢你的回答。
    【解决方案2】:

    我又一次设法解决了我的问题。 :) 首先从数据集中删除你的可选参数。我们将在 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 +"'))";
    }
    

    如您所见,“?”仅当在数据集中声明参数时才需要。 没有它,我们可以将单行与子查询返回的多个值进行比较。

    【讨论】:

    • 您是否在 spagoBI 的 birt 报告中使用了钻取功能。我在 spagoBI 工作室中使用钻取创建了一个 birt 报告,它在那里运行良好,同时将其部署在服务器上。它显示错误 - 发生错误。稍后重试。如果问题仍然存在,请联系系统管理员。超链接上显示的 url 是“GET /SpagoBIBirtReportEngine/run?__report=%2FD%3A%2FAll-In-One-S‌​pagoBI-5.1.0_2101201‌​5%2Fbin%2FRevenueDet‌​ails.rptdesign&idCon‌​tratto=77&__overwrit‌ ​e=true HTTP/1.1" 404 687.. 请帮忙 –
    • 您创建的超链接可能有问题。不确定,信息太少。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多