【问题标题】:SSRS default parameter values in subscription订阅中的 SSRS 默认参数值
【发布时间】:2012-02-07 16:50:17
【问题描述】:

我有一份报告,其中包含用户输入的两个必需的日期参数。我想创建一个在周五运行的订阅,该订阅会在前一周的周日到周六期间进行拉取。例如,对于即将到来的星期五,订阅将在 1 月 29 日至 2 月 4 日期间取消。我试过=Now(), =Today(), @ExecutionTime,然后减去天数,但我得到的只是错误。这可以吗?

我确实看到了这个链接,但我想知道是否有更好的方法。 http://www.sqlservercentral.com/articles/Development/datadrivensubscriptions/2432/

SSRS 2008

【问题讨论】:

    标签: reporting-services ssrs-2008


    【解决方案1】:

    是的,我已经这样做了,请参阅此帖子 https://stackoverflow.com/a/5539615/168703 您可以创建一个获取日期范围的数据集并在您的报告中使用它。然后您的订阅可以使用此日期范围并自行动态更改,而无需每天/每周/每月/每年/等手动更改。

    在这里也转发,这是您最灵活的解决方案:

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

    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
    

    这些对我真的很有帮助,因为我在报告服务中使用了它来获取日期参数。您可以简单地创建一个引用此表函数的数据集,然后在 RS 中的任何日期时间的参数中使用它们。

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

    SELECT * FROM [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
    

    现在您已经有了一个可用作数据集的存储过程...现在在报告服务中添加一个新数据集:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我最喜欢处理这种情况的技巧是创建一个名为 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
        

        【讨论】:

          【解决方案4】:

          开始日期

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

          结束日期

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

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

          【讨论】:

          • @Gabe 您将它们设置为报告中的默认值。在订阅页面中,您只需选择“默认”。要为参数设置默认值,请转到参数属性(右键单击 -> 参数属性),然后转到默认值部分。添加一个值并给它上面的表达式。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-09
          • 2015-02-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多