Reporting services 订阅中的SSRS默认参数值

Reporting services 订阅中的SSRS默认参数值,reporting-services,ssrs-2008,Reporting Services,Ssrs 2008,我有一个报告,其中有两个用户输入的必需日期参数。我想创建一个在周五运行的订阅,从上个星期的周日到周六。因此,例如,对于即将到来的周五,订阅将在1月29日至2月4日停止。我尝试了=Now(),=Today(),@ExecutionTime,然后减去天数,但得到的都是错误。这可能吗 我确实看到了这个链接,但我想知道是否有更好的方法。 SSRS 2008是的,我已经这样做了,请看这篇文章 您可以创建一个获取日期范围的数据集,并在报告中使用它。然后,您的订阅可以使用此日期范围并自行动态更改,而无需每天

我有一个报告,其中有两个用户输入的必需日期参数。我想创建一个在周五运行的订阅,从上个星期的周日到周六。因此,例如,对于即将到来的周五,订阅将在1月29日至2月4日停止。我尝试了
=Now(),=Today(),@ExecutionTime
,然后减去天数,但得到的都是错误。这可能吗

我确实看到了这个链接,但我想知道是否有更好的方法。


SSRS 2008

是的,我已经这样做了,请看这篇文章 您可以创建一个获取日期范围的数据集,并在报告中使用它。然后,您的订阅可以使用此日期范围并自行动态更改,而无需每天/每周/每月/每年等进行手动更改

这也是您最灵活的解决方案:

我还将分享一组常用的日期函数。只需将其创建为表值函数:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

CREATE FUNCTION [dbo].[udfCommonDates] (@date datetime)
RETURNS @t table (week_start datetime,
                  week_end datetime,
                  lastweek_start datetime,
                  lastweek_end datetime,
                  month_start datetime,
                  month_end datetime,
                  lastmonth_start datetime,
                  lastmonth_end datetime,
                  yesterday_start datetime,
                  yesterday_end datetime,
                  today_start datetime,
                  today_end datetime,
                  thisweek_monday_start datetime,
                  thisweek_monday_end datetime,
                  year_start datetime,
                  year_end datetime,
                  tomorrow_noon datetime,
                  today_noon datetime,
                  date_only datetime)
BEGIN
   INSERT @t
   SELECT
   dbo.get_week_start ( @date ) AS week_start,
   dbo.get_week_end   ( @date ) AS week_end,
   dbo.get_week_start ( DATEADD(d, -7, @date ) ) AS lastweek_start,
   dbo.get_week_end   ( DATEADD(d, -7, @date ) ) AS lastweek_end,
   dbo.get_month_start( @date ) AS month_start,
   dbo.get_month_end  ( @date ) AS month_end,
   dbo.get_month_start ( DATEADD(m,-1, @date) ) AS lastmonth_start,
   dbo.get_month_end  ( DATEADD(m,-1,@date) ) AS lastmonth_end,
   dbo.get_yesterday_start ( @date ) AS yesterday_start,
   dbo.get_yesterday_end ( @date ) AS yesterday_end,
   dbo.get_today_start (@date) AS today_start,
   dbo.get_today_end ( @date ) AS today_end,
   dbo.get_weekday_start(1,@date) AS thisweek_monday_start,
   dbo.get_weekday_end(1,@date) AS thisweek_monday_end,
   dbo.get_year_start(@date) AS year_start,
   dbo.get_year_end(@date) AS year_end,  
   dbo.get_tomorrow_noon(@date) AS TomorrowNoon,
   dbo.get_today_noon(@date) AS TodayNoon,
   dbo.get_date_only(@date) AS DateOnly
RETURN
END
以下是这些函数的标量值函数:

    CREATE FUNCTION [dbo].[get_date_only] (@date datetime)
    RETURNS datetime
    WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
    AS    
    BEGIN
        RETURN dateadd(day, DateDiff(day, 0, GetDate()), 0)
    END
    GO

CREATE FUNCTION [dbo].[get_month_end] (@date datetime)
RETURNS datetime
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
AS    
BEGIN
   RETURN dateadd(ms, -3, dateadd (m,datediff(m,0,
          dateadd(m,1,@date)),0))
END
GO

CREATE FUNCTION [dbo].[get_month_start] (@date datetime)
RETURNS datetime
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
AS    
BEGIN
   RETURN dateadd(m,datediff(m,0, @date),0)
   END
GO

CREATE FUNCTION [dbo].[get_today_end] (@today datetime)
RETURNS datetime
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
AS    
BEGIN
   return dateadd(ms, -3, datediff(d,0,dateadd(d,1,@today)))
END
GO

CREATE FUNCTION [dbo].[get_today_noon](@date datetime)
RETURNS datetime
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
AS    BEGIN
   RETURN DATEADD(hh, 12, DATEADD(d,DATEDIFF(d,0, @date),0))
END
GO

CREATE FUNCTION [dbo].[get_today_start] (@today datetime)
RETURNS datetime 
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
AS    BEGIN
   return dateadd(day, 0, datediff(d,0,@today))
END
GO

CREATE FUNCTION [dbo].[get_tomorrow_noon](@date datetime)
RETURNS datetime
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
AS    BEGIN
   RETURN DATEADD(hh, 12, DATEADD(d,DATEDIFF(d,-1, @date),0))
END
GO

CREATE FUNCTION [dbo].[get_week_end] (@date datetime)
RETURNS datetime
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
AS    BEGIN
   return dateadd(yyyy, datepart(yyyy,
      dateadd(weekday,7-datepart(weekday, @date),@date))-1900, 0)
    + dateadd(ms, -3,
      dateadd(dy, datepart(dy,
     dateadd(weekday,7-datepart(weekday, @date),@date)),0) )
END
GO

CREATE FUNCTION [dbo].[get_week_start] (@date datetime)
RETURNS datetime
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
AS    BEGIN
   return dateadd(yyyy, datepart(yyyy,
      dateadd(weekday,1-datepart(weekday, @date),@date))-1900, 0)
    + dateadd(dy, datepart(dy,
      dateadd(weekday,1-datepart(weekday, @date),@date))-1,0)
END
GO

CREATE FUNCTION [dbo].[get_weekday_end] (@weekday tinyint,
                                 @date datetime)
RETURNS datetime
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
AS    BEGIN
   return dateadd(yyyy, datepart(yyyy,
      dateadd(weekday,@weekday-
      datepart(weekday, @date),@date))-1900, 0)
    + dateadd(ms, -3,
      dateadd(dy, datepart(dy,
      dateadd(weekday,@weekday-datepart(weekday, @date),
                                        @date)),0) )
END
GO

CREATE FUNCTION [dbo].[get_weekday_start] (@weekday tinyint,
                                   @date datetime)
RETURNS datetime
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
AS    BEGIN
   return dateadd(yyyy, datepart(yyyy,
      dateadd(weekday,@weekday-
      datepart(weekday, @date),@date))-1900, 0)
    + dateadd(dy, datepart(dy,
      dateadd(weekday,@weekday-datepart(weekday, @date),
                                        @date))-1,0)
END
GO

CREATE FUNCTION [dbo].[get_year_end] (@date datetime)
RETURNS datetime
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
AS    BEGIN
RETURN DATEADD(year, DATEDIFF(year, 0, GetDate())+1, 0)-1
END
GO

CREATE FUNCTION [dbo].[get_year_start] (@date datetime)
RETURNS datetime
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
AS    BEGIN
   RETURN DATEADD(year,DATEDIFF(year,0, @date),0)
END
GO

CREATE FUNCTION [dbo].[get_yesterday_end] (@today datetime)
RETURNS datetime
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
AS    BEGIN
   return dateadd(ms, -3, datediff(d,0,@today))
END
GO

CREATE FUNCTION [dbo].[get_yesterday_start] (@today datetime)
RETURNS datetime
WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT
AS    BEGIN
   RETURN dateadd(day, -1, datediff(d,0,@today))
END
GO
这些对我来说真的很有帮助,因为我在ReportingServices中使用了这些参数作为日期参数。您可以简单地创建一个引用此表函数的数据集,然后在RS中的任何datetime的参数中使用这些数据集

您可以这样执行整个表值函数:

从[MyDB].[dbo].[udfCommonDates](GetDate())中选择*

结果是这样的

报告服务人员 现在我在前面提到,我将这些用于报告服务。 现在RS的人可能在想,但这对我有什么帮助,因为我需要一个数据集,而数据集只能基于存储过程或直接表。创建以下存储过程没有问题:

CREATE PROCEDURE [dbo].[uspCommonDates] AS
begin
   set datefirst 1
   declare @date datetime
   set @date = getdate()
   select * from dbo.udfCommonDates(@date)
end
现在您有了一个存储过程用作数据集…现在在reporting services中添加一个新的数据集:

现在转到报告的“报告参数”部分:

现在,选择数据集dsFunctions(或您称之为dsFunctions的任何名称),然后从标量函数中选择任何值字段,例如:

现在,当您运行报告时,它使用标量:

现在,在“订阅”中,您将看到“使用默认值”复选框位于 日期的参数。如果选中此复选框,它将自动使用默认值 此自定义函数提供的值。在reporting services中,它非常灵活,是一个非常好的解决方案。这是一个屏幕打印:


处理这种情况我最喜欢的技巧是创建一个名为StartWeek的整数参数。提示“开始的一周:”可用值,如:

Value    Label
 -4      =dateadd("d",0-weekday(today)+2+(-4*7),today).ToString("m")
 -3      =dateadd("d",0-weekday(today)+2+(-3*7),today).ToString("m")
 -2      =dateadd("d",0-weekday(today)+2+(-2*7),today).ToString("m")
 -1      Previous Week
  0      Current Week
  1      Last Month
  2      This Month
默认值为-1

然后在您的查询中:

DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME

DECLARE @CurrentDate DATETIME
SET @CurrentDate = GETDATE()
--SET @CurrentDate = 'October 31, 2011'  -- for debugging

IF ( @StartWeek > 0 ) 
   BEGIN
      SET @StartDate = DATEADD(mm, DATEDIFF(mm, 0, @CurrentDate), 0)
      SET @StartDate = DATEADD(mm, 2 - @StartWeek, @StartDate)
      SET @EndDate = DATEADD(s, -1, DATEADD(mm, 1, @StartDate))
   END
ELSE 
   BEGIN
      SET @StartDate = DATEADD(wk,
                               DATEDIFF(wk, 0, DATEADD(d, -1, @CurrentDate))
                               + @StartWeek, 0)
      SET @EndDate = DATEADD(s, -1, DATEADD(day, 7, @StartDate))
   END

Select
   *
FROM
   MyTable
WHERE
   BeginDate <= @EndDate
   AND FinishDate >= @StartDate
DECLARE@StartDate-DATETIME
声明@EndDate-DATETIME
声明@CurrentDate日期时间
SET@CurrentDate=GETDATE()
--设置@CurrentDate='2011年10月31日'--用于调试
如果(@StartWeek>0)
开始
设置@StartDate=DATEADD(mm,DATEDIFF(mm,0,@CurrentDate),0)
设置@StartDate=DATEADD(mm,2-@StartWeek,@StartDate)
设置@EndDate=DATEADD(s,-1,DATEADD(mm,1,@StartDate))
结束
其他的
开始
SET@StartDate=DATEADD(wk,
DATEDIFF(wk,0,DATEADD(d,-1,@CurrentDate))
+@StartWeek,0)
设置@EndDate=DATEADD(s,-1,DATEADD(第7天,@StartDate))
结束
挑选
*
从…起
我的桌子
哪里
开始日期=@StartDate
开始

=DateAdd("d", -12, Today())
结束日期

=DateAdd("d", -6, Today())

因此,对于即将到来的星期五2/10。这将为您提供1/29-2/4的日期范围。

在报告参数配置(在开发时,而不是在订阅创建时)上,为参数添加默认值。如果您这样做,则在创建订阅时将有一个名为“使用默认值”的复选框

@Gabe您可以在报告中将它们设置为默认值。在订阅页面中,您只需选择“默认”。要设置参数的默认值,请转到参数属性(右键单击->参数属性),然后转到默认值部分。添加一个值并使用上面的表达式。