Geoflow … et alors ?

Si vous êtes passé à coté du BUZZ intersidérale de GeoFlow vous deviez être en vacances depuis la SQL Pass Business Analytics conference.

Je ne vais pas faire un énième article sur la techno je pense que le sujet a était traité de fond en comble sur la blogosphère.

Je voudrais plutôt me faire le relais de Jamie Thomson et de son post => Geoflow? Is that it, Microsoft? Un article qui expose clairement mon ressenti sur la situation du reporting by Microsoft, c’est à dire :

  • Geoflow n’est pas intégrable à Sharepoint
  • Geoflow est un add-in séparé de Powerview… j’aurais bientôt plus d’applications intégrées à Excel que dans mon menu démarrer… (Hé chérie comment on lance deezer ? Ah bin tu as regardé dans mes ribbon Excel ? Oo ! )

J’ajouterai un autre point : mais qui arrive à lire ce qui est produit avec cet outil ? Puisque les images parlent plus que les mots, voici quelques captures récupérées par ci par là :

Quoi que, couplé avec mon add-in deezer pour Excel cela peut jouer le rôle d’equalizer non ?

Ah oui le mix fond de carte + bâtons 3D + Camemberts je pense que c’est le combo ultime pour montrer que cet outil peut faire couler une boite ?

http://djeepy1.files.wordpress.com/2013/04/image2.png

Ok on voit très bien que le Louvre est le plus visité des musés de Paris et plutôt rapidement, mais voir ça sur une carte, quelle est la valeur ajoutée ?

imageOhhhhhhhh c’est beau !

Bon allez j’arrête de râler je dois juste être trop bête pour comprendre qu’on peut tous représenter géographiquement et qu’aujourd’hui Geoflow ce n’est pas juste de l’effet waouh mais que cela répond à un réel besoin en entreprise.

D’ailleurs c’est vrai, niveau reporting coté MS, on est à ce niveau d’innovation parce que tous les autres outils sont parfaits, reporting Services et powerview c’est quand même complètement au niveau de QlickView / Tableau / … non ? (Ah on me souffle à l’oreille que non …) Je conclurais par : Keep Going ! Vous êtes sur le bon chemin.

Le GUSS Version 2013 !

Pour notre plus grand plaisir, le Groupement des Utilisateurs SQL Server (GUSS) fait peau neuve cette année!

Au programme une gestion plus communautaire avec un board qui prend les décisions plutôt qu’un bureau classique (Président,trésorier …) le board sera constitué de :

Et sera élu chaque année par les membres actifs en assemblée générale, bref vous pouvez toujours lire les status: http://guss.fr/accueil/le-guss/les-statuts.aspx

Donc une approche plus communautaire avec le board, ok … mais ce n’est pas tout, suppression de la cotisation pour les membres actifs, vous avez donc un droit de vote dès que vous participez régulièrement aux évènements ! (Formidable non ? )

A venir aussi, un nouveau site web, de nouveaux évènements et toujours plein d’Afterworks dont celui de mercredi prochain !

Bref plein de bonnes choses, en espérant vous voir nombreux lors des évènements afin de pouvoir partager tous ensemble.

Charger tous les packages de déploiement des modèles MDS

Hier nous avons crée tous nos packages de déploiement avec un script PowerShell disponible ici.

Il est maintenant temps de charger tous ces packages sur notre serveur de prod, voici le script utilisé:

#Parameters
#MDS Database
$MDSdb="MDS"
#Serveur Name, with named instance if required
$MDSServeur = "."
$MDSPath = "C:\Program Files\Microsoft SQL Server\110\Master Data Services\Configuration"
#Your MDS Service name, you can fin the name with this command : MDSModelDeploy listservices
$MDSServiceName = "MDS1"
$CurrentPath = $(get-location)
#The package Path where .pkg are, absolute or relative
$FromPath = ".\Packages\"
#Deployement Mode deploynew, deployupdate or deploycreate http://msdn.microsoft.com/fr-fr/library/hh479646.aspx
$deployType = "deployclone"
$versionName = ""

cd $MDSPath
cd $FromPath

Foreach ($file in Get-Childitem $(get-location)  | where {$_.extension -eq ".pkg"})
{
switch($deployType)
{
    deploynew 
    {
        & "$MDSPath\MDSModelDeploy.exe" $deployType -package $file.name -model $file.BaseName -service $MDSServiceName
    }
    deployclone  
    {
        & "$MDSPath\MDSModelDeploy.exe" $deployType -package $file.name -service $MDSServiceName
    }
    deployupdate 
    { 
        & "$MDSPath\MDSModelDeploy.exe" $deployType -package $file.name  -version $versionName -service $MDSServiceName
    }

}

}

Et nous voici avec nos modèles clonés sur notre serveur de prod, nous aurions aussi pu modifier la variable $deployType afin de mettre à jour les modèles.

Le résultat en image:

PowerShellBlack

MDS

N.B:

Attention à ne pas sous dimensionner vos serveurs, là j’ai 4 GO de Ram et pour les modèles de plus de 2 GO de données, c’est très long … de plus le serveur est à genoux durant l’import.

 

 

Serv

Créer tous les packages de déploiement des modèles MDS

Créer UN package de déploiement MDS c’est facile et expliqué ici => http://msdn.microsoft.com/fr-fr/library/hh479639.aspx mais comment diantre créer tous les packages de déploiement sans taper toutes les commandes à la main !

La solution propre serait d’utiliser l’API WCF de MDS pour récupérer les modèles mais cela nécessite le déploiement d’un code compilé sur les différents serveurs, ce qui ne me convient pas.

J’ai donc fait un script Powershell qui tape directement dans la base MDS, pas très élégant mais cela fonctionne.

Le script :

#Parameters
#MDS Database
$MDSdb="MDS"
#Serveur Name, with named instance if required
$MDSServeur = "."
$MDSPath = "C:\Program Files\Microsoft SQL Server\110\Master Data Services\Configuration"
#Your MDS Service name, you can fin the name with this command : MDSModelDeploy listservices
$MDSServiceName = "MDS1"
$CurrentPath = $(get-location)
#The destination Path where .pkg files will be created, absolute or relative
$DestPath = ".\Packages\"
cd $MDSPath
# Create SqlConnection object and define connection string
$con = New-Object System.Data.SqlClient.SqlConnection
$con.ConnectionString = "Server=$MDSServeur; Database=$MDSdb; 
  Integrated Security=true"
$con.open()

# Create SqlCommand object, define command text, and set the connection
$cmd = New-Object System.Data.SqlClient.SqlCommand
$cmd.CommandText = "SELECT DISTINCT
      TM.[Name] AS ModelName
	  ,MAX(MV.Name) AS VersionName
  FROM [MDS].[mdm].[tblModel] TM
  INNER JOIN MDS.mdm.tblModelVersion MV
	ON MV.Model_ID=TM.ID
  WHERE [IsSystem] = 0
  GROUP BY TM.[Name]"
$cmd.Connection = $con

# Create SqlDataReader
$dr = $cmd.ExecuteReader()

If ($dr.HasRows)
{
  Write-Host Number of Models: $dr.FieldCount
  Write-Host
  While ($dr.Read())
  {
    $packageName=$DestPath+$dr['ModelName']+".pkg"
    if(Test-Path $packageName)
    {
        rm $packageName
    }
    if(!(Test-Path $DestPath))
    {
        md -Path $DestPath
    }

    Write-Host Génération du package pour le model : $dr["ModelName"] Version: $dr["VersionName"] 
    ./MDSModelDeploy.exe createpackage -model $dr['ModelName'] -version $dr['VersionName'] -service $MDSServiceName -package $packageName -includedata

  }
}
Else
{
  Write-Host No models
}
cd $CurrentPath

Le fichier est disponible au téléchargement ici => MDSDeploy

PowerShell

******* Update du 22/04/2013 ********

Suite au commentaire de Roman, voici un script basé sur les commandes mdsmodeldeploy.exe listmodels et listversion. Ce n’est clairement pas plus simple (car bricolage de chaîne de caractère) mais plus dans la bonne pratique car on ne tape pas directement dans la base SQL de MDS.

#Parameters
#MDS Database
$MDSdb="MDS"
#Serveur Name, with named instance if required
$MDSServeur = "."
$MDSPath = "C:\Program Files\Microsoft SQL Server\110\Master Data Services\Configuration"
#Your MDS Service name, you can fin the name with this command : MDSModelDeploy listservices
$MDSServiceName = "MDS1"
$CurrentPath = $(get-location)
#The destination Path where .pkg files will be created, absolute or relative
$DestPath = ".\Packages\"
cd $MDSPath

$i = 0

$output = ./MDSModelDeploy.exe listmodels -service MDS1

foreach($lineOutput in $output)
{

    if($i -ne 0 -and $i -lt ($output.count - 2))
    {
        $packageName=$DestPath+$lineOutput+".pkg"
        if(Test-Path $packageName)
        {
            rm $packageName
        }
        if(!(Test-Path $DestPath))
        {
            md -Path $DestPath
        }
        Write-Host Génération du package pour le model : $lineOutput
        $outputVersion = ./MDSModelDeploy.exe listversions -service $MDSServiceName -model $lineOutput
        $j=0
        foreach($lineOutputVersion in $outputVersion)
        {
            if($j -eq ($outputVersion.count - 3))
            {
                ./MDSModelDeploy.exe createpackage -model $lineOutput -service $MDSServiceName -package $packageName -includedata -version $lineOutputVersion
            }
            $j++
        }

    }
    $i++
}

Afterwork du GUSS

Le prochain Afterwork du GUSS à lieu Mecredi 17 Avril, le fil conducteur sera gestion de projet et Agilité autour de SQL Server, l’idée étant de croiser nos points de vues, n’hésitez pas à venir nombreux débattre avec nous.

Pour ma part, je suis assez fan d’une approche qui serait un croisement de la méthodologie de Kimball (décrite dans le DataWareHouse Lifecycle Toolkit V2) et d’agilité.

J’exprime plus en détails mon point de vue sur ce sujet ici => http://blog.sauget-ch.fr/2013/03/problematiques-de-la-gestion-de-projet-decisionnel/

Notez dès à présent la date dans votre agenda :

17 avril – 19h00
Charly-Birdy
1 place Etienne Pernet, Paris 15ème
Métro Commerce

Impact des fonctions sur le parcours des indexes

En pleine révision de la certification 70-461 Querying Microsoft SQL Server 2012 je me retrouve donc à lire le livre : Querying Microsoft SQL Server 2012: Exam 70-461 Training Kit et oui j’avoue, je ne suis pas fan de la méthode bachotage de dump certexam, tant qu’à utiliser mon temps je préfère ne pas apprendre des QCM par cœur ;) bref, ceci paie puisque j’apprends ou revois certaines fonctionnalité que je vais partager avec vous.

Continue reading

Problèmatiques de la Gestion de Projet Décisionnel

** Les éléments qui suivent sont l’image d’un point de vue subjectif, issus de mon expérience professionnel et des nombreuses conversations que je peux avoir avec mes collègues et amis présents dans l’écosystème du décisionnel, si vous ne vous y retrouvez pas, n’hésitez pas à le remonter dans les commentaires **

Ces derniers temps, un constat me saute aux yeux, une partie non négligeable des projets décisionnels périclitent, glissent, dérivent non pas par manque de compétences des consultants mais par absence totale de gestion de projet.

Pourquoi ce constat est plus frappant en décisionnel qu’en développement par exemple?

  • Les projets B.I. peuvent être commandités directement par les équipes fonctionnelles (Contrôle de gestion, Pôle marketing, Direction …) et ne passent pas toujours par la case DSI.
  • La mise en place d’applications répond à un besoin opérationnel qui est souvent plus facile à spécifier que les besoins analytiques qui sont par nature assez conjoncturels et sont amener à évoluer de manière rapide.
  • Le manque de support sur la gestion de projet de la part du client, associé aux points ci-dessus, implique lors des régies une prise en charge de cette tâche par la MOA, la gestion de projet devient alors “gestion de planning”. Et là c’est le drame.
  • Les 3 points ci-dessus sont d’autant plus cruciaux qu’en France le statut d’Architecte Décisionnel est soit délégué aux développeurs soit au Chef de projet et n’apparait que très rarement en tant que poste à part entière. Hors un développeur n’aura pas la latitude d’imposer une cohérence au système d’information décisionnel global de l’entreprise (Matrice de bus) tout comme la partie MOA ne saura pas forcément jauger de l’impact des solutions techniques mises en place par les équipes de développement.

Je suis intimement convaincu qu’aujourd’hui le décisionnel (En mode conseil) a le cul entre deux chaises, une DSI qui n’a pas les compétences pour gérer les projets de ce type, et des fonctionnels très demandeurs (quitte à passer outre la DSI depuis des années avec Access / Excel …) mais incapables de mesurer les problématiques techniques inhérentes à la mise en place d’un projet décisionnel d’entreprise (Historisation, Stockage, Sécurité).

Ajoutez à tout cela un autre challenge qui serait mettre en place une méthodologie Agile au sein de votre projet décisionnel et vous voilà partie vers l’inconnu le plus total. As tu essayé toi lecteur de faire passer dans une itération de deux semaines les éléments d’un projet B.I. ? J’en ai fait l’expérience récemment et voici le résultat sur une partie d’ETL :

TFS

Pourquoi les choses se sont passées comme cela ? Je vois deux raisons :

  1. Nous avons souvent la chance dans notre domaine de découvrir les données en même temps que nos clients, et nous ne sommes donc pas à l’abri de surprises qui nous obligent à attendre des retours de leur part (règle de gestion …)
  2. Faire un découpage assez fin pour réussir à livrer un élément en deux semaines c’est difficile, surtout lorsque rien n’est spécifié et que la qualité des données s’en mêle.

En conclusion, vous l’aurez compris, la gestion de projet B.I. nécessite un effort considérable car il est nécessaire d’allier :

  • Architecture du système d’information (Modélisation dimensionnelle, cohérence des données …)
  • Compréhension suffisante du fonctionnel pour pouvoir effectuer un découpage très fin des différents besoins (Et donc nécessité de récolter ces besoins)
  • Gestion de planning
  • Compréhension technique des solutions mises en place afin de s’assurer que le curseur “Maintenabilité” => “Performance” => “Rapidité de mise en place” ne soit pas déconnant (Éviter de finir par livrer un système qui fonctionne mais impossible à maintenir / faire évoluer)

Bon je râle,  je râle mais quelle solution je préconise pour que cela se passe bien ? et bien une approche qui serait un mixe du DataWareHouse Lifecycle ToolKit 2nd Edition de Ralph Kimball, de SCRUM et d’outils tel que TFS et MSPROJECT ;)

Je vais faire un papier plus long sur l’approche que j’envisage à l’avenir donc “Stay Tuned” !

 

Table Storage Source Component

La bêta de mon premier composant est disponible sur CodePlex, celui-ci vous permet de charger des données depuis les stockages Azure Table Storage de manière assez simple tout en permettant un chargement incrémental grâce à une date de début de chargement.

Quelques images (Le design va être revu sous peu):

Table Storage Table Storage2Table Storage3

Il reste pas mal de choses à faire dessus telles que :

  • Rendre possible la détection automatique des tailles de chaînes de caractères car aujourd’hui String = NVARCHAR(4000) (Un peu comme le DataType Guessing du Driver Oledb Jet http://msdn.microsoft.com/en-us/library/ms141683.aspx)
  • Paralléliser le chargement des données afin de gagner en performance.
  • Documenter le composant

LGPLv3_Logo.svg
Ce composant est disponible sous licence LGPL et peut donc être intégré dans n’importe lequel de vos projets même non libre.

N’hésitez pas si vous avez des retours, des améliorations, des questions, des bugs

Le code source est disponible ici sur CodePlex => http://tssc.codeplex.com/

N.B: Merci au blog de Rainer Stropek qui m’a permis de poser les bases du composant.