在参数默认值中使用查找功能

时间:2014-03-14 20:31:36

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

目标:为要在日程安排中使用的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'   是指一个领域。字段不能在报表参数中使用   表达式。

有谁知道如何让这个工作?还是人们有另外一种做法?

2 个答案:

答案 0 :(得分:1)

所以我认为我已经找到了一个符合我要求的非常好的解决方案。

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

所以解决方案是让一个存储过程采用一个可以为null的参数,其中传入null返回整个集合,但是传入DateCalcId将返回一条记录,然后可以归结为该范围开始和结束参数。

因此,整个数据集将填充第一个参数(@DynamicDate)的可用值,其中值字段为" DateCalcId"列,标签字段是" 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

答案 1 :(得分:0)

您不使用数据集,只需使用Default表达式即可使用VBA计算参数日期值。例如,以下日期的DateRangeEnd将为:

昨天:

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

上个月末:

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

因此,根据您的SWITCH参数,您有DynamicDate语句:

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

以及所有日期范围选择。