3

У меня есть ежемесячный календарь в SSRS, который тянется во все дни месяца, который вы укажете, а также показывает дни с предыдущего и следующего месяца, чтобы показать 6, 7 день недель. То, что я пытаюсь сделать теперь отображать диапазоны за каждую неделю в течение месяца, к примеру, в ноябре 2015 года я хотел бы:6 Неделя 7 дней для каждого месяца для календаря SSRS

Oct 25-31 
Nov 1-7 
Nov 8-14 
Nov 15-21 
Nov 22-28 
Nov 29-Dec 5 

Выражение Я пытаюсь настроить на плечо выглядит в соответствии с:

="Week " & VBCRLF & Left(MonthName(Parameters!start_cymd.Value.Month,False),3) & " " & Fields!Day.Value & " - " & Fields!Day.Value + 6 

Какую дорогу я должен спускать с точки зрения добавления этого выражения, чтобы получить желаемый результат? Если вам нужно больше информации, чтобы ответить на мой вопрос, я был бы рад предоставить его. Благодаря!

Edit:

Выходной ток enter image description here

ХП Генерирование Календарь:

ALTER PROCEDURE [Event].[Report_Event_Calendar_Month_sp] 
@start_cymd DATE = NULL 
AS 
BEGIN 

DECLARE @StartDate DATE = @start_cymd , 
     @EndDate DATE = @start_cymd , 
     @SDate DATE = @start_cymd 

---First day of current month 
SET @StartDate = DATEADD(s, 0, DATEADD(mm, DATEDIFF(m, 0, @StartDate), 0)) 
SET @SDate = DATEADD(s, 0, DATEADD(mm, DATEDIFF(m, 0, @SDate), 0)) 
---First day to display on calendar 
SET @StartDate = DATEADD(DAY, -DATEPART(DAY, @StartDate) - 6, @StartDate) 
---Last day of month 
SET @EndDate = DATEADD(s, -1, DATEADD(mm, DATEDIFF(m, 0, @SDate) + 1, 0)) 
---Last day to display on calendar 
SET @EndDate = DATEADD(DAY, -DATEPART(DAY, @EndDate) + 35, @EndDate) 

;WITH Dates([Date]) 
     AS (
      SELECT @StartDate AS [Date] 
      UNION ALL 
      SELECT DATEADD(DAY, 1, [Date]) 
      FROM Dates 
      WHERE [Date] < @EndDate 
     ) , 
     Events 
     AS (
      SELECT EventDesc , 
        Notes , 
        start_cymd AS EventDate , 
        MemberName 
      FROM [Event].Event_Description ED 
        INNER JOIN [Event].SQL_Team_Events SE ON ED.EventDesc_ID = SE.EventDesc_ID 
        INNER JOIN [Event].SQL_Team_Member SM ON SE.Event_ID = SM.Event_ID 
        INNER JOIN [Event].Members M ON SM.Member_ID = M.Member_ID 
     ) 


---Number the records based on the date, if multiple records have 
    ---the same date then they will be numbered the same. Used in 
    ---calculation to determine row record is to display 
    SELECT [Order] = DENSE_RANK() OVER (ORDER BY d.[Date]) , 
    ---Date used in all calculations for date 
      d.[Date] , 
    ---Generates matrix columns 
      [WeekDay] = DATEPART(WEEKDAY, d.[Date]) , 
    ---Used to display day of month on calendar 
      [Day] = DATEPART(DAY, d.[Date]) , 
    ---Used in some calculations for display 
      [Month] = DATEPART(MONTH, d.[Date]) , 
      e.EventDesc , 
      e.Notes , 
      e.EventDate , 
      e.MemberName 
    FROM  Dates d 
      LEFT JOIN Events e ON d.[Date] = e.EventDate 
    ---Set the maximum number of times the CTE 'Dates' can recurse 
    OPTION (MAXRECURSION 100) 

END 
GO 
+1

В конце выражения вам понадобится функция «IIF», которая определяет, будет ли поле «Fields! Day.Value + 6» превышать длину вашего месяца, чтобы правильно отобразить изменение месяца в середине недели (* 29 ноября -Sep 5 *). На первый взгляд все остальное мне кажется прекрасным. – Oceans

+0

Да ... кофе еще не ударил ноль. – postald

+0

Есть ли причина, по которой вы не можете использовать SQL-запрос для генерации этой информации в наборе данных? Мне кажется, что это будет значительно проще, особенно если учесть разные месячные длины, которые вам придется иметь дело с – Jonnus

ответ

2

Попробуйте это:

Reporting Services Expression

=Switch(
DatePart("D",Fields!Date.Value) + 6 > Datepart("D",Fields!Date.Value.AddDays(1-Fields!Date.Value.Day).AddMonths(1).AddDays(-1)), 
"Week" & VBCRLF & Left(MonthName(Fields!Date.Value.Month,False),3) & " " & DatePart("D",Fields!Date.Value) & " - " & 
Left(MonthName(Fields!Date.Value.Month + 1,False),3) & " " & DatePart("D",Fields!Date.Value.AddDays(6)), 
true, 
"Week" & VBCRLF & Left(MonthName(Fields!Date.Value.Month,False),3) & " " & DatePart("D",Fields!Date.Value) & " - " & 
DatePart("D",Fields!Date.Value.AddDays(6)) 
) 
  • Протестировано 2015-02-27 вернулся: Week feb 27 - mar 5
  • Протестировано 2015-11-29 вернулся: Week nov 29 - dec 5
  • Протестировано 2015-11-22 вернулся: Week nov 22 - 22

Примечание. Я использую поле Date вашего набора данных, начиная с Day

T-SQL

На уровне T-SQL вы можете добавить столбцы с данными, вам нужно, то сцепить эти столбцы в выражении отчета.

SELECT [Order] = DENSE_RANK() OVER (ORDER BY d.[Date]) , 
---Date used in all calculations for date 
      d.[Date] , 
---Generates matrix columns 
      [WeekDay] = DATEPART(WEEKDAY, d.[Date]) , 
---Used to display day of month on calendar 
      [Day] = DATEPART(DAY, d.[Date]) , 
---Used in some calculations for display 
      [Month] = DATEPART(MONTH, d.[Date]) 
---New filds for rows expression in SSRS 
      ,LEFT(DATENAME(MONTH,d.[Date]),3) as [StartMonth] 
      ,DATEPART(DAY,d.[Date]) as [StartDay] 
      ,IIF(DATEADD(day,6,d.[Date]) > EOMONTH(d.[Date]) 
       ,LEFT(DateName(Month,DATEADD(day,6,d.[Date])),3) 
       ,'' 
       ) as [EndMonth] 
      ,Datepart(day,DATEADD(day,6,d.[Date])) as [EndMonth]    
      e.EventDesc , 
      e.Notes , 
      e.EventDate , 
      e.MemberName 
FROM  Dates d 
      LEFT JOIN Events e ON d.[Date] = e.EventDate 

Expression:

= "Week" & VBCRLF & Fields!StartMonth.Value & " " & Fields!StartDay.Value & 
" - " & Fields!EndMonth.Value & " " & Fields!EndDay.Value 

Позвольте мне знать, если это может помочь вам.

+0

Это было прекрасно! Спасибо огромное! – postald

+0

@postald, Ницца! вы можете выбрать мой ответ как правильный, если ваш вопрос был очищен, просто нажмите на правильный символ в левой части моего ответа. –

Смежные вопросы