2013-07-15 104 views
0

我想創建一個的JasperReports有多個參數的報告,正確生成報表時,用戶通過所有的參數,但是,當一個參數是錯過了我用這個請求產生什麼請求報告與參數

SELECT 
    t.*, 
    u."name" AS username, 
    c."name" AS componentName, 
    s."designation" AS statusName, 
    pr."name" AS priorityName, 
    p."name" AS projectName 
FROM 
    "component" c INNER JOIN "ticket" t ON c."id" = t."component_id" 
    INNER JOIN "personne" u ON t."personne_id" = u."id" 
    INNER JOIN "status" s ON t."status_id" = s."id" 
    INNER JOIN "priority" pr ON t."priority_id" = pr."id" 
    INNER JOIN "project" p ON c."project_id" = p."id" 
WHERE 
    pr.name = $P{priority} 
and u.login = $P{userLogin} 
and s.designation = $P{status} 
and t.creation_date between $P{start} and $P{end} 
and c.name = $P{componenet} 

即使有一個參數丟失,請您幫助我生成報告嗎?

+0

我想你在找什麼是設置**當沒有數據**該報告設定顯示* *沒有數據**樂隊當空(確保你加入樂隊),或者也許**所有部分,沒有數據** –

+0

是的,我驗證了它,我得到了融洽的列的標題,但我真正想要的是與我的應用程序的IHM中的過濾器同步以提取報告。實際上,在此過濾器中,當用戶默認情況下未選擇任何參數時,所有列表都會顯示,我想提取完全相同的東西,但在報告中我沒有選擇任何參數時使用的請求只有列的名稱出現 – hana

+0

換句話說,我想如果用戶沒有輸入任何參數我給(%)所有參數來提取列表 – hana

回答

0

你想要外連接嗎?或者您也可以選擇這樣的結構:

and (u.login = $P{userLogin} or $P{userLogin} is null) 

每行

0

您可以控制其中的Java類子句之前生成報告。

1.In的Javaü可以檢查參數是否爲空或不是,然後做小的驗證,如

StringBuffer sb = new StringBuffer(); 
if(StringUtils.isNotEmpty(priority)){ 
     sb.append(" AND pr.name = "+priority); 
    } 

2.do每隔條件u.login, s.designation

3.after u可以通過在iREPORT分享到人人reportParam.put("sqlQuery", sb.toString());

4,簡單地改變你的查詢

WHERE 
pr.name = $P{priority} 
and u.login = $P{userLogin} 
and s.designation = $P{status} 
and t.creation_date between $P{start} and $P{end} 
and c.name = $P{componenet} 

WHERE 1=1 $P!{sqlQuery} 

現在你不需要擔心null,因爲它會忽略java類中的條件。

+0

感謝您的答覆我測試了它們,但報告生成爲空現在,當用戶不選擇一個參數,但我想要的是選擇所有可能的情況下爲這個參數,當他沒有通過任何我想嘗試例如WHERE pr.name like('%',$ P {優先},'%')但我有一個錯誤,請幫助我 – hana

+0

你可以發佈錯誤嗎? – ggDeGreat

+0

我想你想要'在哪裏pr.name像(coalesce($ P {priority},'%')'這將看看是否$ P {priority}爲空,然後返回% –

0

您可以爲每個參數設置的缺省值或使用該查詢: -

 SELECT 
t.*, 
u."name" AS username, 
c."name" AS componentName, 
s."designation" AS statusName, 
pr."name" AS priorityName, 
p."name" AS projectName 
FROM 
"component" c INNER JOIN "ticket" t ON c."id" = t."component_id" 
INNER JOIN "personne" u ON t."personne_id" = u."id" 
INNER JOIN "status" s ON t."status_id" = s."id" 
INNER JOIN "priority" pr ON t."priority_id" = pr."id" 
INNER JOIN "project" p ON c."project_id" = p."id" 
WHERE 
(pr.name = $P{priority} or $P{priority} is null) 
    and (u.login = $P{userLogin} or $P{userLogin} is null) 
    and (s.designation = $P{status} or $P{status} is null) 
    and t.creation_date between $P{start} and $P{end} 
    and (c.name = $P{componenet} or $P{componenet} is null)