上方廣告

2016年6月16日 星期四

Rdlc 矩陣(Matrix) 取得資料列編號

最近同事的報表有一個需求,希望可以在報表內顯示群組的資料列編號,遇到新的群組需重新計算,在資料表中的顯示類似下圖紅框處的編號方式。

這個看起來再普通不過的需求,馬上就想到報表本身有提供一個RowNumber的函式,只需要新增一個資料欄位,配合群組名稱的設定(參閱下圖設定),就可以出現期望的結果了。


但事情總是不是我們想像中的那麼簡單,這個需要將各門市的每個銷售品牌放到同一個資料列上,並顯示該品牌的銷售量,也就是希望長的像下圖這樣的結果,直覺的反應就覺得用矩陣來處理就可以了,事情進行到這邊還是覺得,資料列編號那種小事了,一看就是用RowNumber就可以處理了,於是就請同事直接先使用矩陣來處理。


再興高采烈地拉好矩陣,並且使用RowNumber套用好資料列編號後,卻發現,這啥~~~~~~~~~~~~~~~~鬼,這個結果這們這麼詭異,怎麼跟我美好的想像不太一樣。


仔細觀察了一下,發現Matrix群組後的編號原則,似乎會使用門市類型(群組)內的每個門市名稱出現的最後一個順序當作該資料列的編號(參考下圖SQL出現的結果)。


知道編號的產生邏輯後,就可以Google一下,但網路上一堆奇奇怪怪的解決方法,在我看來似乎都沒有針對矩陣+群組的編號做一完美的解決方式,正當我快要放棄,想說乾脆使用SQL自己串出編號好了(內心極為不願意,因為該範例僅為測試參考用,實際的資料是經過大量資料的彙總,從SQL自行運算編號可能造成效能上的崩壞),卻在國外的一個網站找到極為相似的解決辦法,該解決方案為報表內寫一個函式,並在資料欄位內使用該函式來處理編號,經實際測試了一下,確實可行,但因為該網站需要的編號需求與當下的需求有稍微的不同,因此稍微調整一下Function的寫法,底下提供給大家參考。

PS.老實說筆者對於報表的開發一向不在行,在查到該文之前,甚至不知道可以直接在報表內撰寫函式,實在該檢討檢討。~"~

1. 首先在報表屬性->程式碼中寫下一個自定義的Function GetRowNo,其內容再計算若遇到不同的門市內行則編號重編號開始計算,否則序號加1。
Dim lastTypeName  as String
Dim rowCount as Integer

Public Function GetRowNo(byval TypeName as String) as Integer
 If TypeName = ""  or TypeName <> lastTypeName Then 
  rowCount = 1
 Else 
  rowCount  = rowCount  + 1
 End If
      lastTypeName  = TypeName
 Return rowCount
End Function


2. 顯示編號的欄位處撰寫運算式,內容為呼叫自定義函式,並傳入門市類型的欄位,Code.GetRowNo(Fields!TypeName.Value)。


3. 確認結果,果然是想要的結果,可以收工了。