來自羣裏面討論的一個問題,EXCEL 中有相似於這樣的圖形,上面是 Chart, Chart X軸上的值正好就是下方 Table 的列頭,這個在 SSRS 中應該如何實現?
SSRS 200八、2008RS,2012 中實際上沒有這種對應的控件,咱們一般想到的方式多是上方一個單獨的 Chart 圖,下方一個 Table 而後合併在一塊兒。可是這樣會存在一些問題,由於 Chart 軸的值不是固定的,會隨着聚合值的增長而擴展。而且對於表中的列頭來講也沒有辦法徹底可以和 Chart X 軸上的座標對應在一條豎線上,必定會有誤差。
在 SSRS 中,咱們能夠經過一些技巧來實現相似於這樣的效果。下面是我用 Column Chart 來展示的這種相似於 Excel 中的效果,雖然實現比較接近了,但我並不推薦這麼作! 由於咱們徹底能夠經過合理的變通,並使用其它的方式將這些數據展示的更加合理!
原始測試數據 (AdventureWorksDW2012)就是一個簡單的查詢 -
SELECT DPC.EnglishProductCategoryName, FIS.OrderDate, FIS.OrderDateKey, DD.CalendarYear, FIS.SalesOrderNumber, FIS.SalesOrderLineNumber, FIS.SalesAmount AS Internet_Sales FROM FactInternetSales AS FIS INNER JOIN DimProduct AS DP ON FIS.ProductKey = DP.ProductKey INNER JOIN DimProductSubcategory AS DPS ON DP.ProductSubcategoryKey = DPS.ProductSubcategoryKey INNER JOIN DimProductCategory AS DPC ON DPS.ProductCategoryKey = DPC.ProductCategoryKey INNER JOIN DimDate AS DD ON FIS.OrderDate = DD.FullDateAlternateKey
新建報表和數據集 Dataset,選擇 Matrix 行分組爲 Product Category ,列分組爲 Calendar year。html
添加兩個新行 - 選擇 Outside Group - Above。
並刪除第一行。
刪除的時候只刪除行,可是不要連組給刪除了。
刪除以後的樣子就是這樣的。
第二行是表頭要顯示的年份,第一行用做行內 Column Chart 圖。
在第一行的這個位置插入 Data Bar,選擇 Stacked Column。
填充 Stacked Column 中的聚合值,分組以及系列。
填充完畢後就能夠看到大體的效果了,每一列都是從 Matrix 列分組展開的,而每一列當中的 Column Chart 的分組又依賴於當前的列分組中的年份。
自行作一些美化工做,包括格式化等等。
存在一個問題,不一樣的系列是出來了,可是沒法區分各個系列與產品分類的關係。
思路是 - Chart 圖中的顏色模板使用自定義的,而後使用自定義函數獲取指定的顏色,這幾種顏色須要和自定義模板中的顏色是同樣的。
Private colorPalette As String() = {"SeaGreen", "Orange", "RoyalBlue"} 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
報表的自定義函數。app
設置 Stacked Column 圖的自定義模板顏色。
選中 English Product Category 文本框,設置它的背景顏色,調用函數。
=Code.GetColor(Fields!EnglishProductCategoryName.Value)
最後,要作出這種效果還須要進一步的格式化,調整邊框等操做使得這個 Stacked Column 像一個總體,而非單一的個體,這些美化的細節就不一一描述了。能夠參考 天善學院微軟SSRS2012報表課程 基礎案例中的 - 案例6,案例13,案例18,案例24 以及 SSRS 報表設計提升篇中的報表美化與設計等案例。因此本文只講解實現的流程,過於細節的設計技巧,包括一些聚合分組的概念,自定義函數等不是本文的重點。
對於文章開頭看到的這種 Line Chart 形式可不能夠作,也能夠作,能夠經過調整 Chart 區域折線的平面寬度使得幾個獨立的折線區域也鏈接成一個總體。可是像最左側的 Y 軸線如何實現,幾個產品不使用底線區分而要求使用 Chart 中自帶的系列又該顯示且不重複?這些都不是拖拖拽拽就能夠實現的,這須要熟練掌握 SSRS 報表中的各類知識點和技能點,不一樣控件的組合使用技巧等。固然,若是就這個案例來講,假設實際開發中若是是我,我會拒絕設計這種樣子的報表,由於上圖很明顯在閱讀性和數據呈現上徹底體現不出來像 Excel 展示出來的那種效果。
因此,在實際報表開發過程當中,不能爲了模仿而模仿,由於頗有可能模仿成一個四不像。
吐吐口水吧! 在實際項目中,在引導客戶改變已有使用習慣,適應新的適應習慣的過程當中每每確實是伴着口水,Fighting 的,包括遭受到客戶對自身能力的懷疑,這些在項目開發中都是很正常的。像有不少客戶每每會提出他們認爲很好實現但實則很難實現的一些效果要求必須實現,這些極端狀況也是客觀存在的。對於我來講,我也會遇到一些變態的和不合理的需求,但一般狀況下我也會直接拒絕,坦誠告訴客戶沒法實現,由於它已經違背了 SSRS 自身特性。但同時我也會嘗試拿出另多的替代的解決方案讓客戶來選擇,這樣客戶一般會比較容易接受和妥協。就像出門從北京到上海出差,告訴他們飛機確實由於技術緣由就是不能飛,在客戶非要證實但又沒法證實飛機就是能起飛的同時給他們選擇高鐵,汽車和自行車三選一,通常狀況下客戶仍是會從中選擇他最可以接受的一種最優方案,由於誰也耗不起時間。