認識 SSRS 參照函數 - Lookup

本文將介紹如何在認識 SSRS 中使用參照函數 - Lookup

情境描述

今天好朋友 James 跟筆者討論如何於 SSRS 中利用 ID 去搜尋 Name,一開始筆者以為透過查詢參數就可以解決,或是直接以在單一資料集利用 T-SQL 做 Join 即可,後來經了解事情並非如此單純,因為報表所使用的資料集來自異質資料來源,因此無法使用筆者慣用的偷懶方式來完成,必須使用參照函數 Lookup 才能解決這個問題,雖然在筆者 Try 出來前 James 就自己解決了,但筆者還是在此紀錄一下,請見下一節的說明。

實作步驟

若您的 ID 跟 Name 的對應關係屬於一對一的關係,亦即一個 ID 只對應到一個 Name,適合利用 Lookup 函數來完成,其語法如下:


Lookup(source_expression, destination_expression, result_expression, dataset)

其中四個參數說明如下(以下節錄自 MSDN):

source_expression :在目前範圍中評估並指定要查閱之名稱或索引鍵的運算式
destination_expression:針對資料集中的每個資料列評估並指定要比對之名稱或索引鍵的運算式。
result_expression:針對 source_expression = destination_expression 之資料集中的資料列評估,並指定要擷取之值的運算式。
dataset:指定報表中資料集名稱的常數。

相信您和筆者一樣看不懂 MSDN 的說明,筆者以圖解的方式來說明 source_expression、destination_expression、result_expression 和 dataset 這四個參數。首先筆者於 SSDT 建立一個 SSRS 報表伺服器專案,並於專案中建立一名稱為 dsNW 的共用資料來源連接至 Northwind 資料庫,以及名稱為 dsOrders 與 dsCustomers 資料集,分別對應至 Orders 與 Customers 資料表,然後建立一個名稱為 rpOrders 的報表,整個專案結構如下圖所示:

image

接著於報表資料中分別建立資料來源及資料集,其中資料來源使用共用資料來源(dsNW),資料集使用的是共用資料集(dsOrders 和 dsCustomers),報表資料結構如下圖。

image

接著由工具箱拉一個資料表控制項至報表主體,並設定資料表的 DataSetName 屬性為 dsOrders,接著設定資料行要顯示的欄位如下圖的樣子,除了 CompanyName 資料行下面會特別說明外,其他資料行都是 dsOrders 資料集中的欄位,可直接由下拉式選單中選擇。

image

image

由於 dsOrders 使用的是 Northwind 資料庫的 Orders 資料表,其中 CustomerID 資料行為 Customers 資料表的 Primary Key,因為正規化的緣故,CustomerID 所對應的 CompanyName 並不會儲存在 Orders 資料表,因此必須動態參考 dsCustomers 資料集,這樣的情境正是適合使用 Lookup 函數來動態呈現 CustomerID 所對應的 Company,因此筆者於 CompanyName 資料行詳細資料上按滑鼠右鍵,選擇運算式。

image

於【運算式】視窗中輸入下列指令碼,其中第一個參數(source_expression) Fields!CustomerID.Value 為來源資料集(dsOrders)的 CustomerID 資料行,主要用來做為對應到 dsCustomers 資料集的鍵值;第二個參數(destination_expression) Fields!CustomerID.Value 則為 dsCustomers 資料集的資料行,也是 Customers 資料表的的 Primary Key,用來和 dsOrders 資料集的 CustomerID 資料行進行查閱,當 dsOrders 資料集的 CustomerID 資料行與 dsCustomers 資料集的 CustomerID 資料行相等時,則回傳第三個資料參數(result_expression)Fields!CompanyName.Value 的內容,而第四個參數(dataset)則是 destination_expression 和 result_expression 所在的資料集名稱 dsCustomer,該名稱有區分大小寫,輸入時請注意應該與資料集名稱的大小寫相同(感謝 James 的資訊)。


=Lookup(Fields!CustomerID.Value,Fields!CustomerID.Value,Fields!CompanyName.Value,"dsCustomers")

image

依照上述設定後預覽報表,就可以看到如下圖的執行結果:

image

最後順帶一提,利用 Lookup 參照函數的概念類似於在 T-SQL 中使用 Left Join,當對應不到時則會回傳空白。

參考資料

- Lookup 函數 (報表產生器及 SSRS)