第 1 课:添加按日期筛选报表的参数 (Report Builder 2.0)
通过在报表查询中包含开始日期参数和结束日期参数,可以指定用来限定从数据源检索的数据所处的日期范围。您可以创建其他参数,以便对从数据源检索到的数据进行筛选。
在本课中,您将向查询添加 @StartDate 和 @EndDate 参数,以便限定从数据源检索的数据。StartDate 和 EndDate 两个报表参数是自动创建的,并显示在“报表数据”窗格中。参数区分大小写。在 Transact-SQL 中,查询参数以 @ 符号作为开头,而显示在“报表数据”窗格中的报表参数则不然。
您将这些参数的数据类型设置为 DateTime,并将看到报表查看器工具栏中会显示一个带有参数文本框的日历控件。您还将设置这些参数的默认值,以使报表可以自动运行。最后,您将创建未绑定到查询参数的报表参数 DayofWeek,并使用该报表参数对从数据源检索到的数据进行筛选。
本教程要求您已完成教程:创建基本表报表 (Report Builder 2.0)。
打开现有报表
单击**“开始”,依次指向“程序”**、Microsoft SQL Server 2008 Report Builder,再单击 Report Builder 2.0。
从“报表生成器”按钮,单击**“打开”**。
导航到销售订单。这是在教程:创建基本表报表 (Report Builder 2.0) 中创建的报表。
单击**“打开”**。将在设计视图中打开报表定义。
下面,您将用包含查询参数的查询替换数据集查询。
替换现有数据集查询
在“报表数据”窗格中,右键单击数据集 DataSet1,然后单击**“查询”**。将打开查询设计器。
在“查询”窗格中,用以下查询替换文本:
SELECT SH.OrderDate ,SH.SalesOrderNumber ,SD.OrderQty ,SD.LineTotal ,P.Name AS [Product] ,PS.Name AS [Subcategory] FROM Sales.SalesOrderHeader AS SH INNER JOIN Sales.SalesOrderDetail AS SD ON SH.SalesOrderID = SD.SalesOrderID INNER JOIN Production.Product AS P ON SD.ProductID = P.ProductID INNER JOIN Production.ProductSubcategory AS PS ON PS.ProductSubcategoryID = P.ProductSubcategoryID INNER JOIN Production.ProductCategory AS PC ON PC.ProductCategoryID = PS.ProductCategoryID WHERE PC.Name = 'Clothing' AND SH.OnlineOrderFlag = 0 AND (SH.OrderDate BETWEEN (@StartDate) AND (@EndDate))
除删除了用于排序的 ORDER BY 子句并添加了带有两个限制参数的条件之外,该查询与以前的查询相同:
AND (SH.OrderDate BETWEEN (@StartDate) AND (@EndDate))
在工具栏上单击**“运行”(!)。此时将打开“定义查询参数”**对话框,提示您为每个参数输入值。
提供以下两个值以查看筛选的结果集:
在**“参数值”**列中,为 @StartDate 输入值,例如 20010101。
在**“参数值”**列中,为 @EndDate 输入值,例如 20030101。
单击“确定”。
结果集显示 2001 至 2002 年期间具有订单值的数据集。
单击“确定”。
在“报表数据”窗格中,展开“参数”节点以查看两个根据查询参数自动创建的报表参数 StartDate 和 EndDate。
在定义表示日期或时间的查询参数之后,必须更改报表参数的数据类型以使其匹配。
更改报表参数的数据类型和默认值
在“报表数据”窗格中,右键单击 StartDate,然后单击**“参数属性”**。
确保参数名称为 StartDate 且提示为“开始日期”。
在**“数据类型”**中,选择 Date/Time。这会将报表参数设置为报表定义中保存的数据类型。
单击“确定”。
在“报表数据”窗格中,双击 EndDate。验证名称和提示值。
在**“数据类型”**中,选择 Date/Time。
单击“确定”。
单击**“运行”**以预览报表。StartDate 和 EndDate 参数将分别显示在带有日历控件的报表工具栏中。参数的数据类型是 Date/Time 并且未定义可用值列表时,将自动显示日历控件。如果定义了可用值列表,则改为显示一个值下拉列表。
提供两个参数值以运行报表。您可以使用日历控件或只需键入以下日期:
在 StartDate 参数文本框中,键入 2001-01-01。
在 EndDate 参数文本框中,键入 2003-01-01。
单击**“查看报表”**。报表将仅显示位于报表参数值范围中的数据。
为报表创建报表参数后,可以为这些参数添加默认值。默认参数可以使报表自动运行;否则,用户必须输入参数值,报表才能运行。
为参数设置默认值
切换到“设计”视图。
在“报表数据”窗格中,展开“参数”,并双击 StartDate。此时将打开**“报表参数属性”**对话框。
单击**“默认值”**。
选择**“指定值”选项。此时将显示“添加”按钮和空的“值”**网格。
单击**“添加”**。空行即被添加到网格中。
在**“值”**文本框中,替换默认文本 (Null) 并键入 2001-01-01。
单击“确定”。
在“报表设计”窗格中,双击 EndDate。
单击**“默认值”**。
选择**“指定值”**选项。
单击**“添加”**。
键入 2003-01-01。
单击“确定”。
单击**“预览”**。由于每个参数均具有默认值,报表将立即运行。
将新字段添加至查询以用于筛选
切换到“设计”视图。
右键单击数据集 DataSet1 并选择**“数据集属性”**。打开查询设计器,并用以下新查询替换查询:
SELECT SH.OrderDate ,DATENAME(weekday, SH.OrderDate) as Weekday ,SH.SalesOrderNumber ,SD.OrderQty ,SD.LineTotal ,P.Name AS [Product] ,PS.Name AS [Subcategory] FROM Sales.SalesOrderHeader AS SH INNER JOIN Sales.SalesOrderDetail AS SD ON SH.SalesOrderID = SD.SalesOrderID INNER JOIN Production.Product AS P ON SD.ProductID = P.ProductID INNER JOIN Production.ProductSubcategory AS PS ON PS.ProductSubcategoryID = P.ProductSubcategoryID INNER JOIN Production.ProductCategory AS PC ON PC.ProductCategoryID = PS.ProductCategoryID WHERE PC.Name = 'Clothing' AND SH.OnlineOrderFlag = 0 AND (SH.OrderDate BETWEEN (@StartDate) AND (@EndDate))
在查询中,将以下命令添加至 SELECT 语句,以便为发生销售业务的工作日另外定义一个计算列:
,DATENAME(weekday, soh.OrderDate) as Weekday.
单击“运行”(!)。**“定义查询参数”**对话框随即打开。
在**“参数值”**列中,为 @StartDate 输入值,例如 20010101。
在**“参数值”**列中,为 @EndDate 输入值,例如 20030101。
单击“确定”。结果集中应该显示一个标有 Weekday 的新列。
单击**“确定”**两次。在“报表数据”窗格中,确保含有 Weekday 字段。
既然表具有了用于标识工作日的数据,您即可添加筛选器以便只在报表中使用一周中某一天的销售额。若要帮助验证这一点,您可以显示带有销售订单日期的工作日。
设置表中日期的格式
切换到“设计”视图。
单击带 OrderDate 字段表达式的单元。在**“主文件夹”选项卡上的“数字”**组中,单击对话框启动器。
在**“类别”中,确保“日期”**已选中。
在**“类型”**框中,选择用于显示工作日的日期类型。例如,对于区域设置“英语(美国)”,可以选择 Monday, January 31, 2000。
单击“确定”。
单击**“运行”**以预览报表。表第一列中的日期将显示工作日及日历日期。
下面,您将添加参数以使用户按工作日进行筛选。
添加新报表参数
切换到“设计”视图。
在“报表数据”窗格中,单击**“新建”,然后单击“参数”。此时将打开“报表参数属性”**对话框。
在“名称”中,键入 DayoftheWeek。
在**“提示”**中,键入“筛选每周工作日:”。
确保该数据类型是 Text。
单击**“默认值”**。
选择**“指定值”选项。此时将显示“添加”按钮和空的“值”**网格。
单击**“添加”**。
键入 Friday。
单击“确定”。
下面,您将添加筛选器以仅显示为 DayoftheWeek 参数选择的值。可以将筛选器添加到表或数据集中。此报表具有显示相同数据的表和图表。如果只希望在表中显示经过筛选的数据,请将筛选器添加到表中。如果同时希望在表和图表中显示经过筛选的数据,请将筛选器添加到数据集中。在下面的步骤中,您将对数据集设置筛选器。
使用参数表达式设置数据集筛选器
在“设计”视图中,右键单击“报表数据”窗格中的 DataSet1,然后单击**“数据集属性”**。
单击**“筛选器”**。
单击**“添加”**。空行即被添加到网格中。
在**“表达式”**的下拉列表中,选择 [Weekday]。
确保**“运算符”**显示为等号 (=)。
单击**“值”文本框旁边的表达式 (fx) 按钮。此时将打开“表达式”**对话框。
在“类别”中,单击**“参数”**。当前参数列表将显示在“值”窗格中。双击 DayoftheWeek。该参数表达式便会添加至表达式文本框中。现在表达式文本框中将显示以下表达式:=Parameters!DayoftheWeek.Value。
单击“确定”。
**“值”**将显示 DayoftheWeek 参数的简单表达式:[@DayoftheWeek]。
单击“确定”。
数据集的筛选器现在已设置为将 Weekday 字段中的值与 DayoftheWeek 的参数值进行比较。例如,在报表工具栏中为 DayoftheWeek 输入值 Friday 时,报表处理器将仅处理表中字段 Weekday 的值是 Friday 的行。
单击**“预览”**。由于所有参数都有默认值,因此报表会自动运行。表和图表将仅显示由 StartDate 和 EndDate 定义的日期范围内的值以及在 Friday 发生的值。对于此数据集,只有三个日期为星期五:
February 1, 2002
March 1, 2002
November 1, 2002
后续步骤
您已成功地定义了查询参数和报表参数、设置了这些参数的默认值并对数据集设置了筛选器。在下一课中,您将学习如何为参数创建可用值列表,即有效值列表。请参阅第 2 课:添加创建可用值列表的参数 (Report Builder 2.0)。