第 4 课:添加级联参数

级联参数提供了一种管理大量报表数据的方法。使用级联参数,一个参数的值列表取决于前面参数选取的值。顺序对于级联参数来说很重要,因为对较晚出现在列表中的参数的数据集查询将包含对较早出现在列表中的参数的引用。

在本课中,您将使用为类别、子类别和产品定义三个查询参数的主数据集查询来创建报表。您将定义三个其他数据集,以便为每个级联参数提供可用值。

向打开的报表服务器项目添加新报表

  1. 在解决方案资源管理器中,右键单击**“报表”,指向“添加”,再单击“新建项”**。

  2. 在**“添加新项”对话框的“模板”下,单击“报表”**。

  3. 在**“名称”中,键入 CascadingParameters.rdl,再单击“添加”**。

    此时报表设计器将打开,并在“设计”视图中显示新的 .rdl 文件。

创建对共享数据源的引用

  1. 在“报表数据”窗格中,单击**“新建”,然后单击“数据源”**。

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

  3. 选择**“使用共享数据源引用”**。

  4. 从下拉列表中选择 AdventureWorks。

  5. 单击“确定”。

使用查询和查询参数创建主数据集

  1. 在“报表数据”窗格中,右键单击数据源 AdventureWorks_Ref,然后单击**“添加数据集”**。

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

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

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

  5. 在查询窗格下面,单击**“查询设计器”**。

  6. 粘贴以下查询:

    SELECT 
       PC.Name AS Category,
       PSC.Name AS Subcategory,
       P.Name AS Product,
       SOH.[OrderDate],
       SOH.SalesOrderNumber,
       SD.OrderQty, 
       SD.LineTotal
       FROM [Sales].[SalesPerson] SP 
          INNER JOIN [Sales].[SalesOrderHeader] SOH 
          ON SP.[BusinessEntityID] = SOH.[SalesPersonID]
          INNER JOIN Sales.SalesOrderDetail SD
          ON SD.SalesOrderID = SOH.SalesOrderID
          INNER JOIN Production.Product P
          ON SD.ProductID = P.ProductID
          INNER JOIN Production.ProductSubcategory PSC
          ON P.ProductSubcategoryID = PSC.ProductSubcategoryID
          INNER JOIN Production.ProductCategory PC
          ON PC.ProductCategoryID = PSC.ProductCategoryID
          WHERE (PC.Name = (@Category)
             AND PSC.Name = (@Subcategory)
             AND P.Name = (@Product))
    

    查询现在包含查询参数 @Category、@Subcategory@Product。

  7. 单击“运行”(!) 以查看结果集。系统将打开**“定义查询参数”**对话框。

  8. 在**“参数值”**列中,按照下表键入各查询参数的值。

    参数名称

    参数值

    @Category

    Components

    @Subcategory

    Brakes

    @Product

    Front Brakes

  9. 单击“确定”。

    结果集包含按日期分组的 Front Brakes 的销售订单号列表。

    运行查询时,每个查询参数生成了相应的报表参数。单击两次**“确定”**退出查询设计器和相应对话框。

  10. (可选)在“报表数据”窗格中,展开“参数”节点,确保显示以下报表参数:Category、Subcategory 和 Product。

  11. (可选)每个数据集查询参数的值绑定到同名的报表参数。若要对此进行验证,请在“报表数据”窗格中,右键单击 SalesbyCategory,然后单击**“数据集属性”**。

    1. 单击**“参数”**。

    2. 在**“参数名称”**列中,确保名称为 @Category、@Subcategory@Product。

    3. 在**“参数值”**列中,确保值为 [@Category]、[@Subcategory] 和 [@Product]。

      这些简单表达式引用在“报表数据”窗格中显示的报表参数。

接下来,您将创建一个在运行时为每个报表参数提供两个值的数据集。这些值将填充可用值,并且还会提供默认值,以使报表自动运行。

为报表参数定义有效值数据集

  1. 在“报表数据”窗格中,右键单击 AdventureWorks_Ref,然后单击**“添加数据集”**。

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

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

  4. 在**“查询类型”中,确保已设置“文本”**。

  5. 在**“查询”窗格下面,单击“查询设计器”**。

  6. 将以下查询文本粘贴到**“查询”**窗格中:

    SELECT DISTINCT Name AS Category FROM Production.ProductCategory
    

    SELECT DISTINCT 命令仅检索列中的唯一值。

  7. 单击**“运行”(!**) 以查看结果集。Category 列将显示有四个值:Accessories、Bikes、Clothing 和 Components。

  8. 单击“确定”。

接下来,您将设置 Category 报表参数的属性,并将上面查询中的值用作其可用值和默认值。

设置报表参数的可用值和默认值

  1. 在“报表数据”窗格的“参数”文件夹中,右键单击 Category,然后单击**“参数属性”**。

  2. 在**“名称”**中,确保名称为 Category。

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

  4. 单击**“从查询中获取值”**。随即将显示以下三个字段。

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

  6. 在**“值”**字段中,单击 Category。

  7. 在**“标签”**字段中,单击 Category。

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

  9. 单击**“从查询中获取值”**。

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

  11. 在**“值”**字段中,选择 Category。

  12. 单击“确定”。

接下来,您将修改 @Subcategory 参数,使其取决于为 @Category 选取的值。

为报表参数 Subcategory 添加值数据集

  1. 在“报表数据”窗格中,右键单击 AdventureWorks_Ref,然后单击**“添加数据集”**。

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

  3. 将以下查询文本粘贴到“查询”窗格中:

    SELECT DISTINCT PSC.Name AS Subcategory 
       FROM Production.ProductSubcategory AS PSC
          INNER JOIN Production.ProductCategory AS PC
          ON PC.ProductCategoryID = PSC.ProductCategoryID
          WHERE PC.Name = (@Category)
    
  4. 单击“确定”。

  5. 数据集 SubcategoryValues 将显示在“报表数据”窗格中。Subcategory 字段具有 14 个列出组件的行。

接下来,设置 @Subcategory 报表参数的属性,并将上面查询中的值用作其可用值和默认值。

设置 Subcategory 报表参数的可用值和默认值

  1. 在“报表数据”窗格的“参数”文件夹中,右键单击 Subcategory,然后单击**“参数属性”**。

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

  3. 单击**“从查询中获取值”**。

  4. 在**“数据集”**下拉列表中,单击 SubcategoryValues。

  5. 在**“值”**字段中,单击 Subcategory。

  6. 在**“标签”**字段中,单击 Subcategory。

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

  8. 单击**“从查询中获取值”**。

  9. 在**“数据集”**下拉列表中,单击 SubcategoryValues。

  10. 在**“值”**字段中,单击 Subcategory。

  11. 单击“确定”。

接下来,创建取决于 @Category 值和 @Subcategory 值的 @Product 参数。

为报表参数 Product 添加值数据集

  1. 在“报表数据”窗格中,右键单击 AdventureWorks_Ref,然后单击**“添加数据集”**。

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

  3. 将以下查询文本粘贴到“查询”窗格中:

    SELECT DISTINCT P.Name AS Product
    FROM Production.Product P
       INNER JOIN Production.ProductSubcategory AS PSC
       ON P.ProductSubcategoryID = PSC.ProductSubcategoryID
       INNER JOIN Production.ProductCategory AS PC
       ON PC.ProductCategoryID = PSC.ProductCategoryID
    WHERE (PC.Name = (@Category)
       AND PSC.Name = (@Subcategory))
    
  4. 单击“确定”。

    此时,将向“报表数据”窗格添加包含一个 Product 字段的 ProductValues 数据集。

接下来,设置 @Product 参数的属性,并将上面查询中的值用作其可用值和默认值。

设置 Product 报表参数的可用值和默认值

  1. 在“报表数据”窗格的“参数”文件夹中,右键单击 Product,然后单击**“参数属性”**。

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

  3. 单击**“从查询中获取值”**。

  4. 在**“数据集”**下拉列表中,单击 ProductValues。

  5. 在**“值”**字段中,单击 Product。

  6. 在**“标签”**字段中,单击 Product。

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

  8. 单击**“从查询中获取值”**。

  9. 在**“数据集”**下拉列表中,单击 ProductValues。

  10. 在**“值”**字段中,单击 Product。

  11. 单击“确定”。

接下来,将添加一个显示选择每个级联参数的值的效果的表。

添加显示结果的表

  1. 在“设计”视图中,添加一个表。

  2. 在“报表数据”窗格中,将以下字段从 SalesbyCategory 数据集拖至表的详细信息行中的 3 个单元:SalesOrderNumber、OrderQty 和 LineTotal。

  3. 将 Category 从 SalesbyCategory 数据集拖到**“行组”窗格,并将其放置到“详细信息”**组上面。

  4. 将 Subcategory 从 SalesbyCategory 数据集拖到**“行组”**窗格,并将其放置到 Category 下面。

  5. 将 Product 从 SalesbyCategory 数据集拖到**“行组”**窗格,并将其放置到 Subcategory 下面。

  6. 将 OrderDate 从 SalesbyCategory 数据集拖到**“行组”**窗格,并将其放置到 Product 下面。

  7. (可选)设置以下各单元的格式:将 [LineTotal] 设置为“货币”,将 [OrderDate] 设置为“日期”。

测试级联参数

  1. 单击“预览”。

    由于已设置每个报表参数的默认值,因此报表将自动运行。

  2. 从 Category 下拉列表中选择 Components。

  3. 从 Subcategory 下拉列表中选择 Brakes。

  4. 从 Product 下拉列表中选择 Front Brakes。

    注意:在选择每个后续参数时,下一参数的下拉列表将根据您前面的选择只显示有效值。

  5. 在报表查看器工具栏上,单击**“查看报表”**。

此时报表将针对包含“Front Brakes”产品的订单显示销售订单号以及订单数量和行总计。表显示按 category、subcategory、product 和 order date 组织的销售订单。

后续步骤

您已使用按产品类别、子类别和产品名称筛选的级联参数成功创建了显示包含特定产品的销售订单的报表。在下一课中,您将学习将参数传递给钻取报表。请参阅第 5 课:添加要传递给钻取报表的参数