第 1 课:添加按日期筛选报表的参数 (SSRS)

通过在报表查询中包含开始日期参数和结束日期参数,可以指定用来限定从数据源检索的数据所处的日期范围。您可以创建其他参数,以便对从数据源检索到的数据进行筛选。

在本课中,您将向查询添加 @StartDate@EndDate 参数,以便限定从数据源检索的数据。StartDate 和 EndDate 两个报表参数是自动创建的,并显示在“报表数据”窗格中。参数区分大小写。查询参数以 @ 符号作为开头,而报表参数则不然。

您将这些参数的数据类型设置为 DateTime,并将看到报表查看器工具栏中会显示一个带有参数文本框的日历控件。您还将设置这些参数的默认值,以使报表可以自动运行。最后,您将创建未绑定到查询参数的报表参数 DayofWeek,并使用该报表参数对从数据源检索到的数据进行筛选。

本教程要求您已完成教程:创建基本表报表

打开现有报表服务器项目

  1. 单击**“开始”,依次指向“所有程序”**和 Microsoft SQL Server 2008 R2,单击 Business Intelligence Development Studio

  2. 在**“文件”菜单上,指向“打开”,再单击“项目/解决方案”**。

  3. 单击**“教程”**,然后选择 Tutorial.sln。本教程是在教程:创建基本表报表 中创建的。

  4. 单击**“确定”**打开项目。“教程”项目即在解决方案资源管理器中显示,并带有一个名为 Sales Orders.rdl 的报表。

    注意 如果解决方案资源管理器不可见,请单击**“视图”菜单中的“解决方案资源管理器”**。

将嵌入数据源转换为共享数据源

  1. 在“报表数据”窗格中,右键单击数据源 AdventureWorks 并选择**“转换为共享数据源”。名为 AdventureWorks.rds 的数据源即被添加到“解决方案资源管理器”**中。

  2. 在“报表数据”窗格中,右键单击 AdventureWorks 数据源,并选择**“数据源属性”**。

  3. 在**“名称”**中,键入 AdventureWorks_Ref。

  4. 单击“确定”。

替换现有数据集

  1. 在“报表数据”窗格中,右键单击数据集 AdventureWorksDataset,然后单击**“数据集属性”**。

    注意注意

    如果未显示“报表数据”窗格,请单击“视图”菜单上的“报表数据”

  2. 在**“数据源”**中,确保已选中 AdventureWorks_Ref。

  3. 在**“查询类型”中,确保已选中“文本”**。

  4. 单击**“查询设计器”**按钮打开查询设计器。

  5. 用下列查询替换文本框中的文本。

    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))

  6. 在工具栏上单击**“运行”(!)。此时将打开“定义查询参数”**对话框,提示您输入参数值。

  7. 提供以下两个值以查看筛选的结果集:

    1. 在**“参数值”**列中,为 @StartDate, 输入值,例如 1/31/2001。

    2. 在**“参数值”**列中,为 @EndDate 输入值,例如 1/31/2003。

  8. 单击“确定”。 

  9. 结果集显示 2001 至 2002 年期间筛选后的订单数据集。

  10. 单击两次**“确定”**。“报表数据”窗格即用数据集字段进行填充。另请注意将自动创建 StartDate 和 EndDate 两个报表参数,并显示在“参数”节点下面。

在定义报表的查询参数之后,必须更改报表参数的数据类型,使其与源数据的数据类型匹配。默认数据类型为文本,在大多数数据源中,它映射为字符串数据类型。如果源数据是数字、布尔值或日期/时间,则必须更改报表参数数据类型。

更改报表参数的数据类型和默认值

  1. 在“报表数据”窗格中,展开“参数”,并双击 StartDate。此时将打开**“报表参数属性”**对话框。

  2. 确保参数名称为 StartDate ,并且提示为“开始日期”。

  3. 在**“数据类型”中,选择“日期/时间”**。

  4. 单击“确定”。

  5. 在“报表数据”窗格中,双击 EndDate。验证名称和提示值。

  6. 在**“数据类型”中,选择“日期/时间”**。

  7. 单击“确定”。 

  8. 单击**“预览”**。StartDate 和 EndDate 参数将分别随附一个日历控件显示在报表工具栏中。参数的数据类型是 Date/Time 并且未定义可用值列表时,将自动显示日历控件。如果定义了可用值列表,则改为显示一个值下拉列表。

  9. 提供以下两个参数值以运行报表:

    1. StartDate 参数文本框中,输入日期 1/31/2001。

    2. EndDate 参数文本框中,输入日期 1/31/2003。

  10. 单击**“查看报表”**。报表将仅显示位于报表参数值范围中的数据。

为报表创建报表参数后,可以为这些参数添加默认值。默认参数可以使报表自动运行;否则,用户必须输入参数值,报表才能运行。

为参数设置默认值

  1. 在“设计”视图的“报表数据”窗格中,展开“参数”,并双击 StartDate。此时将打开**“报表参数属性”**对话框。

  2. 单击**“默认值”**。

  3. 选择**“指定值”选项。此时将显示“添加”按钮和空的“值”**网格。

  4. 单击**“添加”**。空行即被添加到网格中。

  5. 单击**“值”**文本框,并删除默认文本 (Null)。

  6. 键入 1/31/2001。单击“确定”。 

  7. 在“报表设计”窗格中,双击 EndDate。

  8. 单击**“默认值”**。

  9. 选择**“指定值”**选项。

  10. 单击**“添加”**。

  11. 键入 1/31/2003。单击“确定”。

  12. 单击**“预览”**。由于为所有参数定义了默认值,因此报表会立即运行。

将新字段添加至查询以用于筛选

  1. 切换到“设计”视图。

  2. 右键单击数据集 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.

  3. 单击“运行”(!)。**“定义查询参数”**对话框随即打开。

  4. 在**“参数值”**列中,为 @StartDate, 输入值,例如 1/31/2001。

  5. 在**“参数值”**列中,为 @EndDate 输入值,例如 1/31/2003。

  6. 单击“确定”。结果集中应该显示一个标有 Weekday 的新列。

  7. 单击两次**“确定”**。在“报表数据”窗格中,确保含有 Weekday 字段。

(可选)设置要筛选的表数据中的日期的格式

  1. 单击**“设计”**选项卡。

  2. 右键单击带 [Date] 字段表达式的单元,然后单击**“文本框属性”**。

  3. 单击**“数字”,然后在“类别”字段中,选择“日期”**。

  4. 在**“类型”**框中,选择“2000 年 1 月 31 日,星期一”。

  5. 单击**“确定”**。

添加新报表参数

  1. 在“设计”视图中,单击“报表数据”窗格中的**“新建”,然后单击“参数”。此时将打开“报表参数属性”**对话框。

  2. 在“名称”中,键入 DayoftheWeek。

  3. 在**“提示”**中,键入“筛选每周工作日:”。

  4. 确保该数据类型是 Text。

  5. 单击**“默认值”**。

  6. 选择**“指定值”选项。此时将显示“添加”按钮和空的“值”**网格。

  7. 单击**“添加”**。

  8. 键入 Friday。

  9. 单击“确定”。  

使用参数表达式设置表筛选器

  1. 在“设计”视图中,右键单击表的行控点或列控点,并选择**“Tablix 属性”**。

    注意注意

    表数据区域是基于 Tablix 数据区域的模板。

  2. 单击**“筛选器”**。此时将显示空筛选器网格。

  3. 单击“添加”。空行即被添加到网格中。

  4. 在**“表达式”**的下拉列表中,选择 [Weekday]。

  5. 确保**“运算符”**显示为等号 (=)。

  6. 单击**“值”文本框旁边的表达式 (fx) 按钮。此时将打开“表达式”**对话框。

  7. 在“类别”中,单击**“参数”**。当前参数列表将显示在“值”窗格中。双击 DayoftheWeek。该参数表达式便会添加至表达式文本框中。现在表达式文本框中将显示以下表达式:=Parameters!DayoftheWeek.Value。

  8. 单击“确定”。再次单击**“确定”,退出“Tablix 属性”**对话框。

    现在设置表的筛选器,使其比较字段 Weekday 中的值和 DayoftheWeek 的参数值。例如,在报表工具栏中为 DayoftheWeek 输入值 Friday 时,报表处理器将仅处理表中字段 Weekday 的值是 Friday 的行。

    单击**“预览”**。由于所有参数都有默认值,因此报表会自动运行。该表将仅显示由 StartDate 和 EndDate 定义的日期范围中的值,以及有关 Friday 的值。

后续步骤

您已成功地定义了查询参数和报表参数,为这些参数设置了默认值并在表上设置了筛选器。在下一课中,您将学习如何为参数创建可用值列表,即有效值列表。请参阅第 2 课:添加创建可用值列表的参数 (SSRS)