Créer un Calendrier avec SSRS

Présentation

Cet article aura pour but de vous montrer comment on peut créer un calendrier avec SSRS.
SSRS ne propose  pas de composant type Calendrier mais il est tout à fait possible de concevoir notre propre calendrier.
On s’appuiera sur une Time dimension bien fournie, un peu de SQL et une matrice sur laquelle on va opérer.
Le data warehouse utilisé est celle de AdventureWorks2008DWR2.
On effectue une requête sur la dimension DimDate : on aura besoin les champs ci dessous dans notre requête principale :
SELECT [DateKey] --clé primaire concaténation de l'année du mois et du jour sous la forme AAAAMMJJ
 ,[FullDateAlternateKey] --Date Complète sous la forme AAAA-MM-JJ
 ,[DayNumberOfWeek] --Numéro du jour dans le semaine : 1 pour Dimanche, 2 pour Lundi etc...
 ,[EnglishDayNameOfWeek] --Jour en anglais : Monday, Tuesday etc...
 ,[DayNumberOfMonth] --Numéro du jour dans le mois : 1 à 31
 ,[DayNumberOfYear] --Numéro du jour dans l'année : 1 à 365
 ,[WeekNumberOfYear] --Numéro de semaine : 1 à 53
 ,[EnglishMonthName] --Nom anglais du mois : January,February etc...
 ,[MonthNumberOfYear] --Numéro du mois dans l'année : 1 à 12
 ,[CalendarYear] --Année : 2005, 2006 etc...
 FROM [AdventureWorksDW2008R2].[dbo].[DimDate]

Création du rapport

Le rapport va illustrer dans un calendrier le nombre de commandes faites par jour. Cela donnera de la visibilité au niveau de la semaine et du mois.
Créez une source de données avec un dataset contenant la requête suivante:
SELECT        COUNT(FactInternetSales.OrderDateKey) AS COUNT_ORDERS, DimDate.FullDateAlternateKey, DimDate.DayNumberOfWeek, DimDate.EnglishDayNameOfWeek,
 DimDate.DayNumberOfMonth, DimDate.DayNumberOfYear, DimDate.WeekNumberOfYear, DimDate.EnglishMonthName, DimDate.CalendarYear, DATEPART(w,
 DimDate.FullDateAlternateKey) AS WeekDayNumber, DATEPART(ww, DimDate.FullDateAlternateKey) AS WeekNumber, DimDate.MonthNumberOfYear
FROM            DimDate INNER JOIN
 FactInternetSales ON DimDate.DateKey = FactInternetSales.OrderDateKey
WHERE        (DimDate.MonthNumberOfYear = @CurrentMonth) AND (DimDate.CalendarYear = @CurrentYear)
GROUP BY FactInternetSales.OrderDateKey, DimDate.FullDateAlternateKey, DimDate.DayNumberOfWeek, DimDate.EnglishDayNameOfWeek, DimDate.DayNumberOfMonth,
 DimDate.DayNumberOfYear, DimDate.WeekNumberOfYear, DimDate.EnglishMonthName, DimDate.CalendarYear, DimDate.MonthNumberOfYear
Dans SSRS on créé un nouveau rapport, dans lequel on insère une matrice et ajouter les champs comme ci-dessous:
Vous pouvez exécuter le rapport, vous verrez que les champs ne sont pas rangés correctement.
Pour ranger les colonnes dans le bon ordre… dans l’espace « Column Group » en dessous de votre rapport faites un clic droit sur le groupe EnglishDayNameofWeek puis Group properties.
Dans la fenêtre qui apparait rendez vous dans  Sorting puis configurez le trie avec la colonne DayNumberOfWeek.
Vous pouvez par la suite supprimez la colonne Week Number Of Year, en supprimant uniqument la colonne.
Pour affecter une mesure aux jours de la semaine on va utiliser la propriété BackgroungColor des cellules avec une expression de ce genre :

=Switch(
Fields!COUNT_ORDERS.Value=0,"gray",
Fields!COUNT_ORDERS.Value<4 ,"red",
Fields!COUNT_ORDERS.Value>4 AND Fields!COUNT_ORDERS.Value<7,"orange",
Fields!COUNT_ORDERS.Value>5,"green")

Dynamiser la navigation

Pour créer la naviagation sur le calendrier ajoutez 2 Text Box.
Elles vont  contenir les « << et >>  »  pour naviguer sur les mois.
Afin de rendre cette navigation dynamique on va créer des actions et des variables. Vous pouvez les rendre cachées et ajuster une date par défaut comme le mois et l’année actuelle.
Adventure Works ne possédant pas de données pour l’année 2011, je vous conseille d’utiliser une date par défaut pour laquelle il y a des données.
Créez donc deux variables : CurrentMonth et CurrentYear de type integer.
Allez dans les propriétés de la text box « >> » (Mois suivant) et configurez le comme ci dessous. Ce rapport fera appel à lui même en utilisant les variables CurrentMonth et CurentYear.
Voici les expressions…
CurrentMonth :
=IIF(
Parameters!CurrentMonth.Value=12,
1,
Parameters!CurrentMonth.Value+1)
CurrentYear:

=IIF(
Parameters!CurrentMonth.Value=12,
Parameters!CurrentYear.Value+1,
Parameters!CurrentYear.Value)
Faites la même chose pour la text Box « << »  (Mois précédent)

Avec les expressions suivantes:
CurrentMonth

=IIF(
Parameters!CurrentMonth.Value=1
,12
,Parameters!CurrentMonth.Value-1)
CurrentYear:
=IIF(
Parameters!CurrentMonth.Value=1,
Parameters!CurrentYear.Value-1,
Parameters!CurrentYear.Value)
Lancez votre rapport cela devrait marcher🙂

Allez plus loin

A partir de là on pourrait avoir d’autres actions dans le but de créer un scénario comme : lorsque l’on clique sur une date du calendrier on aurait le détails des commandes, ou sinon voir si cette période correspond à une campagne lancée (Soldes, Vacances etc).

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s