目标:为要在日程安排中使用的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' 是指一个领域。字段不能在报表参数中使用 表达式。
有谁知道如何让这个工作?还是人们有另外一种做法?
答案 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))
以及所有日期范围选择。