第 1 課:加入參數,依日期篩選報表 (SSRS)
在報表的查詢中加入開始和結束日期的參數之後,您就可以指定日期範圍,限制從資料來源擷取的資料。您也可以建立其他參數,用來篩選從資料來源擷取後的資料。
在這一課,您會將參數 @StartDate 和 @EndDate 加入到查詢中,以限制從資料來源擷取的資料。此時系統會自動為您建立兩個報表參數 StartDate 和 EndDate,並顯示在 [報表資料] 窗格中。參數需要區分大小寫。查詢參數開頭為 @ 符號,而報表參數則不是。
您會將參數的資料類型設定為 DateTime,並且會看到日曆控制項與參數文字方塊一起出現在報表檢視器工具列上。您將為參數設定預設值,讓報表能夠自動執行。最後,您會建立未繫結至查詢參數的報表參數 DayofWeek,並用它來篩選從資料來源擷取資料後的資料。
本教學課程需要您先完成<教學課程:建立基本資料表報表>。
開啟現有的報表伺服器專案
按一下 [開始],依序指向 [所有程式] 和 [Microsoft SQL Server 2008 R2],然後按一下 [Business Intelligence Development Studio]。
從 [檔案] 功能表,指向 [開啟],然後按一下 [專案/方案]。
按一下 [教學課程],然後選擇 Tutorial.sln。這是在<教學課程:建立基本資料表報表>中建立的教學課程。
按一下 [確定] 以開啟專案。教學課程專案會顯示在 [方案總管] 中,其中包含一個稱為 Sales Orders.rdl 的報表。
注意:如果看不到 [方案總管],請從 [檢視] 功能表按一下 [方案總管]。
將內嵌的資料來源轉換成共用資料來源
在 [報表資料] 窗格中,以滑鼠右鍵按一下 AdventureWorks 資料來源,然後選取 [轉換為共用資料來源]。在 [方案總管] 中就會加入稱為 AdventureWorks.rds 的資料來源。
在 [報表資料] 窗格中,以滑鼠右鍵按一下 AdventureWorks 資料來源,然後選取 [資料來源屬性]。
在 [名稱] 中,輸入 AdventureWorks_Ref。
按一下 [確定]。
取代現有的資料集
在 [報表資料] 窗格中,以滑鼠右鍵按一下 AdventureWorksDataset 資料集,然後按一下 [資料集屬性]。
[!附註]
如果您看不到 [報表資料] 窗格,請按一下 [檢視] 功能表上的 [報表資料]。
在 [資料來源] 中,確認已選取 [AdventureWorks_Ref]。
在 [查詢類型] 中,確認 [文字] 已選取。
按一下 [查詢設計工具] 按鈕來開啟查詢設計工具。
以下列查詢取代文字方塊中的文字。
SELECT soh.OrderDate AS [Date], soh.SalesOrderNumber AS [Order], pps.Name AS Subcat, pp.Name as Product, SUM(sd.OrderQty) AS Qty, SUM(sd.LineTotal) AS LineTotal FROM Sales.SalesPerson sp INNER JOIN Sales.SalesOrderHeader AS soh ON sp.BusinessEntityID = soh.SalesPersonID INNER JOIN Sales.SalesOrderDetail AS sd ON sd.SalesOrderID = soh.SalesOrderID INNER JOIN Production.Product AS pp ON sd.ProductID = pp.ProductID INNER JOIN Production.ProductSubcategory AS pps ON pp.ProductSubcategoryID = pps.ProductSubcategoryID INNER JOIN Production.ProductCategory AS ppc ON ppc.ProductCategoryID = pps.ProductCategoryID GROUP BY ppc.Name, soh.OrderDate, soh.SalesOrderNumber, pps.Name, pp.Name, soh.SalesPersonID HAVING (ppc.Name = 'Clothing' AND (soh.OrderDate BETWEEN (@StartDate) AND (@EndDate)))
除了加入一個包含兩個限制參數的條件之外,這與之前的查詢相同:
AND (soh.OrderDate BETWEEN (@StartDate) AND (@EndDate))
按一下工具列上的 [執行] (!)。[定義查詢參數] 對話方塊便會開啟,提示您輸入參數值。
提供兩個值以查看篩選過的結果集:
在 [參數值] 欄位中,輸入 @StartDate, 的值,例如 1/31/2001。
在 [參數值] 欄位中,輸入 @EndDate 的值,例如 1/31/2003。
按一下 [確定]。
結果集會根據 2001 年和 2002 年的順序,顯示篩選過的資料集。
按兩次 [確定]。[報表資料] 窗格會以資料集欄位擴充。同時請注意,系統會自動建立兩個報表參數 StartDate 和 EndDate,並顯示在 [參數] 節點下。
定義報表的查詢參數之後,您必須變更報表參數的資料類型,以符合來源資料的資料類型。預設值為 [文字],這會對應到大部分資料來源中的 [字串] 資料類型。如果來源資料為數值、布林值或日期/時間,您必須變更報表參數資料類型。
變更報表參數的資料類型和預設值
在 [報表資料] 窗格中,展開 [參數],然後按兩下 StartDate。[報表參數屬性] 對話方塊隨即開啟。
確認參數的名稱為 StartDate 而提示為開始日期。
在 [資料類型] 中,選取 [日期/時間]。
按一下 [確定]。
在 [報表資料] 窗格中,按兩下 EndDate。請確認名稱和提示值。
在 [資料類型] 中,選取 [日期/時間]。
按一下 [確定]。
按一下 [預覽]。StartDate 和 EndDate 參數分別會與日曆控制項一起出現在報表工具列上。當參數的資料類型設為 Date/Time,而且您尚未定義可用的值清單時,日曆控制項會自動出現。如果您定義可用的值清單,則會出現值的下拉式清單。
提供兩個參數值來執行報表:
在 [StartDate] 參數文字方塊中,輸入日期 1/31/2001。
在 [EndDate] 參數文字方塊中,輸入日期 1/31/2003。
按一下 [檢視報表]。報表只會顯示報表參數值之內的資料。
建立報表的報表參數之後,就可以加入這些參數的預設值。預設參數可讓報表自動執行,否則,使用者就必須輸入參數值來執行報表。
設定參數的預設值
在 [設計] 檢視的 [報表資料] 窗格中,展開 [參數],然後按兩下 StartDate。[報表參數屬性] 對話方塊隨即開啟。
按一下 [預設值]。
選取 [指定值] 選項。[加入] 按鈕和空白的 [值] 方格隨即出現。
按一下 [加入]。空白資料列會加入至方格中。
按一下 [值] 文字方塊,然後刪除預設文字 (Null)。
輸入 1/31/2001。按一下 [確定]。
在 [報表設計] 窗格中,按兩下 EndDate。
按一下 [預設值]。
選取 [指定值] 選項。
按一下 [加入]。
輸入 1/31/2003。按一下 [確定]。
按一下 [預覽]。報表會立即執行,因為所有參數都定義了預設值。
在查詢中加入新欄位,以用於篩選
切換至 [設計] 檢視。
以滑鼠右鍵按一下 AdventureWorksDataset 資料集,然後選取 [資料集屬性]。開啟查詢設計工具,然後將查詢取代為下列新查詢:
SELECT soh.OrderDate AS [Date], DATENAME(weekday, soh.OrderDate) as Weekday, soh.SalesOrderNumber AS [Order], pps.Name AS Subcat, pp.Name as Product, SUM(sd.OrderQty) AS Qty, SUM(sd.LineTotal) AS LineTotal FROM Sales.SalesPerson sp INNER JOIN Sales.SalesOrderHeader AS soh ON sp.BusinessEntityID = soh.SalesPersonID INNER JOIN Sales.SalesOrderDetail AS sd ON sd.SalesOrderID = soh.SalesOrderID INNER JOIN Production.Product AS pp ON sd.ProductID = pp.ProductID INNER JOIN Production.ProductSubcategory AS pps ON pp.ProductSubcategoryID = pps.ProductSubcategoryID INNER JOIN Production.ProductCategory AS ppc ON ppc.ProductCategoryID = pps.ProductCategoryID GROUP BY ppc.Name, soh.OrderDate, soh.SalesOrderNumber, pps.Name, pp.Name, soh.SalesPersonID HAVING (ppc.Name = 'Clothing' AND (soh.OrderDate BETWEEN (@StartDate) AND (@EndDate)))
在查詢中,透過在 SELECT 陳述中加入下列命令,即可定義其他導出資料行做為一週中產生銷售的一天:
DATENAME(weekday, soh.OrderDate) as Weekday.
按一下 [執行] (!)。[定義查詢參數] 對話方塊隨即開啟。
在 [參數值] 欄位中,輸入 @StartDate, 的值,例如 1/31/2001。
在 [參數值] 欄位中,輸入 @EndDate 的值,例如 1/31/2003。
按一下 [確定]。 您應該會在標示為 Weekday 的結果集中,看到新的資料行。
按兩次 [確定]。在 [報表資料] 窗格中,確認 Weekday 是一個欄位。
(選擇性) 若要在將要進行篩選的資料表資料中格式化日期
按一下 [設計] 索引標籤。
以滑鼠右鍵按一下含有 [Date] 欄位運算式的資料格,再按一下 [文字方塊屬性]。
按一下 [數字],然後在 [類別目錄] 欄位中選取 [日期]。
在 [類型] 方塊中,選取 [Monday, January 31, 2000]。
按一下 [確定]。
加入新的報表參數
在 [設計] 檢視的 [報表資料] 窗格內,按一下 [新增],然後按一下 [參數]。[報表參數屬性] 對話方塊隨即開啟。
在 [名稱] 中,輸入 DayoftheWeek。
在 [提示] 中,輸入 Filter on the day of the week:。
確認資料類型是 Text。
按一下 [預設值]。
選取 [指定值] 選項。[加入] 按鈕和空白的 [值] 方格隨即出現。
按一下 [加入]。
輸入 Friday。
按一下 [確定]。
使用參數運算式設定資料表篩選
在 [設計] 檢視中,以滑鼠右鍵按一下資料表的資料列或資料行控制代碼,然後選取 [Tablix 屬性]。
[!附註]
資料表資料區域是以 Tablix 資料區域為基礎的範本。
按一下 [篩選]。空白的篩選方格隨即出現。
按一下 [加入]。空白資料列會加入至方格中。
在 [運算式] 中,從下拉式清單選取 [Weekday]。
確認 [運算子] 會顯示等號 (=)。
按一下 [值] 文字方塊旁邊的運算式 (fx) 按鈕。[運算式] 對話方塊隨即開啟。
在 [類別目錄] 中,按一下 [參數]。目前的參數清單隨即出現在 [值] 窗格中。按兩下 [DayoftheWeek]。參數運算式隨即加入到運算式文字方塊中。下列運算式現在會出現在運算式文字方塊中:=Parameters!DayoftheWeek.Value。
按一下 [確定]。 再按一下 [確定] 來結束 [Tablix 屬性] 對話方塊。
資料表的篩選現在設定為比較 Weekday 欄位的值與 DayoftheWeek 的參數值。例如,當您在報表工具列中,輸入 Friday 做為 DayoftheWeek 的值時,報表處理器將只會處理資料表中 Weekday 欄位的值為 Friday 的資料列。
按一下 [預覽]。由於所有參數都有預設值,因此,報表會自動執行。資料表只顯示介於 StartDate 和 EndDate 所定義日期範圍內以及落在星期五的值。
後續步驟
您已順利定義查詢參數和報表參數、設定參數的預設值,並在資料表上設定篩選。在下一課,您將學習如何為參數建立可用值 (或稱為有效值) 清單。請參閱<第 2 課:加入參數以建立可用值的清單 (SSRS)>。