【问题标题】:Implement a set of parameters in ssrs which are dependent on each other in any order在 ssrs 中实现一组参数,它们以任意顺序相互依赖
【发布时间】:2022-10-01 08:12:19
【问题描述】:

我在一个表中有 4 列

Continent   Country     State        District
APJ         India       punjab       Tavi
APJ         India       punjab       xyz
APJ         India       punjab       abc
AMS         US          Washington   efg
AMS         US          Washington   yyy
AMS         US          Columbia     bbb

我需要创建四个以任意顺序相互依赖的参数。

报表运行时,默认情况下应在参数中选择以下值,不得重复

parameter1 parameter2   parameter3   parameter4
APJ        India        Punjab       Tavi
AMS        US           Washington   xyz
                        Columbia     abc
                                     efg
                                     yyy
                                     bbb
                    
                    

SSRS 中的要求与示例

  1. 如果我在参数 3 中只选择旁遮普语,那么 parameter1 应仅显示 APJ,parameter2 应仅显示 India,parameter4 应仅显示 Tavi、xyz 和 abc。

  2. 如果我在参数 4 中选择 yyy 和 bbb 则 parameter1 应仅显示 AMS , parameter2 应仅显示 US , parameter3 应仅显示 Washington 和 Columbia

  3. 同样,如果我在参数 2 中选择一个值,那么参数 1、参数 3 和参数 4 的值应该取决于参数 2

  4. 同样,如果我在参数 1 中选择一个值,那么参数 2、参数 3 和参数 4 的值应该取决于参数 1

    标签: sql-server reporting-services business-intelligence azure-synapse


    【解决方案1】:

    你不能轻易做到这一点,SSRS 不允许前向或循环依赖。因此,如果参数 2 依赖于参数 1,则参数 1 不能依赖于参数 2。想象一下只有两个参数的场景,比如国家和省。

    省份的数据集查询可能是SELECT * FROM tblProvince WHERE Country = @pCountry 国家/地区的数据集查询为SELECT * FROM tblCountry WHERE Province = @pProvince

    但是如果不运行依赖于@pCountry 的关联查询,就无法评估@pProvince,如果不运行依赖于@pProvince 的关联查询,就无法评估它,我们一圈又一圈地进行。


    现在一个可能的答案......可能有一种更简单的方法可以做到这一点,但是这应该可以......

    在以下代码中,TestTable1 是您在问题中提供的数据。

    基本思想是我们为每个参数创建一对数据集,其中一个包含可用列的列表,另一个包含该列的值列表。在这个例子中我只做了两个,但原理是一样的,每个查询都会有更多的部分到 WHERE 子句。

    第一个数据集将被称为“dsP1Fields”。这只是我们表中 4 列的列表,因此以下查询就足够了(您可以引用系统对象来获取列名,但这对于这个简单的场景来说太过分了)

    DECLARE @t TABLE(colName varchar(50))
    INSERT INTO @t VALUES ('Continent'), ('Country'), ('State'), ('District')
    SELECT * FROM @t
    

    现在添加一个名为p1Field 的参数并将其可用值设置为dsP1Fields 查询。

    我们可以在这一点上测试报告,以确保我们看到下拉列表中的 4 项......一切都很好,所以继续......

    创建一个名为dsP1Values 的新数据集并将其数据集查询设置为

    DECLARE @sql varchar(1000) = CONCAT('SELECT DISTINCT ', @p1Field, ' as p1Values FROM dbo.TestTable1')
    
    exec (@sql)
    

    请注意,我们必须为返回的列加上别名,因为 SSRS 总是希望返回相同的数据集结构,因此您选择的任何内容都将称为 p1Values

    现在创建一个名为p1Value 的新参数并将其可用值设置为dsP1Values 数据集。

    如果您现在进行测试,您将看到p1Values 根据您选择的字段动态选择正确的值。

    好的,接下来我们做第二个参数,这稍微难一些,因为我们必须适应参数 1 中的选择。

    因此,使用以下查询创建一个名为 dsP2Fields 的新数据集。

    DECLARE @t TABLE(colName varchar(50))
    INSERT INTO @t VALUES ('Continent'), ('Country'), ('State'), ('District')
    SELECT * FROM @t WHERE colName NOT IN(@p1Field)
    

    请注意,我们省略了第一个参数中选择的任何内容,因此您不能两次选择同一列。

    现在创建一个名为p2Field 的新参数并将可用值设置为dsP2Fields

    接下来,使用以下查询创建一个名为 dsP2Values 的新数据集

    DECLARE @sql varchar(1000) 
        = CONCAT('SELECT DISTINCT [', @p2Field, '] as p2Values FROM dbo.TestTable1 ', 
                 'WHERE ', @p1Field, ' = ''', @p1Value, '''')
    
    exec (@sql)
    

    接下来是一个名为p2Value 的新参数,其可用值指向dsP2Values

    如果您现在进行测试,您会发现选择是完全动态的。您可以继续使用其他 2 个参数,只需记住每次扩展查询以容纳已设置的参数,就像我对参数 2 所做的那样。

    这是一个简短的 GIF 来展示这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      相关资源
      最近更新 更多