2012-06-05 15 views
0

我有,目前有三個層次分組的損益報告: 1.藥房 2.客戶 3.包裝形式「捲起」組

我已經設置了報告提示用戶爲藥房,客戶和包裝類型提供價值。細節帶顯示收入和保證金等指標。爲藥房,客戶或包裝類型選擇默認值將返回組中的所有值。

我想知道 - 有沒有什麼辦法,如果用戶選擇「使用默認」的參數,告訴iReport捲起分組?現在,如果我選擇藥房和客戶,但使用默認的包裝類型,我仍然會爲幾種包裝類型中的每一種獲取詳細信息。我如何告訴iReport總結所有包裝類型?或者,如果沒有指定客戶,就給定藥店的所有客戶?或者我可以在查詢中做到這一點?我有一個Oracle數據庫,正在使用iReport Professional 4.5.1。

感謝, 麗莎

編輯以添加代碼:

SELECT 
     FAC.FILL_MONTH AS FILL_MO, 
     FAC.PHAR_CODE AS PHAR_CODE, 
     FAC.FAC_ID AS FAC_ID, 
     FAC.PACKTYPE_CODE AS PACKTYPE, 
     SUM(FAC.TOT_RXCOUNT_NUM) AS RX_COUNT, 
     SUM(FAC.TOT_REVENUE_AMT) AS REVENUE, 
     SUM(FAC.TOT_COGS_AMT) AS COGS, 
     SUM(FAC.TOT_MARGIN_AMT) AS MARGIN 
FROM 
     MySchema.Table FAC 
WHERE 
     FAC.FILL_MONTH BETWEEN $P{startdate} AND $P{enddate} 
     AND $X{IN, FAC.PHAR_CODE, pharmacy} 
     AND $X{IN, FAC.FAC_ID, facility} 
     AND $X{IN, FAC.PACKTYPE_CODE, packtype} 
GROUP BY 
     FAC.PHAR_CODE, 
     FAC.FAC_ID, 
     FAC.PACKTYPE_CODE, 
     FAC.FILL_MONTH 
ORDER BY 
     PHAR_CODE ASC, 
     FAC_ID ASC, 
     PACKTYPE ASC, 
     FILL_MO ASC 
+1

發佈您的SQL(或其簡化版本)。應該可以使用這些參數來獲得你所需要的。 – mdahlman

+0

謝謝!我發佈了我的代碼的簡化版本。 – Lisa

回答

3

您有SQL正確以獲取您想要的原始數據。但是,您需要修改它以強制PACKTYPE(和其他字段)在用戶指定否PACKTYPE的特殊情況下以不同方式分組。

創建一個新參數$P{PACKTYPE_SELECT_SQL}。其默認值直接基於您現有參數$P{packtype}的值。 (這意味着$P{packtype}必須首先出現在生成.jrxml)套裝$P{PACKTYPE_SELECT_SQL}的默認值是這樣的:

$P{packtype}==null ? " 'All Package Types' " : " FAC.PACKTYPE_CODE " 

然後修改這樣的SQL查詢(只有一行被修改,剩下的只是用於上下文中):

SELECT 
    FAC.FILL_MONTH AS FILL_MO, 
    FAC.PHAR_CODE AS PHAR_CODE, 
    FAC.FAC_ID AS FAC_ID, 
    $P!{PACKTYPE_SELECT_SQL} AS PACKTYPE, 
... 
WHERE 
    FAC.FILL_MONTH BETWEEN $P{startdate} AND $P{enddate} 
    AND $X{IN, FAC.PHAR_CODE, pharmacy} 
    AND $X{IN, FAC.FAC_ID, facility} 
    AND $X{IN, FAC.PACKTYPE_CODE, packtype} 

$P{packtype}不爲空的情況下,則生成的SQL將完全像從前那樣。但是在$P{packtype}爲空的情況下,您現在將得到一個硬編碼的字符串來代替PACKTYPE_CODE。

推測你的報告是在PACKTYPE上分組的。所以你應該能夠保持報告中的佈局和分組不變。

您可以想象,像添加一個布爾輸入控件的變體,明確讓用戶選擇是否將PACKTYPE保留在報表中。但是,這個基本的想法應該讓你得到你所需要的。

+0

這工作很好。非常感謝你的幫助!我沒有想過定義另一個參數,所以我可以使用$ P!以這種方式。我可以經常看到我自己使用它。 – Lisa

+0

非常有趣。我從來沒有這樣做過。非常有創意的解決方案 – Tom

+0

Matthew,我將它部署到JasperServer併爲設施和packtype值設置級聯輸入控件。它適用於iReport,但不適用於JasperServer。沒有一個輸入控件是強制性的,並且在JasperServer中,我沒有選中「總是提示」。當報告第一次打開時,它會按照應有的情況捲起組,但是從輸入控件中,如果我只選擇藥房並且不選擇任何其他輸入控件,它將顯示其他輸入控件的所有元素,例如_select_sql參數將被忽略。我有什麼想法可以解決這個問題?再次感謝你。 – Lisa

2

我會嘗試做查詢。沒有看到你的查詢很難給出具體細節,但我可以提供一些我的代碼作爲例子。在這個特定的碧玉報告中,我顯示了基於用戶指定的PGM_NAME和USER_NAME的值。但是,指定這些參數是可選的。如果未指定參數,則默認情況下會報告所有PGM_NAME和/或USER_NAME。在我的ireport查詢中,WHERE子句有以下幾行:

WHERE ($P{PGM_NAME} IS NULL OR job.pgm_name = $P{PGM_NAME}) 
AND  ($P{USER_NAME} IS NULL OR details.username = $P{USER_NAME}) 

這種方式就像一種魅力。我希望這可以幫助您確定如何調整自己的查詢。如果您需要這方面的幫助,請在您的問題中發佈查詢。

+0

藥房,客戶和包裝類型都是java.util.collection類型的變量,在我的查詢的where子句中,我使用$ X設置參數,如$ X {IN,PHARMACIES,pharmacy}。 所以你的回答讓我意識到,當我使用藥房/客戶/包裝類型的默認值時,它會爲每一個返回每個值。我不希望每個人都有明確的價值,我想要集體聚合。我只需要弄清楚如何告訴iReport。 – Lisa

+0

它看起來像我們可以指定更多的數據(使用$ X {...來獲取給定客戶的每種包裝類型,或只是一種類型或多種類型),但似乎沒有我們可以操縱分組數量動態地在JRXML模板中創建級別。 – Lisa