1

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

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

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

数据集将是这样的:

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”的值表达式引用一个字段。字段不能用于报表参数表达式。

有谁知道如何让这个工作?或者人们是否有另一种方式来做到这一点?

4

2 回答 2

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
于 2014-03-17T13:40:34.907 回答
0

您不使用数据集,您可以使用默认表达式使用 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))

依此类推,适用于您的所有日期范围选择。

于 2014-03-15T23:31:00.347 回答