[SSRS] Un tableau croisé dynamique (oui dynamique!) avec Reporting Services

Alors celle là c’est l’arlésienne des questions Reporting Services.

Peut-on utiliser RS pour générer un TCD?

La réponse que l’on entend souvent tourne autour de ce gloubiboulga de Consultant MSBI « Oui mais c’est de la bidouille, RS n’est pas un client ad-hoc. Sinon vous connaissez Excel?« 

Soyons honnête c’est assez vrai. Mais ce n’est pas parce que tordre un outil n’est pas vraiment complètement prévu qu’il ne faut pas le faire. Bah oui sinon on n’aurait jamais eu de dimensions techniques dans des cubes AS, et puis la vie serait ennuyeuse il faut avouer. Alors pourquoi ce post, et pourquoi aujourd’hui? Parce qu’on vient de me demander ce que fait la fonction Fields() – oui je dis bien la fonction Fields() – dans SSRS. Et que l’utilité principale que je lui connais est précisément de faire ça.

La fonction Fields()?

La fonction Fields(string) permet de convertir un nom de champ passé en paramètre en l’expression Fields!.Value correspondante dans la portée de l’expression. Oui, en quelque sorte c’est de la Reflection, Reporting Services Staïle.

Oui mais quel rapport avec un TCD?

J’y viens, j’y viens. Créons un rapport avec une matrice. Ce rapport s’appuie sur une requête bêbête en SQL, qui renvoie des trucs de vente.

Créons deux datasets bidons. Un s’appelle Mesures, l’autre Axes. Chacun comprend respectivement les noms de champs du dataset Données du type considéré, à savoir que Mesures contient ‘PU’, ‘Qté’ et ‘CA’ et Axes le reste des noms. Appuyons maintentant trois paramètres, deux monovalués s’appuyant sur Axes et s’appelant respectivement Lignes et Colonnes et un multivalué s’appelant Mesures et s’appuyant sur… bravo vous avez deviné, le dataset Mesures. OK ça ne fait absolument rien pour le moment, mais il faut avouer, c’est beau.

La partie drôle arrive. Créons une matrice, avec un groupe de lignes, un groupe de colonnes, et trois cellules pour nos trois mesures. L’expression de groupement en ligne est donc basée sur Fields et vaut:

=Fields(Parameters!Lignes.Value).Value

L’expression en colonnes est du même esprit. Enfin, il ne reste plus qu’à conditionner la visibilité des cellules de mesures à une expression du genre:

=InStr(Join(Parameters!Mesures.Value, », »), »PU »)=0

Une fois que l’on fait tourner tout cela, on a donc quelque chose du style (et on ne se MOQUE PAS des couleurs :)):

On pourrait aller beaucoup plus loin, gérer un nombre d’axes dynamique (bon avec une limite certes…) mais ce serait exagérer. Simplement c’est un usage marrant de la fonction Fields je trouve! Vous en pensez quoi?
A bientôt!
PS: Pour les nostalgiques, le DataSet s’appuie sur Northwind, j’étais en mode hommage à SQL 2000 et j’en avais assez d’AW.

Edit: Charles-Henri Sauget a lu ce papier et, voyant que je ne me décidais pas à partager mon RDL, a implémenté la solution que je décris sur son blog. Allez faire un tour😉

Une réflexion sur “[SSRS] Un tableau croisé dynamique (oui dynamique!) avec Reporting Services

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