mardi 31 mars 2009

Sum Distinct avec SSRS

Reporting Services (SSRS) 2005 propose de nombreuses fonctions d'agrégation dont Sum, Min, Max, Avg, Count, Count distinct etc.

Malheureusement il arrive souvent qu'on ait besoin d'une autre fonction qui n'est pas fournie par défaut: Sum Distinct. Ce billet vous montre donc comment l'implémenter dans votre rapport.

Imaginons qu'on ait une requête qui ramène une liste combinant des employés, leurs spécialités, leur département et leur salaire. On aura donc une spécialité d'employé par ligne et donc potentiellement plusieurs lignes pour un même employé.

Si on désire réaliser un rapport avec un regroupement par département affichant le nombre d'employés à ce niveau agrégé, alors on peut utiliser la fonction CountDistinct(Fields!EmployeeID.value) dans la case correspondante, ce qui ramène le bon résultat.
Le problème apparaît lorsqu'on désire par exemple calculer la somme des salaires d'un département. On pourrait rajouter un champ dans la requête qui serait le résultat d'une sous requête et ramènerait le TotalSalaireDepartement pour chaque département. C'est une solution qui est peu envisageable si le nombre de champs à rajouter est élevé. D'où l'idée de cette fonction SumDistinct qui permet de récupérer le résultat grâce à un petit bout de code Vb.
Pour ajouter la nouvelle fonction, aller dans l'onglet "code" des propriétés du rapport:


Il ne reste plus qu'à appeler la fonction dans les cases du rapport.
SumDistinct(Mesure, ID, Valeur)
Ce qui donne pour cette exemple au niveau d'une ligne département:

=Sum(Code.SumDistinct(01, Fields!EmployeeId.Value, Fields!Salaire.Value))
Remarquez dans le code la clé de la HashTable qui est composée d'une Mesure (01 pour Salaire) et d'un ID (EmployeeID). Cette astuce permet de pouvoir réutiliser la même fonction pour des mesures différentes, par exemple 01 pour le salaire, 02 pour le poids de l'employé ou encore 03 pour l'âge de l'employé, sous réserve que les valeurs agrégées au niveau département de ces dernières mesures aient un intérêt quelconque:)

mercredi 25 mars 2009

Installer Reporting Services sur Windows Server Web Edition

Voici un problème auquel j'ai été confronté récemment chez un client, installer Reporting Services sur une Web edition de Windows server.

Si vous lancez la procédure classique d'installation SQL Server, vous réaliserez vite que le nombre de possibilités est assez limité. Vous ne pouvez en effet qu'installer les outils clients sur cette version de Windows Server (les autres composants étant grisés). Il est en effet impossible d'installer un moteur de base de données sur cette édition. Cela dit, dans mon cas, le but était seulement d'installer la partie applicative de Reporting Services, les bases de métadata étant stockées sur un autre serveur dédié aux bases de données.

La bonne nouvelle est qu'il est possible d'installer Reporting Services même si le wizzard classique d'installation ne le permet pas. L'astuce est la suivante: lancer le fichier "SqlRun_RS.msi" qui est situé dans le répertoire "\Servers\Setup" du CD SQL Server 2005.

Une fois l'installation terminée, vous pouvez configurer votre serveur de rapport en lançant "Reporting Services Configuration". C'est à travers cette interface que vous chosirez par exemple le serveur qui accueillera vos bases métadata "ReportServer" et "ReportServerTempDB".