【问题标题】:Using a Lookup function in a Parameter Default在参数默认值中使用查找函数
【发布时间】:2014-03-14 20:31:36
【问题描述】:

目标:为要在调度中使用的 SSRS 参数提供动态日期计算。

我有一个包含两个日期参数的报告,DateRangeBeginDateRangeEnd。我们遇到的问题是用户希望将此报告安排在“月初至今”、“年初至今”、“上周”等日期范围内。当用户去安排报告时,他们只能为这两个参数提供静态日期。

我的想法是创建一个数据集,该数据集将计算这些值并在另一个名为 DynamicDate 的参数中引用。然后,用户将从 DynamicDate 参数中选择“昨天”,DateRangeBeginDateRangeEnd 参数将使用数据集中的计算值进行更新。

数据集应该是这样的:

Select
    2 as DateCalcId,
    'Yesterday' as DateCalcDescription,
    CONVERT(VARCHAR, DATEADD(DAY,-1,GETDATE()), 101) as DateCalcBegin,
    CONVERT(VARCHAR, DATEADD(DAY,-1,GETDATE()), 101) as DateCalcEnd
UNION ALL
Select
    1 as DateCalcId,
    'Today' as DateCalcDescription,
    CONVERT(VARCHAR, DATEADD(DAY,0,GETDATE()), 101) as DateCalcBegin,
    CONVERT(VARCHAR, DATEADD(DAY,0,GETDATE()), 101) as DateCalcEnd
UNION ALL
Select
    3 as DateCalcId,
    'Month to Date' as DateCalcDescription,
    CONVERT(VARCHAR,(CONVERT(datetime, CONVERT(VARCHAR, Year(GetDate())) + '-' + Convert(Varchar,Month(GetDate())) + '-01')), 101) as DateCalcBegin,
    CONVERT(VARCHAR, DATEADD(DAY,0,GETDATE()), 101) as DateCalcEnd
order by
    DateCalcId

我认为我想要使用的函数是日期参数中的 Lookup() 函数作为它们的默认值,但我在语法上遇到了一点问题。到目前为止,我有:

=Lookup(Parameters!DynamicDate.Value, Fields!DateCalcId.Value, Fields!DateCalcBegin.Value, "CalculatedDates")

但是我收到了这个错误:

用于报告参数“DateRangeBegin”的值表达式 指一个领域。报表参数中不能使用字段 表达式。

有谁知道如何让它工作?或者人们有其他方法吗?

【问题讨论】:

    标签: sql reporting-services reporting-services-2012


    【解决方案1】:

    所以我想我已经想出了一个非常适合我要求的解决方案。

    我真的很喜欢在 SQL 数据集中计算这些动态日期范围对的想法,因为它们可以在多个报告中重复使用,不需要创建自定义 dll,并且可以在单个数据集中计算这对记录。

    因此解决方案是使用一个带有可为空参数的存储过程,其中传入 null 返回整个集合,但传入 DateCalcId 将返回单个记录,然后可以将其归因于范围开头和结束参数。

    因此,整个数据集将填充第一个参数 (@DynamicDate) 的可用值,其中 Value 字段是“DateCalcId”列,Label 字段是“DateCalcDescription”列。

    然后日期范围参数默认值将绑定到单个结果数据集,使用 @DynamicDate 值作为存储过程的输入。

    这允许用户选择动态日期,日期范围参数默认为计算日期,用户可以根据需要覆盖这些日期。

    如果应始终根据所选值计算日期,则日期参数可用值也可以设置为单个结果数据集。

    这是存储过程:

    Create PROCEDURE [CNF].[RptCalculatedDateRanges]
        @DynamicDateId int = null
    AS
    BEGIN
        SET NOCOUNT ON;
    
        Declare @Today datetime = convert(varchar,getdate(),101)
    
        Select
            *
        from
            (
                Select
                    2 as DynamicDateId,
                    'Yesterday' as DynamicDateDescription,
                    DATEADD(DAY,-1,@Today) as DynamicDateBegin,
                    DATEADD(DAY,-1,@Today) as DynamicDateEnd
                UNION ALL
                Select
                    1 as DynamicDateId,
                    'Today' as DynamicDateDescription,
                    @Today as DynamicDateBegin,
                    @Today as DynamicDateEnd
                UNION ALL
                Select
                    3 as DynamicDateId,
                    'Month to Date' as DynamicDateDescription,
                    CONVERT(VARCHAR,(CONVERT(datetime, CONVERT(VARCHAR, Year(@Today)) + '-' + Convert(Varchar,Month(@Today)) + '-01')), 101) as DynamicDateBegin,
                    @Today as DynamicDateEnd
            ) D
        where
            @DynamicDateId = D.DynamicDateId or
            @DynamicDateId is null
        order by
            DynamicDateId
    END
    

    【讨论】:

      【解决方案2】:

      您不使用数据集,您可以使用默认表达式使用 VBA 计算参数日期值。例如,以下日期的 DateRangeEnd 将是:

      昨天:

      =DateAdd(DateInterval.Day, -1, Today)
      

      上个月月底:

      =DateAdd(DateInterval.Day, -1, DateAdd(DateInterval.Day, 1-Day(Today), Today))
      

      所以你有一个基于DynamicDate 参数的SWITCH 语句:

      =Switch(Parameters!DynamicDate.Value = 1, Today, Parameters!DynamicDate.Value = 2, DateAdd(DateInterval.Day, -1, Today))
      

      您所有的日期范围选择等等。

      【讨论】:

      • 谢谢克里斯,我过去做过,但希望有可能使用数据集。这样,所有逻辑都可以包含在一个视图中并被所有报告使用。所以也许我应该创建一个 DLL 来封装所有的逻辑......
      猜你喜欢
      • 1970-01-01
      • 2012-02-28
      • 2018-02-26
      • 2011-02-20
      • 2011-04-09
      • 2017-09-18
      • 2011-03-27
      • 2015-10-27
      相关资源
      最近更新 更多