2016-08-02 136 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