Значения параметров SSRS по умолчанию в подписке - PullRequest
2 голосов
/ 07 февраля 2012

У меня есть отчет с двумя обязательными параметрами даты, которые вводит пользователь. Я хочу создать подписку, которая будет работать в пятницу и будет работать с воскресенья по субботу на предыдущей неделе. Так, например, в предстоящую пятницу подписка будет действовать с 29 января по 4 февраля. Я пробовал =Now(), =Today(), @ExecutionTime, а затем вычитал количество дней, но получал только ошибки. Возможно ли это сделать?

Я видел эту ссылку, но мне интересно, есть ли лучший способ. http://www.sqlservercentral.com/articles/Development/datadrivensubscriptions/2432/

SSRS 2008

Ответы [ 4 ]

6 голосов
/ 07 февраля 2012

Да, я сделал это, см. Этот пост 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 ())

Результат примерно такой

enter image description here

Для пользователей служб отчетов

Теперь я уже упоминал ранее, что я использую их для служб отчетов. Теперь ребята из RS могут подумать, но как это поможет мне, так как мне нужен набор данных и набор данных, которые могут быть основаны только на хранимой процедуре или прямой таблице. Без проблем создайте следующую хранимую процедуру:

CREATE PROCEDURE [dbo].[uspCommonDates] AS
begin
   set datefirst 1
   declare @date datetime
   set @date = getdate()
   select * from dbo.udfCommonDates(@date)
end

Теперь у вас есть хранимая процедура для использования в качестве набора данных ... Теперь в службах отчетов добавьте новый набор данных:

enter image description here

Теперь перейдите в раздел параметров отчета:

enter image description here

Теперь выберите этот набор данных dsFunctions (или как вы его называли), а затем выберите любое из полей значений из скалярных функций, таких как:

enter image description here

Теперь, когда вы запускаете отчет, он использует скаляры:

enter image description here

Также теперь в вашей «Подписке» вы увидите флажок «Использовать по умолчанию» рядом с параметр для даты. Если вы установите этот флажок, он будет автоматически использовать по умолчанию значение, предоставляемое этой пользовательской функцией. Это очень, очень гибкое и очень хорошее решение для служб отчетности. Вот снимок экрана этого:

enter image description here

2 голосов
/ 11 апреля 2012

В конфигурации параметров отчета (во время разработки, а не при создании подписки) добавьте значение по умолчанию для параметра.Если вы это сделаете, у вас будет флажок «использовать значение по умолчанию» при создании подписки

1 голос
/ 08 февраля 2012

BeginDate

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

EndDate

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

Итак, на предстоящую пятницу 2/10. Это даст вам диапазон дат 1/29 - 2/4.

1 голос
/ 07 февраля 2012

Мой любимый способ справиться с этой ситуацией - создать параметр Integer с именем 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...