6

我用谷歌搜索了很多,发现通常无法完成。我在这里遇到了其中一个黑客:

http://www.bp-msbi.com/2011/04/ssrs-cascading-parameters-refresh-solved/

但它在 ssrs 2005 中对我不起作用。只是想知道是否有人在 2005 年尝试过它。或者是否有任何其他可以尝试的黑客。

根据本文,依赖参数仅在其值被第一个参数中的选择无效时才会刷新。如果我们可以在每次参数更改时使相关参数无效,我们将强制执行完全刷新。一种简单的方法是附加一个值,例如使用 NEWID() T-SQL 函数获得的 GUID。

所以基本上我们想在两个真实参数之间引入一个假参数。这个假参数应该每次都返回新值,因为它后面的存储过程会在每次调用 proc 时向结果集添加一个 guid。所以它强制完全刷新其他参数。

现在我面临的主要问题是:

设置此假参数的默认值。对于可用值,伪参数后面的存储过程会运行,并以以下格式返回数据:result1,result2_GUIDFROMSQL

现在看起来如果我要求它从查询中获取默认值,则再次调用相同的存储过程来设置默认值。但是随着存储过程再次运行,新的 guid 来了,因此无法找到旧值,因此它没有按需要设置。

我只需要找出一种机制来将这个 guid 从引入的参数传递到下一个参数。

那就是我失败的地方。

我的问题可以通过创建一个数据源是这个查询字符串的参数来简单地复制。

select getdate() id, @name nid 

所以在这种情况下如何为这个参数设置一个默认值。

4

4 回答 4

1

下面我将介绍一个详细的场景,然后我将展示基于 Visser 和 Abbi 的答案的示例实现。

想象一下,我有一份报告,其中每一行都是一个项目。一个项目有一个状态列,其值为“进行中”或“完成”,还有一个项目经理列,其值为一个人的姓名。以下是表中的行:

  • 项目 A(状态 = 进行中,项目经理 = Bob)
  • 项目 B(状态 = 进行中,项目经理 = Tom)
  • 项目 C(状态 = 完成,项目经理 = Jack)
  • 项目 D(状态 = 完成,项目经理 = Tom)
  • 项目 E(状态 = 完成,项目经理 = Jill)

我想在我的报告中有 2 个参数

  1. 显示已完成的项目?- 这是一个布尔参数
    • 何时false仅显示“进行中”项目 A 和 B
    • true除了“完成”项目 C、D 和 E 之外,何时将显示“进行中”项目 A 和 B。
  2. 项目经理- 这是一个多值文本参数,其选项和默认值需要根据“显示已完成项目?”进行更改?它所依赖的参数。
    • 如果显示已完成的项目?设置为false只有“Bob”和“Tom”选项才会显示,因为它们分别是正在进行的项目 A 和 B 的项目经理。
    • 如果显示已完成的项目?设置为truethen 除了“Bob”和“Tom”之外,您还将有“Jack”和“Jill”作为选项显示,因为它们分别是非活动项目 Project C 和 Project E 的项目经理。

现在进行实施:

  1. 显示已完成的项目?范围

    显示已完成项目参数

  2. 项目经理数据集查询(有关如何生成密钥的详细信息,请参阅 Visser 和 Abbi 的答案,该密钥将根据独立参数进行更改并强制 SSRS 重新加载默认值)

    SELECT 
        [ProjectManager_Key] = 
            pOuterAlias.[ProjectManager_Key] + '_' + 
            CAST(ROW_NUMBER() OVER(ORDER BY pOuterAlias.[ProjectManager_Key] DESC) AS NVARCHAR(MAX)),
        [ProjectManager] =  pOuterAlias.[ProjectManager]
    FROM 
        (
            SELECT 
                [ProjectManager_Key] = 
                    pInnerAlias.ProjectManager + '_' + 
                    CAST(ROW_NUMBER() OVER(ORDER BY pInnerAlias.ProjectManager ASC) AS NVARCHAR(MAX)),
                [ProjectManager] = pInnerAlias.ProjectManager
            FROM 
            (
                SELECT 
                    [ProjectManager] 
                FROM 
                    [dbo].[Project]
                WHERE
                    Status = 'In Progress' OR
                    @ShowCompletedProjects = 1
            ) pInnerAlias
        ) pOuterAlias
    ORDER BY 
        pOuterAlias.[ProjectManager]
    
  3. 项目经理参数

    • 一般的

      项目经理总经理

    • 可用值

      项目经理可用值

    • 默认值

      项目经理默认值

  4. 项目数据集

    • 询问

      SELECT 
          *
      FROM 
          [dbo].[Project]
      WHERE
      (
          Status = 'In Progress' OR
          @ShowCompletedProjects = 1
      ) AND
      Project Manager IN (@ProjectManager)
      
    • 参数(请务必注意[@ProjectManager.Label]使其与数据库中实际项目经理值的项目匹配的部分,而不是我们生成的键。

      项目参数

于 2017-04-27T21:06:37.157 回答
0

最后我能够解决这个问题。这个链接是一个有用的开始。 http://www.optimusbi.com/2012/07/16/multilevel-cascading-select/

基本上它的作用是:以某种方式编写参数查询,以便每次更改其父参数时依赖参数都会更改其值。

该查询添加行号,前面带有“_”。因此,每次用户选择其他值时,行号都会发生变化,因此查询结果集也会发生变化。

然后在使用结果集时删除下划线后的文本以获取真实代码。

于 2012-07-24T16:13:35.070 回答
0

有一种解决方法可以在所有情况下解决此问题。

请注意,先前提供的答案是以某种方式编写查询参数,以便每次更改其父参数时依赖参数都会更改其值,这适用于某些情况,但并非所有情况。如果从属参数的“可用”值由于另一个参数而改变并且从属参数是可见的,则它可以工作,如果从属参数是隐藏的或内部的,或者如果“可用”值没有因为另一个参数而改变参数,它将不起作用。

万无一失的解决方法是在报表中定义一个自定义函数,并在依赖参数的表达式中调用它。自定义函数将参数(依赖参数所依赖的参数)的值作为参数,并简单地返回其值。即使函数只是获取值并返回它,SSRS 也不会检查代码并假设代码可以做任何事情(生成随机数,从磁盘中提取文件等)。因此,SSRS 每次值更改时都会调用该函数,无论从属参数的“可用”值是否更改,也无论从属参数是可见的、隐藏的还是内部的。

像这样的东西:

public function returnArg(ByVal TheArg As String) As String
  return TheArg
end function

假设您有两个参数:

参数1 参数2

并且 Parameter2 取决于 Parameter1。

将 Parameter2 的值设置为一个表达式,其中包括使用函数调用 Parameter1,例如:

=CODE.returnArg(Parameters!Parameter1.Value)

现在在这种情况下 Parameter2 只是显示 Parameter1 中的值,但是这个逻辑可以扩展到更复杂的表达式和多个参数。只要表达式中的每个参数都有 CODE.returnArg(...) 函数调用,SSRS 就会始终刷新该值。

于 2013-06-10T21:32:22.510 回答
0

@Abbi 的第二个链接不再有效。现在可以在以下位置找到该文章: http ://www.optimusinfo.com/multilevel-cascading-select/

不幸的是,图像被破坏了,没有它们,文章有点不完整。我能够在其移动位置找到一张图像(即使尝试适当的变化我也找不到其他图像):http ://www.optimusinfo.com/wp-content/uploads/2012/07/Multilevel-Cascading -with-Select-All-18.jpeg

这给了我使该技术发挥作用所需的最后一条线索:当您设置数据集参数属性时,您需要手动将参数值指定为例如 [@City.Label] 而不是通常的普通旧 [@City ](对应于 [@City.Value]。

这是因为该技术将“值”更改为无法再在数据库中查找的自定义值!因此,您需要使用用户友好、数据库现有的“标签”作为参数。(可能应该很明显,但是......)如果您了解报表生成器,其余的都是非常标准的。

另请注意,此链接目前不适用于多值级联参数。然而,它可以很容易地修改为:只需更改参数存储的过程以加入值拆分函数。我从SQL Server 给出的 udf_splitvarible 函数改编了我的 - In 子句与声明的变量

修改相当简单,但我会举一个例子。这是来自文章(修复了糟糕的格式)。

SELECT 
    l11.CompanyName1+'_'+ CAST(row_number() over( order by  l11.CompanyName1 desc) AS VARCHAR(50) )as CompanyName11
    ,l11.CompanyName
FROM 
(
    SELECT 
        l1.CompanyName+'_'+ CAST(row_number() over( order by  l1.CompanyName asc) AS VARCHAR(50) )as CompanyName1
        ,l1.CompanyName
    FROM 
    (
        SELECT DISTINCT CompanyName
        FROM Customers
        WHERE City IN(@City)
    )l1
)l11
ORDER BY l11.CompanyName ASC

改变:

SELECT DISTINCT CompanyName
FROM Customers
WHERE City IN(@City)

到:

SELECT DISTINCT CompanyName
FROM Customers
INNER JOIN udf_SplitVariable(@City,',') v ON City = v.Value

这也适用于 SQL Server 2008/Report Builder 3。

我无法理解/应用@borkmark 的答案。这些限制似乎不适用于我的情况。

于 2015-04-29T04:52:26.597 回答