2016-08-02 58 views
0

我正在使用SpagoBI,并试图用可选参数创建报告。我有beforeOpen()脚本的问题。这是查询。BIRT报告可选参数脚本

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主?我会很乐意提供帮助。谢谢。

回答

1

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

步骤

  1. 重写查询以便可选参数可以是NULL或数据库字段等于某个值。对于每个可选参数,您将有两个'?'在查询中。第一个测试是针对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数据集的参数是什么样子,三个可选参数。

​​

+0

哇。太简单。谢谢你的答案。 – LucasPG

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 +"'))"; 
} 

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

+0

您是否在spagoBI的birt报告中使用了钻取功能..我已经在spagoBI studio中使用钻取创建了一个birt报告,它在那里运行良好,同时将其部署到服务器上。它显示错误 - 发生错误。稍后重试。如果问题仍然存在,请联系系统管理员。超链接上显示的URL是“GET/SpagoBIBirtReportEngine/run?__ report =%2FD%3A%2FAll-In-One-S pagoBI-5.1.0_2101201 5%2Fbin%2FRevenueDet ails.rptdesign&idContratto = 77&__ overwrit e = true HTTP/1.1“404 687 ..请帮忙 - – dhS

+0

您创建的超链接可能有问题。不确定,信息太少。 – LucasPG

+0

https://stackoverflow.com/questions/45298476/drill-through-not-working-in-spagobi-server-in-birt-report – dhS