2009年11月22日 星期日

Cliend-Side Report (RDLC) Group

首先我想要使用Group的功能解決使用SQL的Rollup的功能,相關功能介紹可以參照 [Oracle]Group By Rollup Function介紹 該文章中提到使用Rollup可以做到總計及特定群組小計之功能,這樣的功能其實如果你不懂如何使用SQL的Rollup也可以使用RDLC中的Group來做到。



首先我們會使用SQL 2005以後才出現的範例資料庫Adevntureworks,並使用底下SQL來建立出產品以及分類間的關係
SELECT     Production.ProductCategory.Name AS PCatName,
                      Production.ProductSubcategory.Name AS PCatSubName, Production.Product.Name AS PName
FROM         Production.ProductCategory INNER JOIN
                      Production.ProductSubcategory ON Production.ProductCategory.ProductCategoryID = Production.ProductSubcategory.ProductCategoryID INNER JOIN
                      Production.Product ON Production.ProductSubcategory.ProductSubcategoryID = Production.Product.ProductSubcategoryID


該SQL所表示的資料如下

主要呈現產品主分類次分類產品名稱。由上圖得知所有的產品總共有295筆,而在接下來的例子中,我們將會介紹如何使用RDLC先將每個次分類中所有產品總數的加總(小計)以及每個主分類的產品總數加總(總計)

首先我們先使用PCatSubName來做Group(群組 ),相關操作如下圖所示
拖入一個Table(資料表)元件,然後將相關欄位設定如下圖

於【詳細資料列】中點選滑鼠右鍵,出現之選單選擇【插入群組】

於【群組對象】表中新增運算式【=Fields!PCatSubName.Value】(註:使用下拉選單即可直接設定)後點選確定按鈕

此時畫面出現如下,會有【群組列]之圖示出現於原本【詳細資料列】之上下列中

將原本運算之欄位從原本【詳細資料列】中移往【群組列】中,此作用代表三個欄位於呈現資料時會使用我們剛剛所設定之群組【PCatSubName】為主(以SQL來看的話表示Group by PCatName,PCatSubName)

於【詳細資料列】中點選滑鼠右鍵,選擇【刪除資料列】,將不需呈現之資料列予以刪除(註:這裡我們需要刪除【詳細資料列】及【下群組資料列】,我們於上面所設定之群組資料列算是【上群組資料列】)

依序刪除後,資料表元件之畫面如下

我們將其設定至aspx頁面中,並以文章一開始提到之SQL指令為資料來源,將其資料匯如後結果如下(註:請將BorderStyle=Solid,並排序PCatName欄位)


這是我們設定完以【PSubCatName】為群組條件後,所出現之結果,其解釋為【每個次分類中所有產品總數的加總】,而接下來我們再設定群組2【PCatName】,使其可以達到【每個主分類的產品總數加總】之需求,相關步驟如下
於群組一中依照剛剛所介紹之方式再插入群組


設定其【群組對象】為【=Fields!PCatName】


並使用剛剛所介紹之技巧,將資料表物件之相關運算設定如下(註:這裡把群組2調整為使用【PSubCatName】為群組運算對象,而群組1的群組運算對象則為【PCatName】,並於頁尾的地方加入【總計】及其運算)

其結果如底下所示,於原本的【PSubCatName】群組的計算下,又多了一列小計之運算結果,並且由於我們於頁尾的地方也有一個總計的運算,所以於最後一列有一個所有資料的總計結果

結論:
這個範例主要是要說明資料表中群組的應用,並講述其意義,我搭配 [Oracle]Group By Rollup Function介紹 文章來解釋RDLC中群組的意義,這裡再次說明上面範例中以【PSubCatName】為群組是為了呼應參考文章中【1.每個部門不同職務的員工薪水的加總】的Group之功能,而【PCatName】群組是呼應【2.每個部門的員工薪水的加總】,主要就是要闡述主類別及次類別群組上的關係,並使用RDLC中之排版及運算功能來做到【小計】及【總計】之功能。

題外話:
其實如果可以用SQL就直接把所需要之結果呈現出來不管是在運算的效能上,或是程式的開發上都算是上上之選,因為本身群組的功能相信資料庫一定有對Group及Rollup之運算做過最佳化,而使用RDLC則是需要把資料都匯到Client程式端之後,再經由.NET程式之運算呈現之結果,以上面的例子來看,這中間資料庫至少需匯出295筆資料(Raw Data)給Client端,如果今天Client端之程式主機與資料庫之程式主機之網路並非在同一個網域中,則光是資料傳輸就會浪費非常多的頻寬以及時間,不過並非使用SQL就是唯一之選擇,當資料庫將所有的Raw Data都匯出給Client端的時候,Client端的程式則可以再針對這些資料作額外之加值運算,亦能取出不同之運算或排版結果,所以還是要以當時開發的情境來做判斷考量才會比較妥當。

1 則留言:

匿名 提到...

板主:
謝謝拉~~
看了解決了群組的問題