2009-05-20 47 views
8

我正在處理Sql Server Reporting Services中相當複雜的報表。我的SP返回一個動態數量的列,每個列都是動態命名的。如何在SSRS中表示未知數量的列?

基本上認爲一個計時應用。每個動態列表示該團隊爲該團隊收取時間的時間段。如果報告涵蓋的時間段內沒有向該存儲桶收取任何費用,則不會顯示。每個桶都有自己的標識符,我需要列標題。

我有一個SP返回這一切。它通過使用exec語句執行一些動態SQL(醜陋的我知道,但我在SQL 2000中,所以PIVOT選項不起作用)

我可以有無限數量的存儲桶和任何或所有可能會顯示。

我發現這個 - http://www.codeproject.com/KB/reporting-services/DynamicReport.aspx - 這是有幫助的,但在這個例子中,他有一個有限數量的列,他只是隱藏或顯示他們根據哪些人有價值觀。在我的情況下,我有可變數量的列,所以不知何故我需要報告添加列。

有什麼想法?

+0

我們可以看到一個或兩個您的示例數據?很可能你用動態列做的事情可能會變成永久列,或者成爲數據行。 – DForck42 2009-05-21 16:29:55

+0

我現在不在工作,但是我有兩個版本。一個使用動態列,另一個是更「關係」的版本,我將每個版本都拉回自己的數據集中,並且與另一個版本相關。這是非常可能的,但我似乎無法在SSRS中找到一種方式來將這些行數據表示爲列(實質上是它們的樞軸) – JoshReedSchramm 2009-05-25 17:11:06

回答

9

只要你知道列的最大數量,這是可能的一種時尚後,要做到這一點。

首先,從查詢名稱與一個結果列,所以你可以把它傳遞到查詢或得到它。其次,只需構建報告就好像它有最大數量的列一樣,如果它們是空的,就隱藏它們。

例如,我必須建立一個報告,將長達一年的報告月度銷售數字,但幾個月不一定在一月開始。我把一個月的名字傳回一列,然後是我的報告中的數字。在.rdl上,我創建了12組列,每個可能的月份一列,並且只使用表達式來隱藏列,如果列是空的。結果是報告似乎擴展到所需的列數。

當然,它並不是真正的動態,它可以在你不需要知道上限的情況下儘可能擴大。

+0

這正是我最終做的。不幸的是,該項目得到了報廢,所以我從未更新過這個答案,並忘記了我做了什麼。謝謝。 – JoshReedSchramm 2010-08-14 12:49:43

0

我有必要在過去,我得出的結論做,這是「你不能」,但我還不能肯定這一點。如果你找到解決方案,我會聽到它。

想到的一個問題是,你需要定義使用你會從存儲過程返回的列的名稱的報告,如果你不知道這些名字或有多少是,你如何定義報告?

關於如何做到這一點的唯一想法是通過C#動態創建報告定義(.rdl文件),但是當時我無法找到MS API來完成此操作,而我現在懷疑一個存在。我找到了一個開源的,但我沒有追求這條路線。

+0

將標記作爲正確的答案,因爲我們從未最終解決這個給定平臺的問題我們受到限制。我們最終改變了要求。 – JoshReedSchramm 2010-06-24 18:58:25

4

構建2相關數據集,第一個用於報告內容,第二個用於列標籤列表。

報表內容的數據集必須具有固定數量的列和名稱。您可以分配一些最大數量的列。

在這個例子中,我將前兩列固定或始終可見,最多4列可通過多值參數進行選擇顯示,或取決於查詢條件。和往常一樣,我們也可能有一個總數。因此,它可能看起來像這樣:

Fixed01, Fixed02, Dyna01, Dyna02, Dyna03, Dyna04, Total 

其值的第二個數據集將是這樣的:

Name Label 
---- ----- 
Dyna01 Label01 
Dyna02 Label02 
Dyna03 Label03 

我省略了第4個標籤,以證明並非所有列正在使用的一某些查詢條件。請記住,這兩個數據集都與同一個查詢有關。

現在創建一個名爲@columns的參數;用第二個數據集填充其可用值和默認值。

對於每個那些4個動態的列,設置列可見性用下面的表達式:

=IIf(InStr(join(Parameters!columns.Value,","),"Dyna01"),false,true) 

和每個他們的列標題文本框的,使用下面的表達式:

=Lookup("Dyna01", Fields!Name.Value, Fields!Label.Value, "dsColumns") 

至於總計,這裏是它的能見度表達式:

=  IIf(InStr(join(Parameters!columns.Value, ","), "Dyna01"), false, true) 
AndAlso IIf(InStr(join(Parameters!columns.Value, ","), "Dyna02"), false, true) 
AndAlso IIf(InStr(join(Parameters!columns.Value, ","), "Dyna03"), false, true) 
AndAlso IIf(InStr(join(Parameters!columns.Value, ","), "Dyna04"), false, true) 

這裏是它的價值觀:

= IIf(InStr(join(Parameters!columns.Value, ","), "Dyna01"), Fields!C01.Value, 0) 
+ IIf(InStr(join(Parameters!columns.Value, ","), "Dyna02"), Fields!C02.Value, 0) 
+ IIf(InStr(join(Parameters!columns.Value, ","), "Dyna03"), Fields!C03.Value, 0) 
+ IIf(InStr(join(Parameters!columns.Value, ","), "Dyna04"), Fields!C04.Value, 0) 

就是這樣,希望它有幫助。

獎金,即第二個數據集,dsColumns,也可以容納其他列屬性,如:顏色,寬度,字體等

0

現在如果列數不確定,比如說我的日期列名非常符合報告的選擇標準, 例如列可以是: 名稱,[2013-05-03],[2013-05-04],[2013-05-05] .....

相關問題