Alternatives Kalender Control für SSRS Report Datums Parameter und das auf dem Report
Es ist natürlich nicht wirklich als Ersatz für das DatePicker Control für Datumsparameter gedacht, sondern mehr als kleines Gimmick und ist auch eher ein kleines Experiment, was so machbar ist im Microsoft Reporting Services.
Um einen Kalender abbilden zu können, werden natürlich zunächst einmal die Datumswerte für einen Bereich rund um ein vorgegebenes Datum benötigt. Damit man auch eine einfache Liste zu Darstellung verwendet werden kann, sollten die Daten nach Wochentagnamen pivotisiert sein. Das kann mit zwei Funktionalitäten vom Microsoft SQL Server erreicht werden: Eine Common Table Expression zum Erzeugen der Datenreihe und die Pivot Funktion um eine Kalenderwoche / Wochentag Matrix zu erhalten:
Statement:
-- Nur für Test in SSMS, für SSRS wieder entfernen
SET LANGUAGE DEUTSCH; -- Wegen fixen Wochentagnamen
DECLARE @startDate date; -- Parameter wie in SSRS definiert
SET @startDate = {d N'2011-01-03'};
;WITH
dates AS
(SELECT CAST(DATEADD(dd, -13 - DATEPART(dw, @startDate)
, @startDate) AS date) as CalendarDate
UNION ALL
SELECT DATEADD(dd, 1, CalendarDate) as CalendarDate
FROM dates
WHERE CalendarDate <
DATEADD(dd, 14 + (7 - DATEPART(dw, @startDate)), @startDate)
)
SELECT IsoWeek, [Montag], [Dienstag], [Mittwoch]
, [Donnerstag], [Freitag], [Samstag], [Sonntag]
FROM
(SELECT DATEPART(iso_week, CalendarDate) AS IsoWeek
,DATENAME(dw, CalendarDate) AS DayName
,CalendarDate
FROM dates
) AS PivotSource
PIVOT (Min(CalendarDate)
FOR DayName IN ( [Montag], [Dienstag], [Mittwoch]
,[Donnerstag], [Freitag], [Samstag], [Sonntag])
) AS PivotTable
ORDER BY [Montag], [Dienstag], [Mittwoch]
, [Donnerstag], [Freitag], [Samstag], [Sonntag]
Ergebnis:
IsoWeek Montag Dienstag Mittwoch Donnerstag Freitag Samstag Sonntag
----------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
51 2010-12-20 2010-12-21 2010-12-22 2010-12-23 2010-12-24 2010-12-25 2010-12-26
52 2010-12-27 2010-12-28 2010-12-29 2010-12-30 2010-12-31 2011-01-01 2011-01-02
1 2011-01-03 2011-01-04 2011-01-05 2011-01-06 2011-01-07 2011-01-08 2011-01-09
2 2011-01-10 2011-01-11 2011-01-12 2011-01-13 2011-01-14 2011-01-15 2011-01-16
3 2011-01-17 2011-01-18 2011-01-19 2011-01-20 2011-01-21 2011-01-22 2011-01-23
Da für die PIVOT Funktion fixe Werte für die Wochentage verwendet werden, funktioniert die Abfrage natürlich nur mit deutschen Spracheinstellungen und für die IsoWeek ist natürlich die DATEFIRST Einstellung wichtig; also komplett DE Settings. Als Aggregationsfunktion für PIVOT kann statt MIN auch jede andere Aggregation verwendet werden; es gibt ja nur ein Datum je Woche / Wochentag Gruppierung. Das Aufrechnen des DATEPART(dw,..) Wertes wird hier verwendet, um immer „volle“ Wochen zu erhalten. So enthält das Ergebnis immer die Woche, in der das Datum liegt und jeweils +/- 2 volle Wochen drum rum.
Weiter geht’s mit dem Report. Da die Daten bereits wie gewünscht aufbereitet sind, reicht eben ein einfaches Listen Control für die Darstellung (abgesehen davon, dass in SSRS 2008/2008R2 eh alles ein Tablix ist). Um die Liste auch als interaktives Control verwenden zu können, wird einfach „Aktion“ Funktion bei den einzelnen Datumsfelder verwendet. Hier gibt man als „Gehe zu Bericht“ den gleichen Bericht wieder an und legt für den Parameter den Wert des aktuellen Feldes an; so wird der Bericht erneut mit dem neuen, angeklickten Datum aufgerufen.
Analog kann man über Textboxen / Images Funktionen wie „Heute“, „Vorjahr“ oder „Folgemonat“ umsetzen, nur das hier für den Parameter beim Berichtsaufruf eine Expression verwendet wird, wo auf dem aktuellen Datumsparameter per DateAdd ein Wert aufgerechnet wird bzw. fix auf Today() gesetzt wird.
Das BIDS 2008 Projekt kann von meinem SkyDrive geladen werden, es muss dann nur die Datenquelle angepasst werden, wobei die auch auf die master Datenbank zeigen kann; es wird ja aus keiner Tabelle selektiert, sondern nur eine CTE mit fixen Werten verwendet.
Eine Vorschau des Reports sieht so aus, optisch kann es ja nach Belieben gestaltet werden; die aufs Datum bezogenen Daten können dann unterhalb des Kalenders angezeigt werden: