第 2 课:向报表添加级联参数

新建日期: 2006 年 7 月 17 日

级联参数为存在自然关系的一组参数中的每一个参数提供了筛选可用值的方法。例如,在 AdventureWorks 数据库中,各分销商的地址位于某个市县的特定地点(字段 City)。市县分组到各个州/省/市/自治区(字段 StateProvince)。州、自治区和省则分组到各个国家或地区中(字段 CountryRegion)。国家或地区已分组到各个销售区域中(字段 TerritoryGroup)。可以为具有关联顺序的这些字段创建四个级联参数,从范围最广的类别 TerritoryGroup,直到最具体的 City

如果报表工具栏中包含了级联参数,报表读者可以从第一个参数中选择一个值,该值决定了可从下一个参数中选择的值,依此类推。通过这种方式,可以从成千上万个选择中为各个级联参数筛选出数量便于管理的多个选择。

级联参数具有隐含顺序。在报表设计器中查看报表参数时,参数窗格将按顺序列出参数。列表中的第一个参数不依赖于其他任何参数。此列表中的下一个参数在作为级联参数时将依赖于前一个参数。可以用报表参数对话框中的向上箭头和向下箭头按钮来对参数重新进行排序。

在本课中,您将学习如何向上一个教程中创建的 Sales Orders 报表添加四个级联参数(TerritoryGroup、CountryRegion、StateProvince 和 City)。您将为每个参数创建一个用于填充其可用值列表的数据集。在为有效值数据集创建带查询参数的查询时,系统将自动创建报表参数。由于已经为从最广泛 (TerritoryGroup) 到最具体 (Cities) 的有效值列表创建了数据集,所以您将以正确的依赖顺序创建报表参数。对于最后的有效值数据集 (Cities),您将学习如何手动创建报表参数并使其与对应的查询参数关联。

创建所有数据集之后,您将修改各报表参数的默认属性,并将有效值和默认值属性设置为指向相应的数据集和字段。

最后,还必须修改原始数据集查询,以包含各个报表参数的查询参数。运行报表时,您将依次为各级联参数选择值。您会发现下一参数的可用值仅列出在选择第一个参数之后生效的值。

操作过程

打开 ResellersWorldwide 报表

  1. SQL Server Business Intelligence Development Studio 中,打开在上节课中创建的“高级参数教程”报表服务器项目。

  2. 在解决方案资源管理器中,双击 Resellers Worldwide 报表。将在**“布局”**视图中打开此报表。

  3. 单击**“数据”**选项卡。

为参数 TerritoryGroup 添加可用值数据集

  1. 在**“数据集”下拉列表中,单击“<新建数据集>”。将打开“数据集”**对话框。

  2. 在**“查询”选项卡的“名称”**文本框中,键入 ValidValuesforTerritoryGroup

  3. 确保**“数据源”**是 Resellers

  4. 确保**“命令类型”“Text”**。

  5. 将下列查询粘贴到查询窗格中。

    SELECT distinct [Group] as SalesTerritory
       FROM [AdventureWorks].[Sales].[SalesTerritory]
    
  6. 单击**“运行”** (!) 以查看结果集。将显示 SalesTerritory 列,并带有三行:Europe、North America 和 Pacific。

为参数 CountryRegion 添加可用值数据集

  1. 在**“数据集”下拉列表中,单击“<新建数据集>”。将打开“数据集”**对话框。

  2. 在**“查询”选项卡上的“名称”**文本框中,键入 ValidValuesforCountryRegion

  3. 确保**“数据源”**是 Resellers

  4. 确保**“命令类型”“Text”**。

  5. 将下列查询粘贴到查询窗格中。

    SELECT Distinct CR.Name AS CountryRegion
    FROM Sales.Store AS S
        JOIN Sales.CustomerAddress AS CA ON CA.CustomerID = S.CustomerID
        JOIN Person.Address AS A ON A.AddressID = CA.AddressID
        JOIN Person.StateProvince SP ON 
            SP.StateProvinceID = A.StateProvinceID
        JOIN Person.CountryRegion CR ON 
            CR.CountryRegionCode = SP.CountryRegionCode
        JOIN Sales.Customer C on S.CustomerID = C.CustomerID
        JOIN Sales.SalesTerritory T on C.TerritoryID = T.TerritoryID
    WHERE (T.[Group] = (@TerritoryGroup))
    Order by CR.Name
    
  6. 单击**“运行”** (!)。将打开**“定义查询参数”**对话框。

  7. 键入 Pacific

    系统将显示结果集,结果集中包含 CountryRegion 列和值为 Australia 的一行。

    在定义名为 @TerritoryGroup 的查询参数时,系统将创建名为 TerritoryGroup 的新报表参数。

  8. (可选)在**“数据集”下拉列表旁边,单击“编辑所选的数据集”** () 按钮,然后单击**“参数”**选项卡。确保查询参数 @TerritoryGroup 绑定到报表参数 TerritoryGroup (=Parameters!TerritoryGroup.Value) 的值。

为参数 StateProvince 添加可用值数据集

  1. 在**“数据集”下拉列表中,单击“<新建数据集>”。将打开“数据集”**对话框。

  2. 在**“查询”选项卡上的“名称”**字段中,键入 ValidValuesforStateProvince

  3. 确保**“数据源”**是 Resellers

  4. 确保**“命令类型”“Text”**。

  5. 将下列查询粘贴到查询窗格中。

    SELECT Distinct SP.Name AS StateProvince
    FROM Sales.Store AS S
        JOIN Sales.CustomerAddress AS CA ON CA.CustomerID = S.CustomerID
        JOIN Person.Address AS A ON A.AddressID = CA.AddressID
        JOIN Person.StateProvince SP ON 
            SP.StateProvinceID = A.StateProvinceID
        JOIN Person.CountryRegion CR ON 
            CR.CountryRegionCode = SP.CountryRegionCode
    WHERE (CR.Name = @CountryRegion)
    Order by SP.Name
    
  6. 单击**“运行”** (!) 以查看结果集。将打开**“定义查询参数”**对话框会打开。

  7. 在**“参数值”文本框中,键入 Australia。单击“确定”**。

    系统将显示 StateProvince 列,并带有四行:New South Wales、Queensland、South Australia 和 Victoria。

为参数 City 添加可用值数据集

  1. 在**“数据集”下拉列表中,单击“<新建数据集>”。将打开“数据集”**对话框。

  2. 在**“查询”选项卡上的“名称”**字段中,键入 ValidValuesforCity

  3. 确保**“数据源”**是 Resellers

  4. 确保**“命令类型”“Text”**。

  5. 将下列查询粘贴到查询窗格中。

    SELECT Distinct A.City 
    FROM Sales.Store AS S
        JOIN Sales.CustomerAddress AS CA ON CA.CustomerID = S.CustomerID
        JOIN Person.Address AS A ON A.AddressID = CA.AddressID
        JOIN Person.StateProvince SP ON 
            SP.StateProvinceID = A.StateProvinceID
        JOIN Person.CountryRegion CR ON 
            CR.CountryRegionCode = SP.CountryRegionCode
        JOIN Sales.Customer C on S.CustomerID = C.CustomerID
        JOIN Sales.SalesTerritory T on C.TerritoryID = T.TerritoryID
    WHERE (
        T.[Group] = (@TerritoryGroup) AND
        CR.[Name] = (@CountryRegion) AND
        SP.[Name] = (@StateProvince)
        )
    Order by A.City
    
  6. 单击**“运行”** (!) 以查看结果集。此时,**“定义查询参数”**对话框会打开。

  7. 在**“参数值”**文本框中,按照下表键入各查询参数的值。

参数名称 参数值

@TerritoryGroup

Pacific

@CountryRegion

Australia

@StateProvince

Victoria

  1. 单击**“确定”**。
    系统将显示 City 列以及三行:Melbourne、Seaford 和 South Melbourne。

现在,您已经创建了四个级联参数。接下来,您将学习如何编辑所创建报表参数的属性,这些报表参数与查询参数相对应。您将各参数设置为使用相应的数据集来检索可用值集。

设置 TerritoryGroup 报表参数的可用值

  1. 在**“报表”菜单中,单击“报表参数”“报表参数”对话框将打开,并且在“参数”**窗格已选中 TerritoryGroup

  2. 确保**“数据类型”**是 String

  3. 在**“提示”**文本框中,键入“选择一个区域组:”。

  4. 确保未选中任何复选框。

  5. 在**“可用值”部分中,选择“来自查询”**。

  6. 从**“数据集”**下拉列表中,选择 ValidValuesforTerritoryGroup

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

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

  9. 在**“默认值”部分中,选择“无查询”**。

  10. 在文本框中,键入 North America

    可以将默认值设置为特定值或来自某个数据集字段的默认值。因为此参数是 String 类型,所以可以直接在文本框中输入值。对于其他数据类型,则可键入以等号 (=) 开头的表达式。

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

  12. (可选)单击**“预览”**选项卡。将显示 TerritoryGroup 参数,该参数带有默认值 Europe 以及来自 ValidValuesforTerritoryGroup 数据集的 SalesTerritory 字段的有效值。

    在本课的最后阶段对 Resellers 数据集查询进行更改之前,您无法看到报表数据发生的更改。

设置 CountryRegion 报表参数的可用值

  1. 在**“报表”菜单中,单击“报表参数”。将打开“报表参数”**对话框。

  2. 在**“参数”**窗格中,选择 CountryRegion

  3. 确保**“数据类型”**是 String

  4. 在**“提示”**文本框中,键入“选择一个国家/地区:”。

  5. 确保未选中任何复选框。

  6. 在**“可用值”部分中,选择“来自查询”**。

  7. 从**“数据集”**下拉列表中,选择 ValidValuesforCountryRegion

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

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

  10. 在**“默认值”部分中,选择“来自查询”**。

  11. 在**“数据集”**下拉列表中,选择 ValidValuesforCountryRegion

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

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

  14. (可选)单击**“预览”**选项卡。为 TerritoryGroup 选择一个值。为 CountryRegion 参数选择一个值。检查您看到的 CountryRegion 值是否是与选定的“区域”组相对应的有效值。

设置 StateProvince 报表参数的可用值

  1. 在**“报表”菜单中,单击“报表参数”。将打开“报表参数”**对话框。

  2. 在**“参数”**窗格中,选择 StateProvince

  3. 确保**“数据类型”**是 String

  4. 在**“提示”**文本框中,键入“选择一个州/自治区/省:”。

  5. 确保未选中任何复选框。

  6. 在**“可用值”部分中,选择“来自查询”**。

  7. 从**“数据集”**下拉列表中,选择 ValidValuesforStateProvince

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

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

  10. 在**“默认值”部分中,选择“来自查询”**。

  11. 在**“数据集”**下拉列表中,选择 ValidValuesforStateProvince

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

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

  14. (可选)单击**“预览”**选项卡。为 TerritoryGroup 选择一个值。为 CountryRegion 参数选择一个值。为 StateProvince 参数选择一个值。检查您看到的 StateProvince 值是否是与选定的 TerritoryGroupCountryRegion 相对应的有效值。

创建 City 报表参数并设置其属性

  1. 在**“报表”菜单中,单击“报表参数”。将打开“报表参数”**对话框。

  2. 在**“参数”**窗格中,可注意到并不存在名为 City 的报表参数。

    在为数据集定义包含参数的查询时,会自动创建报表参数。到目前为止,创建的数据集查询无一包含 @City 查询参数。您可以创建一个名为 City 的报表参数,在定义确实包含 @City 查询参数的查询时,如果报表参数有对应名称(不包括查询参数指示符“@”的名称),那么查询参数将自动绑定到报表参数。

  3. 单击**“添加”**。将创建一个具有默认属性的报表参数。

  4. 在**“属性”部分的“名称”**文本框中,键入 City

  5. 确保**“数据类型”**是 String

  6. 在**“提示”**文本框中,键入“选择一个市县:”。

  7. 确保未选中任何复选框。

  8. 在**“可用值”部分中,选择“来自查询”**。

  9. 从**“数据集”**下拉列表中,选择 ValidValuesforCity

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

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

  12. 在**“默认值”部分中,选择“来自查询”**。

  13. 在**“数据集”**下拉列表中,选择 ValidValuesforCity

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

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

  16. (可选)单击**“预览”**选项卡。为 TerritoryGroupCountryRegionStateProvince 参数选择值。检查您看到的 City 参数值是否是与您的选择相对应的有效值。

到目前为止,您已经创建了级联参数值。现在,您需要将这些值包含到表数据区域的数据集查询中,从而使您选择的参数包含在检索表数据的查询中。

修改分销商 Salesorders 数据集的查询以包含现有查询参数

  1. 在“数据”视图的**“数据集”**下拉列表中,选择 Resellers。查询窗格中将出现上一课中创建的原始查询字符串。

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

    SELECT S.CustomerID, SO.SalesOrderNumber, SO.OrderDate, SO.TotalDue,
        S.Name AS Store, A.City, SP.Name AS State, CR.Name
        AS CountryRegion, 
        SC.ContactID As StoreContactID, T.[Group] As TerritoryGroup
    FROM Sales.Store AS S
        JOIN Sales.CustomerAddress AS CA ON CA.CustomerID = S.CustomerID
        JOIN Person.Address AS A ON A.AddressID = CA.AddressID
        JOIN Person.StateProvince SP ON 
            SP.StateProvinceID = A.StateProvinceID
        JOIN Person.CountryRegion CR ON 
            CR.CountryRegionCode = SP.CountryRegionCode
        JOIN Sales.SalesOrderHeader AS SO ON 
        S.CustomerID = SO.CustomerID
        JOIN Sales.StoreContact SC ON  S.CustomerID = SC.CustomerID
        JOIN Sales.Customer C on S.CustomerID = C.CustomerID
        JOIN Sales.SalesTerritory T on C.TerritoryID = T.TerritoryID
    WHERE(
        (T.[Group] = (@TerritoryGroup))
        AND
        (CR.Name = (@CountryRegion))
         AND
         (SP.Name = (@StateProvince))
        AND
        (A.City = (@City))
       )
    ORDER BY S.CustomerID 
    

    现在,查询包含了使用报表参数值的查询参数。

  3. 单击**“运行”** (!) 以查看结果集。此时,**“定义查询参数”**对话框会打开。

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

参数名称 参数值

@TerritoryGroup

Pacific

@CountryRegion

Australia

@StateProvince

Victoria

@City

Melbourne

  1. 单击**“确定”**。
    结果集将包含 Melbourne 市分销商的销售情况。
    当您将查询参数添加到 Resellers 数据集的查询定义时,它们将自动设置为从对应的报表参数值获取值。
  2. (可选)在**“数据集”下拉列表旁边,单击“编辑所选的数据集”** () 按钮,然后单击**“参数”**选项卡。确保查询参数 @TerritoryGroup@CountryRegion@StateProvince@City 绑定到对应报表参数的值。

设置 NoRows 值

  1. 单击**“布局”**选项卡以切换到“布局”视图。

  2. 在表中单击,系统将显示表的控点。单击表的角控点以选中该表。该表将带有灰色轮廓。

  3. 在属性窗口中,找到 NoRows 属性。在相邻的文本框中粘贴下列文本。

    本地区无分销商。

创建主报表标题和参数值文本框

  1. 单击**“布局”**选项卡以切换到“布局”视图。

  2. 右键单击包含报表处理时间戳的文本框,然后选择**“表达式”**。

  3. 单击**“值”文本框旁边的表达式(“Fx”)按钮。将打开“编辑表达式”**对话框。用以下内容替换时间戳表达式:

    ="Report Processed Date: " & 
      Globals!ExecutionTime.ToShortDateString() & " " & 
      Globals!ExecutionTime.ToShortTimeString() & vbCrLf & 
      "Sales Territory for: " 
    & Parameters!TerritoryGroup.Value & ", " 
    & Parameters!CountryRegion.Value & ", "
    & Parameters!StateProvince.Value & ", "
    & Parameters!City.Value
    
  4. 单击**“预览”。尝试选择不同的参数值。注意:在选择每个后续参数时,下一参数的下拉列表将根据您的选择只显示可用值。即使您选择了新参数,报表数据也不会改变。若要使用新选择的参数重新处理报表,请单击“查看报表”**。

后续步骤

您已经成功地用级联参数创建了报表,该报表将按区域显示分销商的销售情况。在下一课中,您将学习如何用参数来更改表详细信息行和表组的排序方式。请参阅第 3 课:使用参数更改初始排序和交互式排序

请参阅

其他资源

在 Reporting Services 中使用参数
使用参数控制报表数据

帮助和信息

获取 SQL Server 2005 帮助