带 SSRS 的条件下拉列表

oba*_*sta 2 reporting-services ssrs-2008

我创建了一个带有下拉列表的 SSRS 报告来参数化报告的数据。这工作正常。我现在需要添加另一个参数来进一步过滤报告。例如,我有一个显示区域、国家、地区等的位置下拉列表。我需要添加另一个依赖于第一个下拉列表的下拉列表。因此,如果我在第一个下拉列表中选择“国家/地区”,则在第二个下拉列表中显示国家/地区列表,或者如果我选择区域 - 我在第二个下拉列表中显示区域列表。Country、Area、Region 数据存储在不同的表中。所以基本上我的查询需要足够智能才能根据第一个下拉选择运行适当的 sql。

非常感谢您提供的任何帮助。

Chr*_*tta 5

Reporting Services 的强大功能之一是一切都是表达式,包括数据集的 SQL 语句。

假设您的第一个参数(描述要选择的内容的参数)被调用Location,它会选择一个位置列表,例如国家、地区等。也许您可以从一个包含 aLocationId和 a的表中得到它Description

SELECT LocationId, Description FROM Locations
Run Code Online (Sandbox Code Playgroud)

您将 Location 参数连接到此查询以获取该Location参数的位置选择器下拉列表。

现在创建第二个参数,称为Select我们要从国家或地区列表中选择的位置。为简单起见,我将假设只有两个位置:LocationId 为 1 的 Country 和 LocationId 为 2 的 Region。

创建一个名为的新数据集Selections并手动向其添加字段,名为IdDescription。将您的Select参数连接到此数据集。现在对于Selections数据集的 SQL 语句,输入以下表达式:

=IIF(Parameters!Location.Value = 1, 
    "SELECT CountryId AS Id, CountryName AS Description FROM Countries", 
    "SELECT RegionId AS Id, RegionName AS Description FROM Regions")
Run Code Online (Sandbox Code Playgroud)

因此,当Location参数设置为 1(国家/地区)时,您可以从国家/地区表中选择,否则从地区表中进行选择。您可以为字段名称设置别名,以便为数据集获得一致命名的字段,以便在Select参数查询中使用。显然,您可以根据需要将其扩展到更多选择。

你明白了,但这有点脆弱——每当你想添加一个新的位置类型时,你必须检查所有报告并更新Selections数据集的 SQL 语句。这很乏味,没有人想要那份工作。我们想要的是一个自动化系统,其中所有报告在添加时都会得到新的选择。

因此,让我们向 Locations 表添加一列,称为 SQLStatement。对于 Country 行,这将具有以下值:

SELECT CountryId AS Id, CountryName AS Description FROM Countries
Run Code Online (Sandbox Code Playgroud)

对于 Region 行,SQLStatement 字段具有以下值:

SELECT RegionId AS Id, RegionName AS Description FROM Regions
Run Code Online (Sandbox Code Playgroud)

现在,Locations 表中包含Selections数据集的 SQLStatement 值。您不能直接使用它(您的数据集只会返回 SQL 语句字段的值,而不是执行它),但您希望有一些返回此字符串的内容作为用于Selections数据集的 SQL 语句的表达式。自定义代码可用于执行此操作。所以用于Selections数据集的表达式将是这样的:

=Code.GetSQLStatement(Parameters!Location.Value)
Run Code Online (Sandbox Code Playgroud)

然后你有这样的自定义代码功能(重要的部分被遗漏了):

Public Function GetSQLStatement(LocationId As Integer) As String
    Dim SQL As String
    SQL = "SELECT SQLStatement FROM Locations WHERE LocationId = " + CStr(LocationId)
    ' Connect to database, get SQLStatement field 
    GetSQLStatement = <Field Value>
End Function
Run Code Online (Sandbox Code Playgroud)

当您想添加另一个位置选择(例如大洲)时,您所要做的就是在 Locations 表中添加另一行,例如 LocationId = 3、Description = Continent 和 SQLStatement = SELECT ContinentId AS Id, ContinentName AS Description FROM Continents,现在您拥有的按位置选择的每个报告都将是能够使用大陆。