Как создать григорианский календарь в SSRS, как показано на рисунке - PullRequest
0 голосов
/ 22 декабря 2018

Как я могу произвести в SSRS этот григорианский календарь (чтобы выбрать дату начала или дату окончания для фильтра, подобного показанному на рисунке)?Должен ли я использовать датчик или что-то еще?

Gregorian calendar

1 Ответ

0 голосов
/ 23 декабря 2018

сначала получите данные календаря в работоспособном формате:

DECLARE @StartDate DATETIME, @EndDate DATETIME
SET @StartDate = '12/01/2018'
SET @EndDate = '01/31/2019'

SELECT @StartDate = DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0,@StartDate),0)) -- FirstDayOfMonth
SELECT @EndDate = DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@EndDate)+1,0)) -- LastDayOfMonth

; WITH Months AS (
 SELECT
 [Month] = DATEPART(MONTH,DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0,@StartDate),0))),
 [Year] = DATEPART(YEAR,DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0,@StartDate),0))),
 FirstDayOfMonth = DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0,@StartDate),0)),
 LastDayOfMonth = DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@StartDate)+1,0)),
 FirstDayOfCalendar = DATEADD(DAY,-DATEPART(WEEKDAY,DATEADD(s,0,DATEADD(mm, 
 DATEDIFF(m,0,@StartDate),0)))+1,DATEADD(s,0,DATEADD(mm, 
 DATEDIFF(m,0,@StartDate),0))),
 LastDayOfCalendar = DATEADD(DAY,6-DATEPART(WEEKDAY,DATEADD(s,-1,DATEADD(mm, 
 DATEDIFF(m,0,@StartDate)+1,0))),DATEADD(s,-1,DATEADD(mm, 
DATEDIFF(m,0,@StartDate)+1,0)))
UNION ALL SELECT
 [Month] = DATEPART(MONTH,DATEADD(MONTH,1,FirstDayOfMonth)),
 [Year] = DATEPART(YEAR,DATEADD(MONTH,1,FirstDayOfMonth)),
 FirstDayOfMonth = DATEADD(MONTH,1,FirstDayOfMonth),
 LastDayOfMonth = DATEADD(s,-1,DATEADD(mm, 
 DATEDIFF(m,0,DATEADD(MONTH,1,FirstDayOfMonth))+1,0)),
 FirstDayOfCalendar = DATEADD(DAY,-DATEPART(WEEKDAY,DATEADD(MONTH,1,FirstDayOfMonth))+1,DATEADD(MONTH,1,FirstDayOfMonth)),
 LastDayOfCalendar = DATEADD(DAY,6-DATEPART(WEEKDAY,DATEADD(s,-1,DATEADD(mm, 
 DATEDIFF(m,0,DATEADD(MONTH,1,FirstDayOfMonth))+1,0))),DATEADD(s,-1,DATEADD(mm, 
 DATEDIFF(m,0,DATEADD(MONTH,1,FirstDayOfMonth))+1,0)))
 FROM
 Months
 WHERE
 LastDayOfMonth < @EndDate
 ), Dates AS (
 SELECT
 [Month],
 [Year],
 [Date] = FirstDayOfCalendar,
 FilterDate = LastDayOfCalendar
 FROM
 Months
 UNION ALL SELECT
 [Month],
 [Year],
 [Date] = DATEADD(DAY,1,[Date]),
 FilterDate
  FROM
 Dates
  WHERE
 [Date] < FilterDate
 )
SELECT
 DisplayOnCalendar = DENSE_RANK() OVER (ORDER BY d.Year, d.Month),
 d.Month,
 [Day] = DATEPART(DAY,d.[Date]),
 d.Year,
 [WeekDay] = DATEPART(WEEKDAY, d.[Date]),
 [Order] = DENSE_RANK() OVER (PARTITION BY d.Year, d.Month ORDER BY d.Date), 
 d.Date,
case when month(d.Date) = Month then '1' else '2' end as ID
FROM
 Dates d

Далее, чтобы организовать отчет в режиме конструктора, необходимо создать три матрицы, каждая из которых будет размещена внутри друг друга:

Чем большематрица сгруппирована по строке, сгруппированной по "= DisplayOnCalender", матрица среднего размера сгруппирована по строке, сгруппированной по "= Ceiling (Fields! Order.Value / 7)" и столбцу, сгруппированному по "= Weekday".

меньшая матрица содержит выражение = IIF (Fields! ID.Value = 1, Fields! Day.Value, "")

Когда вы создали две матрицы, темно-зеленые строки фона могут быть удалены, они дают информациюдля смежных полей выражений.перетащите наименьшую матрицу в красное поле.затем перетащите эти две комбинированные матрицы в желтое поле.

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...