【问题标题】:SQL Report Builder 3.0 Multi Value ParameterSQL Report Builder 3.0 多值参数
【发布时间】:2013-01-08 00:41:41
【问题描述】:

我有一个需要在文本字段参数中接受数字范围和逗号分隔值的报告。该参数用于“帐户类型”,他们希望能够输入“1,2,5-9”,这将采用整数值 1,2,5,6,7,8,9。我知道如何使用单个值来执行此操作,但从不使用范围。

我将用于单个值的示例代码是:

    SELECT
      arcu.vwARCUAccount.AccountType
      ,arcu.vwARCUAccount.ACCOUNTNUMBER
    FROM
      arcu.vwARCUAccount
    WHERE
      arcu.vwARCUAccount.AccountType = @AccountType

任何信息都会非常有帮助。我团队中的某个人已经估计了它,并说它可以在没有意识到他们想要一个范围的情况下完成,所以现在我被困住了。我敢打赌这里的每个人都在我的位置上,所以我提前感谢大家。

【问题讨论】:

    标签: tsql reporting-services ssrs-2008 reportbuilder3.0


    【解决方案1】:

    有几件事你想做。

    A.设置一个数据类型为“整数”的参数,并确保选中“允许多个值”复选框。将其值设置为“整数”。现在打好了。

    这实际上设置了一个数据集的可用数组列表,您为该类型的数据类型定义可以传递多个数据集。

    B.创建一个名为“values”的简单数据集,就像这样

        declare @Ints table ( id int);
    
        insert into @Ints values (1),(2),(5),(6),(7),(8),(9)
    

    C.回到第一步中的变量并打开它的属性。在侧窗格中选择“可用值”。选择单选按钮“从查询中获取值”。将您的数据集列为“值”,将您的值和标签列为“id”。

    您现在已将参数数组绑定到您指定的值。然而,用户不必只选择其中一项或全部,而是选择其中一项或多项。

    D.你需要设置你的主数据集(我假设你在来这里之前已经做过)。出于我的示例的目的,我将制作一个简单的示例。我创建了一个名为 person 的数据集:

        declare @Table Table ( personID int identity, person varchar(8));
    
        insert into @Table values ('Brett'),('Brett'),('Brett'),('John'),('John'),('Peter');
    
        Select *
        from @Table
        where PersonID in (@Ints)
    

    重要的部分是谓词显示:

    'PersonID in (@Ints)'

    这告诉数据集它依赖于用户在这个数组参数中选择一个值。

    【讨论】:

    • 我做了更多的研究,而且效果很好。感谢您的帮助。不过还有一个问题。您如何默认为“全部”值?
    • 如果你想要默认值,我通常在使用数组时将第二个数据集设置为默认值。因此,当您在步骤 B 中设置所有值的临时表时,请将另一个数据集设置为“默认值”。然后对于其他步骤,请转到步骤 C 之类的参数,但选择“默认值”。只要您的所有默认值都在主列表的数组中,它就会成功。当您的用户运行报告时,他们将看到这些都已选中以启动。我在几乎所有的报告中都使用默认设置,这样可以加快用户速度。
    【解决方案2】:

    我对 tsql 并不完全精通,但是使用 reg 表达式呢?

    LIKE (Transact-SQL)

    如:

    arcu.vwARCUAccount.AccountType like '[' + replace(@AccountType, ',','') + ']'
    

    【讨论】:

    • 但是我刚刚意识到这仅适用于最大为 9 的帐号
    • 它也不适用于范围 (5-9)。我可以创建一个可以扩展列表的函数吗?有人对我从哪里开始有任何想法吗?
    • 您可以在报表生成器中使用 vb 函数,这样就可以了 - msdn
    【解决方案3】:

    这可以工作。作为一个粗略的刷子尝试:

    1. 从 tsql 中移除账户类型的过滤器。

    2. 创建一个输入数字的 vb 函数,这是帐户类型,并测试它是否在用户提供的参数字符串中并输出 1 或 0。Vb Functions

        Function test(byval myin as integer, byval mylimits as string) as integer
        'results as 1 or 0
    
          dim mysplit as string()= Split(mylimits, ",")
          dim mysplit2 as string(1)
    
          'look through all separated by a ","
          For Each s As String In mysplit 
    
            'does there exists a range, i.e. "-"? 
            if s like "%-%" then
              mysplit2 = split(s, "-")
    
              'is the value between this range?
              if myin >= mysplit(0) andalso myin <= mysplit(1) then 
                return 1
              end if
    
            'is the value equal to the number?
            elseif s = myin then
              return 1
    
            end if
          Next s
    
          return 0
    
        End
    

    3。使用 vb 函数在数据集上创建一个过滤器,账户类型作为输入等于 1。

        =code.test(Fields!AccountType.Value, Paramaters!MyPar.Value)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      • 2016-03-03
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      相关资源
      最近更新 更多