Blog du Pôle .NET

Partager pour mieux développer...

Création de cube local avec C# et XMLA

clock April 14, 2009 11:13 by author aequoy

Le décisionnel est un de mes domaines fonctionnels d'origine, il m'arrive de temps à autre de répondre à des questions clients sur cette problématique.

Un client m'a donc récemment posé une colle. Comment faire pour qu'une application puisse créer puis attaquer un cube local programmatiquement via MDX sans passer par la case serveur d'analyse (Analysis Services en l'occurence) ?

Pour ce faire, je me suis tourné du côté de XML for Analysis (XMLA) afin de définir le schéma de mon cube. XMLA est une norme respectée par MS Analysis Services, Hyperion, SAP et SAS (autrement dit c'est un standard de fait sur le marché). Pour celles et ceux intéressés par la norme voyez du côté de ce lien.XMLA sert essentiellement de protocole de dialogue entre un serveur d'analyse et des applications tierces en s'appuyant sur SOAP. Une chose intéressante avec XMLA est qu'en plus d'être un protocole permettant l'interrogation de cubes analytiques, il permet aussi la création de ceux-ci.

Le schéma XMLA sera donc interprété via ADOMD.Net dans sa partie cliente (téléchargeable sur le site Microsoft). Une fois le cube local (*.cub) généré par ADOMD.Net je l'attaque classiquement.

Pour le bien de la démonstration, j'utilise la base Adventure Works afin d'aller chercher mes données mais toute source de données disposant d'une chaîne de connexion fera l'affaire.

1er problème : comment créer mon script XMLA ?

  • 1ère solution : je me tape la grammaire XMLA et je crée tout à la main. Cette solution est sympathique mais prend énormément de temps.
  • 2ème solution : j'utilise mon serveur d'analyse propiétaire et j'extraie un script XML. Loin de moi la fainéantise, mais j'ai privilégié cette approche.

Je vous conseille de récupérer une version gratuite SQL Server Express Advanced disposant des fonctionnalités d'analyse ainsi que les outils Visual Studio For Business Intelligence.

Je crée donc d'abord un projet d'analyse sous Visual Studio avec une source de données ici sur ma base relationnelle Adventure Works.  


 

 

 

 

 

 

 

 

Ma DataSourceView est assez simple :

 

  J'ai donc une table de fait Customer qui va disposer d'une seule mesure (Le nombre de client) exposée selon 2 dimensions : les territoires de vente et les magasins. Un schéma très simple pour l'exercice.

 Une fois publié, je sélectionne ma base de données sous management studio (à télécharger) après m'y être connecté et j'exporte le script XMLA. Bien faire attention d'exporter la base et non le cube !


J'obtiens un script que je sauvegarde sous mon répertoire c:\textcube.txt.

 2ème problème : comment créer la requête qui va manipuler le script pour générer le cube local ?

Le script de création seul ne suffit pas. Il faut l'englober dans un stub qui va se connecter à la source de données. Voici ce script gratuitement :) :

<Batch xmlns='http://schemas.microsoft.com/analysisservices/2003/engine'> 
CUBESCRIPT
<Parallel>  
<Process xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>    
<Object>      
<DatabaseID>Analysis Services Project1</DatabaseID>    
</Object>    
<Type>ProcessFull</Type>    
<WriteBackTableCreation>UseExisting</WriteBackTableCreation>  
</Process>
</Parallel>
</Batch> 

  A la place de CUBESCRIPT, je vais remplacer programmatiquement le schéma créé précédemment.Le stub est sauvegardé dans un autre fichier texte xmlastub.txt.

Notez bien que le DatabaseID doit être identique à celui présent dans le fichier textcube.txt.

S'en suit un programme C# qui va construire la requête :

 
AdomdConnection conn = new AdomdConnection();	
conn.ConnectionString = string.Format("Provider=MSOLAP;Data Source={0}", "c:\\cubedemo.cub"); 
try { 
conn.Open(); 
AdomdCommand cmd = new AdomdCommand(); 
cmd.Connection = conn;                       
string xmlastub = File.OpenText("C:\\xmlastub.txt").ReadToEnd();                    
string xmlacube = File.OpenText("C:\\TestCube.txt").ReadToEnd();                
cmd.CommandText = xmlastub.Replace("CUBESCRIPT", xmlacube);                     
cmd.Execute(); 
Console.WriteLine("ok"); }
catch (Exception ex) { Console.WriteLine(ex.Message); }
finally { conn.Dispose(); } Console.ReadLine(); 

 

Le cube est maintenant généré, il n'y a plus qu'à l'attaquer.

Une petite requête MDX pour la route :

AdomdConnection conn = new AdomdConnection();
            conn.ConnectionString = string.Format("Provider=MSOLAP;Data Source={0}", "c:\\cubedemo.cub");
            try
            {
                conn.Open();
                AdomdCommand cmd = new AdomdCommand();
                cmd.Connection = conn;
                cmd.CommandText = "select {[Measures].[Customer Count]} on columns, {[Store].[Business Entity ID].[Business Entity ID].Members} on rows from [MonTest]";
                AdomdDataReader monReader = cmd.ExecuteReader();
                while (monReader.Read())
                {
                    //lecture
                }
                Console.WriteLine("ok");
            }
            catch (Exception ex) { Console.WriteLine(ex.Message); }
            finally { conn.Dispose(); } Console.ReadLine();

Voilà !

Alexandre Equoy

PS : Si vous souhaitez changer la chaîne de connexion de la source, vous trouverez dans le fichier XMLA les lignes suivantes :

  <DataSources>
                <DataSource xsi:type="RelationalDataSource">
                    <ID>AdventureWorks</ID>
                    <Name>AdventureWorks</Name>
                    <ConnectionString>Provider=SQLNCLI10.1;Data Source=WVFROLDU01\SQL2008_ENT;Integrated Security=SSPI;Initial Catalog=AdventureWorks</ConnectionString>
                    <ImpersonationInfo>
                        <ImpersonationMode>ImpersonateServiceAccount</ImpersonationMode>
                    </ImpersonationInfo>
                    <Timeout>PT0S</Timeout>
                </DataSource>
            </DataSources>

Sachez aussi qu'Excel est capable d'ouvrir un fichier *.cub directement ce qui permet d'accéder aux fonctionnalités décisonnelles dans Excel sur ce cube local.

TestCube.rar (34,13 kb)

Currently rated 4.5 by 4 people

  • Currently 4.5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Silverlight 3 beta disponible

clock March 20, 2009 09:42 by author aequoy

 Microsoft a présenté hier durant le MIX 09 la nouvelle mouture de Silverlight 3.0.

Parallèlement à l’arrivée de la bêta de Silverlight 3.0, Microsoft prépare Expression Blend 3, qui embarquera son propre lot de nouveautés, notamment SketchFlow pour concevoir rapidement et visuellement des interfaces, ou encore l’importation de travaux depuis Photoshop et illustrator.

Les développeurs qui veulent s’essayer à Silverlight 3.0 auront besoin de Visual Studio 2008 SP1 ou au moins de Visual Web Developers Express 2008 SP1.

Voici les différents téléchargements relatifs :

  • Outils Silverlight 3.0 pour Visual Studio (incluent le SDK)
  • Runtimes développeurs pour Windows et Mac OS X
  • Version Preview d’Expression Blend 3
  • Kit d’outils complémentaire (contrôles, thèmes, etc.)
  • Services RIA .NET
  • Documentation : en ligne ou sous forme de fichier CHM
  • Alexandre Equoy

    Be the first to rate this post

    • Currently 0/5 Stars.
    • 1
    • 2
    • 3
    • 4
    • 5


    Microsoft Health Graphing control

    clock February 20, 2009 05:15 by author aequoy

     

    La santé et le secteur hospitalier étant mes domaines fonctionnels d'origine, voici un petit billet pour vous informer de la sortie de nouveaux contrôles et guides WPF/Silverlight dédiés aux interfaces médicales. 

    Si vous n'avez pas encore consulté le site http://www.mscui.net/ je vous y invite.



    Source : http://www.mscui.net/Blog/post/Welcome-to-our-New-Graphing-Control.aspx

    Alexandre Equoy

    Currently rated 5.0 by 1 people

    • Currently 5/5 Stars.
    • 1
    • 2
    • 3
    • 4
    • 5


    Access it aux techdays

    clock February 9, 2009 13:41 by author aequoy

    Histoire de relayer la news présente sur notre site, vous pourrez nous retrouver sur le stand CUC23 espace Communication Unifiée et Collaboration.

    Florent Santin, consultant .Net, interviendra, en tant que speaker, sur les sujets suivants :

    WF 4 : Premier contact (FRA318)
    Mardi 10 février - de 14h30 à 15h30

    Microsoft a dévoilé Workflow Foundation avec la version 3 du framework .Net. Cette session vous présente WF 4.0, dans un premier temps de façon didactique pour comprendre les motivations de ce pan technologique, puis en passant en détail les nouveautés et différences par rapport à la version actuelle.

    De la macro VBA au développement .Net VSTO (RDA102)
    Mardi 10 février - de 16h00 à 17h00

    Vous êtes développeur de macros VBA dans Office? Vous commencez à vous sentir limité dans vos possibilités et aimeriez aller un cran plus loin ? Venez donc voir comment migrer en douceur vers la plateforme .NET et VSTO pour passer d'un code VBA à un code VB.NET libérant ainsi vos possibilités de personnalisation et d'intégration dans Office. Visual Studio 2008 vous aidera par exemple également à modifier le ruban Office sans ligne de code à l'aide d'un designer !

    Visual Studio 2010 : les nouveautés de l'édition test (IND126)
    Mercredi 11 février - de 13h00 à 14h00

    La qualité des applications est un axe majeur pour Microsoft. La version 2010 de Visual Studio Team System présentera des nouveautés intéressantes dans ce domaine. Visual Studio Team System Test Edition sera beaucoup enrichi : - Tests fonctionnels d'applications Web, WinForms et WPF - Outil dédié à la gestion des campagnes de tests - Enregistrement de vidéos à l'exécution des tests Visual Studio Team Lab (un nouveau produit) permet de gérer et de déployer des environnements de tests virtualisés. Sans oublier des améliorations dans Team Foundation Server et Visual Studio Team System Development : - Gestion graphique des branches - Eléments de travail : traçabilité et liens typés - Débuggeur historique - Débuggeur déployable à distance en mode déconnecté La sessions sera illustrée par des démonstrations de ces nouvelles fonctionnalités.

    Alexandre Equoy 

    Be the first to rate this post

    • Currently 0/5 Stars.
    • 1
    • 2
    • 3
    • 4
    • 5


    Microsoft Surface Camp : day 2

    clock February 6, 2009 04:58 by author aequoy

    Après une première journée dont l'objectif était de défaire les illusions vis à vis de Microsoft Surface et de nous projeter dans ce que l'on peut attendre de l'outil, cette seconde journée démarre sur le design d'application sur Surface.
    Yoann has improved his english. He is certainly fluent now... ;)
    Notre interlocuteur a commencé par évoquer des guidelines de design.
    L'aspect multi user et l'aspect contextuel (l'endroit, les types de participants...) influent énormément sur le design et les comportements d'application
    .
    Nos scénarios de tests vont devoir s'étoffer afin de prendre en compte tous les cas d'utilisations.

    Nous continuerons à vous donner des nouvelles.

    Repeat after me Yoann, my taylor is rich ....

    Après 2 jours passés ensemble, Yoann s'est enfin décidé à me demander en mariage. Et comme tout "bons" devs que nous sommes nous avons décidé de préparer l'événement par une application Surface.

    L'idée de cette application est de préparer un plan de table, d'assigner des personnes à ces tables, d'imprimer des tags sur les cartes d'invitation et le jour J (un jour mon prince viendra...) par la reconnaissance des tags_id de placer les gens automatiquement.

    Nous avons codé une partie de la nuit ce début d'application sur le simulateur et nous l'avons testé en réel sur la table cet après midi.

    Enormément d'idées arrivent du fait de passer sur la table (c'est l'application bien sûr qui est passée sur la table ;)). Plutôt que d'utiliser des bouton nous allons utiliser des objets réels que nous placerons et qui par reconnaissance de forme donneront au final le même rendu.

    Lorsque notre interlocuteur nous prévenait qu'il fallait absolument une table pour développer, c'est VRAI !!! (Arnaud, Eric, Olivier si vous nous lisez :) )

    Les idées fusent à partir du moment où d'autres utilisateurs peuvent interagir.

    Expérience fantastique ! Nous sommes comme 2 gosses devant un jouet.

    Marvellous comme dirait Yoann ;)

    Alexandre Equoy

    Quelques photos de l'évenement :

     



    Avec le témoin ;)
    Laurent tu seras mon témoin


    Currently rated 3.9 by 9 people

    • Currently 3.888889/5 Stars.
    • 1
    • 2
    • 3
    • 4
    • 5


    Microsoft Surface Camp : day 1

    clock February 5, 2009 07:48 by author aequoy

    J'ai la chance d'être avec mon collègue Yoann (YoView pour les intimes) de participer à un séminaire Microsoft Surface.

    C'est le début de l'aventure Access it sur cette technologie.

    Nous ne sommes pas assujettis à un NDA quelconque donc nous vous donnerons des nouvelles, des samples assez rapidement.

    En attendant la table Access it :) (message subliminal pour nos boss :) , nous proposerons un résumé de ce séminaire où des choses très intéressantes se disent.

    Un premier constat que notre interlocuteur américain nous fait justement remarquer est qu'il faut revoir notre façon de penser.

    Le multitouch n'est absolument pas le fer de lance de cette technologie. Il faut penser "social computing", intégration de devices multiples, reconnaissance de formes.

    C'est vrai qu'il est tentant de faire tout et n'importe quoi avec surface pour le "fun" mais à 10 000 euros la table c'est cher payé.

    Mieux vaut un "bête" écran tactile. 

    Nous avons donc du boulot pour imaginer de "vrais" scénarios métiers intégrant l'ensemble des capacités de la table.

    Les scénarios multitouch étant simples à concevoir, je pense que dans un premier temps, il faut imaginer l'objet, le device qui va se "connecter" à la table.

    Alexandre Equoy

    Quelques photos pour la route :

     

    YoView devant la table

    Access it



    Currently rated 5.0 by 2 people

    • Currently 5/5 Stars.
    • 1
    • 2
    • 3
    • 4
    • 5


    Entity Framework : release des multiples providers de bases de données

    clock February 2, 2009 11:40 by author aequoy

    En ce début d'année, une liste d'annonce autour du Framework Entity vient nous rassurer quant à la pérénité de la technologie.

    Devart offre un Provider supportant l'accès à Oracle, MySQL et PostgreSQL.

    Sybase annonce le support du framework Entity sur iAnywhere.

    Npgsql2.0RTM fournit un support du framework Entity sur PostgreSQL.

    IBM annonce l'arrivée d'un provider Entity pour DB2.

    Alexandre Equoy

    Currently rated 4.5 by 2 people

    • Currently 4.5/5 Stars.
    • 1
    • 2
    • 3
    • 4
    • 5


    Dynamic Language Runtime

    clock December 10, 2008 13:27 by author aequoy

    Pour comprendre l’intégration des langages dynamiques dans .Net 4, il faut commencer par creuser sur l'élément moteur : le Dynamic Language runtime.

    La mission première du DLR est de permettre aux langages dynamiques (python, ruby, pHp, javascript…) de s’interfacer avec .Net.

    Un deuxième objectif est de permettre l’interopérabilité entre .Net et les interfaces COM IDispatch de manière simple et claire.

    Un troisième  objectif est de rendre les langages .Net plus « dynamiques » en supportant le DLR.

     

    Avec les types dynamiques, l’objet est maître de déterminer en runtime s’il supporte ou non le message ou l’opération qui lui est envoyé. Les objets dynamiques participent donc à un protocole de message afin de négocier de quelle manière un message abstrait est passé à un autre objet.

     

    Les notions importantes à retenir du DLR sont :

    ·         Modèle de hosting commun pour attaquer la DLR : l’objet ScriptRuntime est le point d’entrée vers les langages dynamiques. Il permet d’exécuter du code dans le contexte d’exécution (ScriptScope) au travers d’un moteur de script (ScriptEngine) qui va choisir le langage dans lequel le code va être exécuté.

    ·         Utilisation d’arbres sémantiques (Expression Trees) : là on attaque une notion très abstraite du domaine de la linguistique (dédicace à Jeannine Leguy ;)). Le but étant d’organiser les expressions sous forme arborescente afin que l’analyseur syntaxique puisse résoudre facilement ces expressions.

    ·         Intégration d’emplacement d'appel dynamique (DynamicSites, SiteBinders, Rules) permettant de lier un appel dynamique (message émis par C# par exemple) à une cible (objet Python par exemple).

    ·         Typage dynamique partagé au travers de l’interface IDynamicObject et de MetaObject. MetaObject permet l’interopérabilité entre les langages. IDynamicObject va permettre de rendre le comportement dynamique.

    ·         Un ensemble d’utilitaires (default binder, tuples, big integers, adapters pour permettre aux types statiques de participer au protocol IDynamicObject)

     Voilà un petit aperçu du DLR. Il va falloir pas mal de temps afin de creuser les impacts, les apports du type dynamic dans .Net.

    Alexandre Equoy

    Currently rated 4.5 by 2 people

    • Currently 4.5/5 Stars.
    • 1
    • 2
    • 3
    • 4
    • 5


    C# 4 : Dynamic object

    clock December 8, 2008 23:00 by author aequoy

    Pour celles et ceux qui n'ont pas suivi la PDC 2008, une des nouveautés montrées par la team C# dans C#4 concerne la possibilité d'exécuter des opérations, dont les détails ne seront connus qu'à l'exécution, en utilisant le mécanisme de délégation soutenu par le DLR (Dynamic Language Runtime).

    Ca paraît complexe dit comme cela :) (la phrase n'est pas de Marcel Proust) et bien en fait ça l'est:)

    Un petit exemple s'impose :

    dynamic d = GetDynamicObject();<br/>
    d.MethodeResolueAlExecution();
    //Marcel Proust Powered :)

    Comme vous pouvez voir, la variable locale "d" est du type dynamic, qui est un type compris par le compilateur. Ce code compile (donc on release;) )et il aurait compilé quel que soit le nom de la méthode. Le type "dynamic" est un type très spécial (^^).

    Pour le compilateur, la différence avec une variable normale est qu'il n'est pas possible d'émettre un IL (Intermediate Language ) appelant la méthode MethodeResolueAlExecution car il ne connait pas le type "d". Il émet donc un "emplacement d'appel dynamique" pour permettre de résoudre l'appel à l'exécution (via le DLR).

    Mais à quoi cela peut-il servir ????

    Cela va permettre d'utiliser C#, pour invoquer des méthodes écrites avec des langages dynamiques tels Python/Ruby où, chose plus intéressante, sur n'importe quel objet COM IDispatch, sans même un chargement interop (ou wrapper).

    Un exemple issu de codeplex mettant en évidence (c'est pas si évident que cela en fait :) ) le DLR :

    J'ai une méthode écrite en python (satan, sors de ce corps !!!)

    def welcome(name): return "Hello '" + name + "' from IronPython"

    La suite, un main C# qui va charger puis appeler la méthode :

    static void Main(string[] args) {
    Console.WriteLine("Loading helloworld.py...");
    ScriptRuntime py = Python.CreateRuntime();
    dynamic helloworld = py.UseFile("helloworld.py");
    Console.WriteLine("helloworld.py loaded!");
    for (int i = 0; i < 1000; i++) {
    Console.WriteLine(helloworld.welcome("Employee #{0}"), i)
    }
    Console.WriteLine(); }

    Pour la route, un webcast d'Anders Hejlsberg explicant la signification de l'introduction des types dynamiques dans C#4.

    Je vous invite à regarder Deep Dive: Dynamic Languages in Microsoft .NET c'est extrêmement intéressant !

    Alexandre Equoy

    Be the first to rate this post

    • Currently 0/5 Stars.
    • 1
    • 2
    • 3
    • 4
    • 5


    PLINQ dans VS 2010 .Net4

    clock November 9, 2008 02:17 by author aequoy
    Depuis hier je joue un peu :D avec VS 2010.
    Entre 2 plantages, j'ai pratiqué quelques exemples de requêtes parallèlisées via PLINQ.
    Dans ma machine virtuelle, il est pour l'instant très difficile de mesurer le gain (quelques millisecondes dans mes premiers tests).
    En lisant un peu le blog de la team parallel extensions, il serait possible de simuler dans la machine virtuelle le multi coeur grâce à hyperV.

    Donc wait and see, j'essaierai de mettre cela en place dans un futur proche avec l'aide d'un ingénieur IT.

    En attendant, c'est assez bluffant, quasi-indolore au niveau du code.
    Par contre les objets de requêtage PLINQ sont complètement différents de ceux de Linq (objectquery dans mon cas).
    Linq

    PLinq

    Alexandre Equoy

    Be the first to rate this post

    • Currently 0/5 Stars.
    • 1
    • 2
    • 3
    • 4
    • 5


    Calendrier

    <<  March 2010  >>
    MoTuWeThFrSaSu
    22232425262728
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234
    Afficher en pleine page

    Visiteurs