第 3 课:添加在列表中选择多个值的参数 (Report Builder 2.0)

在本课中,您将了解如何更改参数以接受多个值。这些参数称为多值参数。默认情况下,一个参数接受一个值。上一课创建的参数 BusinessPersonID 和 DayoftheWeek 均接受一个值。若要修改某个参数以接受多个值,您必须知道该参数是否是通过查询参数自动创建的,例如 BusinessPersonID;或者是否是使用“报表数据”窗格手动创建的,例如 DayoftheWeek。

若要修改报表参数以接受多个值,您只需设置报表参数属性。如果报表参数基于查询参数,则还必须更改查询。如果在筛选器中使用该参数,则必须更改 Filter 运算符来指定一组值而非单个值。

替换现有数据集

  1. 在“报表数据”窗格中,右键单击数据集 DataSet1,然后单击**“查询”**。

    将打开基于文本的查询设计器。

  2. 用下列查询替换文本框中的文本:

    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.SalesPerson SP 
      INNER JOIN Sales.SalesOrderHeader AS SH 
          ON SP.BusinessEntityID = SH.SalesPersonID
      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.OrderDate BETWEEN (@StartDate) AND (@EndDate))
          AND SH.SalesPersonID IN (@BusinessPersonID)
    

    除条件已从等于 = 更改为包含 IN 之外,该查询与以前的查询相同:

    AND SH.SalesPersonID IN (@BusinessPersonID)
    
  3. 单击**“运行”(!**) 按钮。提示输入查询参数的值时,请使用下表来输入值。查询设计器不支持测试多值参数。

    @StartDate

    20010101

    @EndDate

    20030101

    @BusinessPersonID

    290

  4. 单击“确定”。 

    随即显示 BusinessPersonID = 290 的销售人员 Ranjit Varkey Chudukatil 的结果集。

编辑 BusinessPersonID 报表参数以接受多个值

  1. 在“报表数据”窗格中,展开**“参数”**,并双击 BusinessPersonID 参数。

  2. 选中**“允许多个值”**选项。

  3. 单击“确定”。 

  4. 单击**“预览”**。报表将自动运行。BusinessPersonID 的下拉列表显示所有销售人员姓名。

注意注意

系统将(“全选”)值用作多值参数可用值下拉列表中的第一个值。使用该复选框可以选中或清除所有值。

添加新数据集以填充报表参数的有效值

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

  2. 在“报表数据”窗格工具栏中,单击**“新建”,然后单击“数据集”。此时将打开“数据集属性”**对话框。

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

  4. 在**“查询类型”中,确保选择的是“文本”**。

  5. 单击**“查询设计器”,然后单击“编辑为文本”**。

  6. 在“查询”窗格中,粘贴以下查询:

    SET DATEFIRST 1;
    SELECT DISTINCT 
       DATEPART(weekday, S.OrderDate) as WeekdayNumber,
       DATENAME(weekday, S.OrderDate) as Weekday
       FROM Sales.SalesOrderHeader S
    Order by WeekdayNumber
    
  7. 单击查询设计器工具栏上的**“运行”(!**) 按钮。结果集将显示序号及每周的工作日。

  8. 单击两次**“确定”退出“数据集属性”**对话框。

    数据集 WeekDaysfromQuery 将显示在“报表数据”窗格中。

编辑参数以接受多个值、默认值和有效值

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

  2. 选择**“允许多个值”**。

  3. 单击**“可用值”**。

  4. 选择**“从查询中获取值”**。

  5. 在**“数据集”**下拉列表中,选择 WeekDaysfromQuery。

  6. 在**“值字段”**下拉列表中,选择 WeekdayNumber。

  7. 在**“标签字段”**下拉列表中,选择 Weekday。

用户选择参数值时,他们是从标签中进行选择,但报表使用的是其值。当设置默认值或筛选器时,这一点非常重要。该值必须是 WeekdayNumber 字段的整数值。

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

  2. 选择**“指定值”**。

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

  4. 在**“值”**中,将 Friday 替换为 6。因为值来自提供工作日数字和工作日名称的数据集,所以默认值必须指定工作日数字。值 6 表示 Saturday。

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

  6. 在**“值”**中,键入 7。此值表示 Sunday。

  7. 单击“确定”。 

    在可以预览报表之前,必须为表更改筛选器表达式以使用 IN 运算符,因为 DayoftheWeek 参数接受多个值。

更改筛选器以使用多值参数

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

  2. 单击**“筛选器”**。其中已包含一个在第 1 课中为 DayoftheWeek 添加的筛选器。

  3. 在**“表达式”**的下拉列表中,确保值为 [Weekday]。

  4. 将**“运算符”**由等号 (=) 更改为 In

  5. 在**“值”**中,键入 [@DayoftheWeek.Label]。

    指定参数标签以便工作日的名称与标签字段相比较,而非与工作日的数值字段相比较。

  6. 单击“确定”。 

    现在设置表的筛选器,使其使用 In 运算符比较字段 Weekday 的值和参数 DayoftheWeek 的标签。为报表参数选择多个值时,筛选器将测试表的每一行,以查看 Weekday 字段是否存在于 DayoftheWeek 集合中。

  7. 单击**“运行”**以预览报表。该报表会显示默认值为 Saturday 和 Sunday 的报表参数 DaysoftheWeek,这些默认值是您指定的默认值的标签。使用下拉列表为 DayoftheWeek 参数选择多个值。

后续步骤

您已成功地将报表参数属性从单值更改为多值。而且已对查询、筛选器和表达式做出必要的更改,以使用多值参数集合。您还学习了在表达式中使用多值参数。在下一课中,您将学习如何创建根据前面参数的选定值有条件地填充其值的参数。请参阅第 4 课:添加级联参数 (Report Builder 2.0)