顯示具有 rdlc 標籤的文章。 顯示所有文章
顯示具有 rdlc 標籤的文章。 顯示所有文章

2011年7月28日 星期四

ReportViewer範例PART5-REVIEW CODE篇

這是我之前使用REREPORTVIEWER執行RDLC的程式碼
其中VISIBLE、LocalReport.ReportPath、DataSources.Clear()、DataSources.Add與Refresh這些都會一直重複使用,所以我把它寫成一個常用的FUNCTION,並新增一個CLASS叫RdlFunction.cs,把常用到的FUNCTION都放在這一個CLASS。
建立好CLASS之後,使用這個CLASS改寫之前的程式:
其中的dtGetCustomerByCity的方法來自商業邏輯層,詳細內容在這個連結
使用商業邏輯層與RdlFunction.cs有二個最大的好處,分別是:
管理:假設業務邏輯有改變,這時候只要改商業邏輯層就好了,其他程式不會動到。
開發:使用之前寫的FUNCITON,下次開發時可以重用,方便省時。
最後顯示報表內容。
搞定收工。

2011年7月7日 星期四

Reporting Service 2008R2 LookupSet的使用

繼上一篇的LookupMuliLookUp後,現在要介紹Lookup家族的最後一個成員LookupSet。
我們有兩個Table分別為DimCity與SubCity:
DimCity與SubCity這兩個Table的關係是一對多。
接著我們在設計畫面建立一個table,並且加入DimCity的CityID與CityName到Tablix,接著在另一個Tablix輸入運算式:
我們看到LookupSet的第一個參數為DimCity的Fields!CityID.Value,而第二個參數為SubCity,第三個參數為顯示名稱,最後則是另一個DataSet(資料集)的名稱。
在LookupSet後因為資料是1對多的關係,所以顯示報表會有error,這時候我們使用Join把產生分解後,並且加上,這個符號,最後就可以觀看資料的結果:

Naming Excel Worksheets

問題:在Reporting Service 2008 R2之前我們要把rdl匯出成Excel檔案時常常為Excel的sheet命名而苦惱。

解決方法: 在Reporting Service 2008 R2可以設定屬性PageName達成匯出excel時命名sheet。

我們把PageName設定為想要命名的欄位名稱。
接著將rdl報表匯出成excel,這時候我們就可以看到Excel的sheet是以PageName的值(城市)來命名。

2011年7月6日 星期三

Reporting Service 2008R2 MultiLookup的使用。

繼上一篇LOOKUP的使用之後,這篇是講MultiLookup的用法,MultiLookup與Lookup的使用方法很像,差別在於第一個使用的參數Lookup是單一值而MultiLookup第一個使用的參數可以是多值的。
我們有兩個Table分別為DimSubCity與SubCity:

我們看到DimSubCity的SubCityID是多值的,這時候MultiLookup就派上用場了
我們看第一個參數使用Split切開後再與 SubCity的Fields!SubCityID.Value在關聯,第三個與第四個參數分別為顯示名稱與要結合的DataSet,完成後Table內容如下:
預覽報表內容:
原本的1,2,3已經可以使用SubCityName來顯示資料內容了。
接著下一篇我將會講解LookupSet的使用方法。

Reporting Service2008 R2 Lookup Function 的使用

我們在做報表的時候通常會遇到一個問題,報表的Table物件只能使用一個DataSet,在Reporting Service 2008 R2新增的Function(Lookup、MultiLookup與LookupSet),可以讓我們在Table物件使用兩個DataSet。
首先看一下兩個DataSet的資料結構:
我們有FactSaleTable與DimCity兩個TABLE,這兩個TABLE是以CityID做關聯。
接下來我們拖拉一個TABLE物件,並且拉入FactSaleTable的CityID與SaleAmount兩個欄位至TABLE物件,這時候TABLE的DataSet為FactSaleTable。
接著我們在城市代號與欄位金額中間增加一個空白欄位,並在該欄位的運算式打上
在Lookup這個FUNCTION,其中第一個Fields!CityID.Value為原來的FactSaleTable的 CityID,第二個Fields!CityID.Value為DimCity的CityID,它會與第一個的 Fields!CityID.Value做比對(Mapping),第三個Fields!CityIDName.Value為顯示的欄位內容,而"DimCity"就是第二個DataSet。

完成後TABLE如下

預覽內容
我們看到中間的程式名稱的是DimCity DataSet的內容,而城市代號與銷售金額是FactSaleTable DataSet的內容,這表示同一個Table可以一次使用兩個DataSet。
下一篇我將講解如何使用MultiLookup。

2011年7月4日 星期一

Reporting Service的群組分頁之二:如何設定群組頁數與總頁數之頁碼

在Reporting Service 2005,設定群組分頁時常常遇到頁碼不會依群組計算,而是以全部的頁數來計算。譬如說:你的報表總共有八頁,分二個群組,一個群組五頁,一個三頁,但是Reporting Service 2005出來頁碼就是八頁,1/8,2/8,不會依個群組分頁碼,第一個是1/5到5/5,第二個群組是1/3到3/3,如果要做到這種效果,有額外寫code,昨天我在某個老外的bi blog看到在Reporting Service 2008 R2有群組分頁頁碼的設定,阿~真是好物一枚。
這是我做的報表範例
頁尾有兩個textbox,運算式分別為:
Globals!PageNumber/Globals!TotalPages與Globals!OverallPageNumber/Globals!OverallTotalPages
這時候瀏覽報表內容:
發現Globals!PageNumber/Globals!TotalPages與Globals!OverallPageNumber/Globals!OverallTotalPages是一模一樣的,這是因為我們頁碼的設定ResetPageNumber的屬性為flase的緣故。
ResetPageNumber屬性設為true頁碼就可以依群組而變動了。
瀏覽結果如下圖
展開看詳細資料內容
阿~真是棒,微軟好像有聽到我們工程師的心聲,這次給他一個讚!^^
搞定收工~~

2011年7月3日 星期日

如何解決SSRS 2008 R2凍結表頭的問題

今天有個可愛的學妹問我這個問題,學妹都開口了身為學長不幫忙好像說不過去。
其實凍結表頭這個問題真正的問題點反而不是在凍結表頭的設定,而是設定凍結表頭後,凍結的表頭會跟資料重疊在一起,讓人看不清楚表頭內容。
身為學長的我怎麼不可以多照顧一下學妹呢?哈哈,廢話不多說,趕快給他做下去。
首先是設定凍結表頭,如何設定凍結表頭呢?這個問題你知我知就連獨眼龍也知。
首先在資料行群組點選進階模式
然後在資料列群組上面的FixedData屬性選True
接著預覽報表內容,發現表頭和資料內容混在一起,這樣表頭內容看的不是很清楚。
怎麼辦呢?很簡單,只要把表頭的背景顏色用深色系的顏色,而表頭文字用白色,這樣表頭就可以把資料內容蓋住,而白色字體在深色系下很顯眼,一眼就可以看得很清楚。
預覽結果如下:
你看看,當移動拖拉BAR時,深色的凍結表頭是不是蓋住資料內容,這樣就不會有表頭內容和資料內容混在一起的困擾。

其實我覺得做報表可以多用一些顏色、字體或字型的小技巧來達到的某些視覺上的效果,重點是使用者一目瞭然,有時候這些小技巧可能替代原本需要做很多的設定或甚至於報表工具設定做不到的效果,我覺得這是很多人包含我本人會忽略的一些小細節。
兩點半了,該去看電影了,收工。

2011年6月25日 星期六

ReportViewer範例PART3SubReport之二

繼上一篇ReportViewer範例PART3如何SubReport之一 製作SubReport後,接下來就是使用ReportViewer掛在Web上。就像這樣:

首先要先寫好一個METHOD給主要的報表使用,程式碼如圖:
然後再寫一個METHOD給SubreportProcessing事件用來顯示SubReport內容,程式碼如圖:
接著在Page_Load事件,把顯示報表的METHOD掛在SubreportProcessing事件上,並且要注意顯示主報表的時機,要判斷有沒有PostBack,否則顯示報表時會一直Page_Load。
最後執行程式顯示報表內容。

如何在SSRS 2008設計ParentChild Hierarchy的報表

首先在資料庫的資料要有兩個欄位用來關聯階層關係
上圖的範例資料表是以EmployeeKey與ParentEmployeeKey兩個欄位作為ParentChild階層關聯。
接著使用sql cte的cte實作出資料表中資料的階層。

然後拉入一個資料表物件,並把EmployeeName、EmployeeLevel與SalesAmount拉入到資料表物件中。
 拉入後增加一個以EmployeeKey的群組。
在把之前新增群組的所產生的資料行刪除。
接著在資料列群組刪除詳細資料。
然後在group1的advanced頁面的Recursive parent選擇ParentEmployeeKey。
選完後在SalesAmount這個欄位按右鍵點選運算式
在運算式的頁面輸入=Sum(Fields!SalesAmount.Value,"Group1",Recursive)
然後在EmployeeName屬性方塊設定欄位文字的間距
設定欄位文字的間距
在運算式中輸入=20*Level()+5 & "pt"做為欄位間距規則。
瀏覽一下內容
看起來還真漂亮。不過如果在加上可以drilldwon的效果那就更棒了。為了加上drilldwon的效果我們必需在群組做設定。
我們進入群組屬性的頁面
在可見性的頁籤中點選隱藏(H),並在勾選此報表項目可以切換顯示後,在下拉式選單選擇EmployeeName。
預覽報表,發現有drilldwon的效果。
不過這份報表有一個缺點,就是T1與T2中都是在同一階層,但是T2卻沒有收合的符號,這樣會造成T2的階層筆T1還低的錯覺,除非T2下面也有子階層,這時候T1與T2的對其位置才會相同。
為了解決這個問題,我想了一個折衷的方法,就是除了最底階層外,其他階層的
 EmployeeName都給予粗體字,這樣就可以用來識別T2不是最底層的問題。
首先在EmployeeName的欄位點選右鍵進入預留位置屬性編輯頁面
進入後在字型的頁籤點一下粗體的運算式
在運算式輸入判斷欄位是不是最底層的程式碼,如果是的話就不會顯示粗體字,不是的話就會顯示粗體字。
最後瀏覽結果發現T2有粗體字型而TT2沒有,這表示T2不是最底下的階層,這樣就不會有T2的階層是最底層的錯覺。
 呼~搞定收工。