samedi 13 avril 2013

[SSAS] : Formatage des mesures

Un post rapide pour voir comment généraliser le formatage des mesures "FORMAT_STRING" dans SSAS. Cette tâche qui est souvent réalisée de manière manuelle, peut devenir fastidieuse dans le cas ou nous avons un grand nombre de mesures, et peut être automatisé via un Script MDX.

Afin de réaliser cette tâche de manière aisée il faut mettre en place au préalable une règle de nommage des mesures, en y ajoutant un préfixe/suffixe, par exemple:

  • Montant : pour toutes les mesures de type Currency
  • Nombre : pour toutes les mesures de type Standard
  • % :  pour toutes les mesures de type Percent
Il ne reste plus qu'à définir le script MDX dans l'onglet Calculations du Cube de la manière suivante:

Format_String( Filter (Measures.ALLMEMBERS,
                       Instr(Measures.CurrentMember.Name, "Montant") > 0
                       )
             ) = "Currency";
Format_String( Filter (Measures.ALLMEMBERS,
                       Instr(Measures.CurrentMember.Name, "Nombre") > 0
                       )
             ) = "Standard";
Format_String( Filter (Measures.ALLMEMBERS,
                       Instr(Measures.CurrentMember.Name, "%") > 0
                       )
             ) = "Percent";


Et voici le résultat obtenu:


En espérant que ça pourrait vous aider...



vendredi 29 mars 2013

[SSRS] : Concaténation de plusieurs lignes en une seule

Un petit post rapide, pour montrer comment concaténer plusieurs lignes d'une requête en une seule, par exemple en affichant pour chaque gamme de produit, la liste des produits dans la même cellule, séparés par une virgule.

Le but est de passer de cette représentation :


 A quelque chose qui ressemble à :


Pour cela, la version 2008 R2 a apporté une nouvelle fonction le "LookupSet" qui est, un peu similaire à la fonction "Lookup" mais qui permet de récupérer un jeu de données au lieu d'une seule valeur, à partir d'un autre Dataset.

Dans mon cas les données proviennent du même dataset, donc je me suis livré au jeu et j'ai testé le "LookupSet" en faisant une jointure sur le même champ (Gamme) du Dataset du tableau, et ce qui fonctionne très bien, puisque la requête est généré avant l'évaluation de l'expression SSRS.

Et techniquement, la syntaxe de l'expression SSRS est la suivante :

Join(LookupSet(Fields!GammeDesc.Value, Fields!GammeDesc.Value, Fields!ProduitDesc.Value, "DataSet1"),", ")

Avec en vert, la clé de jointure qui pointe sur le même champ et en bleu le champ qu'on veut récupérer et puis la fonction "Join" pour concaténer le résultat retourné par le "LookupSet".

En espérant que ça pourrait aider.



lundi 18 mars 2013

[SSRS] : Temps d’exécution de rapport

Parfois, pour debugguer un rapport, on peut avoir besoin d'afficher le temps global d’exécution du rapport en pied de page ou à l’intérieur même du rapport, et cela sans faire appel à la vue ExecutionLog de la base ReportServer.

La solution consiste à utiliser la fonction Now() et la variable globale SSRS Global!ExecutionTime, la première permettant de récupérer l'heure d'affichage effectif du rapport et la deuxième permettant de récupérer l'heure de génération du rapport et plus exactement à partir du moment où l'on clique sur le bouton "Afficher le rapport".

Donc, en faisant la différence entre Now() et Global!ExecutionTime nous pouvons avoir le temps d’exécution global du rapport, techniquement cela se traduit de la manière suivante :

System.DateTime.Now.Subtract(Globals!ExecutionTime).TotalSeconds

Et pour faire quelque chose de plus complet, pour les rapports qui dépasserais une minute de temps d’exécution voir une heure, même si rare, voici l'expression complète :

IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).TotalSeconds < 1, "< 1 seconde(s)",

(

IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).Hours > 0, System.DateTime.Now.Subtract(Globals!ExecutionTime).Hours & " heure(s), ", "") +

IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).Minutes > 0, System.DateTime.Now.Subtract(Globals!ExecutionTime).Minutes & " minute(s), ", "") +

IIf(System.DateTime.Now.Subtract(Globals!ExecutionTime).Seconds > 0, System.DateTime.Now.Subtract(Globals!ExecutionTime).Seconds & " seconde(s)", ""))

)

Et pour tester le rapport, nous ajoutons un Dataset avec un WAITFOR DELAY '00:00:03' pour simuler un temps d’exécution de 3 secondes.
Ce qui donne le résultat suivant :