Recherche Google-Like dans une dimension en Reporting Services

Je suppose que cela a déjà été fait par un certain nombre de pontes et de moins-pontes mais j’ai trouvé l’application marrante. On me demande ce matin de disposer d’un champ libre dans un rapport dans lequel on peut rentrer un certain nombre de mots qui seront des critères de recherche permettant de séléctionner des membres selon leur caption dans un second paramètre en cascade – le tout en MDX est-il besoin de le préciser.
En gros je tape vélo dans une TextBox et dans une combo j’ai tous les membres avec le label vélo. Si je tape « vélo pneu » je récupère tous les produits possédant vélo OU pneu dans leur nom affichable.

Le côté sympa de RS pour éviter un parsing compliqué est de pouvoir disposer de paramètres multivalués en saisie libre, ce qui donne à peu près ceci:


Une fois ceci fait on récupère un objet de type Array, sur lequel on peut appliquer la fonction Join en VBA dans le binding de variable RS.


="{"+
"Filter"+
"("+
"[Product].[Product Categories].Members"+
",VBA!InStr([Product].[Product Categories].CurrentMember.Member_caption,'"+
Join
(
Parameters!Filtre.Value,
"')),"+
"Filter"+
"("+
"[Product].[Product Categories].Members,"+
"VBA!InStr([Product].[Product Categories].CurrentMember.Member_caption,'"
)+
"'))}"

Résultat: je peux faire des recherches dans mon second paramètre en fonction de mots issus du premier. Bon ça n’est pas encore Google (ou Bing🙂 ) parce que les recherches y sont ordonnées (plus les résultats comprennent de tokens satisfaisants, plus ils sont hauts). Qu’à cela ne tienne, un petit Order MDX plus tard:


="Order"+
"("+
"{"+
"Filter"+
"("+
"[Product].[Product Categories].Members"+
",VBA!InStr([Product].[Product Categories].CurrentMember.Member_caption,'"+
Join
(
Parameters!Filtre.Value,
"')),"+
"Filter"+
"("+
"[Product].[Product Categories].Members,"+
"VBA!InStr([Product].[Product Categories].CurrentMember.Member_caption,'"
)+
"'))}"+
","+
"IIF(VBA!InStr([Product].[Product Categories].CurrentMember.Member_caption,'"+
Join
(
Parameters!Filtre.Value,
"')=0,0,1)+IIF(VBA!InStr([Product].[Product Categories].CurrentMember.Member_caption,'"
)+
"')=0,0,1)"+
",BDESC)"

…on a un résultat ordonné. Comme je l’ai dit rien d’inédit mais c’est sympa à faire.


PS: Evidemment tout cela serait bien plus simple avec une fonction SSAS dans un assembly dédié mais la contrainte est de ne pas utiliser la procédure magique.
PS2: A quand VBA!Split en MDX!!!

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