JSS 2013 – Webcast SSIS Design Pattern

Bonne année à tous !

Me voilà de retour de vacances et un petit post rapide concernant le webcast de la session SSIS – Design Pattern que l’on a animé avec David Joubert.

Bonne visualisation 😉

Publicités

MDX – Division par 0,Null et fonction Divide()

Intro

De temps en temps je dois faire du MDX…
Et à chaque fois que je me lance dans cette aventure périlleuse d’écriture de requête multi dimensionelle, je me dis que j’aimerais prendre du temps pour vraiment tout connaitre sur ce langage. Et espérer qu’un jour je puisse le maîtriser.

C’est pourquoi je vais essayer de publier des posts (enfin) sur ce sujet.
Mon premier sujet la division par 0, Null et la fonction Divide()

Règle de base

La division par 0 n’est pas possible et quand on fait de l’informatique on a la valeur NULL qui vient semer le trouble. Selon le language, les fonctions il faut prévoir ces cas.

Comment le moteur OLAP fonctionne et comment gère t-on ce cas en MDX ?

Bonne question !

Premièrement règle d’or  0 = null  pour le moteur AS.

WITH MEMBER [Measures].[NullValue] AS Null
MEMBER [Measures].[ZeroValue] AS 0
MEMBER [Measures].[CheckZeroEqualToNull?] AS
IIF( [Measures].[ZeroValue] = [Measures].[NullValue], true, false) SELECT
{
[Measures].[NullValue],[Measures].[ZeroValue],
[Measures].[CheckZeroEqualToNull?]
} ON COLUMNS
FROM [MyKioub]

Résultat de la requête :

mdx_zero_null_true

Conclusion : AS considère les valeurs nulles comme une valeur à 0.

Par conséquent si il fallait vérifier le dénominateur d’une division il suffirait de vérifier le cas du 0 uniquement…

Application

Les requêtes ci-dessous présentent les différents cas que l’on peut rencontrer.
En sachant qu’avec SSAS 2008 les vérifications sont faites  avec des IF.
Tandis qu’avec SSAS 2012 on a une toute nouvelle fonction DIVIDE().

WITH MEMBER [Measures].[Value] AS 100
MEMBER [Measures].[NullValue] AS Null
MEMBER [Measures].[ZeroValue] AS 0
MEMBER [Measures].[100 / 0] AS
 [Measures].[Value]/[Measures].[ZeroValue] ,Format_String = '#.#0'
MEMBER [Measures].[100 / Null] AS
 [Measures].[Value]/[Measures].[NullValue] ,Format_String = '#.#0'
MEMBER [Measures].[Null / Null] AS
 [Measures].[NullValue]/[Measures].[NullValue] ,Format_String = '#.#0'
MEMBER [Measures].[0 / Null] AS
 [Measures].[ZeroValue]/[Measures].[NullValue] ,Format_String = '#.#0'
MEMBER [Measures].[Null / 0] AS
 [Measures].[NullValue]/[Measures].[ZeroValue] ,Format_String = '#.#0'
MEMBER [Measures].[0 / 0] AS
 [Measures].[ZeroValue]/[Measures].[ZeroValue] ,Format_String = '#.#0'
MEMBER [Measures].[0 / 100] AS
 [Measures].[ZeroValue]/[Measures].[Value], Format_String = '#.#0'
MEMBER [Measures].[Null / 100] AS
 [Measures].[NullValue]/[Measures].[Value], Format_String = '#.#0'
MEMBER [Measures].[Check 100 / 0] AS
 IIF([Measures].[ZeroValue] = 0, Null,  [Measures].[Value]/[Measures].[ZeroValue]),Format_String = '#.#0'
MEMBER [Measures].[Check 100 / NullEqual0] AS
 IIF([Measures].[Null] = 0, Null,  [Measures].[Value]/[Measures].[ZeroValue]),Format_String = '#.#0'
MEMBER [Measures].[Check 100 / Null] AS
 IIF(IsEmpty([Measures].[NullValue]), Null,  [Measures].[Value]/[Measures].[ZeroValue]),Format_String = '#.#0'
MEMBER [Measures].[DivFunct] AS
 DIVIDE([Measures].[NullValue],[Measures].[Value] )

SELECT {
 [Measures].[Value],
 [Measures].[NullValue],
 [Measures].[ZeroValue],
 [Measures].[Null / Null],
 [Measures].[0 / Null],  [Measures].[Null / 0],
 [Measures].[0 / 0],
 [Measures].[100 / 0],
 [Measures].[Check 100 / NullEqual0],
 [Measures].[100 / Null],
 [Measures].[Check 100 / 0],
 [Measures].[Check 100 / Null],
 [Measures].[0 / 100],
 [Measures].[Null / 100],
 [Measures].[DivFunct]} ON COLUMNS,
, [MyDim].[MyAttribute].&[MyMember] ON ROWS
FROM [MyKioub]

Résultats:

MDX_Test_Divide

La fonction DIVIDE()

Cette fonctione est disponible depuis la version 2012 de SQL SERVER, et possèdes 3 paramètres :
Divide (<numerator>, <denominator> [,<alternateresult>])

WITH MEMBER [Measures].[Value] AS 100
MEMBER [Measures].[NullValue] AS Null
MEMBER [Measures].[ZeroValue] AS 0
MEMBER [Measures].[100 / 0] AS
DIVIDE([Measures].[Value],[Measures].[ZeroValue]) ,Format_String = '#.#0'
MEMBER [Measures].[100 / Null] AS
DIVIDE([Measures].[Value],[Measures].[NullValue]) ,Format_String = '#.#0'
MEMBER [Measures].[Null / Null] AS
DIVIDE([Measures].[NullValue],[Measures].[NullValue]) ,Format_String = '#.#0'
MEMBER [Measures].[0 / Null] AS
DIVIDE([Measures].[ZeroValue],[Measures].[NullValue]) ,Format_String = '#.#0'
MEMBER [Measures].[Null / 0] AS
DIVIDE([Measures].[NullValue],[Measures].[ZeroValue]) ,Format_String = '#.#0'
MEMBER [Measures].[0 / 0] AS
DIVIDE([Measures].[ZeroValue],[Measures].[ZeroValue]) ,Format_String = '#.#0'
MEMBER [Measures].[0 / 100] AS
DIVIDE([Measures].[ZeroValue],[Measures].[Value]), Format_String = '#.#0'
MEMBER [Measures].[Null / 100] AS
DIVIDE([Measures].[NullValue],[Measures].[Value]), Format_String = '#.#0'

SELECT {[Measures].[Value],
[Measures].[NullValue],
[Measures].[ZeroValue],
[Measures].[Null / Null],
[Measures].[0 / Null],
[Measures].[Null / 0],
[Measures].[0 / 0],
[Measures].[100 / 0],
[Measures].[100 / Null],
[Measures].[0 / 100], [Measures].[Null / 100] } ON COLUMNS
, [MyDim].[MyAttribute].&[MyMember] ON ROWS
FROM [MyKioub]

Résultat :
DIVIDE_MDX

Si on ne spécifie pas de troisième argument  « alternateresult » dans la fonction DIVIDE() alors cette dernière retournera toujours « (null) ».
Vous pouvez donc remplacer ce comportement par défaut en spécifiant  une chaine de caractère ou un nombre positif.

Lien : FR – http://technet.microsoft.com/fr-fr/library/ms145626.aspx
EN – http://technet.microsoft.com/en-us/library/ms145626.aspx

Mosha wrote : http://sqlblog.com/blogs/mosha/archive/2007/01/28/performance-of-iif-function-in-mdx.aspx

CWebb wrote :http://cwebbbi.wordpress.com/2013/07/26/new-mdx-divide-function/

Retour Evènement – Les journées SQL Server 2013 (JSS 2013)

Un petit post pour remercier le GUSS, les sponsors et toute l’organisation de cet évènement.

Les JSS ont fêté leurs 3 ans d’existence en battant son record d’affluence :  365 professionnels ont assistés aux JSS 2013.

Quelques stats twitter : http://tweetbinder.com/rs/k3He8LfK9Yq.

Les phtotos : http://t.co/RI0keJizyI

Un petit clin d’oeil également à David Joubert  avec qui  j’ai eu le plaisir de préparer notre session sur SSIS.

On a voulu faire une petite session simple en montrant les principes de bases que l’on a dans SSIS.  Si cette session vous a plu on va pousser pour en faire une avec autre avec un niveau au dessus pour l’année prochaine.

Les webcasts sont bientôt disponibles.

Les slides : http://guss.pro/2013/12/07/slides-journees-sql-server-2013/

Il y a un sondage que vous pouvez remplir afin de nous faire remonter vos avis :  http://tinyurl.com/SondageJSS2013

JSS 2013 : Les Journées SQL Server 2013

La fin de l’année approche, le froid se fait ressentir, vos enfants commencent à découper des jouets dans les prospectus et les collent sur une feuille, vous pensez ce que vous allez faire pour ces fêtes…

Mais on n’échappe pas à une autre coutume les JSS, un évènement gratuit autour de SQL Server, cette édition 2013 se déroulera le 2 et 3 Décembre à Paris dans le centre de conférence de Microsoft.

JSS_2013

Avec David Joubert, nous animerons une session intitulée : SSIS – Design Patterns.

Demandez le programme !

planningJSS20131

Pour participez à l’évènement inscrivez-vous sur le site officiel : http://guss.pro/2013/12/02/journees-sql-server-2013/

Event – SQLSaturday à Paris 2013 : Samedi 14 Septembre

sqlsat251_web_thumb1Le SQLSaturday se déroulera pour la première fois à Paris le Samedi 14 Septembre 2013.

Au programme 3 parcours BI, DBA et Etudiant.

sans-titre

Et du beau monde en perspective …

Des sessions in english with famous people :

  • Jen Stirrup
  • Allan Mitchell
  • Hugo Kornelis

et nos compatriotes made in France :

  • Eiden Florian
  • Sauget Charles-Henri
  • Joubert David
  • Riehl Jean Pierre
  • Coutaud Romuald
  • Harel Patrice

et bien d’autre encore, un évènement à ne pas rater !

Inscription et plus d’infos :
http://guss.fr/
http://www.sqlsaturday.com/251/eventhome.aspx

SSRS – Répéter un élément d’une liste en tant qu’en-tête/pied de page

Le nom de cet article est peut être mal choisi mais il est difficile de donner un nom à ce genre de problème lié aux listes groupés, en-têtes/pied de page  (header/footer) et la répétition sur plusieurs pages.

Je vais essayer de vous l’expliquer.

Un petit rappel sur les listes dans SSRS.

Si on souhaite répéter un rapport sur plusieurs pages tout en étant libre de diposer des éléments on devra utiliser le composant List de SSRS.
Mais ce n’est pas tout, si on groupe cette liste par un champ/ID  on obtiendra des sous-ensembles de données qui vont être répétés au travers de la liste.
Et pour finir si on ajoute un Page Break sur ce fameux groupe (champs/ID) on aura comme résultat un ensemble de données par page.

Illustration

Pour illustrer rapidement, un petit exemple d’une fiche de renseignements d’une personne dans laquelle on afficherait également un tableau dans lequel on présenterait la liste de ses enfants.

Notre dataset renvoit un  jeu de données avec les informations liés à plusieurs personnes. Après avoir mis en place la liste, le groupement par numéro de sécurité social par exemple et le saut de page après chaque groupe on va obtenir  une seule fiche de renseignements par personne et par page.

De ce style :

Exemple

Bref tout va bien pour l’instant il n’y a rien de sorcier.

On peut tout de même se poser quelques questions.

« Si le tableau des enfants est trop grand ? Par exemple 10 enfants ? « 

Réponse :

« Il débordera sur la seconde page. Bien évidemment pour une meilleure lecture du tableau on pourra répéter les en-têtes de colonnes du tableau. »

Illustration :

Exemple2

Autre question.

« Mais si on souhaite que les  infos générales des parents s’affichent sur toutes les pages de la même manière que sur la première page ? Comme par exemple répéter le nom du parent au début de chaque page ? »

Illustration du résultat attendu :

Exemple3

Réponse :

« Haaa…Let me search 🙂 ! »

Désormais ne cherchez plus ! Voici un moyen de répondre a ce type de demande.

L’astuce : Mode d’emploi

Il semblerait que cela fonctionne uniquement avec SSRS 2012, les tests sous SSRS 2008 ne donnent pas le même résultat.

Il existe une petite astuce qui vaut ce qu’elle vaut mais n’hésitez pas à laisser vos commentaires avec différentes pistes pour faire la même chose.

Pour parvenir a mes fins j’ai dû ajouter les champs dans la liste et les cacher (Propriété Hidden du groupe static ou de la ligne).  Par la suite j’ai ajouté un header au rapport dans lequel  je place des TextBoxes.

Grâce à des expressions j’appelle les valeurs de ces champs cachés de la liste via un ReportItems!NomTextbox.Value.
Un bon renommage des noms textbox cachés facilite l’utilisation de la collection ReportItems!.

Un conseil : Ajoutez les champs à utiliser dans le tableau dans une cellule vide de l’en-tête de colonnes ou ajoutant une ligne au dessus de l’en-tête du tableau. Cachez la ligne / les champs n’hésitez pas jouer sur la taille de la police dans certains cas pour ne pas perdre d’espace.

Pourquoi faire ceci ?  Pour le RepeatOnNewPage de l’en-tête de colonnes du tableau, les champs étant cachés dans une zone qui sera répétée sur les nouvelles pages, alors les Textboxs du Header étant eux aussi répétés automatiquement pourront à chaque page récupérer la valeur des champs. Si vous ne le faites pas les champs texte du header n’afficheront pas de valeurs.

ssrs_repeat_list_header

Résultat :

ssrs_header_list_demo

Autre comportement : si vous oubliez  de faire un saut de page dans le groupe alors les textbox du header afficheront les valeurs du dernier groupe de la page.

NOTE I :  On ne peut pas utiliser deux ReportItems  dans une expression.

NOTE II : Cela fonctionne aussi si l’on souhaite répéter dans le footer.

PS : Cela fait un petit moment que je n’ai pas publié d’articles. J’ai débuté une nouvelle expérience dans ma petite vie et j’ai du laissé de côté certaines choses. L’envie ne manquait (presque) pas le temps par contre…

Les Journées SQL Server 2012 alias JSS 2012

Oyé Oyé brave gens, qu’il est bon de retrouver mon vieux pti’ blog avec ce genre d’annonce.
Comme l’année dernière je participerai aux Journées SQL Server 2012 organisé par le GUSS. Les inscriptions sont ouvertes depuis quelques temps et le programme est disponible sur le site officiel :

http://jss2012.fr/2012/10/31/ouverture-des-inscriptions/

Je profite également de ce post pour annoncer mon retour en France. Et oui ! le Canada c’est terminé depuis deux mois (déjà le temps passe vite 🙂 ).Vous comprenez donc pourquoi j’ai un peu disparu de la blogosphère.

Je reviendrai bientôt avec des idées de posts plein la tête…