最近在查SSRS的一些文章,看到MSDN在有一篇不錯的文章,許多圖表設置都有說明,共享給大家。。
其中有說明在SSRS中如果去寫條件表達寫和報表屬性中的“自定義代碼”,文章相對比較長,需要大家耐心的查閱。
簡介
本白皮書講述如何在 Microsoft SQL Server Reporting Services 報表中設計圖表。本文分為幾部分並引用特定的報表示例;它們包含在示例項目下載中。
第一部分為數據准備,此部分主要包括有關准備數據的特定信息、技巧和見解。第二部分為圖表標簽,此部分講述如何應用標簽設置來改進圖表和控制視覺外觀和效果。
示例圖表和報表部分講述如何充分利用 SQL Server Reporting Services 內置圖表功能的特定示例,有時還包括高級示例。其中有些示例需要根據所提供的分步說明進行仔細研究。為方便起見,還包括了功能完備的示例報表。這些示例報表基於 SQL Server 2005 AdventureWorks 示例數據庫和 Northwind 示例數據庫。
關於數據准備和圖表標簽的信息可幫助您更好地理解這些示例。當您研究這些示例時,您會發現偶爾跳回到第一部分所介紹的特定圖表標簽主題很有用。
數據准備
圖表提供了一種實現數據可視化的方法。與冗長的數據列表相比,圖表可以更有效地傳遞信息。在創建圖表前花費時間認真地准備和理解數據,將有助於快速高效地設計圖表。Reporting Services 圖表數據分為三個區域:值、類別組和系列組。有關詳細信息,請參閱 SQL Server 2005 Books Online 的 SQL Server Reporting Services 部分中的使用圖表數據區域。
圖表與矩陣非常相似:
-
圖表的類別組相當於矩陣的列組。
-
圖表的系列組相當於矩陣的行組。
-
圖表的值相當於靜態矩陣的行組。
-
圖表的數據值或數據點相當於矩陣的單元。
准備圖表的數據集查詢時請牢記以下幾點:
-
圖表值沿數字 Y 軸顯示。請確保作為值所使用的字段為數字數據類型(與包含格式化數字的字符串不同)。
-
X 軸的值根據圖表類別組的值或組標簽(如果組標簽已顯式定義)來確定。X 軸支持兩種模式(將在 X 軸類別模式和標量模式中詳細論述)。如果希望使用 X 軸標量模式,請確保用於類別組表達式的字段和/或表達式的計算結果為數字數據類型或 DateTime 對象。
-
您可以隨意使用任意數量的圖表。圖表同其他數據區域(如矩陣或表格)一樣,綁定於一個特定的數據集。可以在數據集查詢中使用“連接”和“聯合”以包含數據集中的所有必需數據。
-
如果圖表置於表組頭或組尾中,或置於矩陣單元中,則傳遞到圖表控件中的數據會限制為構成該組的數據的子集。圖表不能置於表的細節行中,因為只引用一個數據行。
-
若圖表中數據過多(如幾千個數據點),則解釋起來會很困難,除非使用散點圖來顯示數據點的值和群集的分步。如果詳細級別的數據粒度並非必需或沒有用處,則可以考慮在數據集查詢中預先聚合數據。
圖表標簽
本節包含下列圖表標簽主題。當您研究下節中的示例時,您會發現偶爾跳回到本節所介紹的主題很有用。
-
X 軸類別模式和標量模式
此節說明兩種 X 軸模式之間的顯著區別。可以使用 CategoryAxisSettings 示例報表作為試驗的起點。
-
軸標簽
軸標簽部分對應用標簽設置及在運行時這些設置如何影響圖表的視覺外觀進行深入討論。
-
數據點標簽和圖例標簽
此節講述如何通過添加數據點標簽和圖例標簽來改進圖表。
X 軸類別模式和標量模式
X 軸有兩種模式。可使用“圖表屬性”對話框中“X 軸”選項卡上的“數值或時間刻度值”選項來設置模式。
-
類別模式
類別組表達式的值確定 X 軸的各個類別。標簽僅針對在數據中的實際類別顯示。在類別模式中,組內的排序順序和顯式排序表達式很重要,因為圖表控件將不再對類別重新排序。針對 X 軸所定義的格式代碼僅在組表達式或組標簽表達式(如果已顯示定義)計算結果為非字符串對象時才會應用。
如果存在多級類別分組,則會顯示類別的分組跨度。
-
標量模式
X 軸的值范圍由最小和最大類別組表達式的值決定。因此,為了可以比較和排序,組表達式的值必須為數值或 DateTime 值。數據中的間隙(例如,使用 DateTime 類別分組卻只有七月和九月的數據)在 X 軸上顯示,類別則按比例繪制到數字或 DateTime 軸。在標量模式中只允許一個類別分組。
圖 1A 和 2A 中的圖表顯示相同四周的訂單數據。
圖 1A 中的類別軸模式
由於在底層數據集中沒有周末(周六和周日)的訂單數據,因此在圖 1A 中未顯示該類別。示例使用兩種類別分組,如圖 1B 所示。內部組表達式使用 =Day(Fields!OrderDate.Value) 來按天分組。外部組表達式使用 =Month(Fields!OrderDate.Value) 來按月分組。
注意 外部組標簽表達式定義為 =MonthName(Month(Fields!OrderDate.Value)),該表達式使用月名作為分組跨度的標簽。
圖 1C 顯示了 X 軸屬性的設置。在類別模式中,最小、最大和間隔的語義均基於類別索引。因為沒有指定任何顯式軸的屬性,所以所有類別的數據均顯示一個標簽。
圖 2A 中的標量軸模式
標量模式中的 X 軸顯示數值或 DateTime 值。X 軸涵蓋了最小值和最大值范圍之間的全部值。因此,圖 2A 包含周末對應的間隙,因為它們沒有訂單數據。
在標量模式下使用 X 軸時僅允許一個類別分組。類別分組的值必須計算得出數值或 DateTime 值。X 軸標簽的格式由 X 軸上的格式字符串設置確定,本例中為 MMM dd。圖 2B 顯示了 X 軸屬性的設置。
有關數字和 DateTime 格式字符串的詳細信息,請參閱 Microsoft Developer Network (MSDN) 上 .NET Framework 開發人員指南中的以下頁面:
軸標簽
Y 軸標簽始終基於數值。如果未指定顯式軸設置,則 Y 軸使用自動縮放模式,如下所述:
-
Y 軸的最小值根據所有數據點中最低的 Y 值而定。如果最小的數據值不是整數值而是雙精度值(比如 3.75)且關閉了側邊距,則您會發現 Y 軸標簽未四舍五入為整數(例如,間隔為 1:3.75、4.75、5.75 等等)。
-
Y 軸的最大值根據所有數據點中最高的 Y 值自動確定,除非顯式指定最大值。
-
Y 軸的主要間隔根據數據值自動確定(在圖 3 中自動主要間隔為 20)。
-
Y 軸的次要間隔將主要間隔分成若干段(在圖 3 中自動次要間隔為 4;因此 20 / 4 = 5 個次要間隔段構成一個主要間隔段)。
-
由於 Y 軸的值始終為數字,所以可以直接應用數字格式字符串。此設置會應用於所有已生成的 Y 軸標簽。
X 軸模式
如先前部分所述,X 軸有多種模式。根據不同的模式,會提供不同的格式選項,軸設置(最小值、最大值、交點等等)也可能有不同的解釋。下面對不同的格式選項進行說明:
-
基於數字類別組值的標量模式
采用這些設置,X 軸非常類似於 Y 軸。軸設置(如最小值、最大值、交點、主要間隔及次要間隔)被解釋為整數值或雙精度值。
由於 X 軸的值為數字,所以可以直接應用數字格式字符串。
-
基於 DateTime 類別組值的標量模式
軸最小值:如果軸最小值設為常量(比如 2005)或具有整數結果的表達式(比如 =2005),則此值會被解釋為該年的第一天(如 2005 年 1 月 1 日)。
軸最大值:整數設置被解釋為該年的最后一天(如 2005 年 12 月 31 日)。
軸交點:設置被解釋為年中。
主要間隔和次要間隔:間隔設置被解釋為天(相當於 OADate 格式)。例如,5 表示 5 天的間隔,0.5 表示半天(12 小時)的間隔。
對於標簽格式設定,可以直接應用標准 DateTime 格式字符串。
-
類別模式(未選擇數值或時間刻度值選項)
圖表控件基於類別組表達式值,將類別在多個系列中匹配(例如,2006 系列中類別為一月的數據將與 2007 系列中類別為一月的數據處於同一集合。
只有類別組表達式(或如圖 4 中的標簽表達式)的計算結果為數字或 DateTime 數據類型時,X 軸選項卡上的格式字符串設置才有效。通常使用類別模式時,類別組表達式的計算結果為字符串對象,因此隨后應用的格式代碼無效。可添加或更改類別組標簽表達式,或直接通過標簽表達式應用格式設置,如圖 4 所示。
注意 在類別模式中,最小值、最大值和間隔的語義均基於“類別索引”。例如,將 x 軸最小值設置為 2 意味着不會顯示第一個類別的數據。將主要間隔設置為 5 意味着在 x 軸上僅每隔 4 個類別顯示標簽。這在 x 軸有很多類別(和標簽)且類別的底層語義實際為數字時很有用。
注意 Reporting Services 2005 也允許在“X 軸”和“Y 軸”選項卡中顯示的所有輸入字段(“標題”、“最小值”、“最大值”、“主要間隔”、“次要間隔”等)中使用表達式。
軸標簽格式設置問答
-
問( Y 軸):如何可在 y 軸上實施“准確的”基於整數的標簽?
答:如果未指定軸設置,則圖表控件將基於數據點 y 值自動確定這些值。如果數據點的最小值/最大值不是整數,y 軸標簽則可能使用雙精度值。
不過,如果至少有一個軸設置(如“最小值”或“交點”)被報表作者顯式指定為整數值,則圖表控件會將自動檢測到的值圓整為最接近的整數值,然后顯示“准確的”標簽。例如,可動態設置 y 軸的最小值,並如此進行圓整:=Floor(Min(Fields!Freight.Value))。
-
問(標量 x 軸):啟用“數值或時間刻度值”導致在運行時圖表未顯示任何數據點。哪里出現了問題?
答:很可能是因為類別組表達式的計算結果為字符串而不是數值。相應更改類別組表達式。如果不想更改獲取標量數據值而不是字符串值的查詢,還可在報表中使用 Microsoft Visual Basic 函數(如 CInt()、CDbl() 或 CDate())執行類型轉換。
-
問(類別 x 軸):如果類別數量增加,x 軸將變得擁擠,最終將不再繪制軸標簽。如何能夠控制類別模式下 x 軸的標簽數量?
答:圖表控件會嘗試自動定位 x 軸標簽以避免重疊標簽文本。默認情況下,每個類別在 x 軸上均具有一個標簽。可顯式設置 x 軸主要間隔設置以覆蓋此默認行為。例如,將主要間隔設置為 5 將僅每隔 4 個類別顯示標簽。
-
問( X 軸):X 軸標簽是如何自動定位的?
答:當前,內置的 Reporting Services 圖表僅允許自動定位以避免覆蓋 x 軸標簽。軸標簽的標簽方向(水平/垂直)取決於標簽字符串大小和可用空間。X 軸標簽可以一行水平顯示、以能夠換行的多行水平顯示或垂直顯示。當前並不支持以某一角度顯示 x 軸標簽或對單個 x 軸標簽位置顯式手動控制。
注意 有多個第三方圖表加載項,能夠對軸標簽進行更多控制。這些加載項可安裝在 Reporting Services 2005 上。
數據點標簽和圖例標簽
數據點標簽可專用於指出圖表中所有可見數據點中的某些值(如總體最小值或最大值)。
要啟用數據點標簽,請在“圖表屬性”對話框中編輯圖表值。這將打開“編輯圖表值”對話框,其中含有“點標簽”選項卡,該選項卡具有“顯示點標簽”選項。
定位數據標簽
打開數據標簽時,默認情況下,每個數據點將顯示一個標簽。數據點標簽將自動定位以避免重疊標簽。如果數據點標簽重疊,圖表控件會將重疊標簽移至圖表繪圖區的空閑空間中(並畫出輪廓以將數據點標簽與數據點值相連)。如果太多標簽重疊,圖表控件將刪除個別數據點標簽,直至有足夠的空間可放下其余標簽而不會重疊。
除了自動定位外,還可使用顯式“手動標簽定位”(頂部、靠左、居中等)。不過,視數據值以及數據點標簽的長度和大小而定,這可能導致重疊標簽。
默認情況下,數據點標簽將顯示數據點的 y 值。也可指定顯式數據點標簽表達式和數字或 DateTime 格式字符串來自定義標簽。通常,會使用類似於用於計算數據點值表達式中 y 值的表達式執行數據點標簽計算。例如,要在該部分所占的相對份額大於總量的 5% 時只顯式數據點標簽,可使用類似以下步驟中代碼的數據點標簽表達式。
-
對於數據點標簽表達式,請使用以下表達式:
=Code.GetLabel(Sum(Fields!Sales.Value), Sum(Fields!Sales.Value,"SalesChart"))
-
打開“報表屬性”對話框,然后單擊“代碼”選項卡。在“自定義代碼”選項中添加以下 GetLabel(…) 自定義代碼函數。
Public Function GetLabel(ByVal currentValue As Double, ByVal totalValue As Double) As String If currentValue / totalValue < 0.05 Then Return " " Else Return Format(currentValue / totalValue, "P1") End If End Function
代碼解釋
GetLabel() 函數有兩個參數。第一個參數提供該特定數據點的當前值。第二個參數提供總量計算。此函數計算相對百分比。如果它小於 5% (0.05),將返回一個具有空格的字符串。
注意 返回一個空值或空字符串將顯示自動生成的默認標簽。如果相對百分比至少為 5%,則將返回百分比格式字符串(格式字符串:P1)。
可在此白皮書隨附的 PiePercentage 示例報表中找到應用此種格式的示例。
餅圖和圓環圖數據標簽位置
對於餅圖和圓環圖,只有兩種數據點標簽位置:內部(將數據點標簽位置設置為“自動”或“居中”)和外部(任何其他標簽位置)。圖 5(以及 PieSimplePercentage 示例報表)中顯示了外部標簽示例。
可如圖 6 所示指定餅部分標簽的位置。
圖例標簽
通常,基於動態系列組值或標簽(如在組上顯式指定)和(靜態系列)值的名稱確定圖例標簽。因為圖表實質上是分組層次結構的扁平化表示,所以圖例標簽基於該層次結構生成。
例如,如果圖表含有兩個系列分組(外部的定義為 OrderYear,內部的定義為 OrderQuarter),且僅有一個圖表值(如 Actual),圖例標簽將通過將組值和圖表值串聯生成,如表 1 所示。
表 1
OrderYear 標簽 |
OrderQuarter 標簽 |
圖表值系列標簽 |
生成的圖例標簽 |
---|---|---|---|
2006 |
Q1 |
Actual |
2006 – Q1 – Actual |
2006 |
Q2 |
Actual |
2006 – Q2 – Actual |
假設我們再添加一個名為 Budget 的圖表值。使用與上一示例相同的數據,所生成的標簽將如表 2 所示。
表 2
OrderYear 標簽 |
OrderQuarter 標簽 |
圖表值系列標簽 |
生成的圖例標簽 |
---|---|---|---|
2006 |
Q1 |
Actual |
2006 – Q1 – Actual |
2006 |
Q1 |
Budget |
2006 – Q1 – Budget |
2006 |
Q2 |
Actual |
2006 – Q2 – Actual |
2006 |
Q2 |
Budget |
2006 – Q2 – Budget |
注意 通過將組標簽表達式設置為返回空字符串 (=""),可隱藏層次結構中的單個內部級別。這將從生成的圖例標簽中刪除該組級別。
空數據點和標簽
以下情況您可能會覺得很熟悉。您構建了一個具有一個數據系列的圖表,數據點標簽已打開,此圖表看上去很好。您決定添加一個動態系列組以便該圖表顯示多個數據系列。可此時該圖表卻具有額外標簽(用於空數據點)。
在底層數據集對每個系列/類別組合都不包含數據值時,會出現空數據點。此圖表實質上等同於一個具有空單元的(稀疏)矩陣。
可刪除空數據點的標簽。使用此白皮書隨附的 EmptyDataPointLabels 示例報表中所示的方法(另請參閱圖 7),而不打開數據點標簽和使用默認標簽。以下是執行此操作的示例代碼。
-
使用 Count(…) 函數確定為此數據點聚合多少底層數據集行。如果計數為零,則這是個空數據點。通過實際的標簽值將計算值傳入自定義代碼函數:
=Code.GetLabel(Avg(Fields!UnitsInStock.Value), Count(Fields!UnitsInStock.Value))
-
打開“報表屬性”對話框,然后單擊“代碼”選項卡。在“自定義代碼”選項中添加以下 GetLabel(…) 自定義代碼函數。
Public Function GetLabel(ByVal datapointValue As Double, ByVal count As Integer) As String If count = 0 Then Return " " Else Return Format(datapointValue, "N1") End If End Function
數據點標簽格式設置問答
-
問:在圖表充滿數據點和標簽時,靠近數據點標簽的灰線(稱為輪廓)有何用途?
答:如果數據點標簽位置設置為“自動”,則圖表控件會將標簽移至空閑空間區中以避免重疊數據點標簽。這些輪廓將通過數據點位置連接數據點標簽。
可使用手動定位避免此情況。使用表達式,可通過提供具有空格 (=" ") 的字符串的計算結果動態隱藏大部分數據點標簽。否則,將在打開數據點標簽時顯示默認標簽。
-
問:標簽格式設置可使用 Dundas 關鍵字嗎?
答:可以,可對數據點標簽使用內置的 Dundas 關鍵字。不過,通常建議您不要同時將 RDL 表達式和 Dundas 關鍵字同時使用(RDL 表達式將首先被計算,Dundas 函數將由圖表控件隨后進行解釋)。表 3 含有有用的 Dundas 關鍵字的列表。
表 3
Dundas 關鍵字 |
替換為 |
---|---|
#VALX |
數據點的 X 值 |
#VAL |
數據點的 Y 值 |
#VALY、#VALY2、#VALY3 等 |
第一個 y 值、第二個 y 值、第三個 y 值等 |
#INDEX |
系列內的數據點索引 |
#TOTAL |
當前系列中所有 y 值的總計 |
#VALY{C2} |
使用 C2 格式字符串(貨幣格式)設置格式的數據點的 Y 值 |
示例圖表和報表
本節包含了創建不同類型圖表和報表的示例。您可能會發現在研究這些示例時,有時回到先前小節中介紹的圖表標簽主題會很有幫助。以下是本節介紹的一些示例。
-
柱形圖和折線圖混合圖表
大體介紹了組合圖表和 SalesCostTarget 示例報表。
-
Pareto 圖表
實現圖表的 Pareto 可視化(ParetoChart 示例報表)。
-
移動平均計算
圖表中時間系列趨勢的計算和可視化(MovingAverage 示例報表)。
-
自定義圖表調色板和圖例
如何自定義圖表中的顏色(CustomColorPalette 示例報表)。
-
餅圖和圓環圖
使用餅圖和圓環圖時要注意的具體信息。
-
添加圖表數據表
說明如何將聚合的圖表數據鏈接到明細數據(PiePercentage 示例報表)。
-
散點圖和氣泡圖
設計散點圖和氣泡圖的重要提示(BubbleChart、StepFunctionChart)。
-
表格內嵌圖表
也許您不需要復雜的圖表顯示,或者您必須在運行時處理未知數量的數據,但仍希望有用、良好的顯示。本節介紹了實現此目標的途徑 (TableInlineCharts)。
-
圖表可擴展性和手動創建圖表
討論在內置圖表不夠時有何選擇。
在下載文件中,與此白皮書一起還包含了基於 SQL Server 2005 AdventureWorks 示例數據庫和 Northwind 示例數據庫的一些示例報表。
柱形圖和折線圖混合圖表
將一些數據系列顯示成柱形並將其他數據系列顯示為線條的圖表常用於說明總體趨勢、目標值或用於深入分析圖表中的數據。本節介紹了關於如何在 Reporting Services 中設計這種圖表的通用信息。
創建柱形圖和折線圖混合圖表:
-
將一個圖表添加到報表,並將圖表類型設置為“柱形圖”。
-
通過添加類別組和/或系列組以及數據值來設計圖表。
-
對於要用折線顯示的數據值,在“報表設計器”中執行以下步驟:
-
打開“圖表屬性”對話框。
-
單擊“數據”選項卡。
-
選擇要顯示為折線的數據值,然后單擊“編輯”。
-
在“編輯圖表值”對話框中,單擊“外觀”選項卡,再選擇“將數據繪制為線條”(見圖 8)。
圖 8. 在柱形圖中將數據系列繪制成折線
-
將常數或動態目標值添加到圖表:
-
設計圖表。
-
在“圖表屬性”對話框中的“數據”選項卡上,添加新的數據值(例如,Target)。
-
設置目標值(圖 9 中的示例使用了橫跨所有類別的常數目標值 100000)。請確保使用以 = (等號)開始的表達式。否則,不會將目標值解釋為數字值。
圖 9. 添加目標值
SalesCostTarget 示例報表(見圖 10)使用此方法在圖表中添加了一條簡單的銷售目標線。
注意 由於折線圖系列的線條是通過連接多個類別的數據點來繪制的,因此只有在類別分組至少有兩個在運行時不同的組實例值時才能看到線條。
注意 如果圖表包含一個或更多的系列組,目標數據值對於每個系列組實例都相同。如果每個組實例都具有特定的目標值,這可能會很有用。
如果您只希望將一個全局目標值用於所有系列,可以按以下方式動態設置目標數據值:
=iif(Fields!<SameFieldAsSeriesGroup>.Value = First(Fields!<SameFieldAsSeriesGroup>.Value, <ChartName>), <TargetValue>, Nothing)
具體的表達式實例可能與以下代碼類似:
=iif(Fields!Year.Value = First(Fields!Year.Value, "SalesChart"), 100000, Nothing)
Pareto 圖表
Pareto 圖表概括並顯示了數據組之間差異的相對重要性。Pareto 圖表可將“致命的少數”和“有用的多數”區別開來。還可將 Pareto 圖表定義成柱形以降序排列的柱形圖,以識別最大的改進機會。
盡管內置的 Reporting Services 圖表目前並不直接支持 Pareto 圖表,但是您可以使用 Reporting Services 2005 功能並編寫一些代碼來創建 Pareto 圖表。本節深入解釋了此白皮書附帶的 ParetoChart 示例報表。
以下是 ParetoChart 示例報表的方案描述。
SQL Server 2005 AdventureWorks 數據庫包含關於銷售雇員的數據。我們對分析以下與我們的銷售雇員有關的信息特別感興趣:
-
如果以獲得去年最高獎金的銷售雇員為基礎,Pareto 分析會是什么樣子?(見圖 11 中的橙色線。)
-
去年哪些雇員領取到最高獎金?這與他們今年的總銷售額相比結果如何?(見圖 11 中的藍色和綠色圓柱。)
-
將去年的獎金與今年的銷售額相比較,在銷售業績上有沒有重大變化?雖然可通過比較藍色和綠色的圓柱對此做出解答,但圖 11 中橙色和紅色 Pareto 線條的巨大差距使結果更加明顯。 對於某個具體的銷售雇員,我們想深化其過去和現在的銷售業績以根據多年的數據分析歷史趨勢。
這一點可通過增加對銷售數據值(圖 11 中的綠色圓柱)的鑽取操作來實現,因為通過鑽取操作可詳細分析個別銷售人員的數據而完成趨勢分析。鑽取報表(MovingAverage 示例報表)將在下一節詳細說明。
構建 Pareto 圖表報表
-
定義檢索必需銷售數據的查詢。
該查詢將根據獎金值對每個銷售人員的數據進行預排序。它不會檢索獨立的銷售訂單,因為此報表不需要它們。這樣也可使數據集盡可能小。
-
設計總體圖表布局。
將柱形圖添加到報表中。若要分析每個銷售人員的數據,需基於銷售人員添加一個類別組(分組依據 =Fields!SalesPersonID.Value)。對於類別標簽,顯示銷售人員的名和姓。這一點可通過將類別組標簽表達式設為以下形式來實現。
=Fields!FirstName.Value & " " & Fields!LastName.Value
-
准備圖表以進行 Pareto 計算。
我們將 RunningValue(…) 函數用於計算。
注意 僅在從 Reporting Services 2005 開始的圖表中才支持 RunningValue 函數。
與矩陣相似,RunningValue 函數需要圖表中明確的分組范圍,以確定運行值是否應跨越某個特定數據系列的所有類別運行(實質上是水平方向),或者是否應跨越某個特定類別的所有數據系列運行(比較少見)。
對於 Pareto 計算,我們需使用 RunningValue 函數以使用一個系列組名稱作為其“重置”范圍(因此跨越所有類別運行)。由於我們還沒有用於此特定圖表的系列組,因此我們可只根據常數值(例如 1)添加一個假系列組。
組表達式:1
標簽表達式:=""(從生成的圖例標簽中隱去系列標簽)
結果將產生一個數據系列,同時提供一個明確的系列范圍名稱。
-
將獎金和銷售數據值添加為圓柱。
通過將相應的數據集字段拖到圖表上,可將 Bonus 和 SalesYTD 的數據值添加到圖表中。
注意 本示例對獎金和銷售值使用了 Sum() 聚合函數。
我們想將圖例放在圖表繪圖區的左上角。因此,我們希望縮放 y 軸,以便圖表中顯示的最大數據點值不超過 y 軸總高度的 75%。
我們通過將獎金計算按 75% 的系數縮放實現此目標:
=0.75 * Sum(Fields!Bonus.Value) / Max(Fields!Bonus.Value, "SeriesGroup")
我們對銷售計算執行相同的操作:
=0.75 * Sum(Fields!SalesYTD.Value) / Max(Fields!SalesYTD.Value, "SeriesGroup")
-
將 y 軸設置為百分數軸。
在上一步中,我們將獎金計算和銷售計算設置為百分比計算(相對最大值的數量)。
將 y 軸的格式字符串設為 P0 將應用百分比格式(實際 y 軸將在 0.0 和 1.0 之間按比例划分)。為獲得良好的間隔,我們將 y 軸的主要間隔設置為 0.2 以設置 20% 的間隔。
-
將獎金和銷售的 Pareto 計算添加為線條。
RunningValue() 函數在重置之前一直進行累積計算。我們希望永不重置。由於我們起初沒有明確的系列組,因此我們在步驟 3 添加了一個系列組。
Pareto 計算是指累加和除以總值。對於獎金 Pareto 計算,我們使用以下表達式。
=RunningValue(Fields!Bonus.Value, Sum, "SeriesGroup") / Sum(Fields!Bonus.Value, "SeriesGroup")
我們對銷售 Pareto 計算執行相同的操作:
=RunningValue(Fields!SalesYTD.Value, Sum, "SeriesGroup") / Sum(Fields!SalesYTD.Value, "SeriesGroup")
-
添加針對銷售數據值的鑽取操作。
要啟用對 MovingAverage 示例報表中單個銷售人員的銷售數據進行鑽取分析,我們需要添加針對銷售數據點的鑽取操作(見圖 12)。由於我們只對某一個特定的銷售人員感興趣,因此我們將 SalesPersonID 鑽取參數設為當前類別組的值。在本例中為當前銷售人員 ID:=Fields!SalesPersonID.Value。
圖 12. 添加鑽取操作 -
通過添加格式、數據點標簽和圖例完成圖表。
移動平均計算
移動平均是用於分析時間系列數據的一系列類似的統計技術之一。可對任何時間系列計算移動平均系列。
雖然內置的 Reporting Services 圖表不直接支持移動平均計算,但是您通常可編寫代碼來執行此類計算。本節深入講解了 MovingAverage 示例報表。
該示例報表與上一節有關 Pareto 圖表中說明的方案有關。對於某個具體的銷售雇員,我們想分析其過去和現在的銷售業績以根據多年的數據分析歷史趨勢。移動平均可用於消除短期波動,以此強調長期走向或周期。
MovingAverage 示例說明了如何計算簡單的移動平均數(先前 n 個數據點的未加權平均數)。在這個具體示例中,我們使用了先前三個月的銷售數據。請參見圖 13。
構建報表
-
定義查詢以便其檢索必要的銷售明細數據。
該查詢需經過參數化,以便只檢索一個特定銷售人員的數據。根據報表參數(由一個基於有效值列表的數據集填充)設置查詢參數。
-
設計總體圖表布局。
將柱形圖添加到報表中。對 x 軸使用類別模式,以便您能擁有兩個分組級別:在內部級別按月分組,在外部級別利用分組跨度按年分組。月份組使用以下的顯式組標簽表達式將月份格式化為縮寫的月份名稱。=Format(Fields!OrderDate.Value,"MMM")
-
准備圖表以進行移動平均計算。
如在 Pareto 計算的步驟 3 中一樣,我們使用 RunningValue 函數。移動平均計算不能跨越類別重置,因此我們根據 SalesPersonID 添加系列分組。由於已基於特定的銷售人員對查詢進行過參數化,因此將只有一個銷售人員系列。該系列組標簽表達式被設為 =Fields!FullName.Value,因此圖表的圖例項將包含銷售人員的全名。
-
將銷售計算添加為圓柱。
將 TotalDue 數據集字段拖到圖表值放置區以根據 Sum() 聚合添加銷售數據值。若要將詞“Sales”連接到系列組標簽(如步驟 3 中所定義,該組標簽為銷售人員的全名),我們可將數據值標簽顯式設置為 Sales。
-
添加移動平均自定義代碼函數。
下表說明了通過使用隊列進行移動平均計算的一個示例。“隊列內容”列顯示了一個具體月份的當前隊列內容。表的最后一列基於聚合添加到隊列和從隊列刪除的項來顯示 RunningValue 計算。表下方的代碼示例說明了此算法的實現。
表 4月份
銷售額
移動平均(2 個月)
定期運行值
隊列內容
刪除的隊列值
基於隊列的運行值
一月
20
不可用
20
20
不可用
0
二月
10
15
35
20, 10
不可用
0+ 15 = 15
三月
24
17
59
10, 24
-20
15+ (24-20) /2 = 17
四月
16
20
75
24, 16
-10
17+ (16-10) /2 = 20
五月
12
14
87
16, 12
-24
20+ (12-24) /2 = 14
要實現基於隊列的 RunningValue,請將以下代碼添加到“報表屬性”對話框“代碼”選項卡的“自定義代碼”部分。
Private queueLength As Integer = 3 Private queueSum As Double = 0 Private queueFull As Boolean = False Private queue As New System.Collections.Generic.Queue(Of Double) Public Function MovingQueue(ByVal currentValue As Double) As Object Dim removedValue As Double = 0 If queue.Count >= queueLength Then removedValue = queue.Dequeue() End If queueSum += currentValue queueSum -= removedValue queue.Enqueue(currentValue) If queue.Count < queueLength Then Return Nothing ElseIf queue.Count = queueLength And queueFull = False Then queueFull = True Return queueSum / queueLength Else Return (currentValue - removedValue) / queueLength End If End Function
-
將移動平均銷售值添加成線條。
移動平均的數據值計算將基於由 MovingQueue 自定義代碼函數返回的值使用 RunningValue 函數。MovingQueue 函數將為累計的 RunningValue 運算計算調整值。通過使用以下代碼來實現這一點。
=RunningValue(Code.MovingQueue(Fields!TotalDue.Value), Sum, "SalesPerson")
注意 要在一個圖表內運行多個移動平均計算,必須確定在系列結尾重置隊列的方式,或使用多個隊列。例如,您可以使用隊列(這些隊列基於系列組值進行索引,並作為附加參數傳遞給 MovingQueue 函數)的散列表。
注意 一個圖表不能跨過多個頁面。因此,需將變量聲明為專用非共享變量。
若要在另一個跨過多個頁面的數據區域(例如列表、表格或矩陣)中使用移動平均計算,必須將變量聲明為共享(即,靜態)變量以越過分頁維持狀態。然而,由於此時使用靜態變量,如果兩個人同時運行報表,將存在其中一個人破壞另一個人的變量狀態的可能性,但這種可能性很小。如果您需要徹底回避這種可能性,可基於請求用戶的 ID (=Globals!UserID) 將每個共享變量創建到一個散列表中。
自定義圖表調色板和圖例
圖表使用有 10 到 16 種不同色彩的預定義內置調色板。從 Reporting Services 2000 Service Pack 1 (SP1) 開始,您就可以覆蓋默認色彩。若要將色彩值指定為常量或基於表達式的值,請單擊外觀屬性上的“系列樣式”按鈕以獲取“編輯圖表值”對話框中的數據值。例如,您可以通過此操作來基於特定條件(如當前系列中的最小值或最大值)突出顯示值。
注意 如果您不想定義一個完整的自定義調色板,您可以覆蓋單個數據點的色彩。請使用表達式返回一個具體色彩值(以便覆蓋)或返回“空值”,這樣可從底層內置調色板拾取當前色彩。
例如,您想以紅色突出顯示 y 值為負數的所有數據點值。對於所有其他數據點,您希望使用默認色彩顯示。為此,請選擇“編輯數據值”並單擊“外觀”選項卡。單擊“系列樣式”按鈕以打開“樣式屬性”對話框。單擊“填充”選項卡。在填充色彩樣式屬性中輸入以下表達式。
=iif(Sum(Fields!Sales.Value - Fields!Cost.Value) < 0, "Red", Nothing))
注意 如果您將填充色彩設置為一個常量值,此色彩會應用於具體數據系列的所有數據點。
圖表圖例使用色彩字段將圖例項匹配到可見數據點。圖例只能對每個圖例項(數據系列)顯示一個色彩字段;因此,它顯示系列內第一個數據點的色彩。在您使用表達式動態確定系列內單個數據點色彩時請牢記這一點;即圖例項總是顯示第一個數據點的實際色彩。
雖然內置於 Reporting Services 圖表中的圖例易於使用,但是缺乏靈活性。例如,圖例會占用圖表內的空間。如果將圖例置於繪圖區外,在圖例有所增長時,圖表繪圖區的尺寸會相應地縮小。
您可以通過使用圖表或矩陣生成您自己的自定義圖例來獲得更大的靈活性以更好地控制圖例。若要使圖表中的色彩與自定義圖例同步,最簡單的方法是定義您自己的自定義圖表調色板。CustomColorPalette 示例報表實現了一個自定義調色板和一個自定義圖例。請參見圖 14。
創建自定義調色板
-
定義圖表系列組和類別組。
默認情況下,每個圖表數據系列都分配有一種色彩。此色彩基於選中的圖表調色板。在本例中,我們要基於系列組實例值覆蓋這些色彩。
-
定義自定義調色板並添加自定義代碼。
colorPalette 變量存儲自定義調色板的定義,該調色板有 15 種不同的色彩。count 變量跟蹤不同分組值的總數,以便在超出自定義調色板中的不同色彩數時回繞。mapping 散列表跟蹤分組值和色彩之間的映射。這保證了同一數據系列中的所有數據點具有相同的色彩。隨后,該表用於同步自定義圖例色彩與圖表色彩。將以下代碼加入報表的自定義代碼窗口。
Private colorPalette As String() = {"Green", "Blue", "Red", "Orange", "Aqua", "Teal", "Gold", "RoyalBlue", "MistyRose", "LightGreen", "LemonChiffon", "LightSteelBlue", "#F1E7D6", "#E16C56", "#CFBA9B"} Private count As Integer = 0 Private mapping As New System.Collections.Hashtable() Public Function GetColor(ByVal groupingValue As String) As String If mapping.ContainsKey(groupingValue) Then Return mapping(groupingValue) End If Dim c As String = colorPalette(count Mod colorPalette.Length) count = count + 1 mapping.Add(groupingValue, c) Return c End Function
-
調用 GetColor() 函數將色彩分配給數據點。
從填充色彩樣式屬性調用 GetColor 函數。編輯數據值以打開“編輯圖表值”對話框並單擊“外觀”選項卡(圖 15)。單擊“系列樣式”按鈕並單擊“填充”選項卡。當前系列組值將作為參數傳遞給 GetColor 函數,將內部組實例值映射到色彩值時需要此函數。
圖 15. 指定明確的數據系列樣式注意 如果存在多個圖表系列組,您可以連接系列組值以創建一個在 GetColor 函數中使用的唯一標識符。以下代碼是一個示例。
=Code.GetColor(Fields!Country.Value & "|" & Fields!City.Value)
-
添加圖表圖例。
您可以使用內置的圖表圖例。或者,也可關閉內置的圖表圖例並按照下一操作過程中的步驟創建您自己的、有一個表格或一個矩陣數據區的自定義圖表圖例。
創建自定義圖例
-
將一個表格數據區域添加到報表。
將表格放到圖表旁並將其綁定到與圖表相同的數據集。
-
通過添加表格組在表格中反映圖表分組結構。
如果圖表使用系列分組,則通過添加基於與圖表系列組中組表達式相同的表格組來將它們添加到表格。然后添加圖表類別分組(如果存在)作為內部表格組。
一般而言,如果圖表有 m 個系列分組和 n 個類別分組,則您需要為自定義圖例添加 m+n 個表格組。
對於各個表格組,請確定只顯示組頭(它將包含圖例說明)。另外,請刪除表詳細信息行,除非您要使用表詳細信息行來模擬圖表數據表。
-
設計自定義圖例。
為自定義圖例的色彩字段添加一個矩形。例如,您可能會將其添加到第一個表格列。如步驟 2 所示,您將在表格中只有組頭行。矩形將加到最內部的組頭層級。
將矩形的 BackgroundColor 屬性設置為與用於圖表數據點的填充色彩的表達式等價的表達式。在最普通的情況下,該表達式會像以下代碼中一樣僅包含一個分組值。
=Code.GetColor(Fields!Country.Value)
對於圖例文本,可使用與類別及系列組/標簽表達式中相同的表達式,或進行實驗直到獲得您所要的圖例說明文本。
餅圖和圓環圖
數據點標簽和圖例標簽部分說明了如何為餅圖扇面設置內部和外部數據點標簽。本節說明了餅圖和圓環圖的幾個附加屬性。
與其他圖表類型不同,餅圖或圓環圖只有一個“分組維度”(即,一個數據系列)。若要在餅圖和圓環圖中使用兩個維度,就需要將圖表相互堆疊。
注意 在發布報表期間,Reporting Services 自動地將餅圖或圓環圖的系列組轉換成類別組以將數據顯示成一個數據系列。
餅圖常用於顯示數據點的相對百分數。一般而言,百分比值(例如,可將其顯示成數據點標簽)可通過用數據點值表達式除以整個圖表的總和來計算。以下代碼是一個相應的示例。
=Sum(Fields!Sales.Value) / Sum(Fields!Sales.Value, "SalesChart")
如圖 16 所示,表達式被作為一個數據標簽表達式添加。
默認情況下,餅圖扇面使用了黑色邊框以增強其可見性。但是,如在下一節的圖 17 所示,您可以使用特定的數據點外觀設置覆蓋邊框。如果您希望邊框的色彩與餅圖扇面的色彩一致,您必須使用上一節所述的自定義調色板。使用自定義調色板,您可以通過調用基於類別分組值分配色彩的自定義代碼函數為數據點(餅圖扇面)設置與邊框相同的色彩。
添加圖表數據表
您可能希望將明細數據添加到圖表中。直接將數據添加到圖表可能會使圖表更難以理解。可代之以數據表形式添加相應信息。
圖表是可用來形象化值的總體分布及識別關注區域(如,非常大及非常小的值)的一種非常有效的方法。讀者可能希望根據底層明細數據更詳盡地分析信息。
Reporting Services 提供以下三種方式在圖表數據點上添加互動操作:
-
使用“跳至報表”操作可基於當前系列/類別組值,通過將這些值作為鑽取參數值添加,鑽取到其他報表來顯示明細數據。
-
使用“跳至書簽”操作可跳至同一報表中的某部分(如數據表部分)。
-
使用“跳至 URL”操作可生成一個指向報表外的外部導航目標的超鏈接。
圖 17 顯示了包含在本白皮書中的 PiePercentage 示例報表的簡化版本。
創建數據表格
-
創建有自定義調色板的餅圖。
圖 17 中的餅圖有兩個類別分組。外部分組以訂單年度為基礎。內部分組以產品類別為基礎。定義自定義調色板,如在創建自定義調色板步驟中的步驟 2 所述。
由於存在兩個類別分組,我們使用以下表達式生成一個復合鍵,該鍵將被傳遞給 GetColor 函數。
=Code.GetColor(Fields!OrderYear.Value & Fields!ProdCat.Value)
如果我們對數據點填充色彩屬性和數據點邊框色彩屬性應用相同的 GetColor 函數調用,餅圖扇面將不顯示默認的黑色邊框。
-
僅為那些代表大於全部餅圖 4% 的餅圖扇面顯示數據點標簽。
要實現這一目的,請將以下函數添加到報表自定義代碼部分。重要的是為那些沒有標簽的餅圖扇面返回空白標簽字符串,否則圖表控件將為該扇面顯示默認標簽。(默認標簽是底層數據點值。)
Public Function GetLabel(ByVal currentValue As Double, ByVal totalValue As Double) As String If currentValue / totalValue < 0.04 Then Return " " Else Return Format(currentValue / totalValue, "P1") End If End Function
數據點的標簽表達式調用 GetLabel 函數以計算百分比值/標簽。
=Code.GetLabel(Sum(Fields!Sales.Value), Sum(Fields!Sales.Value, "SalesChart"))
-
為圖表創建數據表(矩陣)。
圖表僅按年度和產品類別顯示聚合的銷售數據。在數據矩陣中,我們希望以同樣的方式對數據進行分組。
我們添加矩陣數據區域並將其綁定到與圖表相同的數據集。然后,我們將 OrderYear 和 ProdCat 字段作為行組添加到矩陣上,並在矩陣單元中聚合 Sales 值。若要添加小計,可右鍵單擊矩陣中的組頭單元格並從上下文菜單中選擇“小計”。
注意 單擊矩陣標題中的綠色小三角形,選擇“小計”屬性,在這里您可以為小計單元格明確設置樣式屬性。例如,您可以用不同的背景色彩顯示小計單元格以從視覺上與其他數據相區別。
底層數據集提供了比圖表中顯示粒度更為細的數據粒度。我們可基於子類別添加另一個(內部)行組,以及添加季度和月份作為矩陣的列組來利用數據矩陣的優勢。
-
將切換明細添加到數據矩陣中。
要為特定組添加明細效果,請右鍵單擊組頭並編輯組屬性。在“組屬性”對話框的“可見性”選項卡上,選擇應切換當前組可見性的報表項名稱。通常在父組中選擇文本框的報表項名稱。如果不存在父組,可將文本框添加到矩陣角中,並將其用於在矩陣中關聯最外面的分組級別。
設置切換狀態的“初始可見性”選項也在組的“可見性”選項卡上進行設置。將此選項設置為“可見”意味着初始狀態為展開,而設置為“隱藏”意味着初始狀態為折疊。
-
調整初始切換圖像和切換狀態。
如果組的初始切換可見性狀態設置為“可見”,則切換該組的報表項上的切換圖像可能顯示一個加號 (+)。相反,要顯示減號 (-) 切換圖像,請右鍵單擊切換組的報表項;這通常是父組頭中的文本框。在上下文菜單中選擇“屬性”。在“文本框屬性”對話框中,選擇“可見性”選項卡並設置切換圖像的初始外觀。因為組切換可見性設置為“可見”,所以文本框的初始外觀應設置為“展開 (-)”,如圖 18 所示。
圖 18 調整切換圖像的初始外觀 -
添加書簽以連接圖表和數據矩陣(可選)。
啟用從圖表數據點到數據矩陣的書簽導航可分為兩步。第一步,在數據矩陣內部定義書簽 ID。第二步,定義圖表數據點上書簽導航操作的跳轉。
要在數據矩陣中添加書簽,請右鍵單擊 order year 行組的組頭,並在上下文菜單中選擇“屬性”。在“文本框屬性”對話框中,選擇“導航”選項卡,並使用生成字符串的表達式定義“書簽 ID”表達式:=CStr(Fields!OrderYear.Value)。這為我們提供書簽跳轉目標。
打開“圖表屬性”對話框,編輯數據點屬性。在“操作”選項卡上,選擇“跳至書簽”,使用同樣用於書簽 ID 的表達式。
散點圖和氣泡圖
散點圖和氣泡圖與其他圖表類型不同,因為它們具有明確的數據點 x 值,而不是將類別分組值用作 x 值。因此,可對數據進行分組(和聚合),將其分為不同的類別而不是顯示在 x 軸上的值。例如,若要在 x 軸上顯示各銷售人員去年的銷售量,如果兩個銷售人員擁有相同的 x 值,則不希望聚合 y 軸上的值。BubbleChart 示例報表(圖 19)具有基於銷售人員的類別分組,所以該報表聚合每個銷售人員的銷售數據。但在 x 軸上顯示的是去年的銷售值。
注意 了解數據點的 x 值屬性和基於系列組與類別組的圖表數據分組之間的區別非常重要。如果設計散點圖或氣泡圖,並且該圖在預覽中僅顯示一個數據點,但是本應該顯示很多不同的點,則最有可能的解釋就是未定義任何的類別組或系列組。如果未對類別組和系列組進行定義,則基礎數據集行聚合為具有特定 x 值和 y 值的一個數據點。在某些情況下,您可以定義與 x 值表達式相同的類別組或系列組表達式,但是在散點圖或氣泡圖中,您更想根據數據所表示的內容添加類別或系列分組。如果圖表為每位銷售人員聚合銷售值,類別或系列分組應以 BubbleChart 示例報表中顯示的銷售人員 ID 或姓名為依據。
StepFunctionChart 示例報表給出了散點圖的另一用途。散點折線圖基於測量 ID 使用類別分組。對於特定的幾天(顯示為 x 值),在數據集中存在多個測量值(沿 y 軸上顯示),從而導致豎直遞增。
表內嵌圖
有時,運行時的數據量未知,並且希望動態“增長”圖表的大小。實現此目的一個方法是在另一個數據區域的組中嵌入一個圖表。例如,可以根據下列表達式,在列表數據區域使用詳細信息組:
=Ceiling(RowNumber(Nothing)/20)
這將每二十個詳細信息行分為一組。將圖表嵌入到該列表中可在運行時每二十行創建一個圖表實例。
要創建數據的內嵌條形圖可視化,可使用兩種不同的方法實現:
-
嵌入一個已動態算出右填充量的圖像(參見圖 21)。調整靜態圖像的右填充量可獲得動態伸展圖像所得的條形圖效果。
-
嵌入一個具有已算出的 y 軸最大值的條形圖(參見圖 23)。
-
這兩種方法在 TableInlineCharts 示例報表中並行實現。
若要基於內嵌的圖像實現內嵌可視化
-
設計將用於“條形圖”可視化的內嵌圖像。
通常,簡單的梯度圖像可一目了然。將作為內嵌圖像的圖像添加到報表中。
-
將表格添加到組並將數據可視化。
設計表格的分組結構。可以將圖像可視化置於組頭中或置於表格詳細信息行中。在新的表格列中添加內嵌圖像。從步驟 1 中選擇內嵌圖像作為圖像源。
-
計算右(或左)圖像填充量。
為圖像報表項的右(或左)填充量屬性創建表達式。表達式將要進行可視化的數值除以最大值。然后將相對大小乘以步驟 2 中定義的表格列的寬度。必要時,您可能也想通過使用 Math.Min 或 Math.Max 函數將填充量限制在特定范圍內。
在 TableInlineChart 示例報表中,表格列的寬度為 2 英寸。對於填充量計算,我們使用點測量單位,每英寸包括 72 個點。因此,假設將左填充量設置為 0 點,則“右填充量”選項的范圍是在 144 點之內。使用下列代碼設置填充量。
=144 * (1.0 - Fields!UnitsInStock.Value / Max(Fields!UnitsInStock.Value, "DataSet1")) & "pt"
圖 22 動態計算圖像右填充量大小 -
將圖像大小屬性設置為“合適”。
在前一步驟中定義的填充量決定可用於圖像伸展的空間的大小,從而生成條形圖可視化效果。
內嵌圖像方法的一個缺點是如果在圖像中使用字體或細線,圖像可能會拉長。使用圖表進行內嵌可視化(圖 23)可提供更多對可視化的控制,並通常能獲得更佳效果。
若要使用圖表進行內嵌可視化
-
添加表格以分組數據。
設計表格的分組結構。請記住,只能將圖表置於表格表頭或表格表尾中或置於組頭或組尾中。
-
添加新的表格列並將圖表置於組頭中。
要將條形圖可視化的圖表繪圖區調整至最大尺寸,請應用下列圖表屬性設置。
常規設置:設置為條形圖,關閉圖例。
數據:將圖表與父表綁定到相同的數據集;基於要進行可視化的值添加數據點值。
X 軸:關閉軸標簽,關閉網格線,將刻度線設置為“無”。
Y 軸:關閉軸標簽,將刻度線設置為“無”,將最大值設置為在包含表格或數據集范圍內計算出的最大值。要實現正確的條形圖大小需要如此設置,否則每個圖表實例將基於特定組的數據值僅自動縮放 y 軸。
-
優化圖表可視化(可選)。
嘗試調整圖表繪圖區樣式設置、y 軸的主要網格線、3D 效果或動態顏色設置,以進一步優化內嵌圖表可視化。
圖表可擴展性和手動創建圖表
本白皮書提供通過表達式和自定義代碼功能調整圖表設置和擴展現有圖表功能方面的信息。除此之外,還有其他方法可將更多高級圖表功能集成到 Reporting Service 中:
-
集成由自定義程序集生成的表格圖像。
-
基於 Reporting Services 2005 的新“自定義報表項”功能實現圖表可擴展性。
-
使用可提供增強表格功能的第三方 Reporting Services 2005 加載項組件。這些都基於自定義報表項功能。
若要集成由自定義程序集生成的圖像
-
設計和實現自定義程序集以生成圖像。
自定義程序集必須自行檢索數據、負責分組/排序數據以及生成圖表圖像。
注意 自定義程序集必須以 byte[] 形式返回圖像。不能以 System.Drawing.Image 形式返回圖像。通常可使用與下列代碼相似的代碼轉換 System.Drawing.Image 對象。
System.IO.MemoryStream renderedImage = new MemoryStream(); myChart.Save(renderedImage); renderedImage.Position = 0; return renderedImage.ToArray();
-
將圖像添加到報表中。
將圖像類型設置為“數據庫”。如果生成的圖像是 PNG 圖像格式的位圖,則將圖像的“mimetype”屬性設置為“image/png”。對於圖像值屬性,請使用與下列表達式類似的表達式。
=MyCustomAssembly.GenerateChart()
-
在“報表設計器預覽”視圖中查看報表以確認報表工作正常。
注意 在默認配置中,自定義程序集在“報表設計器”預覽中以“FullTrust”運行。因此,對於要求特定代碼訪問安全權限的操作(如文件輸入/輸出、數據提供訪問等等),在“FullTrust”下將自動為它們授予這些權限。
-
在報表服務器上部署自定義程序集。
確保報表服務器的安全策略配置在運行時為自定義程序集授予足夠的權限,否則圖像生成將失敗。有關詳細信息,請參閱 SQL Server 2005 聯機叢書中的Understanding Code Access Security in Reporting Services(英文)。
基於 CustomReportItem 的圖表與自定義程序集的比較
通過自定義程序集方法使用自定義報表項有多項益處。首先,可以構建自己的、可直接集成到“報表設計器”的設計時支持組件。其次,在運行時,可利用 Reporting Services 處理引擎來檢索數據、應用分組/排序和篩選器。CustomReportItem 運行時控件訪問經過處理的數據,並根據交互圖像映射和關聯操作生成圖表圖像。
在構建自己的 CustomReportItem 之前,請仔細學習、研究文檔和示例。下列站點提供更多相關信息:
-
有關自定義報表項的信息,請參閱 MSDN 上的 Chris Hays's Reporting Services Sleazy Hacks Weblog(英文)。
結束語
本白皮書針對先前在書籍、其他文章、報刊或演示中未探討過的 Reporting Services 圖表功能提供了一些技巧和見解。同時也講述了使用特定功能選項的方法和時間。
白皮書介紹和透徹地分析了一組報表示例,說明了在特定情況下,如何更充分地利用內置 Reporting Services 圖表。例如,白皮書描述了如何添加 Pareto 分析或如何計算移動平均值。
最后,本書探討了可用於將外部(圖表)功能集成到報表中的 Reporting Services 擴展性。
關於作者
Robert M. Bruckner 是 Microsoft SQL Server 商務智能部門的軟件開發工程師。他所負責的主要領域是 SQL Server Reporting Services 數據和報表處理引擎。
本文地址:http://www.cnblogs.com/Earson/p/SSRS_CHART.html
本文引用來源:https://msdn.microsoft.com/zh-cn/library/aa964128(v=sql.90).aspx