<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8122605037444373064</id><updated>2012-02-03T01:27:49.544+01:00</updated><category term='Analysis Services'/><category term='Integration Services'/><category term='Autres'/><category term='PowerShell'/><category term='Master Data Services'/><category term='OLAP'/><category term='SQL'/><category term='AMO'/><category term='Data Mining'/><category term='Conférences'/><category term='PowerPivot'/><category term='Bibliothèque'/><category term='T-SQL'/><category term='StreamInsight'/><category term='Articles'/><category term='Reporting Services'/><category term='MDX'/><category term='Annonces/Releases'/><title type='text'>François Jehl - Blog sur la BI Microsoft</title><subtitle type='html'>&lt;b&gt;SCOPE&lt;/b&gt;&lt;br&gt;
(&lt;br&gt;
   [Product].[Microsoft SQL Server].&lt;b&gt;Members&lt;/b&gt;,&lt;br&gt;
   [Subject].[Subject].&amp;amp;[BI]&lt;br&gt;
);&lt;br&gt;
...&lt;br&gt;
&lt;b&gt;END SCOPE;&lt;/b&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default?start-index=101&amp;max-results=100'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>136</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-8635337210495666779</id><published>2012-01-30T17:52:00.003+01:00</published><updated>2012-01-30T18:13:17.768+01:00</updated><title type='text'>[Techdays 2012] On vous attend dans une semaine!</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/-xhgdIf9y1mA/TybNlb9qOvI/AAAAAAAAAww/YHtTYOz3a50/s1600/FY12_techdays-kit-partenaire-inscription-250x250.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 250px; height: 250px;" src="http://4.bp.blogspot.com/-xhgdIf9y1mA/TybNlb9qOvI/AAAAAAAAAww/YHtTYOz3a50/s400/FY12_techdays-kit-partenaire-inscription-250x250.gif" alt="" id="BLOGGER_PHOTO_ID_5703472021156543218" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Les &lt;span style="font-weight: bold;"&gt;Techdays &lt;/span&gt;c'est la semaine prochaine, j'ose espérer que vous êtes d'ores et déjà tous inscrits! Dans le cas contraire, il n'est pas trop tard! En ce qui me concerne, j'anime cette année avec mon petit camarade &lt;span style="font-weight: bold;"&gt;Aurélien Koppel&lt;/span&gt; une session qui se targue de vous aider à choisir la bonne &lt;span style="font-weight: bold;"&gt;solution pour votre projet décisionnel&lt;/span&gt; en SQL Server 2012, entre de la &lt;span style="font-weight: bold;"&gt;BI Personnelle&lt;/span&gt;, une &lt;span style="font-weight: bold;"&gt;couche sémantique &lt;/span&gt;et un &lt;span style="font-weight: bold;"&gt;cube&lt;/span&gt;. C'est la &lt;span style="font-weight: bold;"&gt;DBI 202&lt;/span&gt;, sobrement intitulée &lt;span style="font-style: italic;"&gt;"Analysis Services 2012 : BI Personnelle, couche sémantique, cube, quelle(s) solution(s) pour un nouveau projet décisionnel?"&lt;/span&gt;.&lt;br /&gt;Ce sera &lt;span style="font-weight: bold;"&gt;mercredi 8 février, de 11h à 12h&lt;/span&gt;, et pour vous y inscrire c'est &lt;a href="http://www.microsoft.com/france/mstechdays/programmes/parcours.aspx#SessionID=59027b4c-de98-41a1-b7e4-5e6803b42811"&gt;ici&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;En espérant vous y voir, dans le cas contraire, je serai en vadrouille sur le salon dès &lt;span style="font-weight: bold;"&gt;mardi 8&lt;/span&gt;, entre le stand &lt;span style="font-weight: bold;"&gt;Infinite Square&lt;/span&gt;, celui de &lt;span style="font-weight: bold;"&gt;SQL Server&lt;/span&gt;, et celui du &lt;span style="font-weight: bold;"&gt;GUSS.&lt;/span&gt;&lt;br /&gt;A la semaine prochaine!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-8635337210495666779?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/8635337210495666779/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=8635337210495666779' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/8635337210495666779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/8635337210495666779'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2012/01/techdays-2012-on-vous-attend-dans-une.html' title='[Techdays 2012] On vous attend dans une semaine!'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-xhgdIf9y1mA/TybNlb9qOvI/AAAAAAAAAww/YHtTYOz3a50/s72-c/FY12_techdays-kit-partenaire-inscription-250x250.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-928016664275829229</id><published>2012-01-06T16:05:00.015+01:00</published><updated>2012-01-16T17:55:21.847+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reporting Services'/><title type='text'>[SSRS] Un tableau croisé dynamique (oui dynamique!) avec Reporting Services</title><content type='html'>Alors celle là c'est &lt;strong&gt;l'arlésienne&lt;/strong&gt; des questions Reporting Services.&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Peut-on utiliser RS pour générer un TCD?&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;La réponse que l'on entend souvent tourne autour de ce gloubiboulga de Consultant MSBI "&lt;em&gt;Oui mais c'est de la bidouille, RS n'est pas un client ad-hoc. Sinon vous connaissez Excel?&lt;/em&gt;"&lt;br /&gt;...&lt;br /&gt;Soyons honnête &lt;strong&gt;c'est assez vrai.&lt;/strong&gt; Mais ce n'est pas parce que &lt;span style="font-weight:bold;"&gt;tordre un outil&lt;/span&gt; n'est pas vraiment complètement prévu qu'il ne faut pas le faire. Bah oui sinon on n'aurait jamais eu de dimensions techniques dans des cubes AS, et puis la &lt;span style="font-weight:bold;"&gt;vie serait ennuyeuse&lt;/span&gt; il faut avouer. Alors pourquoi ce post, et pourquoi aujourd'hui? Parce qu'on vient de me demander ce que fait la fonction &lt;strong&gt;Fields&lt;/strong&gt;() - oui je dis bien la &lt;strong&gt;fonction&lt;/strong&gt; Fields() - dans SSRS. Et que l'utilité principale que je lui connais est précisément de faire ça.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;La fonction Fields()?&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;La fonction &lt;strong&gt;Fields(string)&lt;/strong&gt; permet de convertir un nom de champ passé en paramètre en l'expression &lt;strong&gt;Fields!&lt;nom_de_champ&gt;.Value&lt;/nom_de_champ&gt;&lt;/strong&gt; correspondante dans la portée de l'expression. Oui, en quelque sorte c'est de la &lt;strong&gt;Reflection&lt;/strong&gt;, Reporting Services Staïle.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;strong&gt;Oui mais quel rapport avec un TCD?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;J'y viens, j'y viens. Créons un rapport avec une matrice. Ce rapport s'appuie sur une requête bêbête en SQL, qui renvoie des trucs de vente.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://3.bp.blogspot.com/-aSzVA5AA054/TwcQG30ukFI/AAAAAAAAAwA/V6Zu6Xr3sA8/s1600/01.JPG"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 166px; DISPLAY: block; HEIGHT: 143px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5694537964083646546" border="0" alt="" src="http://3.bp.blogspot.com/-aSzVA5AA054/TwcQG30ukFI/AAAAAAAAAwA/V6Zu6Xr3sA8/s400/01.JPG" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;Créons deux &lt;strong&gt;datasets&lt;/strong&gt; bidons. Un s'appelle &lt;strong&gt;Mesures&lt;/strong&gt;, l'autre &lt;strong&gt;Axes&lt;/strong&gt;. Chacun comprend respectivement &lt;b&gt;les noms de champs&lt;/b&gt; du dataset Données du type considéré, à savoir que &lt;b&gt;Mesures &lt;/b&gt;contient 'PU', 'Qté' et 'CA' et &lt;b&gt;Axes &lt;/b&gt;le reste des noms. Appuyons maintentant trois &lt;b&gt;paramètres&lt;/b&gt;, deux &lt;b&gt;monovalués &lt;/b&gt;s'appuyant sur &lt;b&gt;Axes &lt;/b&gt;et s'appelant respectivement &lt;b&gt;Lignes &lt;/b&gt;et &lt;b&gt;Colonnes &lt;/b&gt;et un &lt;b&gt;multivalué &lt;/b&gt;s'appelant &lt;b&gt;Mesures &lt;/b&gt;et s'appuyant sur... bravo vous avez deviné, le dataset &lt;b&gt;Mesures&lt;/b&gt;. OK ça ne fait absolument rien pour le moment, mais il faut avouer, c'est beau.&lt;/div&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-aeIp6TFefvY/TwcRmgkETwI/AAAAAAAAAwM/lCPLHSeXb5E/s1600/02.JPG"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 500px; DISPLAY: block; CURSOR: hand" id="BLOGGER_PHOTO_ID_5694539607107194626" border="0" alt="" src="http://4.bp.blogspot.com/-aeIp6TFefvY/TwcRmgkETwI/AAAAAAAAAwM/lCPLHSeXb5E/s400/02.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;La partie &lt;strong&gt;drôle&lt;/strong&gt; arrive. Créons une matrice, avec un groupe de lignes, un groupe de colonnes, et trois cellules pour nos trois mesures. L'expression de groupement en ligne est donc basée sur Fields et vaut:&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;=Fields(Parameters!Lignes.Value).Value&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;L'expression en colonnes est du même esprit. Enfin, il ne reste plus qu'à conditionner la visibilité des cellules de mesures à une expression du genre:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;=InStr(Join(Parameters!Mesures.Value,","),"PU")=0&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Une fois que l'on fait tourner tout cela, on a donc quelque chose du style (et on ne se &lt;b&gt;MOQUE PAS&lt;/b&gt; des couleurs :)):&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-J0Vet02eMyI/TwcWqAy9NsI/AAAAAAAAAwY/p6yjQ4K3VUc/s1600/05.JPG"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 223px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5694545164857325250" border="0" alt="" src="http://3.bp.blogspot.com/-J0Vet02eMyI/TwcWqAy9NsI/AAAAAAAAAwY/p6yjQ4K3VUc/s400/05.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;On pourrait aller beaucoup plus loin, gérer un &lt;strong&gt;nombre d'axes dynamique&lt;/strong&gt; (bon avec une limite certes...) mais ce serait exagérer. Simplement c'est un usage marrant de la fonction &lt;strong&gt;Fields&lt;/strong&gt; je trouve! Vous en pensez quoi?&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A bientôt!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;PS: Pour les nostalgiques, le DataSet s'appuie sur Northwind, j'étais en mode hommage à SQL 2000 et j'en avais assez d'AW.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Edit: Charles-Henri Sauget a lu ce papier et, voyant que je ne me décidais pas à partager mon RDL, a &lt;a href="http://www.sauget-ch.fr/article-62-SSRS-Tableau-croise-dynamique.html"&gt;implémenté la solution que je décris sur son blog&lt;/a&gt;. Allez faire un tour ;)&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-928016664275829229?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/928016664275829229/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=928016664275829229' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/928016664275829229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/928016664275829229'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2012/01/ssrs-un-tableau-croise-dynamique-oui.html' title='[SSRS] Un tableau croisé dynamique (oui dynamique!) avec Reporting Services'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-aSzVA5AA054/TwcQG30ukFI/AAAAAAAAAwA/V6Zu6Xr3sA8/s72-c/01.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-5268813060187428765</id><published>2012-01-03T23:11:00.007+01:00</published><updated>2012-01-16T17:54:40.824+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services'/><title type='text'>[Journées SQL Server] Epilogue et précisions</title><content type='html'>&lt;div align="justify"&gt;J'ai reçu pas mal de questions relatives à ma démo bonus de fin de session (que vous pouvez voir sur le &lt;a href="http://fjehl.blogspot.com/2011/12/journees-sql-server-le-webcast-est-en.html"&gt;webcast&lt;/a&gt;). Pour rappel il s'agissait de montrer qu'il était possible &lt;strong&gt;d'injecter du MDX&lt;/strong&gt; dans un modèle BISM Tabular, et de voir qu'il était interprété par Excel. &lt;strong&gt;Alors comment est-ce possible?&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;Déjà ce à quoi vous avez assisté est la définition même de BISM (le côté tolkienien du "One model to rule them all"): les modèles Tabular et Multidimensional sont basées sur des structures objet (au sens &lt;strong&gt;AMO&lt;/strong&gt; et donc XMLA du terme) &lt;strong&gt;identiques&lt;/strong&gt;. Comprenez qu'un modèle tabulaire est &lt;strong&gt;défini en sous jacent&lt;/strong&gt; comme possédant une DataSourceView, un cube qui s'appelle Sandbox (comme dans PowerPivot), des Dimensions, des MeasureGroups... et donc des MdxScripts (oui car je vous rappelle que SSAS &lt;a href="http://technet.microsoft.com/en-us/library/microsoft.analysisservices.mdxscript.defaultscript.aspx"&gt;gère potentiellement plusieurs MdxScripts &lt;/a&gt;que l'on peut modifier mais c'est une autre histoire).&lt;br /&gt;&lt;br /&gt;Si vous vous connectez en &lt;strong&gt;AMO&lt;/strong&gt; sur ce modèle (ou regardez la définition XMLA envoyée au déploiement du modèle tabular) vous constaterez que cet objet MdxScript possède des calculs de deux types, en &lt;strong&gt;MDX et en DAX.&lt;/strong&gt; Entres autres il définit une &lt;em&gt;DefaultMeasure&lt;/em&gt; bidon égale à 1 (probablement pour des raisons de performances). Un client OLAP classique comme Excel est parfaitement capable de lire les deux types mesures, ce qui signifie que le script expose bien les métadonnées de ces deux types. &lt;em&gt;&lt;strong&gt;La démonstration que j'ai faite consistait simplement à rajouter une mesure en MDX (et à scoper dessus) pour prouver que ça marche sous un client OLAP.&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Mais attention! &lt;/strong&gt;La mesure que j'ai créée aurait été invisible en DAX. Je ne l'ai montré qu'à deux personnes qui m'ont posé la question et se reconnaitront mais ma mesure était inconnue du parser DAX. En d'autres termes et à date le formula engine DAX est capable uniquement de &lt;strong&gt;voir les calculs exprimés en DAX&lt;/strong&gt;. De plus ce cas n'est pas supporté. Officiellement les modèles tabulaires ne &lt;strong&gt;gèrent pas&lt;/strong&gt; les calculs MDX, et l'édition du MdxScript est &lt;strong&gt;proscrite&lt;/strong&gt;. Vous voilà prévenus!&lt;br /&gt;Au passage cela répond à une question posée en fin de session: non, les requêtes MDX envoyées à un modèle Vertipaq &lt;strong&gt;ne sont pas&lt;/strong&gt; traduites en DAX.&lt;br /&gt;&lt;br /&gt;Voilà, à bientôt!&lt;br /&gt;&lt;br /&gt;PS: pour finir un rappel des langages supportés sur quel modèle:&lt;br /&gt;&lt;strong&gt;Tabular&lt;/strong&gt; supporte &lt;strong&gt;DAX&lt;/strong&gt; et &lt;strong&gt;MDX&lt;/strong&gt; mais pas avec &lt;strong&gt;DirectQuery&lt;/strong&gt; pour ce dernier. &lt;strong&gt;Multidimensional&lt;/strong&gt; supporte uniquement &lt;strong&gt;MDX.&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-5268813060187428765?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/5268813060187428765/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=5268813060187428765' title='4 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/5268813060187428765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/5268813060187428765'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2012/01/journees-sql-server-epilogue-et.html' title='[Journées SQL Server] Epilogue et précisions'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-6394327834910889343</id><published>2011-12-22T15:06:00.008+01:00</published><updated>2011-12-28T11:04:33.096+01:00</updated><title type='text'>Journées SQL Server: les webcasts sont en ligne!</title><content type='html'>Les webcasts des Journées SQL Server, sont en ligne! Vous pouvez donc vous (re)délecter de notre session avec &lt;b&gt;Aurélien Koppel&lt;/b&gt;, dont le but est de vous &lt;b&gt;aider à choisir entre BISM Tabular et Multidimensional&lt;/b&gt; pour un nouveau projet SSAS.&lt;br /&gt;Vous avez le choix entre directement la regarder ci-dessous, ou aller sur le &lt;a href="http://www.microsoft.com/fr-fr/showcase/details.aspx?uuid=271bebe9-ab13-48e7-b11d-3baf16b743c0"&gt;site Showcase d'hébergement de Microsoft&lt;/a&gt;.                         &lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin:auto;text-align: center;width: 640px; height: 360px; "&gt;&lt;object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="640" height="360"&gt;                                        &lt;param name="source" value="http://www.microsoft.com/global/fr-fr/showcase/RichMedia/player-fr.xap"&gt;                                        &lt;param name="enableHtmlAccess" value="true"&gt;                                            &lt;param name="background" value="#FF000000"&gt;                                        &lt;param name="allowHtmlPopupwindow" value="true"&gt;                                        &lt;param name="minRuntimeVersion" value="4.0.50401.0"&gt;                                        &lt;param name="autoUpgrade" value="true"&gt;                                        &lt;param name="initParams" value="Culture=fr-FR,Uuid=271bebe9-ab13-48e7-b11d-3baf16b743c0,Autoplay=false,MarketingOverlayText=Visiter le site Web de cette vidéo,ShowMarketingOverlay=true,MiscControls=FullScreen;Detached,ShowMenu=True,Tabs=Embed;Email;Share;Info,VideoUrl=http://www.microsoft.com/fr-fr/showcase/details.aspx?uuid=271bebe9-ab13-48e7-b11d-3baf16b743c0,Mode=Player"&gt;                                      &lt;iframe src="http://www.microsoft.com/showcase/video.aspx?uuid=271bebe9-ab13-48e7-b11d-3baf16b743c0&amp;amp;locale=fr-FR" border="0" width="100%" height="100%"&gt;                                        &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/object&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;                                        &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;script type="text/javascript"&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;                                            document.write("&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;script type='text/javascript' src='" + (window.location.protocol) + "//c.microsoft.com/ms.js'" + "&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;\/script&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;");&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/script&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;                                        &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;/div&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&lt;/iframe&gt;&lt;/object&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;N'hésitez pas à voter pour la vidéo si elle vous plait (bon et si elle ne vous plaît pas aussi, la démocratie est ainsi faite). Pour le reste, si vous avez envie de regarder un peu de BI par ce temps pluvieux - certes c'est Noël mais sachez que c'est &lt;b&gt;un loisir tout ce qu'il y a de plus normal en période de fêtes&lt;/b&gt; - n'hésitez pas à fureter sur le site Showcase (le lien juste au dessus de la vidéo). &lt;/div&gt;&lt;div style="text-align: left;"&gt;Vous y trouverez un tas de &lt;b&gt;sessions intéressantes et agréables à regarder&lt;/b&gt;, particulièrement celle de&lt;b&gt; Jean Pierre Riehl&lt;/b&gt; et &lt;b&gt;Florian Eiden&lt;/b&gt;  sur la modélisation dimensionnelle, et celles de &lt;b&gt;Thomas Ricquebourg&lt;/b&gt; que j'ai trouvé bluffant sur DQS et SSIS, ou il était en featuring respectivement avec&lt;b&gt; Sébastien Madar&lt;/b&gt; et JP. &lt;/div&gt;&lt;div style="text-align: left;"&gt;Regardez leurs sessions, notez (bien!), commentez, croyez moi ça fait plaisir :)&lt;/div&gt;Merci encore aux présents, et à très bientôt!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-6394327834910889343?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/6394327834910889343/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=6394327834910889343' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/6394327834910889343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/6394327834910889343'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2011/12/journees-sql-server-le-webcast-est-en.html' title='Journées SQL Server: les webcasts sont en ligne!'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-3324200975368842494</id><published>2011-12-16T13:42:00.007+01:00</published><updated>2011-12-22T16:04:28.086+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annonces/Releases'/><title type='text'>Journées SQL Server: Merci à tous</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-4IXw4hLjZWA/Tus-_BK0bRI/AAAAAAAAAvM/p-uopFg4kVE/s1600/JSQL.png" style="text-align: left; " onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="text-align: justify;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; cursor: pointer; width: 400px; height: 148px; " src="http://2.bp.blogspot.com/-4IXw4hLjZWA/Tus-_BK0bRI/AAAAAAAAAvM/p-uopFg4kVE/s400/JSQL.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5686708206851878162" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;300 personnes! &lt;/b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;Je ne dirais pas que le succès était inespéré, car l'organisation a été rapidement assaillie de demandes d'inscriptions dès l'ouverture, mais tout de même une &lt;/span&gt;&lt;b&gt;très jolie surprise! &lt;/b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;Nous voilà donc en présence d'une belle communauté sur SQL Server qui ne demande qu'à être développée.&lt;/span&gt;&lt;/div&gt;&lt;/b&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Merci au &lt;b&gt;&lt;a href="http://www.guss.fr/"&gt;GUSS&lt;/a&gt;&lt;/b&gt;, particulièrement à &lt;b&gt;Arian Papillon&lt;/b&gt;, &lt;b&gt;&lt;a href="http://blogs.codes-sources.com/christian/"&gt;Christian "Cricri" Robert&lt;/a&gt;&lt;/b&gt;, &lt;b&gt;Sébastien Madar et &lt;a href="http://blog.djeepy1.net/"&gt;Jean-Pierre Riehl&lt;/a&gt; &lt;/b&gt;pour une organisation idéale, très agréable pour les speakers que nous sommes et j'imagine aussi pour les visiteurs. De même merci à &lt;b&gt;Microsoft&lt;/b&gt;, et tout particulièrement à l'équipe SQL Server (&lt;b&gt;Damien Cudel&lt;/b&gt;, &lt;b&gt;Jean-Marc Monfort&lt;/b&gt; et &lt;b&gt;Hugues Valentin&lt;/b&gt;) pour leur disponibilité tout au long de l'évènement pour répondre à nos question, à vos questions sur le produit.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Et puis bien sûr merci à vous: en ce qui me concerne l'accueil pendant et après notre session avec mon compère &lt;b&gt;Aurélien Koppel &lt;/b&gt;a été on ne peut plus chaleureux, et a permis de mettre des visages sur des noms déjà connus, et qui donnent envie d'être encore plus connus (la micro-communauté &lt;b&gt;Microsoft BI de Développez.com &lt;/b&gt;était venue en force!).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Pour la suite, les webcasts seront bientôt en ligne, stay tuned. Et pour le reste... rendez vous aux &lt;a href="http://www.microsoft.com/france/mstechdays/"&gt;&lt;b&gt;TechDays les 6-7 et 9 février 2012&lt;/b&gt;!&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://4.bp.blogspot.com/-FKLbtLSQHWU/Tus_zYM5EkI/AAAAAAAAAvk/8VtOrG_ZPIc/s400/logo_mstechdays_2012.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5686709106387784258" style="text-align: justify;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; cursor: pointer; width: 247px; height: 92px; " /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A bientôt!&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-3324200975368842494?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/3324200975368842494/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=3324200975368842494' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3324200975368842494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3324200975368842494'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2011/12/journees-sql-server-merci-tous.html' title='Journées SQL Server: Merci à tous'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-4IXw4hLjZWA/Tus-_BK0bRI/AAAAAAAAAvM/p-uopFg4kVE/s72-c/JSQL.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-2705939038821091839</id><published>2011-12-02T13:46:00.001+01:00</published><updated>2011-12-02T14:08:33.053+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reporting Services'/><title type='text'>[SSRS] Dépasser 65536 lignes dans un export Excel</title><content type='html'>&lt;div style="text-align: justify;"&gt;Cette astuce est un &lt;b&gt;petit peu connue&lt;/b&gt; mais entre les forums et les clients, cela fait trois fois en quelques jours que l'on me pose cette question: &lt;i&gt;comment faire pour exporter des rapports SSRS de plus de 65536 lignes en XLS&lt;/i&gt; sans avoir pour résultat ça:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;a href="http://3.bp.blogspot.com/-b7xS0rMXN08/TtjI9PGgRgI/AAAAAAAAAus/j9zvN9UMWjE/s1600/2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="99" src="http://3.bp.blogspot.com/-b7xS0rMXN08/TtjI9PGgRgI/AAAAAAAAAus/j9zvN9UMWjE/s640/2.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Donc je me permets de la poster, si cela peut rendre service.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Alors l'idée est d'exploiter une &lt;b&gt;fonctionnalité de l'exporteur Excel&lt;/b&gt;, qui crée une nouvelle sheet lorsque l'on insère un &lt;b&gt;PageBreak explicite. &lt;/b&gt;Pour cela j'ai d'abord créé une table dans un rapport SSRS qui s'appuie sur une requête de test qui me renvoie 100 000 lignes sur... 2041 pages A4.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-lW5McOu_RuQ/TtjI9RyBiAI/AAAAAAAAAuw/bwCVgDj7KTw/s1600/1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="140" src="http://2.bp.blogspot.com/-lW5McOu_RuQ/TtjI9RyBiAI/AAAAAAAAAuw/bwCVgDj7KTw/s200/1.JPG" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Evidemment, l'export de celle-ci en Excel&amp;nbsp;&lt;b&gt;rate lamentablement&lt;/b&gt;&amp;nbsp;(cf plus haut). Alors la solution pour pallier à cela est donc de créer des PageBreak toutes les 65536 lignes: on va donc créer un groupe dans la table, qui groupe les données sur le résultat de &lt;b&gt;la division entière du numéro de la ligne par 65536. &lt;/b&gt;Si vos &lt;b&gt;souvenirs de CM1&amp;nbsp;&lt;/b&gt;sont bons, alors vous ne serez pas étonné que 1 DIV 65535 = 0, 65536 DIV 65535 = 1...etc.&amp;nbsp;L'expression équivalente en RS se traduit par&amp;nbsp;&lt;b&gt;Int(RowNumber(Nothing) / 65536) &lt;/b&gt;comme visible ci-dessous:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-kByHsAFfjc4/TtjKyhWRyoI/AAAAAAAAAvA/1lAulp8CnhU/s1600/8.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="151" src="http://4.bp.blogspot.com/-kByHsAFfjc4/TtjKyhWRyoI/AAAAAAAAAvA/1lAulp8CnhU/s400/8.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Il ne reste plus qu'à dire à SSRS d'insérer un PageBreak entre chaque instance du groupe (i.e. entre chaque valeur distincte de&amp;nbsp;&lt;b&gt;Int(RowNumber(Nothing) / 65536)&lt;/b&gt;). Cela s'active dans l'onglet PageBreaks de l'éditeur de groupe. Une fois ceci fait, l'export Excel se déroule sans problèmes et me sort un Excel de deux sheets.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-gqIsVWpRL4g/TtjI79U0HaI/AAAAAAAAAuc/AiQN6gycGZw/s1600/4.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="156" src="http://3.bp.blogspot.com/-gqIsVWpRL4g/TtjI79U0HaI/AAAAAAAAAuc/AiQN6gycGZw/s320/4.JPG" width="320" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/-sKbLsNX0SJg/TtjI7dXQSoI/AAAAAAAAAuU/XPd2zgjbPRI/s1600/5.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="126" src="http://3.bp.blogspot.com/-sKbLsNX0SJg/TtjI7dXQSoI/AAAAAAAAAuU/XPd2zgjbPRI/s200/5.JPG" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Mais &lt;/b&gt;car il y a un mais, ce PageBreak disgracieux vient &lt;b&gt;s'ajouter à tous les exports, y compris à ma visualiseuse HTML.&lt;/b&gt; J'ai donc un saut de page inutile page 1308 de mon rapport de 2000 pages. &amp;nbsp;&lt;b&gt;Pointillisme peut-être&lt;/b&gt; mais cela peut heureusement être évité, grâce à la &lt;b&gt;fantastique variable globale RenderFormat introduite depuis SQL Server 2008 R2. &lt;/b&gt;Cette globale permet de récupérer l'exporteur utilisé dans une expression, et donc de conditionnellement changer un élément en fonction de l'extension de rendu. Dans mon cas, je vais désactiver le PageBreak, sauf si je suis en Excel. La valeur de &lt;b&gt;PageBreak.Disabled&lt;/b&gt;&amp;nbsp;sur le groupe est donc dynamique et vaut &lt;b&gt;(Globals!RenderFormat.Name &amp;lt;&amp;gt; "EXCEL").&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-O7B0913fzuM/TtjI6u3OaGI/AAAAAAAAAuI/Oyg8eJd2Ul4/s1600/6.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="73" src="http://3.bp.blogspot.com/-O7B0913fzuM/TtjI6u3OaGI/AAAAAAAAAuI/Oyg8eJd2Ul4/s640/6.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Et c'est tout de suite plus joli, les autres extensions ne sont plus affectées par ce hack.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-NVN87bbEbHw/TtjI6yvOvnI/AAAAAAAAAuM/pbeqDVwRtZQ/s1600/7.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-NVN87bbEbHw/TtjI6yvOvnI/AAAAAAAAAuM/pbeqDVwRtZQ/s200/7.JPG" width="150" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Tout cela deviendra inutile (ou presque) avec &lt;b&gt;SQL Server 2012&lt;/b&gt; qui dès l'année prochaine permettra &lt;b&gt;d'utiliser le XLSX pour les exports&lt;/b&gt;. Bon ça servira lorsqu'on voudra dépasser les 1.000.000 de lignes :)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A bientôt!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-2705939038821091839?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/2705939038821091839/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=2705939038821091839' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/2705939038821091839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/2705939038821091839'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2011/12/ssrs-depasser-65536-lignes-dans-un.html' title='[SSRS] Dépasser 65536 lignes dans un export Excel'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-b7xS0rMXN08/TtjI9PGgRgI/AAAAAAAAAus/j9zvN9UMWjE/s72-c/2.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-3725226111658300951</id><published>2011-12-01T13:22:00.001+01:00</published><updated>2011-12-01T15:31:00.765+01:00</updated><title type='text'>4 bonnes raisons de venir découvrir Analysis Services 2012 aux journées SQL Server</title><content type='html'>Cela arrive très vite maintenant, notre session aux &lt;b&gt;&lt;a href="http://fjehl.blogspot.com/2011/10/les-journees-sql-server-edition-2011.html"&gt;Journées SQL Server&lt;/a&gt;&lt;/b&gt; avec &lt;b&gt;Aurélien Koppel &lt;/b&gt;est déjà dans moins de deux semaines. Alors un petit &lt;b&gt;teaser &lt;/b&gt;ne faisant pas de mal, j'ai voulu vous donner quelques excellentes raisons de venir nous voir, si tant est que vous en ayez besoin.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-R556TWuLQ6o/Ttd5AKnL8YI/AAAAAAAAAt4/iFgfgufRVsc/s1600/bism.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://4.bp.blogspot.com/-R556TWuLQ6o/Ttd5AKnL8YI/AAAAAAAAAt4/iFgfgufRVsc/s320/bism.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1 - Le futur d'Analysis Services se dessine maintenant&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Ce &lt;a href="http://fjehl.blogspot.com/2010/11/ssas-polemiques-sur-ssas-powerpivot-et.html"&gt;papier &lt;/a&gt;date de maintenant un an et je me rappelle encore &lt;b&gt;de l'état d'incompréhension&lt;/b&gt;&amp;nbsp;dans lequel la communication de Microsoft avait mis la communauté de développeurs Analysis Services: nous pensions tous que ce sur quoi nous avions&amp;nbsp;bâti notre carrière (pour certains cela fait presque 15 ans), à savoir la promotion de &lt;b&gt;l'OLAP&lt;/b&gt;, du &lt;b&gt;MDX&lt;/b&gt;, bref l'époque d'Analysis Services leader du marché allait être reniée par un vague portage serveur de PowerPivot sous le nom délicat de BISM.&lt;br /&gt;Soyons clair&lt;b&gt; il n'en est rien et vous verrez pourquoi.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;2 - BISM Tabular va permettre de développer des projets BI beaucoup plus rapidement&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Le but de Microsoft en'a jamais changé:&amp;nbsp;&lt;b&gt;occuper&amp;nbsp;tous les segments&amp;nbsp;&lt;/b&gt;du marché des bases d'analyse. Avec Analysis Services, il est leader, avec PowerPivot il concurrence QlikView en frontal. Reste que les&amp;nbsp;&lt;b&gt;Report Models&lt;/b&gt;&amp;nbsp;ayant été un échec et&amp;nbsp;&lt;b&gt;Analysis Services&lt;/b&gt;&amp;nbsp;s'avérant trop complexe pour les petits projets,&amp;nbsp;&lt;b&gt;les couches sémantiques&lt;/b&gt; type B####### O###### - pour ne pas les citer - occupent encore&amp;nbsp;&lt;b&gt;une place très importante en entreprise. &lt;/b&gt;&lt;u&gt;Et c'est précisément là qu'il y a encore des parts à prendre.&lt;/u&gt;&amp;nbsp;Chez ce type de clients/prospects le discours officiel époque SQL Server 2000 "&lt;i&gt;chez Microsoft, la couche sémantique c'est le cube&lt;/i&gt;" ne passe plus: les cubes sont vus comme trop complexes pour une bonne partie des projets, ce qui signifie des&lt;b&gt; experts rares&lt;/b&gt;, une courbe &lt;b&gt;d'apprentissage longue&lt;/b&gt; et au final un&amp;nbsp;&lt;b&gt;coût&amp;nbsp;&lt;/b&gt;qui effraie.&lt;br /&gt;BISM Tabular est simplement&amp;nbsp;&lt;b&gt;un ajout à Analysis Services d'un mode de conception plus simple&lt;/b&gt;&amp;nbsp;pour&amp;nbsp;élargir la base potentielle de clients, &lt;b&gt;et nous vous montrerons à quel point cela est simple.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;3 - BISM Multidimensional continue plus que jamais&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;T.K. Anand &lt;/b&gt;l'affirme, les développeurs AS connus (Teo Lachev, Chris Webb...) le &lt;b&gt;confirment&lt;/b&gt;: pour les projets BI &lt;i&gt;enterprise-wide&lt;/i&gt;, critiques, complexes d'un point de vue métier: bref l'essentiel de nos projets existants: le choix est et restera en 2012 &lt;b&gt;Analysis Services UDM,&lt;/b&gt; renommé &lt;b&gt;Multidimensional&lt;/b&gt;. Son script MDX ses relations en M2M, Parent Child, le support des Custom Rollup, Unary, sa gestion des grosses volumétries... bref toutes ces fonctionnalités exclusives sont encore des critères de choix évidents en faveur de l'OLAP traditionnel pour ces typologies de projets non encore couverts par Tabular.&lt;br /&gt;&lt;b&gt;Nous vous les récapitulerons.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;4 - Demain un modèle unique?&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Les modèles &lt;b&gt;Tabular &lt;/b&gt;supportent d'être requêtés en MDX, les modèles &lt;b&gt;Multidimensional &lt;/b&gt;ne gèrent pas encore le DAX - problématique pour &lt;b&gt;PowerView &lt;/b&gt;- &amp;nbsp;mais cela devrait venir &lt;b&gt;rapidement&lt;/b&gt;. Le script MDX est une exclusivité Multidimensional, comme le stockage en mémoire est une exclusivité Tabular... Il est évident que toutes ces features vont fusionner à l'avenir dans un modèle unique, et c'est d'ailleurs le souhait de l'équipe produit.&lt;br /&gt;Nous verrons ensemble quelles fonctionnalités peuvent être espérées à brève, moyenne et longue échéance, avec toujours une idée en tête: &lt;b&gt;vous aider à faire le bon choix pour tous vos nouveaux projets.&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Voilà j'espère vous avoir donné -encore plus - envie: les journées se tiennent au siège de Microsoft, à Issy Les Moulineaux, les 12 et 13 décembre et pour vous inscrire, c'est &lt;a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032496260&amp;amp;Culture=fr-FR"&gt;ici&lt;/a&gt;!&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-vC7DPWKbmSQ/Ttd5W5CUMGI/AAAAAAAAAuA/exIu7tMN-X4/s1600/images.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-vC7DPWKbmSQ/Ttd5W5CUMGI/AAAAAAAAAuA/exIu7tMN-X4/s1600/images.jpeg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;A très bientôt!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-3725226111658300951?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/3725226111658300951/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=3725226111658300951' title='5 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3725226111658300951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3725226111658300951'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2011/12/4-bonnes-raisons-de-venir-decouvrir.html' title='4 bonnes raisons de venir découvrir Analysis Services 2012 aux journées SQL Server'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-R556TWuLQ6o/Ttd5AKnL8YI/AAAAAAAAAt4/iFgfgufRVsc/s72-c/bism.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-1704136861504601171</id><published>2011-10-24T13:12:00.000+02:00</published><updated>2011-10-24T13:14:58.344+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annonces/Releases'/><title type='text'>Les Journées SQL Server (édition 2011)</title><content type='html'>&lt;div class="post-649 post type-post status-publish format-standard hentry category-sql-server tag-journees-sql-server tag-journeessqlserver clear" id="post-649"&gt;&lt;div style="text-align: center;"&gt;&lt;img style="border-width: 0pt; background-image: none; padding-left: 0pt; padding-right: 0pt; display: inline; padding-top: 0pt;" title="clip_image002" alt="clip_image002" src="http://djeepy1.files.wordpress.com/2011/10/clip_image002.png?w=435&amp;amp;h=161" width="435" border="0" height="161" /&gt;&lt;/div&gt;&lt;div class="entry"&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;p style="text-align: center;"&gt;&lt;b&gt;Rejoignez la communauté des professionnels SQL Server !&lt;/b&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;p style="text-align: justify;"&gt;&lt;img style="border: 0pt none ; margin: 0pt 0pt 0pt 10px; background-image: none; padding-left: 0pt; padding-right: 0pt; display: inline; float: right; padding-top: 0pt;" title="clip_image006" alt="clip_image006" src="http://djeepy1.files.wordpress.com/2011/10/clip_image0061.jpg?w=41&amp;amp;h=64" width="41" align="right" border="0" height="64" /&gt;Les experts francophones de SQL Server, les &lt;b&gt;MVP&lt;/b&gt; (Most Valuable Professionnal) et les &lt;b&gt;MCM&lt;/b&gt; (Microsoft Certified Master) se réunissent à Paris pour 2 jours de conférences entièrement gratuits.&lt;/p&gt;&lt;p style="text-align: justify;"&gt;Vous pourrez découvrir les nouvelles fonctionnalités de &lt;b&gt;SQL Server 2012&lt;/b&gt; mais aussi assister à des sessions sur des sujets pointus au travers d’un parcours consacré au &lt;b&gt;moteur&lt;/b&gt; de base de données, d’un autre consacré à la &lt;b&gt;Business Intelligence&lt;/b&gt; et enfin un parcours dédié aux &lt;b&gt;appliances SQL Server&lt;/b&gt;.&lt;/p&gt;&lt;p style="text-align: justify;"&gt;Au total, ce ne sont pas moins de &lt;b&gt;23 sessions&lt;/b&gt; qui vous attendent sur &lt;b&gt;&lt;i&gt;AlwaysOn, Power View, SSIS Server, les index colonnes, SQL Server Data Tools, SQL Azure, BISM, les performances, la sécurité&lt;/i&gt;&lt;/b&gt;, etc..&lt;/p&gt;&lt;p align="center"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;&lt;a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032496260&amp;amp;Culture=fr-FR" target="_blank"&gt;Inscrivez-vous dès maintenant&lt;/a&gt;&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt; Cet événement est organisé par la &lt;b&gt;communauté SQL&lt;/b&gt; : le groupe des utilisateurs francophones (&lt;b&gt;GUSS&lt;/b&gt;) et les &lt;b&gt;MVP&lt;/b&gt;, avec l’appui et la participation de &lt;b&gt;Microsoft&lt;/b&gt; et du sponsor Platinum : &lt;b&gt;HP&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://www.guss.fr/" target="_blank"&gt;&lt;img style="border: 0pt none ; margin: 0pt 10px 0pt 0pt; background-image: none; padding-left: 0pt; padding-right: 0pt; display: inline; padding-top: 0pt;" title="image" alt="image" src="http://djeepy1.files.wordpress.com/2011/10/image13.png?w=121&amp;amp;h=55" width="121" border="0" height="55" /&gt;&lt;/a&gt;  &lt;a href="http://djeepy1.files.wordpress.com/2011/10/clip_image008.jpg"&gt;&lt;img style="border-width: 0pt; margin: 0pt 10px 0pt 0pt; background-image: none; padding-left: 0pt; padding-right: 0pt; display: inline; padding-top: 0pt;" title="clip_image008" alt="clip_image008" src="http://djeepy1.files.wordpress.com/2011/10/clip_image008_thumb.jpg?w=169&amp;amp;h=70" width="169" border="0" height="70" /&gt;&lt;/a&gt; &lt;a href="http://djeepy1.files.wordpress.com/2011/10/clip_image010.jpg"&gt;&lt;img style="border-width: 0pt; background-image: none; padding-left: 0pt; padding-right: 0pt; display: inline; padding-top: 0pt;" title="clip_image010" alt="clip_image010" src="http://djeepy1.files.wordpress.com/2011/10/clip_image010_thumb.jpg?w=64&amp;amp;h=64" width="64" border="0" height="64" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Tout au long des journées, vous pourrez également poser toutes vos questions à &lt;i&gt;l’espace rencontre&lt;/i&gt; à &lt;b&gt;nos différents sponsors &lt;/b&gt;éditeurs, presse ou SSII. Les speakers sont également à votre disposition.&lt;/p&gt;&lt;p align="center"&gt;Cet événement aura lieu les &lt;/p&gt;&lt;p align="center"&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;12 et 13 décembre       &lt;br /&gt;&lt;/span&gt;&lt;/b&gt;au    &lt;br /&gt;&lt;b&gt;&lt;span style="font-size:100%;"&gt;Centre de conférences Microsoft&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p align="center"&gt;41 quai du Président Roosevelt   &lt;br /&gt;Issy-les-Moulineaux&lt;/p&gt;&lt;p&gt;&lt;a href="http://sqlpass.org/" target="_blank"&gt;&lt;img style="border: 0pt none ; background-image: none; padding-left: 0pt; padding-right: 0pt; display: inline; float: left; padding-top: 0pt;" title="clip_image012" alt="clip_image012" src="http://djeepy1.files.wordpress.com/2011/10/clip_image0121.jpg?w=79&amp;amp;h=109" width="79" align="left" border="0" height="109" hspace="12" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;i&gt;    &lt;br /&gt;GUSS est affilié au PASS (Professional Association for SQL Server), leader des communautés SQL Server à travers le monde. Nous les remercions pour leur soutien dans l’organisation de cet événement.&lt;/i&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-1704136861504601171?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/1704136861504601171/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=1704136861504601171' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/1704136861504601171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/1704136861504601171'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2011/10/les-journees-sql-server-edition-2011.html' title='Les Journées SQL Server (édition 2011)'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-808386944536268883</id><published>2011-10-17T15:56:00.003+02:00</published><updated>2011-12-02T14:10:08.691+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reporting Services'/><title type='text'>[SSRS] Utiliser la fonction Lookup pour traduire les parties statiques des rapports</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;b&gt;Analysis Services&lt;/b&gt; offre des possibilités de traduction intéressantes, qui permettent évidemment de traduire les rapports qui s'appuient dessus. Grâce à la communication du LCID de l'interface cliente, la structure et le contenu du cube sont alors exposées dans la langue adéquate. Mais quiconque à déjà réalisé des rapports sait que &lt;b&gt;ceux-ci sont aussi composés de parties "statiques", non dépendantes du cube,&lt;/b&gt; qui par conséquent ne tirent aucun bénéfice des traductions OLAP. Les titres des rapports, entêtes de tableaux, descriptions, sont alors autant de libellés&lt;b&gt; qu'il va falloir gérer&lt;/b&gt; dans un contexte internationalisé.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5664465196696197778" src="http://3.bp.blogspot.com/-Sdln0MU6sCU/Tpw5FbOj2pI/AAAAAAAAAtY/7sT9RNeINa8/s400/pieter_bruegel.jpg" style="cursor: pointer; display: block; height: 300px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 398px;" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Une solution intéressante à ce problème est apportée par la&lt;b&gt; fonction Lookup de SQL Server 2008 R2&lt;/b&gt;, celle ci permettant de récupérer dans un DataSet l'enregistrement correspondant à une valeur de clé. En effet, stocker les libellés dans une base est une chose, les récupérer en utilisant les (limitatives) fonctions d'agrégations de SSRS en est une autre.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1) &lt;b&gt;1ère étape&lt;/b&gt;, on stocke dans une table au format Clé/Valeur/Langue les différents libellés du rapport. Prenons comme exemple Produit:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Rapport;Libelle;Traduction;Langue;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Ventes;Product;Produit;FR-FR;&lt;/div&gt;&lt;div&gt;Ventes;Product;Product;EN-EN;&lt;/div&gt;&lt;div&gt;...&lt;/div&gt;&lt;div&gt;2) &lt;b&gt;2ème étape&lt;/b&gt; on crée un DataSet, par exemple nommé "Dictionnaire", qui récupère uniquement et dynamiquement les libellés correspondant au rapport et à la langue en cours:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;SELECT Libelle, Traduction&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;FROM dbo.Traductions&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;WHERE Rapport=@Rapport AND Langue=@Langue&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;@Rapport est mappé à la valeur globale &lt;b&gt;Globals!ReportName&lt;/b&gt;, @Langue à &lt;b&gt;User!Language&lt;/b&gt;, deux valeurs exposées par défaut par Reporting Services qui donnent respectivement le nom du rapport en cours et la culture de l'utilisateur connecté.&lt;/div&gt;&lt;div&gt;3) &lt;b&gt;3ème étape&lt;/b&gt; dans chaque cellule ayant besoin d'être traduite, on va chercher le libellé correspondant, avec une expression Lookup: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;=Lookup("Dictionnaire";Fields!Libelle.Value; "Product";Fields!Traduction.Value)&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Magie de la technique, les libellés sont traduits automatiquement, et surtout on peut rajouter des langues à volonté sans retoucher aux rapports!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En espérant vous avoir donné des idées.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;PS1: pour ceux que cela intéresse on aurait pu effectivement imaginer stocker dans la table le nom du contrôle SSRS plutôt qu'une clé gérée par le développeur. Le problème est qu'il est difficile de manière propre de connaître le nom d'un contrôle dans une expression SSRS. Essayez vous verrez c'est très sale et pas assuré d'être stable. Cela oblige donc à documenter.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;PS2: On peut aussi vouloir gérer la traduction par un paramètre, auquel cas on n'utilisera pas User!Language mais un paramètre à soi.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;PS3: Attention à l'interaction avec SSAS: Reporting Services travaille avec des libellés de culture (fr-fr, en-us...), SSAS avec des LCID par défaut.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-808386944536268883?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/808386944536268883/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=808386944536268883' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/808386944536268883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/808386944536268883'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2011/10/utiliser-la-fonction-lookup-pour.html' title='[SSRS] Utiliser la fonction Lookup pour traduire les parties statiques des rapports'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Sdln0MU6sCU/Tpw5FbOj2pI/AAAAAAAAAtY/7sT9RNeINa8/s72-c/pieter_bruegel.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-3701727332640088285</id><published>2011-09-14T20:03:00.000+02:00</published><updated>2011-09-14T23:32:47.484+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reporting Services'/><category scheme='http://www.blogger.com/atom/ns#' term='MDX'/><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services'/><title type='text'>[SSRS] Une Parent Child mise à plat dans plusieurs champs</title><content type='html'>&lt;div style="text-align: left;"&gt;Une petite note rapide: dans &lt;b&gt;Reporting Service&lt;/b&gt;s, lorsque l'on veut utiliser une hiérarchie Parent/Enfant, tous les membres sont exposés &lt;b&gt;dans la même colonne, peu importe leur niveau&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Et si vous désirez avoir un champ par niveau? Impossible de CrossJoiner sur une même hiérarchie (C'est interdit par MDX!), et si vous googlisez, on vous dira soit que c'est un soucis de provider et que vous n'avez qu'à utiliser l'OLE DB, soit de créer des membres calculés, soit d'arrêter les P/C voire Reporting Services tout court...&lt;/div&gt;&lt;div&gt;Mais on peut &lt;b&gt;hacker&lt;/b&gt;, un peu de la même manière que pour le &lt;b&gt;DrillThrough &lt;/b&gt;dans &lt;a href="http://fjehl.blogspot.com/2009/06/drillthrough-ssas-dans-ssrs-ajout-au.html"&gt;un de mes vieux posts&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;La propriété "DbpropMsmdFlattened2"&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Effectivement, ce soucis de colonne est un soucis lié au provider, plus exactement de configuration de la commande AS. Sur un sujet lié lui aussi à RS, &lt;b&gt;Greg Galloway&lt;/b&gt; m'a fait tilter &lt;a href="http://www.artisconsulting.com/blogs/greggalloway/Lists/Posts/Post.aspx?ID=10"&gt;dans ce post&lt;/a&gt;, en disant que le provider Analysis Services pour RS met les propriétés &lt;b&gt;ReturnCellProperties &lt;/b&gt;et &lt;b&gt;DbpropMsmdFlattened2 &lt;/b&gt;à true.  Son post parle du premier, le deuxième nous intéresse aujourd'hui.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Tout d'abord son assertion est vraie: vous pouvez le constater dans le &lt;b&gt;Profiler&lt;/b&gt; sur les events &lt;b&gt;Query Begin&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://4.bp.blogspot.com/-WWB9fxhaH2Y/TnCwKWXMaxI/AAAAAAAAAtI/xU-kayF2Hkg/s400/Untitled.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5652211224198015762" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 94px; " /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Quel est l'effet de ces deux propriétés? Dans la &lt;a href="http://msdn.microsoft.com/fr-fr/library/ms186627.aspx"&gt;doc des propriétés XMLA&lt;/a&gt;, il est spécifié que la première demande l'exposition des propriétés de cellules en tant que colonnes - ce dont traite Galloway - et que la seconde "&lt;i&gt;Fournit&lt;b&gt; tous les membres d'une hiérarchie parent-enfant dans une seule colonne&lt;/b&gt; de table&lt;/i&gt;". &lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Bingo?&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On pense alors qu'il ne reste plus qu'à rajouter DbPropMsMdFlattened=false à la connection string.... Et bien &lt;b&gt;non &lt;/b&gt;car cela ne marche pas: la propriété est insérée dans la commande par RS, donc après établissement de la connexion, et &lt;b&gt;override le choix fait dans la connection string&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La solution? Switcher en mode de requête DMX.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_kbsOT_Eyf_M/SiU7aP_UCjI/AAAAAAAAAMg/OOrIlKh5og4/s1600-h/01.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 175px;" src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/SiU7aP_UCjI/AAAAAAAAAMg/OOrIlKh5og4/s400/01.PNG" alt="" id="BLOGGER_PHOTO_ID_5342741855099685426" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Dans ce cas, ces deux propriétés ne sont pas affectées (on le voit là aussi dans le Profiler, les deux lignes ne sont pas présentes dans l'entête de commande), mais ce pour des raisons que&lt;b&gt; je ne connais pas&lt;/b&gt;. On perd le designer mais la requête marche comme on le souhaite, j'ai bien mes niveaux dans des champs différents.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://4.bp.blogspot.com/-K2UHoyLSzqw/TnCxamaXLWI/AAAAAAAAAtQ/6GSGOhmkEJI/s400/Untitled2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5652212602895805794" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 202px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Après est-ce la bonne approche? A vous de juger, effectivement cela ressemble beaucoup à un &lt;b&gt;hack douteux&lt;/b&gt; mais dans le cas (qui est le mien) ou on ne fait pas un usage extensif des P/C, si un hack certes douteux mais &lt;b&gt;utilisé rarement&lt;/b&gt; évite de recréer et maintenir une data source dédiée ça peut valoir le coup...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A bientôt!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-3701727332640088285?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/3701727332640088285/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=3701727332640088285' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3701727332640088285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3701727332640088285'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2011/09/ssrs-une-parent-child-mise-plat-dans.html' title='[SSRS] Une Parent Child mise à plat dans plusieurs champs'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-WWB9fxhaH2Y/TnCwKWXMaxI/AAAAAAAAAtI/xU-kayF2Hkg/s72-c/Untitled.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-7781266995722377339</id><published>2011-09-06T11:38:00.003+02:00</published><updated>2011-09-06T11:51:16.751+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reporting Services'/><title type='text'>[SSRS] Dernière valeur d'un DataSet comme valeur par défaut</title><content type='html'>&lt;div style="text-align: left;"&gt;C'est drôle comme parfois une solution &lt;b&gt;toute bête&lt;/b&gt; peut vous échapper pendant pas mal de temps. Lorsque vous utilisez un DataSet pour remplir les available values d'un paramètre dans SSRS, il vous est sûrement déjà arrivé de souhaiter sélectionner la dernière valeur comme valeur par défaut (allez par hasard pour une dimension &lt;b&gt;temps&lt;/b&gt;).&lt;/div&gt;&lt;div&gt;Donc première intuition vous sélectionnez une &lt;b&gt;expression comme valeur par défaut&lt;/b&gt;, expression qui fait référence au DataSet en cours (&lt;b&gt;Fields&lt;/b&gt;!...) pour prendre la dernière valeur (aggrégation &lt;b&gt;Last&lt;/b&gt;()).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://4.bp.blogspot.com/-xjMZh1cGzio/TmXs3xY1c8I/AAAAAAAAAs0/jSf2b5uE9q0/s400/Strawberry_Fields_Forever.jpg" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 268px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5649181750500619202" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Et &lt;b&gt;vous prenez une erreur &lt;/b&gt;comme quoi &lt;b&gt;vous ne pouvez pas utiliser Fields! dans ce type d'expression &lt;/b&gt;d'où vous faites comme tout le monde et vous réécrivez un DataSet spécifique pour la dernière valeur, ce qui est quand même dommage d'un point de vue bases de données, parce que l'info vous l'avez déjà dans le DataSet précédent...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Et en réfléchissant un peu on trouve rapidement une &lt;b&gt;solution&lt;/b&gt;: il suffit de déclarer un paramètre "dummy", &lt;b&gt;internal &lt;/b&gt;et &lt;b&gt;multivalué&lt;/b&gt;, qui prend les valeurs du même DataSet que le vrai paramètre intéressant en &lt;b&gt;available &lt;/b&gt;et en &lt;b&gt;default&lt;/b&gt;. &lt;/div&gt;&lt;div&gt;Dans notre paramètre initial, section default,  il suffit alors de saisir l'expression:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;=Parameters!Dummy.Value(Parameters!Dummy.Count-1)&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Et ça marche: on n'a pas le droit de référencer Fields! mais on peut référencer Parameters dans cette expression.&lt;/div&gt;&lt;div&gt;En espérant que ça vous serve, à bientôt!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-7781266995722377339?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/7781266995722377339/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=7781266995722377339' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/7781266995722377339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/7781266995722377339'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2011/09/ssrs-derniere-valeur-dun-dataset-comme.html' title='[SSRS] Dernière valeur d&apos;un DataSet comme valeur par défaut'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-xjMZh1cGzio/TmXs3xY1c8I/AAAAAAAAAs0/jSf2b5uE9q0/s72-c/Strawberry_Fields_Forever.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-1444826032717106921</id><published>2011-08-27T18:08:00.001+02:00</published><updated>2011-09-09T22:46:39.991+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MDX'/><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services'/><title type='text'>[SSAS] Quelques rappels de Multiselect, Sets et AutoExists</title><content type='html'>&lt;div style="text-align: left;"&gt;La notion d'existence sur les sets lorsque l'on réalise des requêtes MDX filtrées (soit par un slicer soit par un subcube) est une des notions les plus complexes à comprendre pour un novice (voire même pour un non novice en MDX).  Dans ce post, je vais essayer de faire un bref rappel synthétique du fonctionnement de tout cela dans SSAS. Il y a eu pas mal de trucs écrits sur le net chez Chris Webb ou feu Mosha, mais je pense que synthétiser tout ça ne fait pas de mal, surtout avec la généralisation des filtrages par subcube dans les générateurs de requêtes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://4.bp.blogspot.com/-dB_82h8kvko/Tmp7H8SoTqI/AAAAAAAAAtA/hEYEJ35qUwI/s400/MultiSelectListBox.jpg" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 245px; height: 155px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5650464058863275682" /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Filtrage par slicer&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Il faut savoir qu'historiquement MDX permet de réaliser un filtrage d'une requête un peu à la manière de SQL en&lt;b&gt; utilisant la clause WHERE&lt;/b&gt;, que l'on appelle aussi &lt;i&gt;slicer&lt;/i&gt;. &lt;/div&gt;&lt;div&gt;En MDX lorsqu'une requête est exécutée, les deux axes principaux (Axis0 et Axis1 aussi appellés COLUMNS et ROWS) sont "existés" (&lt;i&gt;existed &lt;/i&gt;en anglais): on applique sur ces axes la clause &lt;b&gt;Exists &lt;/b&gt;qui ne retourne alors que les membres valables pour le filtrage. Il ne surprend alors personne que la requête suivante ne retourne que les jours de l'année 2007. (A noter que l'on peut aussi faire du multiselect dans les clauses Where, que l'Aggregate en mode SQL 2000 n'est plus usité.).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;SELECT {[Date].[Date].[Date]} ON 0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;FROM [Adventure Works]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;WHERE ([Date].[Calendar].[Calendar Year].&amp;amp;[2007])&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;L'axis0 affiche un résultat équivalent à:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Exists&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;( &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;{[Date].[Date].[Date]}, &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;{[Date].[Calendar].[Calendar Year].&amp;amp;[2007]}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;C'est ce que l'on appelle &lt;b&gt;l'Autoexists. &lt;/b&gt;Mais ce comportement n'est pas appliqué partout dans une requête MDX, et certains sont parfois surpris...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Mot clé Existing&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La requête suivante par exemple ne renvoit pas 365 ou 366 mais.... 1188.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;WITH&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;MEMBER [Measures].[Nb Days In Year]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;AS&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Count&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;{[Date].[Date].[Date]}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;SELECT {[Measures].[Nb Days In Year]} ON 0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;FROM [Adventure Works]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;WHERE ([Date].[Calendar].[Calendar Year].&amp;amp;[2007])&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En effet le &lt;b&gt;set de Dates dans la named calculation n'est pas existé dans le contexte&lt;/b&gt;. Le slicer n'est pas pris en compte et on renvoit tous les membres Date. Un développeur MDX aguerri connait alors la clause Existing (&lt;a href="http://msdn.microsoft.com/fr-fr/library/ms145541.aspx"&gt;http://msdn.microsoft.com/fr-fr/library/ms145541.aspx&lt;/a&gt;) qui force le jeu à être évalué dans le contexte actuel de la requête. En modifiant mon membre de cette manière:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;MEMBER [Measures].[Nb Days In Year]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;AS&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Count&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;b&gt;Existing &lt;/b&gt;{[Date].[Date].[Date]}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On obtient bien alors 365.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Autoexists sur les named sets&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Là ou cela devient drôle c'est que si l'on déclare le set de dates, mettons un jeu nommé Jours, l'Existing est superflu. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;SET [Days]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;AS&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;{[Date].[Date].[Date]}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;MEMBER [Measures].[Nb Days In Year]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;AS&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Count&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;[Days]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Renvoie alors 365. &lt;b&gt;Les jeux nommés de requête sont par défaut existés&lt;/b&gt;... Ce qui peut poser de gros problèmes de compréhension (imaginons que l'on souhaite mettre dans le set les jours d'un YTD il serait alors... vide si on a un jour dans le slicer). C'est ce qu'explique cet excellent article de &lt;b&gt;Chris Webb&lt;/b&gt; (&lt;a href="http://cwebbbi.wordpress.com/2008/07/15/named-sets-autoexists-and-katmai/"&gt;http://cwebbbi.wordpress.com/2008/07/15/named-sets-autoexists-and-katmai/&lt;/a&gt;) qui va beaucoup plus loin).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;C'est le comportement par défaut de l'autoexists, aussi appellé&lt;b&gt; Autoexists de type 1&lt;/b&gt; décrit sur MSDN (&lt;a href="http://msdn.microsoft.com/fr-fr/library/ff487119.aspx"&gt;http://msdn.microsoft.com/fr-fr/library/ff487119.aspx&lt;/a&gt;): l'autoexists est appliqué sur les axes et les jeux de requête. C'est un autoexists &lt;b&gt;deep&lt;/b&gt;, c'est à dire qu'il s'applique à chaque étape du calcul. (Si mon set est calculé à partir d'une composition de fonction, Exists est appliqué sur chaque fonction), par opposition à l'autoexists &lt;b&gt;shallow&lt;/b&gt;, qui ne s'applique que sur le résultat final. Je reste volontairement dans le vague, si vous voulez voir plus d'implications de ces différents modes d'Autoexists, direction chez Chris Webb, sachez seulement que l'autoexists sur les sets peut être par exemple débrayé en modifiant le type d'AE appliqué sur le serveur.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Static Sets et Dynamic Sets&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mais attention, si les jeux nommés de requête sont bien existés par défaut,&lt;b&gt; il n'en est pas de même des jeux créés dans le script MDX&lt;/b&gt; du cube! &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Les sets pré-2008, aussi appellés&lt;b&gt; Static Sets &lt;/b&gt;ne sont pas évalués dans le contexte de la requête, ce qui rend très difficile la récupération des membres "existants" dans un calcul MDX si la requête utilise des subcubes (typique d'Excel en version &amp;gt;12 avec SQL Server 2005).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Dans le cas de notre requête précédente en la réécrivant "Excel Style", cela annule l'effet de la clause Existing, et si la mesure [Nb Days In Year] est calculée dans le script sur un Static Set cete dernière reste fausse (le compte renvoyant là encore 1188). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;SELECT {[Measures].[Nb Days In Year]} ON 0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;FROM &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;SELECT {[Date].[Calendar].[Calendar Year].&amp;amp;[2007]} ON 0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;FROM  [Adventure Works]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La solution est venue avec Katmai (2008) et l'introduction des &lt;b&gt;Dynamic Sets&lt;/b&gt;, qui sont existés dans le contexte de requête. &lt;/div&gt;&lt;div&gt;Un jeu de ce type &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;CREATE DYNAMIC SET CURRENTCUBE.[Days] &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;AS [Date].[Date].[Date] ; &lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;C'est donc la seule manière de remplacer Existing dans le cas d'utilisation de sous-cube pour le filtrage depuis le script MDX. L'article de &lt;b&gt;Mosha &lt;/b&gt;sur les multiselect friendly MDX calculations (&lt;a href="http://www.mosha.com/msolap/articles/mdxmultiselectcalcs.htm"&gt;http://www.mosha.com/msolap/articles/mdxmultiselectcalcs.htm&lt;/a&gt;) est donc de moins en moins utile avec cette évolution d'Excel. On en vient à utiliser des Dynamic Sets à la place des Existing,  comme montré dans ce très bon post (&lt;a href="http://ms-olap.blogspot.com/2010/02/solution-von-ssas-2008-multi-selects-in.html"&gt;http://ms-olap.blogspot.com/2010/02/solution-von-ssas-2008-multi-selects-in.html&lt;/a&gt;) d'&lt;b&gt;Hilmar Buchta.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Les subselects on d'autres implications, entre autres choses en plus d'appliquer Exists ils appliquent aussi VisualTotals, ce qui a d'autres effets inéressants, comme ceux décrits récemment par Jeffrey Wang dans ce post (&lt;a href="http://mdxdax.blogspot.com/2011_08_01_archive.html"&gt;http://mdxdax.blogspot.com/2011_08_01_archive.html&lt;/a&gt;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Voilà en espérant vous avoir raffraichi la mémoire.&lt;/div&gt;&lt;div&gt;A bientôt!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-1444826032717106921?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/1444826032717106921/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=1444826032717106921' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/1444826032717106921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/1444826032717106921'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2011/08/ssas-quelques-rappels-de-multiselect.html' title='[SSAS] Quelques rappels de Multiselect, Sets et AutoExists'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-dB_82h8kvko/Tmp7H8SoTqI/AAAAAAAAAtA/hEYEJ35qUwI/s72-c/MultiSelectListBox.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-2987122264848961876</id><published>2011-07-22T14:45:00.006+02:00</published><updated>2011-07-22T15:13:43.442+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MDX'/><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services'/><title type='text'>[SSAS] DistinctCount sans les NULL et NullProcessing=Preserve</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); "&gt;&lt;img src="http://4.bp.blogspot.com/-afWGwq_6FdM/Til3DNWoWdI/AAAAAAAAArE/iRBBqCUOybY/s400/28916316chuck-norris-jpg.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5632163706011408850" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 150px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" &gt;"NULL is the Chuck Norris of the database .&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" &gt;Nothing can be compared to it."&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;Il arrive à tout consultant de se faire avoir par une fonctionnalité qu'il croyait tellement logique qu'il ne pensait pas qu'elle puisse être mal implémentée. Là en l’occurrence il s'agit du &lt;b&gt;DistinctCount&lt;/b&gt; dans Analysis Services sur des colonnes &lt;b&gt;potentiellement nulles&lt;/b&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Comptage des NULL en relationnel&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Dans toute base SQL, un COUNT(MaColonne) ou les valeurs de MaColonne sont nulles ignore les NULL. Il en est de même pour les COUNT(DISTINCT MaColonne).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border:1px solid black;"&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;SELECT COUNT&lt;/b&gt;(&lt;b&gt;DISTINCT &lt;/b&gt;MaColonne)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;FROM&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;b&gt;VALUES&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;(&lt;b&gt;NULL&lt;/b&gt;),(1)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;) &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;T(MaColonne)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Vous pouvez tester avec ceci qui renverra invariablement "1"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Comptage en MDX&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Passons à Analysis Services. Dans la même logique en MDX, tout fonctionne exactement de la même manière. Si vous tapez:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="border:1px solid black;"&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;WITH&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;MEMBER &lt;/b&gt;CountOfT&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;AS&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;DistinctCount&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;[Time].[Year].&amp;amp;[2011]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;, Null&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;SELECT &lt;/b&gt;CountOfT &lt;b&gt;ON &lt;/b&gt;0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;FROM &lt;/b&gt;[Cube]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Vous obtiendrez le même résultat que précédemment à savoir 1.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Comptage des NULL en agrégation DistinctCount&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;En revanche si vous créez une mesure (et donc un groupe de mesure dédié) en &lt;b&gt;DistinctCount &lt;/b&gt;sur une colonne potentiellement nulle, vous constaterez que... les NULL sont comptés. Bien sûr auparavant vous aurez pris soin de passer le &lt;b&gt;NullProcessing &lt;/b&gt;en &lt;b&gt;Preserve &lt;/b&gt;sur la mesure pour que les NULL ne soient pas convertis en 0 par SSAS (le comportement par défaut revient à &lt;b&gt;ZeroOrBlank&lt;/b&gt;: les convertir en zéro ou chaine vide selon le type de la mesure.)&lt;/div&gt;&lt;div&gt;D'après Charles Wang dans ce &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/sqlanalysisservices/thread/8a2c05a3-5b7e-4057-a15f-725a4ecc740e"&gt;post&lt;/a&gt; il s'agit a priori d'un bug de SSAS.&lt;/div&gt;&lt;div&gt;La seule solution - comme dit par Deepak Puri dans le post cité au dessus - revient donc à &lt;b&gt;appuyer le groupe de mesure dédié du DistinctCount sur une Named Query qui filtre les NULL&lt;/b&gt; sur la table d'origine et non sur cette dernière directement.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Si vous avez d'autres solutions, n'hésitez pas. Et moi maintenant je teste avant de m'avancer :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-2987122264848961876?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/2987122264848961876/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=2987122264848961876' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/2987122264848961876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/2987122264848961876'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2011/07/ssas-distinctcount-sans-les-null-et.html' title='[SSAS] DistinctCount sans les NULL et NullProcessing=Preserve'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-afWGwq_6FdM/Til3DNWoWdI/AAAAAAAAArE/iRBBqCUOybY/s72-c/28916316chuck-norris-jpg.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-4356841352173861221</id><published>2011-07-13T00:44:00.005+02:00</published><updated>2011-07-13T01:11:22.136+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annonces/Releases'/><title type='text'>SQL Server Denali CTP 3, les nouveautés décisionnelles</title><content type='html'>&lt;div style="text-align: left;"&gt;Vous pouvez dès à présent télécharger &lt;b&gt;SQL Server Denali CTP 3&lt;/b&gt; à &lt;a href="https://www.microsoft.com/betaexperience/pd/SQLDCTP3CTA/enus/default.aspx"&gt;cette adresse&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;Un petit focus sur les nouveautés intéressantes dans le domaine du &lt;b&gt;décisionnel &lt;/b&gt;introduites par cette nouvelle CTP.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://4.bp.blogspot.com/-orKs9wGzz8M/ThzT5YrklsI/AAAAAAAAAq8/tTXtxNcAjFQ/s400/SQL_Server_Denali_thumb_13060AB9.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 84px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5628606617137485506" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Analysis Services&lt;/b&gt;&lt;/div&gt;&lt;div&gt;-L'introduction de &lt;b&gt;BISM, BI Semantic Model&lt;/b&gt;, le nouveau modèle de conception de cube utilisant une version serveur du moteur Vertipaq de PowerPivot.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Reporting Services&lt;/b&gt;&lt;/div&gt;&lt;div&gt;-Le projet &lt;b&gt;Crescent&lt;/b&gt;, le nouvel outil de design de rapport interactif, orienté conception et consommation en ligne, conçu pour fonctionner sur BISM. Il remplace Report Builder 1.0, RB 3.0 existe toujours, il est lui sobrement renommé Report Builder.&lt;/div&gt;&lt;div&gt;-La possibilité de mettre en place des &lt;b&gt;alertes &lt;/b&gt;pour être notifié de changements dans les données sous-jacentes aux rapports en mode Sharepoint&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Autres&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;BIDS &lt;/b&gt;passe sous Visual Studio 2010 :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-4356841352173861221?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/4356841352173861221/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=4356841352173861221' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/4356841352173861221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/4356841352173861221'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2011/07/sql-server-denali-ctp-3-les-nouveautes.html' title='SQL Server Denali CTP 3, les nouveautés décisionnelles'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-orKs9wGzz8M/ThzT5YrklsI/AAAAAAAAAq8/tTXtxNcAjFQ/s72-c/SQL_Server_Denali_thumb_13060AB9.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-7927983255390274437</id><published>2011-07-12T00:56:00.000+02:00</published><updated>2011-07-12T16:34:30.586+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reporting Services'/><title type='text'>[SSRS] DrillDown to... à la Excel sous Reporting Services</title><content type='html'>&lt;div style="text-align: left;"&gt;Que voilà une demande intéressante et amusante. Dans Excel, il y a sur les hiérarchies la possibilité d'effectuer un &lt;b&gt;Drill-Down to&lt;/b&gt; jusqu'à un niveau spécifique. Comprendre que l'on n'est pas obligé de descendre toute la hiérarchie pour enfin arriver au niveau souhaité. Si il y en a une dizaine, ça économise des clics :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;Dans &lt;b&gt;Reporting Services&lt;/b&gt;, les boutons de Drill sont positionnés potentiellement sur une &lt;b&gt;TextBox&lt;/b&gt; lorsqu'elle est par exemple le &lt;b&gt;ToggleItem &lt;/b&gt;d'un groupe. Ce toggle est déplié, ou plié par défaut.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Alors comment faire pour satisfaire à la demande en question? Simplement en instaurant un &lt;b&gt;paramètre masqué DrillDownLevel,&lt;/b&gt; qui va permettre via des &lt;b&gt;Actions &lt;/b&gt;sur des TextBox de réappeller le rapport avec un DrillDownLevel spécifique. Ce DrillDownLevel paramétrant qui gouverne l'état visible ou invisible du groupe.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Création du paramètre.&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Rien de sorcier: un paramètre technique &lt;b&gt;masqué de type integer&lt;/b&gt; fera très bien l'affaire. Ne pas oublier de lui mettre une &lt;b&gt;Default Value à 0&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://4.bp.blogspot.com/-cmb_JyOvDcQ/ThxagOj9BUI/AAAAAAAAAqU/YIf0dAyLd6M/s400/1.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 269px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5628473144017487170" /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Configuration des groupes&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La seule petite subtilité est celle ci: la visibilité du groupe n'est pas True ou False en fixe: elle &lt;b&gt;dépend de la valeur de DrillDownLevel:&lt;/b&gt; pour l'item de niveau 1, il est masqué tant que le  DrillDownLevel est inférieur à 1. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://3.bp.blogspot.com/-cAvLWybY3bE/ThxasREj9OI/AAAAAAAAAqc/pEmgKC3qD0Q/s400/2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5628473350849557730" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 233px; " /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Sur la même logique la TextBox dépliant ce groupe (généralement dans le groupe parent) est à l'état [-] dès que ce DrillDownLevel est supérieur ou égal à 1.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://2.bp.blogspot.com/-GTp0-LyILAc/Thxa6ZPWfbI/AAAAAAAAAqk/XGPEPQquk_8/s400/2bis.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5628473593560464818" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 295px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Une action pour commander tout ça&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;J'ai fait le choix de commander la chose via des &lt;b&gt;actions sur les entêtes&lt;/b&gt; de colonne. Sur chaque entête de colonnes on positionne une action GoToReport, en passant la valeur appropriée de DrillDownLevel si on est sur la bonne colonne.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://1.bp.blogspot.com/-gyxSgPAl13o/ThxbBwRXb8I/AAAAAAAAAqs/qEYPjCrqB6k/s400/3.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5628473720002015170" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 230px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Et voilà le résultat! (Je sais je suis nul en choix de couleurs, c'est un de mes défauts préférés).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://4.bp.blogspot.com/-Lpg3emilDkE/ThxbKT_0pqI/AAAAAAAAAq0/tXBDd70FIuY/s400/4.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5628473867031062178" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 244px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Bon reporting!&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-7927983255390274437?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/7927983255390274437/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=7927983255390274437' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/7927983255390274437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/7927983255390274437'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2011/07/ssrs-drilldown-to-la-excel-sous.html' title='[SSRS] DrillDown to... à la Excel sous Reporting Services'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-cmb_JyOvDcQ/ThxagOj9BUI/AAAAAAAAAqU/YIf0dAyLd6M/s72-c/1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-5845121857208099992</id><published>2011-07-10T10:17:00.002+02:00</published><updated>2011-07-13T14:25:48.149+02:00</updated><title type='text'>[SSAS] Sécurité dynamique avec une Factless</title><content type='html'>&lt;table style="BORDER-BOTTOM: 1px solid; BORDER-LEFT: 1px solid; BORDER-TOP: 1px solid; BORDER-RIGHT: 1px solid"&gt;&lt;br /&gt;&lt;tbody&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Ce sujet a été maintes fois abordé, mais je me retrouve souvent à expliquer le concept, voilà un petit rappel qui pourra en aider certains. Des détails d'implémentation sont trouvables un peu partout sur le net du moment que l'on cherche bien :)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;J'ai déjà parlé &lt;a href="http://fjehl.blogspot.com/2009/07/ssas-dynamic-dimension-security-avec.html"&gt;il y a longtemps&lt;/a&gt; de l'implémentation de la sécurité dynamique de dimensions (&lt;em&gt;Dynamic Dimension Security&lt;/em&gt; en bon langage de newsgroup SSAS). Il s'agit pour ceux qui n'ont pas envie de limiter la vue des membres d'une dimension par une &lt;strong&gt;expression MDX dynamique pour chaque utilisateur,&lt;/strong&gt; ce qui est possible par l'utilisation de la fonction MDX &lt;strong&gt;UserName&lt;/strong&gt;, qui renvoie l'ID de l'utilisateur connecté.&lt;br /&gt;&lt;br /&gt;C'est très facile à faire lorsque l'on a une notion d'utilisateur dans le cube, comprendre lorsque les faits à sécuriser sont à la granularité de l'utilisateur: on rajoute le login en tant que Member Property dans le cube et c'est presque terminé. C'est d'ailleurs ce que j'avais fait dans mon exemple.&lt;br /&gt;&lt;br /&gt;En revanche que faire lorsque le cube est à une granularité supérieure? Lorsque la notion d'utilisateur n'y est pas représentée d'un point de vue métier? On peut alors représenter cette notion d'utilisateur dans une ou plusieurs tables de faits dédiées, et gérer la sécurité à l'aide de &lt;b&gt;relations Many-To-Many&lt;/b&gt;. C'est d'ailleurs ce que l'on fait en SQL lorsque l'on doit gérer de la sécurité à la ligne de données.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Une dimension technique d'utilisateur &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;On va d'abord créer une d&lt;b&gt;imension Utilisateur&lt;/b&gt;, qui a un sens uniquement technique. Potentiellement cette dimension peut ne contenir que deux attributs, une Surrogate Key et un identifiant type Active Directory. Cet identifiant peut aussi être un identifiant autre, applicatif que l'on pourra passer via le noeud CustomData de la chaîne de connexion (plutôt que d'utiliser le UserID).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Une table de faits Factless par Securable&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Mettons que l'on ait un reporting dans le cube fait par Unité Organisationnelle, chacune pouvant être vue par un ou plusieurs utilisateurs: on va créer une table de faits FactlessDroitsUniteOrganisationnelle qui sera simplement composée d'un doublet (UniteOrganisationnelleID, UtilisateurID). On crée un &lt;b&gt;groupe de mesure&lt;/b&gt; pour chacune dans le cube. On a donc une relation Fait -&amp;gt; DimUniteOrganisationnelle &amp;lt;- FactlessDroitsUniteOrganisationnelle -&amp;gt; DimUtilisateur.&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;Une relation Many-To-Many par Securable&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Chaque fait relié à un élément à sécuriser dispose alors d'&lt;b&gt;une relation Many-To-Many avec une instance en Role Playing Dimension de la dimension Utilisateur&lt;/b&gt;. On crée donc dans le cube autant d'instances de cette dimension que l'on a de dimensions à sécuriser. Pour chaque table de faits concernée par une relation avec une dimension à sécuriser, on rajoute dans le Dimension Usage&lt;b&gt; une relation Many-To-Many avec l'instance appropriée de la dimension Utilisateur&lt;/b&gt; (i.e. les tables de faits en lien Regular avec les UO se retrouvent alors en lien M2M avec l'instance de dimension UtilisateurUO à travers le groupe de mesure basé sur FactlessDroitsUniteOrganisationnelle).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Et côté rôles...&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;On se retrouve alors à sécuriser la dimension Utilisateur (pas les instances ou CubeDimensions, la Shared Dimension). ce qui descend la sécurité sur toutes les instances. On utilise alors une sécurité basée sur UserID (ou CustomData si on est dans un système différent).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Cette solution de sécurité, que j'ai déjà implémenté avec un succès certain, n'a finalement comme inconvénient que de rajouter un certain nombre de tables. Elle est en revanche &lt;b&gt;relativement transparente&lt;/b&gt; et assez facile à administrer, et est surtout simplissime à gérer côté SSAS?&lt;br /&gt;A noter qu'une foultitude d'autres solutions existent, et que le codage d'une extension en .NET pour gérer la sécurité, s'il est dangereux car appliqué à chaque requête, peut parfaitement être considéré comme une approche robuste.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-5845121857208099992?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/5845121857208099992/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=5845121857208099992' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/5845121857208099992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/5845121857208099992'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2011/07/ssas-securite-dynamique-avec-une.html' title='[SSAS] Sécurité dynamique avec une Factless'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-9050125299193895076</id><published>2011-04-07T16:13:00.007+02:00</published><updated>2011-04-28T11:10:27.667+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MDX'/><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services'/><title type='text'>[SSAS] Une fonction Split en full MDX</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/-EzTnYhSl0vI/TZ3N4Z7Tv0I/AAAAAAAAApg/XtZa21JGpvA/s1600/banana-split.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px;" src="http://4.bp.blogspot.com/-EzTnYhSl0vI/TZ3N4Z7Tv0I/AAAAAAAAApg/XtZa21JGpvA/s400/banana-split.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5592852681180036930" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;J'en avais déjà parlé dans &lt;a href="http://fjehl.blogspot.com/2010/02/recherche-google-like-dans-une.html"&gt;ce post&lt;/a&gt;, il manque une &lt;a href="http://msdn.microsoft.com/fr-fr/library/6x627e5f(v=vs.80).aspx" style="font-weight: bold; "&gt;fonction Split&lt;/a&gt; à MDX. Non pas que cela ne puisse pas se coder dans l'absolu - les &lt;b&gt;procédures stockées managées&lt;/b&gt; en .NET sont pour ça - mais je me suis dit qu'en coder un en MDX pouvait être une application marrante de la récursivité (&lt;i&gt;bien que complètement inutile hormis mon plaisir personnel je vous l'avoue&lt;/i&gt;).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Alors en &lt;b&gt;MDX &lt;/b&gt;comment faire? Il n'y a &lt;b&gt;pas de boucles&lt;/b&gt;, donc la seule technique valable est d'utiliser la &lt;b&gt;récursivité&lt;/b&gt;. Car oui &lt;b&gt;MDX &lt;/b&gt;permet de faire des récursions, ce qui signifie qu'il autorise un membre à se&lt;b&gt; faire référence à lui même &lt;/b&gt;dans sa définition. On a parfaitement le droit d'écrire ça par exemple:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre style="border-bottom-color: rgb(204, 204, 204); border-bottom-width: 1px; border-bottom-style: dashed; text-align: left; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: dashed; padding-bottom: 0px; padding-left: 0px; width: 99%; padding-right: 0px; background-image: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(240, 240, 240); height: auto; overflow-x: auto; overflow-y: auto; border-top-color: rgb(204, 204, 204); border-top-width: 1px; border-top-style: dashed; border-right-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: dashed; padding-top: 0px; "&gt;&lt;code style="word-wrap: normal; "&gt;WITH&lt;br /&gt;MEMBER Measures.[Toto]&lt;br /&gt;AS ([Date].[Date].PrevMember, Toto)*1.1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pour plus de détails allez voir l'excellent &lt;a href="http://sqlblog.com/blogs/mosha/archive/2005/01/23/recursion-in-mdx-how-deep-can-it-go.aspx"&gt;post de Mosha à ce sujet&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;Alors comment cela peut-il m'aider dans mon cas?&lt;/div&gt;&lt;div&gt;Commençons déjà par  définir &lt;b&gt;deux membres de base&lt;/b&gt;, ma chaîne et le caractère de Split:&lt;br /&gt;&lt;pre style="border-bottom-color: rgb(204, 204, 204); border-bottom-width: 1px; border-bottom-style: dashed; text-align: left; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: dashed; padding-bottom: 0px; padding-left: 0px; width: 99%; padding-right: 0px; background-image: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(240, 240, 240); height: auto; overflow-x: auto; overflow-y: auto; border-top-color: rgb(204, 204, 204); border-top-width: 1px; border-top-style: dashed; border-right-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: dashed; padding-top: 0px; "&gt;&lt;code style="word-wrap: normal; "&gt;WITH&lt;br /&gt;MEMBER String&lt;br /&gt;AS "0,1,22,333,4444,55555"&lt;br /&gt;&lt;br /&gt;MEMBER Separator&lt;br /&gt;AS ","&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Le but va donc être de sortir une mesure qui pour un jeu de membres donnés va retourner &lt;b&gt;toutes les sous-chaînes&lt;/b&gt; délimitées par le séparateur. Tout ce dont vous avez besoin c'est donc &lt;b&gt;d'un ensemble de membres &lt;/b&gt;assez grand (plus de membres que d'occurences du séparateur) pour affecter votre mesure. J'ai pris le niveau fin de la dimension Date d'&lt;a href="http://msftdbprodsamples.codeplex.com/"&gt;Adventure Works&lt;/a&gt; mais vous faites comme vous voulez.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mon membre Splitter est défini comme suit:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre style="border-bottom-color: rgb(204, 204, 204); border-bottom-width: 1px; border-bottom-style: dashed; text-align: left; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: dashed; padding-bottom: 0px; padding-left: 0px; width: 99%; padding-right: 0px; background-image: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(240, 240, 240); height: auto; overflow-x: auto; overflow-y: auto; border-top-color: rgb(204, 204, 204); border-top-width: 1px; border-top-style: dashed; border-right-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: dashed; padding-top: 0px; "&gt;&lt;code style="word-wrap: normal; "&gt;MEMBER Splitter AS&lt;br /&gt;CASE&lt;br /&gt;WHEN ([Date].[Date].CurrentMember IS [Date].[Date].[Date].Members.Item(0))&lt;br /&gt;AND (VBA!InStr(String,Separator) &amp;gt; 0)&lt;br /&gt;THEN String&lt;br /&gt;WHEN (VBA!InStr([Date].[Calendar].PrevMember,Separator) &amp;gt; 0)&lt;br /&gt;THEN Right&lt;br /&gt;(&lt;br /&gt;[Date].[Calendar].PrevMember,&lt;br /&gt;Len&lt;br /&gt;(&lt;br /&gt;[Date].[Calendar].PrevMember&lt;br /&gt;)&lt;br /&gt;-&lt;br /&gt;InStr&lt;br /&gt;(&lt;br /&gt;[Date].[Calendar].PrevMember,&lt;br /&gt;Separator&lt;br /&gt;)&lt;br /&gt;)&lt;br /&gt;ELSE&lt;br /&gt;NULL&lt;br /&gt;END&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;Cas 1: &lt;/b&gt;&lt;/i&gt;Si on est au &lt;b&gt;premier &lt;/b&gt;membre du jeu, on affecte le premier membre à  la valeur de la chaîne de caractère initiale&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;i&gt;Cas 2:&lt;/i&gt;&lt;/b&gt; Si on est un &lt;b&gt;autre &lt;/b&gt;membre et qu'il reste des séparateurs dans la chaîne, on prend la &lt;b&gt;partie droite du membre précédent&lt;/b&gt; (la récursivité est là) jusqu'au premier séparateur.&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;i&gt;Cas 3:&lt;/i&gt;&lt;/b&gt; Le travail est terminé, on retourne NULL&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ce membre retourne cela:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://3.bp.blogspot.com/-LPdm7dUcrCc/TZ3LdvitINI/AAAAAAAAApQ/d9PavbOYVvI/s400/Recurs1.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5592850024102699218" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 211px; height: 143px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;C'est &lt;b&gt;presque &lt;/b&gt;ce qu'il me faut. Je rajoute juste un membre qui prend la &lt;b&gt;partie gauche &lt;/b&gt;de chaque valeur de Splitter:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border-bottom-color: rgb(204, 204, 204); border-bottom-width: 1px; border-bottom-style: dashed; text-align: left; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: dashed; padding-bottom: 0px; padding-left: 0px; width: 99%; padding-right: 0px; background-image: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(240, 240, 240); height: auto; overflow-x: auto; overflow-y: auto; border-top-color: rgb(204, 204, 204); border-top-width: 1px; border-top-style: dashed; border-right-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: dashed; padding-top: 0px; "&gt;&lt;code style="word-wrap: normal; "&gt;MEMBER Splitted&lt;br /&gt;AS&lt;br /&gt;CASE&lt;br /&gt;WHEN VBA!InStr(Splitter,Separator)&amp;gt;0&lt;br /&gt;THEN VBA!Left(Splitter,VBA!InStr(Splitter,Separator)-1)&lt;br /&gt;ELSE Splitter&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;SELECT [Splitted] ON 0,&lt;br /&gt;NON EMPTY {[Date].[Date].[Date].Members} ON 1&lt;br /&gt;FROM [Adventure Works]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Et j'obtiens:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://3.bp.blogspot.com/-Z2fCizokVCY/TZ3LmH8bvoI/AAAAAAAAApY/mUixfLpgiEg/s400/Recurs2.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5592850168092016258" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 141px; height: 141px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Tadaaa. Certes assez inutile j'en conviens, mais à mon avis un bon exemple de&lt;b&gt; l'utilisation de la récursivité&lt;/b&gt; pour de l'itération en MDX. &lt;/div&gt;&lt;div&gt;A bientôt!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;table style="border:1px solid black;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;i&gt;&lt;b&gt;EDIT du 28/04/2011:&lt;/b&gt; à signaler au passage ce superbe - comme souvent - article de Jeffrey Wang sur la récursivité en MDX: &lt;a href="http://mdxdax.blogspot.com/2011/04/performance-considerations-for.html"&gt;http://mdxdax.blogspot.com/2011/04/performance-considerations-for.html&lt;/a&gt;&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-9050125299193895076?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/9050125299193895076/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=9050125299193895076' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/9050125299193895076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/9050125299193895076'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2011/04/ssas-une-fonction-split-en-full-mdx.html' title='[SSAS] Une fonction Split en full MDX'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-EzTnYhSl0vI/TZ3N4Z7Tv0I/AAAAAAAAApg/XtZa21JGpvA/s72-c/banana-split.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-2001076365593584968</id><published>2011-03-30T00:21:00.000+02:00</published><updated>2011-03-30T17:49:51.317+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reporting Services'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>[SSRS] Un paramètre pour rechercher... en SQL</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/-MXhTLxSWayE/TZNJ5DCXwrI/AAAAAAAAAoo/UXd4I1UNiZM/s1600/Sans%2Btitre.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;/a&gt;&lt;div style="text-align: left;"&gt;Une petite &lt;b&gt;variante sur le même mode&lt;/b&gt; de ma &lt;a href="http://fjehl.blogspot.com/2010/02/recherche-google-like-dans-une.html"&gt;&lt;b&gt;recherche dans une dimension&lt;/b&gt; en MDX&lt;/a&gt; qui commence à dater: la version SQL.&lt;/div&gt;&lt;div&gt;Deux choses à créer&lt;/div&gt;&lt;div&gt;- Un &lt;b&gt;paramètre &lt;/b&gt;multivalué (le champ de recherche)&lt;/div&gt;&lt;div&gt;- Un &lt;b&gt;DataSet &lt;/b&gt;SQL (le résultat)&lt;/div&gt;&lt;br /&gt;&lt;div&gt;On commence par créer un joli DataSet sur une source SQL qui a la structure de ce que l'on veut renvoyer. Pour moi ce sera ça:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;SELECT &lt;/b&gt;FrenchProductName&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;FROM &lt;/b&gt;AdventureWorksDW2008..DimCustomer&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On le valide pour avoir les métadonnées. Maintenant on va créer une &lt;b&gt;expression &lt;/b&gt;en lieu et place de cette &lt;b&gt;requête&lt;/b&gt;, en cliquant sur le bouton ad-hoc:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://3.bp.blogspot.com/-JX_rEXE-vHA/TZM-5PTtv4I/AAAAAAAAAog/h9-N2fRBblc/s400/FX.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5589880715579604866" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 231px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;L'expression a pour but de &lt;b&gt;générer &lt;/b&gt;une &lt;b&gt;requête &lt;/b&gt;like %% pour chaque mot recherché, le tout unionné et ordonné par nombre de matches (bon je vous l'accorde ça n'est pas &lt;b&gt;PageRank&lt;/b&gt;).&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;SELECT &lt;/b&gt;FrenchProductName&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;FROM&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;   SELECT &lt;/b&gt;ProductKey, FrenchProductName &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;FROM &lt;/b&gt;AdventureWorksDW2008..DimProduct &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;   WHERE &lt;/b&gt;FrenchProductName &lt;b&gt;LIKE &lt;/b&gt;'%vélo%' &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;   UNION ALL &lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;   SELECT &lt;/b&gt;ProductKey,FrenchProductName &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;FROM &lt;/b&gt;AdventureWorksDW2008..DimProduct &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;   WHERE &lt;/b&gt;FrenchProductName &lt;b&gt;LIKE &lt;/b&gt;'%randonnée%'&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;) &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;AS &lt;/b&gt;T&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;GROUP BY &lt;/b&gt;ProductKey, FrenchProductName&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;ORDER BY COUNT&lt;/b&gt;(*) &lt;b&gt;DESC&lt;/b&gt;, FrenchProductName &lt;b&gt;ASC&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pour générer cela on va donc créer une expression qui est d'abord constituée du &lt;b&gt;&lt;span class="Apple-style-span"&gt;début et de la &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;fin&lt;/span&gt; &lt;/span&gt;de la requête&lt;/b&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;=&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;"SELECT FrenchProductName, COUNT(*) Rank "+&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;"FROM "+&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;"("+&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;...&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;")"+&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;"AS T "+&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;"GROUP BY ProductKey, FrenchProductName "+&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;"ORDER BY COUNT(*) DESC, FrenchProductName ASC"&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Entre chaque élément contenu dans le paramètre Recherche, on va&lt;span class="Apple-style-span"&gt;&lt;b&gt; &lt;span class="Apple-style-span"&gt;intercaler du SQL&lt;/span&gt;&lt;/b&gt; suffisant à générer l'ensemble de requête UNION&lt;/span&gt; visibles au dessus. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Join&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Parameters!Recherche.Value,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;"%' "+&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;"UNION ALL "+&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;"SELECT ProductKey,FrenchProductName "+&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;"FROM AdventureWorksDW2008..DimProduct "+&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;"WHERE FrenchProductName LIKE '%"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ne reste plus qu'à rajouter le code SQL suffisant à &lt;b&gt;traiter le premier et le dernier&lt;/b&gt; élément de la liste et on a le résultat final:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border-bottom-color: rgb(204, 204, 204); border-bottom-width: 1px; border-bottom-style: dashed; text-align: left; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: dashed; padding-bottom: 0px; padding-left: 0px; width: 99%; padding-right: 0px; background-image: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(240, 240, 240); height: auto; overflow-x: auto; overflow-y: auto; border-top-color: rgb(204, 204, 204); border-top-width: 1px; border-top-style: dashed; border-right-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: dashed; padding-top: 0px; "&gt;&lt;code style="word-wrap: normal; "&gt;="SELECT FrenchProductName, COUNT(*) Rank "+&lt;br /&gt;"FROM "+&lt;br /&gt;"("+&lt;br /&gt;"SELECT ProductKey, FrenchProductName "+&lt;br /&gt;"FROM AdventureWorksDW2008..DimProduct "+&lt;br /&gt;"WHERE FrenchProductName LIKE '%"+&lt;br /&gt;Join&lt;br /&gt;(&lt;br /&gt;Parameters!Recherche.Value,&lt;br /&gt;"%' "+&lt;br /&gt;"UNION ALL "+&lt;br /&gt;"SELECT ProductKey,FrenchProductName "+&lt;br /&gt;"FROM AdventureWorksDW2008..DimProduct "+&lt;br /&gt;"WHERE FrenchProductName LIKE '%"&lt;br /&gt;)+&lt;br /&gt;"%') AS T "+&lt;br /&gt;"GROUP BY ProductKey, FrenchProductName "+&lt;br /&gt;"ORDER BY COUNT(*) DESC, FrenchProductName ASC"&lt;/code&gt;&lt;/pre&gt;Une fois l'expression définie comme requête du DataSet on peut la &lt;b&gt;tester&lt;/b&gt;, par exemple en la donnant comme source d'un paramètre:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-MXhTLxSWayE/TZNJ5DCXwrI/AAAAAAAAAoo/UXd4I1UNiZM/s1600/Sans%2Btitre.PNG" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://1.bp.blogspot.com/-MXhTLxSWayE/TZNJ5DCXwrI/AAAAAAAAAoo/UXd4I1UNiZM/s400/Sans%2Btitre.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5589892806913540786" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 100px; " /&gt;&lt;/a&gt;Voilà, à bientôt!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-2001076365593584968?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/2001076365593584968/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=2001076365593584968' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/2001076365593584968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/2001076365593584968'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2011/03/ssrs-un-parametre-pour-rechercher-en.html' title='[SSRS] Un paramètre pour rechercher... en SQL'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-JX_rEXE-vHA/TZM-5PTtv4I/AAAAAAAAAog/h9-N2fRBblc/s72-c/FX.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-4758855894568347845</id><published>2011-03-29T20:47:00.001+02:00</published><updated>2011-03-30T17:50:49.266+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reporting Services'/><category scheme='http://www.blogger.com/atom/ns#' term='MDX'/><title type='text'>[SSRS] Traitement des hiérarchies Ragged dans le Query Designer de RS</title><content type='html'>&lt;div style="text-align: left;"&gt;Le &lt;b&gt;Query Designer&lt;/b&gt; de &lt;b&gt;Reporting Services &lt;/b&gt;pour la partie MDX a une particularité sympathique que vous avez peut être déjà remarqué si vous ou vos utilisateurs utilisez Report Builder.&lt;/div&gt;&lt;div&gt;Il gère l'utilisation des hiérarchies Ragged &lt;b&gt;n'importe comment. &lt;/b&gt;Et je me suis rappellé de ça hier soir en faisant une démo.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pour rappel une hiérarchie &lt;i&gt;ragged &lt;/i&gt;est une manière de gérer des hiérarchies déséquilibrées (ou la distance entre (All) et le membre le plus fin d'une branche n'est pas constante: cas typique des employés d'une entreprise...) avec une hiérarchie utilisateur "classique" (et non une Parent Child) principalement pour améliorer les perfs et contourner la &lt;a href="http://fjehl.blogspot.com/2009/12/ssas-rehabilitation-des-parentchild-ou.html"&gt;relative mauvaise gestion des P/C par SSAS&lt;/a&gt;. On utilise pour ça la propriété &lt;b&gt;HideMemberIf &lt;/b&gt;sur les niveaux de la hiérarchie utilisateur pour cacher des niveaux superflus.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Une fois réglé les problèmes connus (on borde par le bas, i.e. pour que ça marche les niveau "à vide" devront être vers le bas et non pas au milieu de la hiérarchie, cf &lt;a href="http://cwebbbi.wordpress.com/2009/11/11/ragged-hierarchies-hidememberif-and-mdx-compatibility/"&gt;ce post de Chris Webb&lt;/a&gt;)  on est tous contents: ça marche dans &lt;b&gt;Excel&lt;/b&gt;, dans les &lt;b&gt;OWC &lt;/b&gt;(BIDS + SSMS) et dans Reporting Services... voir ci dessous, sans commentaires:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://3.bp.blogspot.com/-96SqX7ikNtY/TZL1hYhF1gI/AAAAAAAAAoQ/yZ6fiuj7KdQ/s400/Avant.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5589800041385940482" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 150px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;Pour information ici j'ai projeté une Ragged de 6 niveaux créée en &lt;b&gt;HideMemberIf=ParentName&lt;/b&gt;, ainsi qu'une mesure de base, et j'ai filtré avec un attribut qui stocke le niveau (i.e. la distance au membre (All)) pour ne prendre en compte que les membres jusqu'au niveau 5, donc pas le niveau fin.&lt;div&gt;Et ça ne me renvoie &lt;b&gt;rien&lt;/b&gt;: alors que je vous assure, j'ai des données.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Alors pourquoi?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Tout simplement parce que ce Query Designer est stupide à souhait. Désolé de le dire mais c'est le cas. Si je fais rapidement une analyse de ce qu'il me projette en lignes je verrais que c'est ce set là:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; { ([Organisation].[Hiérarchie Organisations].[Niveau 6].ALLMEMBERS ) } &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Or effectivement, je n'ai pas de membres niveau 6. Si j'écrivais ce MDX, dans le but de projeter tous les membres de toute une hiérarchie j'écrirais quelque chose de la sorte:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; { ([Organisation].[Hiérarchie Organisations].ALLMEMBERS ) } &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Puisque je n'ai jamais demandé de me filtrer uniquement les membres du Niveau 6. Bref en éditant le MDX je récupère ce que je veux , des (null) aux niveaux non renseignés. Au passage le NON EMPTY m'enlève le niveau 6 (cf mon filtrage plus haut).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://4.bp.blogspot.com/-pvx7IYV8i2M/TZL6SytU64I/AAAAAAAAAoY/ii44nW3SLvM/s400/Apr%25C3%25A8s.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5589805288276683650" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 57px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Donc je dois faire écrire du MDX à mes utilisateurs dans Report Builder?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Hmmm. Autant vous dire tout de suite que ça pourrait être une solution immédiate mais que ce n'est pas forcément celle que je vous recommande :).&lt;/div&gt;&lt;div&gt;L'investissement en formation serait à mon avis un poil disproportionné. Comme ça je vois une solution utilisable dans le designer: &lt;b&gt;rendre les niveaux de la hiérarchie utilisateur visibles&lt;/b&gt;. &lt;/div&gt;&lt;div&gt;Dès lors il suffit de notifier aux utilisateurs que ce sont ces hiérarchies d'attributs qui doivent être utilisées dans ce type de cas pour afficher les niveaux par CrossJoin, la précédente hiérarchie étant alors &lt;b&gt;utilisée uniquement comme filtre. &lt;/b&gt;Problème: avec mes 6 niveaux cela risque rapidement de hurler. L'utilisateur n'aime pas trop enchaîner les glisser-déposer.&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Si vous avez une suggestion, n'hésitez pas à la donner, je suis preneur.&lt;/div&gt;&lt;div&gt;Bonne journée!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PS: Vous avez le droit de voter pour corriger cela, sur &lt;a href="http://connect.microsoft.com/SQLServer/feedback/details/543726/analysis-services-2008-ragged-hierarchy-in-reporting-services-2008-doesnt-work"&gt;Connect&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-4758855894568347845?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/4758855894568347845/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=4758855894568347845' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/4758855894568347845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/4758855894568347845'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2011/03/ssrs-traitement-des-hierarchies-ragged.html' title='[SSRS] Traitement des hiérarchies Ragged dans le Query Designer de RS'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-96SqX7ikNtY/TZL1hYhF1gI/AAAAAAAAAoQ/yZ6fiuj7KdQ/s72-c/Avant.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-8389558502383993115</id><published>2011-03-18T15:14:00.006+01:00</published><updated>2011-04-01T17:16:58.601+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conférences'/><title type='text'>[TD 2011] Les webcasts</title><content type='html'>Les &lt;strong&gt;webcasts des TechDays 2011&lt;/strong&gt; sont disponibles sur &lt;a href="http://www.microsoft.com/france/mstechdays/showcase/default.aspx"&gt;le site.&lt;/a&gt;&lt;br /&gt;En ce qui concerne &lt;strong&gt;notre session avec Romuald,&lt;/strong&gt; &lt;em&gt;Exploiter Analysis Services au maximum de son potentiel, &lt;/em&gt;vous pouvez la regarder ci-dessous, télécharger la &lt;a href="http://www.microsoft.com/france/core/redirect/redirect.aspx?rid=1&amp;amp;wizardid=dc712368-010a-4972-a9dc-ebbabfa3e0ff&amp;amp;lcid=1036&amp;amp;fu=http://download.microsoft.com/documents/France/TechDays/2011/DBI301.pptx"&gt;présentation PowerPoint&lt;/a&gt;, ou aller la visualiser sur sa &lt;a href="http://www.microsoft.com/france/mstechdays/showcase/player.aspx?uuid=4f16db32-935b-4b39-9cd2-b65a5e9379b4&amp;amp;parcours=TD11_EFFICACITE_BI"&gt;page d'origine&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="640" height="360"&gt;&lt;br /&gt;           &lt;param name="source" value="http://www.microsoft.com/showcase/silverlight/player/1/player-fr.xap"&gt;&lt;br /&gt;           &lt;param name="enableHtmlAccess" value="true"&gt;    &lt;br /&gt;           &lt;param name="background" value="#FF000000"&gt;&lt;br /&gt;           &lt;param name="allowHtmlPopupwindow" value="true"&gt;&lt;br /&gt;           &lt;param name="minRuntimeVersion" value="4.0.50401.0"&gt;&lt;br /&gt;           &lt;param name="autoUpgrade" value="true"&gt;&lt;br /&gt;           &lt;param name="initParams" value="Culture=fr-FR,Uuid=4f16db32-935b-4b39-9cd2-b65a5e9379b4,Autoplay=false,ShowMarketingOverlay=true,MiscControls=FullScreen;Detached,ShowMenu=True,Tabs=Embed;Email;Share;Info,VideoUrl=http://microsoft.com/showcase/fr/fr/details/4f16db32-935b-4b39-9cd2-b65a5e9379b4,Mode=Player"&gt;&lt;br /&gt;           &lt;a href="http://go.microsoft.com/fwlink/?LinkID=149156" style="text-decoration: none;" onmousedown="javascript:new Image().src = 'http://m.webtrends.com/dcsygm2gb10000kf9xm7kfvub_9p1t/dcs.gif?dcsdat=' + new Date().getTime() + '&amp;amp;dcssip=www.microsoft.com&amp;amp;dcsuri=' + window.location.href + '&amp;amp;WT.tz=-8&amp;amp;WT.bh=16&amp;amp;WT.ul=fr-FR&amp;amp;WT.cd=32&amp;amp;WT.jo=Yes&amp;amp;WT.ti=&amp;amp;WT.js=Yes&amp;amp;WT.jv=1.5&amp;amp;WT.fi=Yes&amp;amp;WT.fv=10.0&amp;amp;WT.sli=Not%20Installed&amp;amp;WT.slv=Version%20Unavailable&amp;amp;WT.dl=1&amp;amp;WT.seg_1=Not%20Logged%20In&amp;amp;WT.vt_f_a=2&amp;amp;WT.vt_f=2&amp;amp;WT.vt_nvr1=2&amp;amp;WT.vt_nvr2=2&amp;amp;WT.vt_nvr3=2&amp;amp;WT.vt_nvr4=2&amp;amp;vp_site=Embedded&amp;amp;wtEvtSrc=' + window.location.href + '&amp;amp;vp_sli=Embedded'"&gt;&lt;br /&gt;           &lt;img src="http://img.microsoft.com/showcase/Content/img/resx/fr-FR/installSL.gif" alt="Get Microsoft Silverlight" style="border-style: none" /&gt;&lt;br /&gt;           &lt;/a&gt;&lt;br /&gt;           &lt;noscript&gt;&lt;div&gt;&lt;img alt="DCSIMG" id="DCSIMG" width="1" height="1" src="http://m.webtrends.com/dcsygm2gb10000kf9xm7kfvub_9p1t/njs.gif?dcsuri=/nojavascript&amp;amp;WT.js=No" /&gt;&lt;/div&gt;&lt;/noscript&gt;&lt;br /&gt;           &lt;/object&gt;&lt;br /&gt;&lt;br /&gt;A bientôt!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-8389558502383993115?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/8389558502383993115/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=8389558502383993115' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/8389558502383993115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/8389558502383993115'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2011/03/td-2011-les-webcasts.html' title='[TD 2011] Les webcasts'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-303512555107176632</id><published>2011-03-09T20:47:00.007+01:00</published><updated>2011-04-01T17:17:19.526+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='StreamInsight'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration Services'/><title type='text'>CEP vs ETL, StreamInsight et SSIS dans la BI</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://3.bp.blogspot.com/-u_P79cqLCxc/TXjbyh9-SzI/AAAAAAAAAoA/A0DHww6Zmbg/s1600/472782025_e106c6b530.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/-u_P79cqLCxc/TXjbyh9-SzI/AAAAAAAAAoA/A0DHww6Zmbg/s400/472782025_e106c6b530.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5582453399283977010" /&gt;&lt;/a&gt;&lt;br /&gt;Je suis de retour du &lt;b&gt;MVP Summit&lt;/b&gt; (avec un très bel event au Safeco Field de Seattle que vous voyez ici) et à nouveau chez mon client préféré! Hormis vous dire que ce que nous avons appris augure de bien belles choses sur &lt;b&gt;SQL Server Denali &lt;/b&gt;en général, et sur ses modules BI en particulier, ne comptez pas trop sur moi pour aller plus loin dans les détails car j'ai signé un NDA avec mon sang...&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Par contre plus sérieusement j'ai été pas mal intéressé là bas par les scénarios de convergence des différents produits sortis ou à venir. Il est vrai qu'après une grosse phase de simplification marketing autour de briques bien identifiées (SQL Server 2005), l&lt;b&gt;'offre BI à l'horizon Denali&lt;/b&gt; devient de plus en plus complexe à lire pour nos chers clients et utilisateurs. Par conséquent la recherche à minima de convergences entre les différents modules est un sujet intéressant. &lt;/div&gt;&lt;div&gt;Intéressant techniquement pour adresser plus de problématiques, intéressant pédagogiquement car c'est de notre faculté à &lt;b&gt;rendre cette offre  lisible&lt;/b&gt; que dépendra en grande partie l'adoption des ces produits.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Le positionnement du &lt;b&gt;CEP StreamInsight&lt;/b&gt; par rapport à l'&lt;b&gt;ETL SSIS&lt;/b&gt; est un bon exemple de cela.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;ETL et CEP dans la BI&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Un &lt;b&gt;ETL &lt;/b&gt;(Extract Transform Load) comme SSIS est le produit traditionnellement utilisé pour &lt;b&gt;charger &lt;/b&gt;les entrepôts de données ou data warehouses. Orienté &lt;b&gt;batch &lt;/b&gt;(ensemble de traitements bien identifiés) et planifié à une certaine fréquence, il est utilisé pour aller chercher les données dans les bases opérationnelles, et les amener dans les bases d'analyse, non sans leur avoir appliqué un nombre généralement considérable de vérifications, aggrégations, filtrages et autres consolidations.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Depuis quelques années et l'avènement du "mythe" (entre guillemets car il devient petit à petit réalité) des entrepôts de données (near)&lt;i&gt;real-time&lt;/i&gt; ou&lt;i&gt; zero-latency &lt;/i&gt;illustré côté Microsoft par des features telles que le Proactive Caching dans SSAS (pour ne citer que lui), on parle d'une supplantation des ETL par des &lt;b&gt;CEP&lt;/b&gt;, des moteurs de Gestion d'Evenements Complexes (&lt;i&gt;Complex Event Processing&lt;/i&gt;). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Un CEP est &lt;b&gt;un moteur d'analyse de flux (souvent) constants &lt;/b&gt;de données, à la recherche de singularités, ou simplement à des fins d'aggrégation.&lt;/div&gt;&lt;div&gt;&lt;b&gt;StreamInsight&lt;/b&gt;, sorti avec SQL Server 2008 R2 est le CEP de SQL Server, il s'agit d'un moteur utilisable en .NET dont les règles de traitement et d’agrégation et l'expression de KPI s'écrivent par des requêtes &lt;b&gt;Linq &lt;/b&gt;sur les flux entrants, donnant des possibilités quasi infinies en terme de transformations, le tout en temps réel. Le pas est vite franchi pour certains oracles du décisionnel: ils prédisent que les ETL et les bases temporaires feront bientôt partie du &lt;b&gt;passé.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Remplacer SSIS par StreamInsight dans l'alimentation d'entrepôts?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Soyons brefs: à date et sauf pour des ultra particuliers, il n'en est évidemment pas question, en tous les cas aujourd'hui, et ce pour plusieurs raisons:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1) &lt;u&gt;Pas de composants spécialisés ETL&lt;/u&gt;: StreamInsight pour le développeur est un &lt;b&gt;framework&lt;/b&gt;: les composants de DataFlow que l'on est amenés à utiliser en ETL avec SSIS seraient à recoder, ainsi que les interfaces d'entrée, de sortie...&lt;/div&gt;&lt;div&gt;2) &lt;u&gt;Trop orienté développeur&lt;/u&gt;: utiliser StreamInsight à la place de SSIS aujourd'hui est aussi aisé que d'utiliser SSIS uniquement par le biais de son API de génération de packages... Disons pas aussi &lt;b&gt;simple &lt;/b&gt;qu'avec un designer graphique.&lt;/div&gt;&lt;div&gt;3) &lt;u&gt;Administration limitée&lt;/u&gt;: là encore les fonctionnalités out-of-the-box de StreamInsight sont restreintes car répétons-le ce n'est pas son usage premier: un CEP doit traiter des données en masse et peut se permettre des erreurs: un entrepôt contient la &lt;b&gt;version corporate de la "vérité"&lt;/b&gt;: il n'y a pas de droit à l'erreur la supervision doit être facile et les erreurs aisément traçables.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Au bilan je ne crois pas que sauf pour des tables de faits spécifiques, ou des entrepôts dédiés à la latence zéro on n'assiste avant quelque temps à la gestion de l'ETL sous SI. En revanche Microsoft est tout à fait conscient de l'intérêt suscité par certaines potentialités de StreamInsight pour les développeurs ETL...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Avant la fusion, des scénarios de convergence...&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;img src="http://3.bp.blogspot.com/-E0rX7TdsWF0/TX8qvYN0NcI/AAAAAAAAAoI/LnPjXfWCFB8/s400/Potara.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5584229056405321154" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 200px;  " /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;StreamInsight permet en effet de requêter des flux en Linq: quelle puissance cela donnerait de pouvoir faire les mêmes requêtes sur des &lt;b&gt;PipelineBuffer&lt;/b&gt;, ce qui revient en effet à embarquer un moteur StreamInsight dans SSIS.&lt;/div&gt;&lt;div&gt;A l'inverse, pour adresser l'absence de composants dans StreamInsight ou pourrait nourrir des lots SSIS à partir de données issues de &lt;b&gt;CepStream&lt;/b&gt;, scénario inverse ici puisque cela revient à embarquer un lot SSIS dans un flux StreamInsight.&lt;/div&gt;&lt;div&gt;&lt;b&gt;Ping Wang&lt;/b&gt; et&lt;b&gt; Wee Hyong Tok&lt;/b&gt; des équipes StreamInsight et SSIS ont écrit un WhitePaper inspiré comme souvent de retours clients sur ce type d'usages de ces deux produits couplés: vous pouvez le trouver &lt;a href="http://download.microsoft.com/download/B/E/1/BE1AABB3-6ED8-4C3C-AF91-448AB733B1AF/SQL_Server_Integration_Services_and_StreamInsight_Together.docx"&gt;ici&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En espérant avoir clarifié quelques points et vous avoir donné quelques idées.&lt;/div&gt;&lt;div&gt;A bientôt!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-303512555107176632?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/303512555107176632/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=303512555107176632' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/303512555107176632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/303512555107176632'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2011/03/cep-vs-etl-streaminsight-et-ssis-dans.html' title='CEP vs ETL, StreamInsight et SSIS dans la BI'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-u_P79cqLCxc/TXjbyh9-SzI/AAAAAAAAAoA/A0DHww6Zmbg/s72-c/472782025_e106c6b530.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-3290365945577585537</id><published>2011-02-11T11:47:00.006+01:00</published><updated>2011-04-01T17:17:33.568+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conférences'/><title type='text'>[TechDays 2011] Merci!</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/-kO3DGoU0fEo/TVUWCMS0-iI/AAAAAAAAAn4/ywYCwW6tDuU/s1600/45555.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 184px;" src="http://4.bp.blogspot.com/-kO3DGoU0fEo/TVUWCMS0-iI/AAAAAAAAAn4/ywYCwW6tDuU/s400/45555.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5572384340856601122" /&gt;&lt;/a&gt;Encore une fois merci à tous ceux (très nombreux) qui sont venus nous voir en session aux &lt;b&gt;TechDays &lt;/b&gt;cette année avec mon collègue &lt;b&gt;Romuald Coutaud!&lt;/b&gt;&lt;div&gt;Comme toujours beaucoup de questions très intéressantes, d'échanges de points de vues enrichissants... Vivement l'année prochaine!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Je mettrai très prochainement sur mon &lt;a href="http://cid-a23884c7072e2532.office.live.com/browse.aspx/Public"&gt;SkyDrive &lt;/a&gt;les exemples abordés en démonstration, n'hésitez pas à venir jeter un coup d'oeil de temps en temps! &lt;/div&gt;&lt;div&gt;En plus de tous les participants, je voulais remercier encore une fois &lt;b&gt;Access IT IDF&lt;/b&gt; qui nous a soutenus et conseillés pendant la préparation, ainsi que l'équipe&lt;b&gt; SQL Server&lt;/b&gt; et &lt;b&gt;Application Platform&lt;/b&gt; de Microsoft pour leur support et leurs retours sur la session, ainsi que leur très gentil accueil pendant ma petite journée &lt;b&gt;d'ATE &lt;/b&gt;sur le stand SQL avec &lt;a href="http://blog.djeepy1.net/"&gt;Jean-Pierre Riehl&lt;/a&gt; :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-3290365945577585537?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/3290365945577585537/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=3290365945577585537' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3290365945577585537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3290365945577585537'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2011/02/techdays-2011-merci.html' title='[TechDays 2011] Merci!'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-kO3DGoU0fEo/TVUWCMS0-iI/AAAAAAAAAn4/ywYCwW6tDuU/s72-c/45555.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-340361396320366872</id><published>2011-02-11T11:34:00.004+01:00</published><updated>2011-04-01T17:17:46.477+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Integration Services'/><title type='text'>[SSIS] Concaténer les valeurs d'une ligne de données</title><content type='html'>Petit besoin intéressant: vouloir reproduire le fonctionnement des sources de Data Flow en &lt;b&gt;concaténant les valeurs de toutes les colonnes&lt;/b&gt; d'une ligne de Pipeline dans une &lt;b&gt;colonne unique&lt;/b&gt; (à des fins de log par exemple, pour tout mettre dans une seule table SQL).&lt;div&gt;&lt;br /&gt;&lt;div&gt;La technique n'est pas très compliquée, il suffit de savoir comment s'y prendre au départ.&lt;/div&gt;&lt;div&gt;Tout d'abord il faut que le composant soit &lt;b&gt;dynamique&lt;/b&gt;: cela veut dire que le script doit marcher pour &lt;b&gt;tout buffer d'entrée&lt;/b&gt;. Cela élimine immédiatement la méthode &lt;i&gt;ProcessInputRow(ScriptBuffer)&lt;/i&gt; au détriment de &lt;i&gt;ProcessInput(PipelineBuffer).&lt;/i&gt; Il est en effet impossible d'accéder à une ligne d'un &lt;b&gt;ScriptBuffer &lt;/b&gt;via une méthode générique, il faut utiliser des accesseurs qui portent le nom de la colonne, que par essence on ne connaît pas (et j'annonce: la &lt;b&gt;Reflection &lt;/b&gt;n'est pas une option ici, même si la première fois que j'ai codé ce script je l'ai fait comme ça...).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Donc pour travailler avec un PipelineBuffer il faut connaître l'index de la colonne à récupérer: bonne pioche, le Script Component bénéficie d'une méthode GetColumnIndexes() qui renvoie les indexes des colonnes d'un Input100 ou Output100. Une fois ces indexes récupérés, on a plus qu'à concaténer avec un StringBuilder.&lt;/div&gt;&lt;div&gt;Le code (simplissime) est ci-dessous (à noter que je n'ai qu'une seule colonne dans mon Output100: ma valeur de concaténation).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre style="border-bottom-color: rgb(204, 204, 204); border-bottom-width: 1px; border-bottom-style: dashed; text-align: left; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: dashed; padding-bottom: 0px; padding-left: 0px; width: 99%; padding-right: 0px; background-image: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(240, 240, 240); height: auto; overflow-x: auto; overflow-y: auto; border-top-color: rgb(204, 204, 204); border-top-width: 1px; border-top-style: dashed; border-right-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: dashed; padding-top: 0px; "&gt;&lt;code style="word-wrap: normal; "&gt;public class ScriptMain : UserComponent&lt;br /&gt;{&lt;br /&gt;private int[] columnIndexes;&lt;br /&gt;private int outputColumnIndex;&lt;br /&gt;public override void PreExecute()&lt;br /&gt;{&lt;br /&gt;    base.PreExecute();&lt;br /&gt;    columnIndexes = this.GetColumnIndexes(this.ComponentMetaData.InputCollection[0].ID);&lt;br /&gt;    outputColumnIndex = this.GetColumnIndexes(this.ComponentMetaData.OutputCollection[0].ID)[0];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private string RowConcat(PipelineBuffer b, int[] columnIndexes, char separator)&lt;br /&gt;{&lt;br /&gt;    StringBuilder sb = new StringBuilder();&lt;br /&gt;    foreach (int columnIndex in columnIndexes)&lt;br /&gt;    {&lt;br /&gt;        if (b[columnIndex] != null)&lt;br /&gt;            sb.Append(b[columnIndex].ToString());&lt;br /&gt;        sb.Append(separator);&lt;br /&gt;    }&lt;br /&gt;    return sb.ToString();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public override void ProcessInput(int InputID, PipelineBuffer Buffer)&lt;br /&gt;{&lt;br /&gt;    while (Buffer.NextRow())&lt;br /&gt;    {&lt;br /&gt;        Buffer.SetString(outputColumnIndex, RowConcat(Buffer,columnIndexes,';'));&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-340361396320366872?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/340361396320366872/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=340361396320366872' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/340361396320366872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/340361396320366872'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2011/02/ssis-concatener-les-valeurs-dune-ligne.html' title='[SSIS] Concaténer les valeurs d&apos;une ligne de données'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-6883767509132031196</id><published>2011-01-06T10:34:00.006+01:00</published><updated>2011-04-01T17:18:39.491+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annonces/Releases'/><category scheme='http://www.blogger.com/atom/ns#' term='Conférences'/><title type='text'>[TD 2011] Les TechDays c'est parti!</title><content type='html'>&lt;div style="text-align: left;"&gt;Dernière ligne droite pour les &lt;b&gt;TechDays 2011&lt;/b&gt;, qui auront lieu du 8 au 10 février au traditionnel Palais des Congrès. Vous pouvez déjà depuis quelques jours vous inscrire sur le&lt;a href="http://www.microsoft.com/france/mstechdays/"&gt; site dédié&lt;/a&gt; avec l'identifiant Live qui va bien.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/TSWQ3XRbbwI/AAAAAAAAAnk/B4xBWYXa7k4/s400/Sans%2Btitre.PNG" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 340px; height: 91px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5559008595873066754" /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;J'aurais le plaisir de vous y retrouver sur le stand &lt;b&gt;Access IT&lt;/b&gt;, mais aussi en &lt;b&gt;session&lt;/b&gt;: avec &lt;b&gt;Romuald Coutaud&lt;/b&gt; mon éminent - que dis-je extraordinaire - collègue, nous aurons le plaisir de vous présenter une session sur les usages avancés d'Analysis Services. Dit autrement nous présenterons les fonctionnalités que tout les développeurs et administrateurs ne connaissent pas forcément, mais qui font d'un projet AS bien plus qu'un simple TCD sous Excel: les assignments, les dimensions techniques, les actions, les traductions, le Proactive Caching, la gestion des aggrégations... et bien d'autres choses encore, articulé autour de retours d'expérience et d'exemples concrets. C'est la session &lt;b&gt;DBI301 &lt;/b&gt;intitulée &lt;b&gt;"Exploiter SQL Server Analysis Services au maximum de son potentiel".&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Au niveau des autres sessions BI, je retiendrai particulièrement celle de &lt;a href="http://www.gaelduhamel.fr/"&gt;Gaël Duhamel&lt;/a&gt; sur du &lt;b&gt;Data Mining &lt;/b&gt;articulé a priori autour de &lt;b&gt;Commerce Server&lt;/b&gt;, connaissant ses dernières publications et sa spécialisation. L'articulation du mining d'AS dans CS est un sujet qui m'intéresse et que je n'ai jamais vraiment eu le temps de creuser.&lt;/div&gt;&lt;div&gt;A voir aussi la session de &lt;b&gt;Reporting Services dans Azure&lt;/b&gt;, là aussi une chose qui risque d'exploser dans l'année, et qui fait partie de la tête de gondole des priorités de MS dans la BI.&lt;/div&gt;&lt;div&gt;Je n'oublierai pas mon ancien collègue &lt;a href="http://aurelien-koppel-pps.blogspot.com/"&gt;Aurélien Koppel&lt;/a&gt;, qui présente un scénario de &lt;b&gt;PowerPivot dans Sharepoint,&lt;/b&gt; sujet là aussi intéressant dans la mesure ou je n'y ai pas touché depuis les CTP de Kilimandjaro et que je n'ai pas eu le plaisir de le voir en projet.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Je ne vais pas lister toutes les sessions ici, je vous laisse fureter sur le site: vous verrez que comme chaque année un grand nombre de thématiques sont abordées, et qu'il va être dur de faire un choix.&lt;/div&gt;&lt;div&gt;J'espère en tous les cas vous retrouver là bas cette année encore!&lt;/div&gt;&lt;div&gt;A bientôt!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-6883767509132031196?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/6883767509132031196/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=6883767509132031196' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/6883767509132031196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/6883767509132031196'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2011/01/td-2011-les-techdys-cest-parti.html' title='[TD 2011] Les TechDays c&apos;est parti!'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kbsOT_Eyf_M/TSWQ3XRbbwI/AAAAAAAAAnk/B4xBWYXa7k4/s72-c/Sans%2Btitre.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-3623062657920535097</id><published>2011-01-06T10:30:00.004+01:00</published><updated>2011-04-01T17:18:26.657+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annonces/Releases'/><title type='text'>Donald Farmer quitte Microsoft</title><content type='html'>&lt;div style="text-align: left;"&gt;La &lt;a href="http://donalddotfarmer.com/2011/01/05/a-new-beginning/"&gt;news &lt;/a&gt;est tombé sur son blog et a été reprise par &lt;a href="http://www.decideo.fr/Donald-Farmer-quitte-Microsoft-pour-QlikTech_a4018.html"&gt;Décidéo&lt;/a&gt;, &lt;b&gt;Donald Farmer&lt;/b&gt;, un des principaux artisans d'Analysis Services depuis la 10 ans quitte &lt;b&gt;Microsoft &lt;/b&gt;pour... QlikTech pour exercer le job d'évangéliste sur &lt;b&gt;QlikView&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://3.bp.blogspot.com/_kbsOT_Eyf_M/TSWbzWHyPOI/AAAAAAAAAns/Utf9NoooIGI/s400/DonaldFarmer.jpg" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 159px; ;" border="0" alt="" id="BLOGGER_PHOTO_ID_5559020621472611554" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;De la part du penseur de &lt;b&gt;PowerPivot &lt;/b&gt;rien de très révolutionnaire, il précise d'ailleurs que la raison de son départ n'est pas technologique, mais plus liée à son besoin de structures plus petites, avec moins de pression.&lt;div&gt;Après &lt;b&gt;Mosha &lt;/b&gt;c'est une autre page qui se tourne sur AS...&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-3623062657920535097?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/3623062657920535097/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=3623062657920535097' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3623062657920535097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3623062657920535097'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2011/01/donald-farmer-quitte-microsoft.html' title='Donald Farmer quitte Microsoft'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kbsOT_Eyf_M/TSWbzWHyPOI/AAAAAAAAAns/Utf9NoooIGI/s72-c/DonaldFarmer.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-9069833203459112388</id><published>2011-01-01T19:27:00.003+01:00</published><updated>2011-04-01T17:18:00.785+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Autres'/><title type='text'>Bonne année 2011</title><content type='html'>Je vous souhaite à tous une excellente année 2011. En espérant qu'elle soit aussi riche pour le sujet qui nous intéresse qu'espéré, avec les previews puis les releases à venir de Crescent et de BISM au sein de SQL Server Denali (11).&lt;div&gt;Merci encore à ceux qui prennent le temps de lire ce blog, je penserai à vous cette année!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-9069833203459112388?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/9069833203459112388/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=9069833203459112388' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/9069833203459112388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/9069833203459112388'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2011/01/bonne-annee-2011.html' title='Bonne année 2011'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-1247814450119354071</id><published>2010-12-02T15:55:00.007+01:00</published><updated>2011-04-01T17:16:35.781+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MDX'/><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services'/><title type='text'>[SSAS] Une dimension tranches d'âge ou comment jouer avec le temps en MDX</title><content type='html'>Je ne sais pas si vous avez déjà eu envie de gérer une dimension de &lt;b&gt;tranches &lt;/b&gt;d'âges (ou d'une quelconque &lt;b&gt;durée&lt;/b&gt;) sous SSAS. Intuitivement ce n'est pas très simple car cela fait partie des choses qui doivent être gérées en pur MDX, a fortiori dans un domaine (les dates) ou la moindre erreur peut transformer la requête en gouffre à performances.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Alors voici une petite méthode éprouvée. Encore une fois il ne s'agit pas là de la solution (je suis un garçon assez modeste :) ) mais d'une manière de faire qui me donne toute satisfaction. Je suis bien sur ouvert à toute suggestion d'amélioration.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Première étape: créer sa table de base&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Personnellement je la crée dans la DSV: c'est une table technique qui a mon sens n'a pas grand chose à faire dans mon beau Data Mart (mais elle pourrait y être si le coeur vous en dit).&lt;/div&gt;&lt;div&gt;Sa structure est simple: un code/libellé de tranche, ainsi que deux attributs entiers supplémentaires, les bornes inférieures et supérieures de l'intervalle.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Voici la requête de construction, basée sur le beau TABLE VALUE CONSTRUCTOR de SQL Server 2008:&lt;/div&gt;&lt;div&gt;&lt;pre style="BORDER-BOTTOM: rgb(204,204,204) 1px dashed; TEXT-ALIGN: left; BORDER-LEFT: rgb(204,204,204) 1px dashed; PADDING-BOTTOM: 0px; LINE-HEIGHT: 20px; PADDING-LEFT: 0px; WIDTH: 99%; PADDING-RIGHT: 0px; FONT-FAMILY: arial; BACKGROUND: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) rgb(240,240,240); HEIGHT: auto; COLOR: rgb(0,0,0); FONT-SIZE: 12px; OVERFLOW: auto; BORDER-TOP: rgb(204,204,204) 1px dashed; BORDER-RIGHT: rgb(204,204,204) 1px dashed; PADDING-TOP: 0px; -moz-background-inline-policy: continuous; -moz-background-clip: border; -moz-background-origin: padding"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;&lt;br /&gt;SELECT * FROM&lt;br /&gt;(&lt;br /&gt;VALUES&lt;br /&gt;(1, '0 - 24 ans', 0, 24),&lt;br /&gt;(2, '25 - 29 ans', 25, 29),&lt;br /&gt;(3, '30 - 34 ans', 30, 34),&lt;br /&gt;(4, '35 - 39 ans', 35, 39),&lt;br /&gt;(5, '40 - 44 ans', 40, 44),&lt;br /&gt;(6, '45 - 49 ans', 45, 49),&lt;br /&gt;(7, '50 - 54 ans', 50, 54),&lt;br /&gt;(8, '55 - 59 ans', 55, 59),&lt;br /&gt;(9, '60 ans +', 60, 70)&lt;br /&gt;) AS t (TrancheAgeId, TrancheAgeLabel, BorneInf, BorneSup)&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;Comme vous le voyez rien de rare.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Seconde étape: a little MDX&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Dans mon cas mon cube est assez simple: j'ai une&lt;b&gt; dimension temps en usage classique&lt;/b&gt; (qui référence mon fait) et une &lt;b&gt;dimension temps référencée&lt;/b&gt; qui jour le rôle de dimension "Date de naissance". Les deux ont même structure (si vous connaissez &lt;b&gt;LinkMember&lt;/b&gt;, ceci a évidemment un intérêt non négligeable). Ma dimension tranche d'âge est ajoutée aux CubeDimensions mais &lt;b&gt;sans usage&lt;/b&gt;, c'est ce que nous appelons une dimension technique (comme le DateTool de Marco Russo par exemple).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Comme je n'aime pas taper des kilomètres de MDX, j'ai essayé de compacter un brin la définition de cette joyeuseté d'assignment.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Le but est pour chaque Tranche d'âge &lt;b&gt;d'aggréger &lt;/b&gt;la mesure courante (Aggregate) sur l'intervalle de la tranche d'âge en cours, en prenant bien soin de forcer le set sur lequel on aggrège sur le DefaultMember des tranches d'age (au moment de l'assignment, les tranches sont à null sauf la tranche par défaut (All) qui comprend les données: si on ne spécifie pas cela, le CurrentMember sur le set à aggréger se positionne sur la tranche en cours, qui n'a pas de données).&lt;/div&gt;&lt;div&gt;&lt;pre style="border-bottom-color: rgb(204, 204, 204); border-bottom-width: 1px; border-bottom-style: dashed; text-align: left; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-left-style: dashed; padding-bottom: 0px; line-height: 20px; padding-left: 0px; width: 99%; padding-right: 0px; background-image: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: rgb(240, 240, 240); height: auto; color: rgb(0, 0, 0); font-size: 12px; overflow-x: auto; overflow-y: auto; border-top-color: rgb(204, 204, 204); border-top-width: 1px; border-top-style: dashed; border-right-color: rgb(204, 204, 204); border-right-width: 1px; border-right-style: dashed; padding-top: 0px; font-family: arial; background-position: initial initial; background-repeat: initial initial; "&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;SCOPE ([Tranche Age].[Tranche Age].[Tranche Age].Members);&lt;br /&gt;This =&lt;br /&gt;Aggregate&lt;br /&gt;(&lt;br /&gt;[Tranche Age].[Tranche Age].DefaultMember*&lt;br /&gt;]DebutTranche[&lt;debuttranche&gt;&lt;br /&gt;:&lt;br /&gt;]FinTranche[&lt;br /&gt;&lt;fintranche&gt;END SCOPE;&lt;br /&gt;&lt;/fintranche&gt;&lt;/debuttranche&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Il reste à calculer ces deux "bornes" de tranche. On peut le faire en effectuant tout d'abord des opérations sur la dimension Temps: le membre bas de la tranche d'âge est le jour courant sur la dimension Temps - vous noterez au passage que la &lt;b&gt;date actuelle&lt;/b&gt; dans mon cas est un ClosingPeriod au niveau jour: car mon groupe de mesure est à la granularité mois avec une dimension au jour - moins la borne inférieure de la &lt;b&gt;Tranche d'Age. &lt;/b&gt;Ce "moins" (un DateAdd en SQL) se gère très bien avec un &lt;b&gt;ParallelPeriod &lt;/b&gt;en MDX. L'intervalle recherché étant un intervalle sur la Date de Naissance, on ramène le membre issu de la dimension Temps sur la dimension Date de Naissance via un &lt;b&gt;LinkMember&lt;/b&gt;, autorisé car on a même structure sur les deux dimensions.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre style="BORDER-BOTTOM: rgb(204,204,204) 1px dashed; TEXT-ALIGN: left; BORDER-LEFT: rgb(204,204,204) 1px dashed; PADDING-BOTTOM: 0px; LINE-HEIGHT: 20px; PADDING-LEFT: 0px; WIDTH: 99%; PADDING-RIGHT: 0px; FONT-FAMILY: arial; BACKGROUND: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) rgb(240,240,240); HEIGHT: auto; COLOR: rgb(0,0,0); FONT-SIZE: 12px; OVERFLOW: auto; BORDER-TOP: rgb(204,204,204) 1px dashed; BORDER-RIGHT: rgb(204,204,204) 1px dashed; PADDING-TOP: 0px; -moz-background-inline-policy: continuous; -moz-background-clip: border; -moz-background-origin: padding"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;   ParallelPeriod&lt;br /&gt;(&lt;br /&gt;    [Date Naissance].[Calendrier].[Année],&lt;br /&gt;    [Tranche Age].[Tranche Age].CurrentMember.Properties("Borne Sup"),&lt;br /&gt;    LinkMember&lt;br /&gt;    (&lt;br /&gt;     ClosingPeriod([Date Actuelle].[Calendrier].[Jour])&lt;br /&gt;     ,[Date Naissance].[Calendrier]&lt;br /&gt;    )&lt;br /&gt;)&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;On arrive finalement au bout de script suivant:&lt;pre style="BORDER-BOTTOM: rgb(204,204,204) 1px dashed; TEXT-ALIGN: left; BORDER-LEFT: rgb(204,204,204) 1px dashed; PADDING-BOTTOM: 0px; LINE-HEIGHT: 20px; PADDING-LEFT: 0px; WIDTH: 99%; PADDING-RIGHT: 0px; FONT-FAMILY: arial; BACKGROUND: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) rgb(240,240,240); HEIGHT: auto; COLOR: rgb(0,0,0); FONT-SIZE: 12px; OVERFLOW: auto; BORDER-TOP: rgb(204,204,204) 1px dashed; BORDER-RIGHT: rgb(204,204,204) 1px dashed; PADDING-TOP: 0px; -moz-background-inline-policy: continuous; -moz-background-clip: border; -moz-background-origin: padding"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;SCOPE ([Tranche Age].[Tranche Age].[Tranche Age].Members);&lt;br /&gt;This =&lt;br /&gt;Aggregate&lt;br /&gt;(&lt;br /&gt;[Tranche Age].[Tranche Age].DefaultMember*&lt;br /&gt;ParallelPeriod&lt;br /&gt;(&lt;br /&gt;    [Date Naissance].[Calendrier].[Année],&lt;br /&gt;    [Tranche Age].[Tranche Age].CurrentMember.Properties("Borne Sup"),&lt;br /&gt;    LinkMember&lt;br /&gt;    (&lt;br /&gt;     ClosingPeriod([Date Actuelle].[Calendrier].[Jour])&lt;br /&gt;     ,[Date Naissance].[Calendrier]&lt;br /&gt;    )&lt;br /&gt;   )&lt;br /&gt;:&lt;br /&gt;ParallelPeriod&lt;br /&gt;(&lt;br /&gt;    [Date Naissance].[Calendrier].[Année],&lt;br /&gt;    [Tranche Age].[Tranche Age].CurrentMember.Properties("Borne Inf"),&lt;br /&gt;    LinkMember&lt;br /&gt;    (&lt;br /&gt;     ClosingPeriod([Date Actuelle].[Calendrier].[Jour])&lt;br /&gt;     ,[Date Naissance].[Calendrier]&lt;br /&gt;    )&lt;br /&gt;   )&lt;br /&gt;);&lt;br /&gt;END SCOPE;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Voilà pour la pause MDX du jour, en espérant que cela puisse vous servir.&lt;br /&gt;A bientôt!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-1247814450119354071?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/1247814450119354071/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=1247814450119354071' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/1247814450119354071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/1247814450119354071'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/12/ssas-une-dimension-tranches-dage-ou.html' title='[SSAS] Une dimension tranches d&apos;âge ou comment jouer avec le temps en MDX'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-7679345042418945161</id><published>2010-11-16T21:26:00.004+01:00</published><updated>2010-11-16T22:29:54.967+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annonces/Releases'/><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services'/><title type='text'>[SSAS] Polémiques sur SSAS, PowerPivot et l'avenir de l'UDM</title><content type='html'>Si vous êtes abonnés aux blogs qui comptent en BI MS vous avez sûrement pu assister à un sacré &lt;b&gt;grabuge&lt;/b&gt;. Rarement une annonce de release et un summit PASS n'auront déclenché autant de réactions.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Les faits&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;En résumé, T.K. Anand (PM chez Corp) a présenté la semaine dernière au PASS les nouveautés de SSAS dans Denali et quelques pistes sur l'avenir. Dans sa présentation, une seule slide sur SSAS "traditionnel" dit aussi &lt;b&gt;UDM &lt;/b&gt;- concernant surtout des ajouts très très mineurs - tout le reste sur l'intégration de &lt;b&gt;VertiPaq &lt;/b&gt;(le moteur de PowerPivot) dans SSAS, sous le nom de &lt;b&gt;BISM &lt;/b&gt;(BI Semantic Model).  Au menu, une vraie intégration serveur, un modèle de sécurité, des KPI..&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;La goutte d'eau a été l'annonce que &lt;b&gt;Crescent&lt;/b&gt; (l'outil de reporting full web) &lt;b&gt;ne sera compatible... que BISM.&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Cela a entraîné une crainte légitime de la plupart des membres de la communauté, résumées par &lt;b&gt;Chris Webb&lt;/b&gt; dans &lt;a href="http://cwebbbi.wordpress.com/2010/11/11/pass-summit-day-2/"&gt;ce post&lt;/a&gt;. En gros, devons nous, à cause de ce que l'on pourrait appeler une "mode", devenir des utilisateurs de PowerPivot sous Visual Studio? Quid des gros projets UDM vantés à longueur de BI Conference ou de PASS, ils sont devenus soudainement inintéressants? &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;T.K. Anand a alors fourni &lt;a href="http://blogs.technet.com/b/dataplatforminsider/archive/2010/11/12/analysis-services-roadmap-for-sql-server-denali-and-beyond.aspx"&gt;une réponse plutôt intéressante&lt;/a&gt;, et qui peut paraître étrange à première vue. Son approche est de faire un parallèle entre &lt;b&gt;UDM vs BISM&lt;/b&gt; et le combat périmé entre natif et managé, entre &lt;b&gt;C++ et C#&lt;/b&gt; qui a eu lieu à l'apparition de .NET.&lt;/div&gt;&lt;div&gt;Pour lui, SSAS UDM est mature: il n'a plus besoin de grosses adjonctions. Par contre, comme C++ il est &lt;b&gt;trop compliqué&lt;/b&gt; pour la plupart des projets et &lt;b&gt;mal maîtrisé &lt;/b&gt;par la plupart des développeurs entraînant une pénurie de ressources - vous connaissez combien de consultants SSAS? et combien de compétents? - et des projets mal réalisés.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La solution est donc de le conserver pour les projets de grande envergure, qui le nécessitent, et à des "experts" dédiés, et de fournir une solution plus simple pour le &lt;i&gt;vulgus &lt;/i&gt;des développeurs. BISM répondra à la plupart des petits projets - la majorité - rien n'empêchant la migration plus tard vers un environnement UDM. &lt;/div&gt;&lt;div&gt;En résumé aujourd'hui les applications critiques, les OS sont en C++, les "petites" applis en C# et plus personne ne se bat pour savoir lequel est le meilleur. Ils &lt;b&gt;conviennent chacun à des types de développeur, à des types de projets différents.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Ce que j'en pense&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Alors mon avis là dessus est assez mitigé. Je suis d'accord sur l'analyse, moins sur son application. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1) Sur l'argument de&lt;b&gt; l'accomplissement de l'UDM&lt;/b&gt; je ne suis pas complètement d'accord, SSAS n'est à mon avis pas &lt;b&gt;terminé &lt;/b&gt;et il y a encore pas mal de boulot! Qui me viennent comme ça, parmi une multitude, quid d'une vraie gestion des Parent Child? De nouveautés sur la gestion de membres calculés (possibilité de gérer des hiérarchies de membres calculés...)? Et les fonctions de date en MDX? Quelques annonces (pour un SP1?) de ce genre de choses devrait rassurer tout le monde.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2) De même, &lt;b&gt;dire que BISM suffira&lt;/b&gt; pour l'immense majorité des cas me semble un peu optimiste: je n'ai jamais vu de projets, même en PME ou on n'a pas besoin de faire un assignment d'une manière ou d'une autre. Soyons optimiste en pensant que ça suffira pour attraper &lt;b&gt;beaucoup de projets ou l'OLAP dissuade aujourd'hui&lt;/b&gt;, et aller chasser sur les terres restantes de BO qui trouve là un adversaire bien plus puissant que lui. Reste alors à clarifier la position de BISM vis à vis de PowerPivot standalone et intégré...&lt;/div&gt;&lt;div&gt;Parce qu'avec une offre OLAP qui va de PowerPivot, PowerPivot intégré SharePoint, BISM et UDM les commerciaux vont bien s'amuser, et nous avec.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3) Enfin sortir Crescent qui est une &lt;b&gt;vraie révolution&lt;/b&gt; et empêcher de l'utiliser sur les bases les plus répandues me semble être une &lt;b&gt;hérésie commerciale&lt;/b&gt;. Chris dit que les équipes travaillent à résoudre cela. Dont acte. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Denali est annoncé comme fondamental surtout pour SSIS et SSAS. Côté ETL ça s'annonce &lt;b&gt;presque parfait&lt;/b&gt;: tout ce dont nous avions souhaité semble être là.&lt;br /&gt;Côté SSAS les produits annoncés et les nouveautés sont intéressantes j'adore DAX, j'ai bien aimé PowerPivot, l'idée de BISM me botte bien. Un peu de clarté commerciale devrait suffire à générer de l'engouement, je fais confiance à MS là dessus.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Moi, petit consultant, je demande juste qu'on laisse tranquille mon UDM et &lt;b&gt;qu'on le fasse évoluer&lt;/b&gt;, et surtout que Crescent le supporte... C'est pas beaucoup demander non?&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-7679345042418945161?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/7679345042418945161/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=7679345042418945161' title='6 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/7679345042418945161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/7679345042418945161'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/11/ssas-polemiques-sur-ssas-powerpivot-et.html' title='[SSAS] Polémiques sur SSAS, PowerPivot et l&apos;avenir de l&apos;UDM'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-264441898808661792</id><published>2010-11-16T18:02:00.018+01:00</published><updated>2011-04-01T17:18:14.672+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annonces/Releases'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration Services'/><title type='text'>[News] Premières impressions sur Denali CTP1 et SSIS</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://3.bp.blogspot.com/_kbsOT_Eyf_M/TOLXoCWy4xI/AAAAAAAAAnI/KkxGjEvzR58/s1600/catalog.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;/a&gt;&lt;div style="text-align: left;"&gt;Je joue en ce moment avec la CTP1 de Denali.  Hormis les nouveautés relationnelles très sympa (je pense au EXEC WITH RESULT SETS) que Christian Robert a très bien résumé, c'est surtout &lt;b&gt;Integration Services &lt;/b&gt;qui bénéficie du plus gros lifting.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Enfin un designer du XXIème siècle!&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;BIDS dans cette CTP est encore sous VS 2008 mais le designer est maintenant en WPF! C'est l'occasion de profiter de quelques améliorations:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;- C'est beaucoup plus joli, fluide, et à mon avis plus stable (bye bye COM!). L'avantage de l'abandon de MSDDS pour le diagraming est de rendre le XML de "rendu" beaucoup plus lisible et surtout parsable. Par exemple il sera possible de récupérer les &lt;b&gt;commentaires &lt;/b&gt;(ça vous rappelle probablement un de mes posts...) puisqu'ils sont maintenant écrits en clair (enfin en XML commenté, sous forme de noeud &lt;b&gt;AnnotationLayout&lt;/b&gt;). Sans compter que ça apporte un truc incroyable: on peut maintenant faire CTRL-Z ou CTRL-Y: une révolution!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://2.bp.blogspot.com/_kbsOT_Eyf_M/TOK7AqtTY3I/AAAAAAAAAmw/YR0-66GuhOQ/s400/Designer.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 399px; height: 264px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5540196111757828978" /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- La &lt;b&gt;toolbar est moins linéaire&lt;/b&gt; et permet de gérer des favoris, elle relègue les composants les moins utilisés dans des dossiers Others.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/TOK7YVmaImI/AAAAAAAAAm4/X211HvB7fJQ/s400/favoris.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5540196518408626786" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 188px; height: 363px; " /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;-Côté Data Flow, c'est aussi pas mal. Là aussi la toolbar est classée, des &lt;b&gt;wizards &lt;/b&gt;apparaissent pour créer les adapteurs source et destination, mais en plus de ça on peut &lt;b&gt;éditer les composants déconnectés&lt;/b&gt;, et pas en mode avancé. Si on rajoute la connectivité avec &lt;b&gt;Data Quality Services &lt;/b&gt;c'est assez sympathique.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Des nouveautés aussi pour le déploiement&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Dans le domaine du &lt;b&gt;management des packages&lt;/b&gt; le déploiement et la partie serveur ont été complètement revus. (Ceci dit au passage, impossible de se connecter pour moi sans passer par l'UAC, cf&lt;a href="http://connect.microsoft.com/SQLServer/feedback/details/614403/denali-ssis-uac-prevents-connection-to-ssis-server-in-ssms-windows-7"&gt; ici&lt;/a&gt;). &lt;/div&gt;&lt;div&gt;&lt;div&gt;Côté serveur de base, une node &lt;b&gt;Integration Services &lt;/b&gt;apparait, permettant de créer un &lt;b&gt;Catalog &lt;/b&gt;SSIS, en réalité une base, nommée par défaut SSISDB (et remplaçant donc MSDB, les DBA seront contents). C'est maintenant ici que se gèrent les lots SSIS en v11 et non plus dans le service auparavant dédié. &lt;/div&gt;&lt;div&gt;D'un point de vue logique, ce catalog comprend en suite des &lt;b&gt;Projects: &lt;/b&gt;finie la structure bordélique des lots arrangés dans une foultitude de dossiers logiques. De plus ces projets sont nativement versionnés! (A l'assaut de TFS!!!)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://3.bp.blogspot.com/_kbsOT_Eyf_M/TOLXoCWy4xI/AAAAAAAAAnI/KkxGjEvzR58/s400/catalog.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5540227574446351122" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 314px; height: 353px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;De plus ce ne sont plus réellement les Dtsx que l'on déploie: comme l'a &lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2010/11/10/introduction-to-ssis-projects-in-denali.aspx"&gt;montré Jamie Thomson&lt;/a&gt; le &lt;b&gt;build des projets SSIS génère une sorte de binaire&lt;/b&gt; (un fichier .ispac) dans un dossier /bin, qui est en fait ce qui est déployé. Comme le dit Jamie, ça commence sacrément à ressembler à du développement et plus trop à du vieux DTS... Et c'est tant mieux.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Côté &lt;b&gt;BIDS&lt;/b&gt;, on peut maintenant, &lt;b&gt;et sans BIDS Helper&lt;/b&gt; déployer &lt;b&gt;directement &lt;/b&gt;depuis le projet, le réglage CreateDeploymentUtility disparaissant au profit du nom du serveur SSIS, là encore comme dans l'addin cité précedemment (et aussi AS, RS au passage). Il suffit dès lors dans un wizard de renseigner le Catalog, et le Project.&lt;/div&gt;&lt;div&gt;Les packages &lt;b&gt;comprennent de plus des&lt;/b&gt; &lt;b&gt;paramètres&lt;/b&gt;, des variables renseignables depuis le wizard de déploiement (et en l'état bindables à des variables d'environnement).&lt;/div&gt;&lt;div&gt;Ceci évite d'avoir à saisir des valeurs de variable type Package.Variables[XYZ].Value comme on devait le faire auparavant. De plus ces paramètres sont ensuite&lt;b&gt; librement utilisables&lt;/b&gt; comme des variables dans le lot.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Une petite note sur Dependency Services&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;La nouvelle fonctionnalité &lt;b&gt;Dependency Services&lt;/b&gt;, de suivi des relations et des modifications dans les bases de données est étendu à SSIS: il est donc possible de visualiser les dépendances d'un package vis à vis de certaines bases. Dit autrement savoir rapidement quel serait l'impact de la modification d'un champ dans votre Data Mart sur les lots d'alimentation, les autres tables...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/TOLe7h-pRwI/AAAAAAAAAnQ/vzzTHxhauSk/s400/dependencydesigner.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5540235605933901570" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 186px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;J'attends de creuser un peu mais cela sort complètement la partie serveur de la &lt;b&gt;boite noire&lt;/b&gt; où elle était confinée, et surtout cela permettrait d'avoir une vraie analyse d'impact au niveau de la stack BI.&lt;/div&gt;&lt;div&gt;En espérant vous avoir donné envie de l'installer!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A bientôt!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-264441898808661792?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/264441898808661792/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=264441898808661792' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/264441898808661792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/264441898808661792'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/11/news-premieres-impressions-sur-denali.html' title='[News] Premières impressions sur Denali CTP1 et SSIS'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kbsOT_Eyf_M/TOK7AqtTY3I/AAAAAAAAAmw/YR0-66GuhOQ/s72-c/Designer.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-7775897179296508020</id><published>2010-11-10T09:40:00.007+01:00</published><updated>2011-04-01T17:19:23.101+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annonces/Releases'/><title type='text'>Des news et une CTP de SQL Server Denali (2011?) à la Keynote du PASS</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Hier soir a eu lieu la &lt;b&gt;Keynote du PASS Summit 2010&lt;/b&gt; (PASS, la Professionnal Association for SQL Server est la plus importante communauté autour de SQL, très largement soutenue par MS) retransmise en direct sur &lt;a href="http://www.sqlpass.org/"&gt;le site du PASS&lt;/a&gt;, comme les autres keynotes.&lt;br /&gt;Cela a été l'occasion d'apprendre quelques petites choses, dont la disponibilité de la &lt;b&gt;CTP 1 de SQL Server Denali. &lt;/b&gt;(http://www.microsoft.com/sqlserver)&lt;div&gt;&lt;br /&gt;&lt;img src="http://fr.academic.ru/pictures/frwiki/68/Denali_Mt_McKinley.jpg" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 452px; height: 303px;" border="0" alt="" /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Plusieurs choses intéressantes ont été abordées, d'abord la fusion du log-shipping, du clustering et du mirroring dans une "unique infrastructure" sous le nom de &lt;b&gt;SQL Server AlwaysOn&lt;/b&gt; si j'ai bien entendu.&lt;/div&gt;&lt;div&gt;Mais c'est surtout côté BI que beaucoup de travail semble avoir été fait&lt;/div&gt;&lt;div&gt;- L'absence de maintien de Proclarity Web qui manque à beaucoup semble avoir porté ses fruits: le &lt;b&gt;Project Crescent&lt;/b&gt; a été abordé: il s'agit d'un outil de Reporting Web très joli, dont la position par rapport à Proclarity Analytics devra être clarifiée...&lt;/div&gt;&lt;div&gt;&lt;div&gt;- Côté &lt;b&gt;SSIS &lt;/b&gt;on annonce une &lt;b&gt;refonte totale de la partie serveur&lt;/b&gt; (le plus gros travail sur ce sujet depuis la sortie de 2005 dixit Amir Netz) ainsi qu'une adjontion appellée &lt;b&gt;Data Quality Services &lt;/b&gt;dont le nom parle tout seul.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;- Côté &lt;b&gt;SSAS &lt;/b&gt;le&lt;b&gt; moteur Vertipaq est intégré côté serveur&lt;/b&gt; dans Analysis Services, mais aussi dans SQL Server relationnel a priori.&lt;/div&gt;&lt;div&gt;- Enfin beaucoup de choses côté outils de développement, tous les projets BI et Database fusionnant dans un &lt;b&gt;unique projet Visual Studio 2010&lt;/b&gt; dont les designers sont complètement chamboulés! Par exemple une démo de démarrage d'un projet BI depuis... une feuille PowerPivot générée sous Excel, a été montrée.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bref beaucoup de choses intéressantes en perspective.&lt;/div&gt;&lt;div&gt;A noter que pour un retour plus précis, Christian a fait un billet très intéressant (&lt;a href="http://blogs.codes-sources.com/christian/archive/2010/11/09/sql-server-denali-quelles-sont-les-nouveaut-s-dans-la-ctp1.aspx"&gt;http://blogs.codes-sources.com/christian/archive/2010/11/09/sql-server-denali-quelles-sont-les-nouveaut-s-dans-la-ctp1.aspx&lt;/a&gt;)&lt;/div&gt;&lt;div&gt;A bientôt!&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-7775897179296508020?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/7775897179296508020/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=7775897179296508020' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/7775897179296508020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/7775897179296508020'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/11/des-news-de-sql-server-denali-2011-la.html' title='Des news et une CTP de SQL Server Denali (2011?) à la Keynote du PASS'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-3154190672052719705</id><published>2010-10-09T16:45:00.001+02:00</published><updated>2010-10-18T11:07:12.608+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>[SQL] Une Parent Child en lignes/à plat en SQL avec les CTE et l'instruction PIVOT</title><content type='html'>Je vous l'avoue il y a des fois où j'aime bien céder à la tentation du nerd, celle de se lancer des petits défis inutiles de prime abord mais tellements jouissifs une fois résolus. Un de mes favoris a été la &lt;b&gt;mise à plat de ParentChild&lt;/b&gt;, vous l'aurez deviné pour faire plaisir à SSAS. &lt;div&gt; &lt;/div&gt;&lt;div&gt;Bref rappel: beaucoup de SI expriment les hiérarchies sur&lt;b&gt; deux colonnes &lt;/b&gt;IdParent, IdEnfant, ce qui est convenable pour le stockage. L'ami &lt;b&gt;Analysis Services&lt;/b&gt; éprouve quelques difficultés connues avec cette structure Parent/Enfant ou ParentChild (Basiquement une dimension construite comme cela ne générera d'aggrégats qu'&lt;b&gt;au niveau du membre (All)&lt;/b&gt; et jamais en dessous). D'où l'envie de transformer un référentiel ParentChild en table mise à plat, i.e. où chaque &lt;b&gt;niveau &lt;/b&gt;est représenté par une &lt;b&gt;colonne&lt;/b&gt;.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;Jetons d'abord un coup d'oeil à ma table avec la requête suivante:&lt;/div&gt;&lt;pre style="BORDER-BOTTOM: rgb(204,204,204) 1px dashed; TEXT-ALIGN: left; BORDER-LEFT: rgb(204,204,204) 1px dashed; PADDING-BOTTOM: 0px; LINE-HEIGHT: 20px; PADDING-LEFT: 0px; WIDTH: 99%; PADDING-RIGHT: 0px; FONT-FAMILY: arial; BACKGROUND: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) rgb(240,240,240); HEIGHT: auto; COLOR: rgb(0,0,0); FONT-SIZE: 12px; OVERFLOW: auto; BORDER-TOP: rgb(204,204,204) 1px dashed; BORDER-RIGHT: rgb(204,204,204) 1px dashed; PADDING-TOP: 0px; -moz-background-inline-policy: continuous; -moz-background-clip: border; -moz-background-origin: padding"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;select Code, CodeRattachement&lt;br /&gt;from TbRef&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;Une Parent Child bien classique en somme... &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kbsOT_Eyf_M/TK8wT5ZTWjI/AAAAAAAAAmA/DW7YKcwpSZo/s1600/00.JPG"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 199px; DISPLAY: block; HEIGHT: 193px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5525688386189482546" border="0" alt="" src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/TK8wT5ZTWjI/AAAAAAAAAmA/DW7YKcwpSZo/s400/00.JPG" /&gt;&lt;/a&gt;&lt;b&gt;Premier besoin&lt;/b&gt;: pour mettre chaque enregistrement dans la bonne colonne, nous allons avoir besoin du rang dans la hiérarchie. Ca, une CTE sait très bien le faire.&lt;pre style="BORDER-BOTTOM: rgb(204,204,204) 1px dashed; TEXT-ALIGN: left; BORDER-LEFT: rgb(204,204,204) 1px dashed; PADDING-BOTTOM: 0px; LINE-HEIGHT: 20px; PADDING-LEFT: 0px; WIDTH: 99%; PADDING-RIGHT: 0px; FONT-FAMILY: arial; BACKGROUND: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) rgb(240,240,240); HEIGHT: auto; COLOR: rgb(0,0,0); FONT-SIZE: 12px; OVERFLOW: auto; BORDER-TOP: rgb(204,204,204) 1px dashed; BORDER-RIGHT: rgb(204,204,204) 1px dashed; PADDING-TOP: 0px; -moz-background-inline-policy: continuous; -moz-background-clip: border; -moz-background-origin: padding"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;with&lt;br /&gt;CteRang(Code, Rang)&lt;br /&gt;as&lt;br /&gt;(&lt;br /&gt;select Code, 1&lt;br /&gt;from TbRef&lt;br /&gt;where CodeRattachement is null&lt;br /&gt;union all&lt;br /&gt;select TbRef.Code, CteRang.Rang+1&lt;br /&gt;from TbRef&lt;br /&gt;inner join CteRang&lt;br /&gt;on TbRef.CodeRattachement = CteRang.Code&lt;br /&gt;)&lt;br /&gt;select Code, Rang&lt;br /&gt;from CteRang&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;On a bien un calcul de rang, comme visible ici:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kbsOT_Eyf_M/TK8y4xqr-7I/AAAAAAAAAmI/ZRt8A27gn1g/s1600/01.JPG"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 152px; DISPLAY: block; HEIGHT: 178px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5525691218793331634" border="0" alt="" src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/TK8y4xqr-7I/AAAAAAAAAmI/ZRt8A27gn1g/s400/01.JPG" /&gt;&lt;/a&gt;Bon passons aux choses sérieuses: pour avoir le bon matériel, nous allons&lt;b&gt; générer toutes chaines hiérarchiques&lt;/b&gt; dit autrement tous les supérieurs de chaque tuple (&lt;i&gt;le niveau maximal apparaitra donc &lt;/i&gt;&lt;b&gt;&lt;i&gt;non plus une seule fois mais n fois&lt;/i&gt;&lt;/b&gt;&lt;i&gt;, n étant le nombre de noeuds.&lt;/i&gt;)&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;Pour cela nous allons faire une CTE non plus partant de la &lt;b&gt;racine mais de la base: &lt;/b&gt;pour chaque noeud (membre d'ancrage avant le UNION ALL), nous allons générer tous ses supérieurs (membre récursif après le UNION ALL).&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;Le noeud d'ancrage a un rang issu de la CTE précédente, les noeuds récursifs le dérivent en retranchant 1 (il s'agit de supérieurs du noeud d'ancrage. De plus, on prend bien soin de garder l'&lt;b&gt;ID du noeud&lt;/b&gt; duquel on est en train de construire la chaîne hiérarchique (Pvt dans mon cas)&lt;/div&gt;&lt;pre style="BORDER-BOTTOM: rgb(204,204,204) 1px dashed; TEXT-ALIGN: left; BORDER-LEFT: rgb(204,204,204) 1px dashed; PADDING-BOTTOM: 0px; LINE-HEIGHT: 20px; PADDING-LEFT: 0px; WIDTH: 99%; PADDING-RIGHT: 0px; FONT-FAMILY: arial; BACKGROUND: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) rgb(240,240,240); HEIGHT: auto; COLOR: rgb(0,0,0); FONT-SIZE: 12px; OVERFLOW: auto; BORDER-TOP: rgb(204,204,204) 1px dashed; BORDER-RIGHT: rgb(204,204,204) 1px dashed; PADDING-TOP: 0px; -moz-background-inline-policy: continuous; -moz-background-clip: border; -moz-background-origin: padding"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;with&lt;br /&gt;CteRang(Code, Rang)&lt;br /&gt;as&lt;br /&gt;(&lt;br /&gt;select Code, 1&lt;br /&gt;from TbRef&lt;br /&gt;where CodeRattachement is null&lt;br /&gt;union all&lt;br /&gt;select TbRef.Code, CteRang.Rang+1&lt;br /&gt;from TbRef&lt;br /&gt;inner join CteRang&lt;br /&gt;on TbRef.CodeRattachement = CteRang.Code&lt;br /&gt;),&lt;br /&gt;CteMiseAPlat (Pvt,Rang,Code,Parent)&lt;br /&gt;as&lt;br /&gt;(&lt;br /&gt;select ref.Code,CteRang.Rang,ref.Code,CodeRattachement&lt;br /&gt;from TbRef ref&lt;br /&gt;inner join CteRang&lt;br /&gt;on CteRang.Code = ref.Code&lt;br /&gt;union all&lt;br /&gt;select cte.Pvt, cte.Rang - 1 , ref.Code,ref.CodeRattachement&lt;br /&gt;from TbRef ref&lt;br /&gt;inner join CteMiseAPlat cte&lt;br /&gt;on cte.Parent = ref.Code&lt;br /&gt;)&lt;br /&gt;select *&lt;br /&gt;from CteMiseAPlat&lt;br /&gt;order by Pvt, Rang&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;Et ça marche:&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kbsOT_Eyf_M/TK8zrgcIpRI/AAAAAAAAAmY/yojgzK8ogTs/s1600/02.JPG"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 262px; DISPLAY: block; HEIGHT: 272px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5525692090342221074" border="0" alt="" src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/TK8zrgcIpRI/AAAAAAAAAmY/yojgzK8ogTs/s400/02.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Vous auriez pu vous en douter, il ne reste plus qu'à... &lt;b&gt;pivoter tout cela&lt;/b&gt;, avec une belle instruction PIVOT. On pivote &lt;b&gt;autour de mon champ Pvt&lt;/b&gt;, en prenant le &lt;b&gt;Rang comme nom&lt;/b&gt; de colonne et en le &lt;b&gt;remplissant avec le Code&lt;/b&gt; (mis dans une fonction d'agrégation bidon). On remplace donc le SELECT * précédent par:&lt;/div&gt;&lt;pre style="BORDER-BOTTOM: rgb(204,204,204) 1px dashed; TEXT-ALIGN: left; BORDER-LEFT: rgb(204,204,204) 1px dashed; PADDING-BOTTOM: 0px; LINE-HEIGHT: 20px; PADDING-LEFT: 0px; WIDTH: 99%; PADDING-RIGHT: 0px; FONT-FAMILY: arial; BACKGROUND: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) rgb(240,240,240); HEIGHT: auto; COLOR: rgb(0,0,0); FONT-SIZE: 12px; OVERFLOW: auto; BORDER-TOP: rgb(204,204,204) 1px dashed; BORDER-RIGHT: rgb(204,204,204) 1px dashed; PADDING-TOP: 0px; -moz-background-inline-policy: continuous; -moz-background-clip: border; -moz-background-origin: padding"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;select Pvt,[1],[2],[3],[4],[5],[6]&lt;br /&gt;from&lt;br /&gt;(&lt;br /&gt;select Pvt, Rang, Code&lt;br /&gt;from CteMiseAPlat&lt;br /&gt;) as u&lt;br /&gt;pivot&lt;br /&gt;(&lt;br /&gt;Max(Code)&lt;br /&gt;FOR Rang IN ([1],[2],[3],[4],[5],[6])&lt;br /&gt;) as t&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;Ce qui donne, tadaaaa: &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kbsOT_Eyf_M/TK8z5RWzDvI/AAAAAAAAAmg/juG37msiKMg/s1600/03.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 151px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5525692326811471602" border="0" alt="" src="http://2.bp.blogspot.com/_kbsOT_Eyf_M/TK8z5RWzDvI/AAAAAAAAAmg/juG37msiKMg/s400/03.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Voilà! La performance n'est pas excellentissime (mieux vaudrait sûrement &lt;b&gt;précalculer &lt;/b&gt;les rangs), mais je trouve que c'est un joli&lt;b&gt; couplage de CTE et de PIVOT&lt;/b&gt; pour un usage très commun. &lt;/div&gt;&lt;div&gt;A bientôt!&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-3154190672052719705?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/3154190672052719705/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=3154190672052719705' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3154190672052719705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3154190672052719705'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/10/sql-mettre-une-parent-child-en-lignes.html' title='[SQL] Une Parent Child en lignes/à plat en SQL avec les CTE et l&apos;instruction PIVOT'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kbsOT_Eyf_M/TK8wT5ZTWjI/AAAAAAAAAmA/DW7YKcwpSZo/s72-c/00.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-9086460887466694097</id><published>2010-10-06T14:37:00.009+02:00</published><updated>2010-10-06T17:57:58.509+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reporting Services'/><title type='text'>[SSRS] Contrefaçon de Magic Quadrant Gartner sous Reporting Services</title><content type='html'>Ce post s'inscrit dans la série "trucs faisables avec Reporting Services alors que l'on ne pensait pas". Il trainait dans mon Inbox depuis quelques temps et je me suis décidé à le publier à la suite d'une question sur un forum. Alors pour faire un &lt;b&gt;MagicQuadrant Gartner&lt;/b&gt;, qui pour rappel ressemble à ça:&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kbsOT_Eyf_M/TKxvDTqy1bI/AAAAAAAAAlY/DTZr7FfY6jc/s1600/gartner-magic-quadrant-bi-2008.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 390px; height: 400px;" src="http://2.bp.blogspot.com/_kbsOT_Eyf_M/TKxvDTqy1bI/AAAAAAAAAlY/DTZr7FfY6jc/s400/gartner-magic-quadrant-bi-2008.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5524912945486812594" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Il vous faut:&lt;/div&gt;&lt;div&gt;- Un&lt;b&gt; Reporting Services&lt;/b&gt;&lt;/div&gt;&lt;div&gt;- Une source de données composées de &lt;b&gt;coordonnées (X,Y) et de labels&lt;/b&gt;&lt;/div&gt;&lt;div&gt;- 10 min de votre temps précieux&lt;/div&gt;&lt;div&gt;- Un soupçon de perversité&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Alors commençons. On commence par prendre un &lt;b&gt;graphique de type nuage de points&lt;/b&gt;, sur lequel on affiche nos points en X et en Y (Valeur et Catégorie: série ne sert à rien car l'ami Gartner affiche les points de la même couleur). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kbsOT_Eyf_M/TKxxmVlGRxI/AAAAAAAAAlg/pknzsUQjrQY/s1600/01.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 255px;" src="http://2.bp.blogspot.com/_kbsOT_Eyf_M/TKxxmVlGRxI/AAAAAAAAAlg/pknzsUQjrQY/s400/01.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5524915746318468882" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Beau mais c'est pas encore ça. Comme on aura pris soin de &lt;b&gt;normaliser les coordonnées&lt;/b&gt; (j'ai pris entre -100 et 100) on commence par formater les axes. Au menu:&lt;/div&gt;&lt;div&gt;- Axes &lt;b&gt;scalaires&lt;/b&gt;, minimum -100 et maximum -100 &lt;/div&gt;&lt;div&gt;- &lt;b&gt;Intersection &lt;/b&gt;positionnée à 0 (Comme ça les axes se croisent en 0,0)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kbsOT_Eyf_M/TKxx2oHoT3I/AAAAAAAAAlo/0rz0LkY6hh0/s1600/02.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 252px;" src="http://1.bp.blogspot.com/_kbsOT_Eyf_M/TKxx2oHoT3I/AAAAAAAAAlo/0rz0LkY6hh0/s400/02.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5524916026173050738" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On affiche les labels des points, en cliquant sur "Afficher les étiquettes de données" lors d'un clic droit sur le graphique. Et dans les propriétés d'étiquettes de série on choisit notre label via une expression du style &lt;b&gt;Fields!Label.Value:&lt;/b&gt; de mieux en mieux. On finit enfin le travail sur les axes:&lt;/div&gt;&lt;div&gt;&lt;div&gt;- Exit les &lt;b&gt;labels&lt;/b&gt;&lt;/div&gt;&lt;div&gt;- Exit les &lt;b&gt;graduations &lt;/b&gt;primaires comme secondaires&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kbsOT_Eyf_M/TKxyAshp9XI/AAAAAAAAAlw/l1cwmuNIPAY/s1600/03.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 241px;" src="http://2.bp.blogspot.com/_kbsOT_Eyf_M/TKxyAshp9XI/AAAAAAAAAlw/l1cwmuNIPAY/s400/03.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5524916199154644338" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Quelques &lt;b&gt;zones de texte&lt;/b&gt; plus loin, et quelques &lt;b&gt;encadrés &lt;/b&gt;mieux placés on obtient ce beau résultat, auquel il ne manque que des... flèches (mais Reporting Services ne sait pas (sic) dessiner des flèches). Amusez vous bien!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kbsOT_Eyf_M/TKxyLYxWdyI/AAAAAAAAAl4/DYc4x2TFBVw/s1600/04.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 288px;" src="http://2.bp.blogspot.com/_kbsOT_Eyf_M/TKxyLYxWdyI/AAAAAAAAAl4/DYc4x2TFBVw/s400/04.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5524916382830327586" /&gt;&lt;/a&gt;&lt;div&gt;PS: On notera au passage ma partialité logicielle :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-9086460887466694097?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/9086460887466694097/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=9086460887466694097' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/9086460887466694097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/9086460887466694097'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/10/ssrs-contrefacon-de-magicquadrant-sous.html' title='[SSRS] Contrefaçon de Magic Quadrant Gartner sous Reporting Services'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kbsOT_Eyf_M/TKxvDTqy1bI/AAAAAAAAAlY/DTZr7FfY6jc/s72-c/gartner-magic-quadrant-bi-2008.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-6065310630116235784</id><published>2010-08-25T10:53:00.009+02:00</published><updated>2011-04-01T17:19:33.206+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reporting Services'/><title type='text'>[SSRS] Un (presque) diagramme de Gantt nativement sous Reporting Services</title><content type='html'>Je ne sais pas si vous est déjà venue l'idée saugrenue de tenter de mettre le Project Plan en Reporting Services. Si d'aventure comme à moi l'idée vous était venue en 2005, vous avez sûrement utilisé la méthode mathématico-barbare énoncée par exemple &lt;a href="http://www.sqlservercentral.com/articles/Reporting+Services+(SSRS)/Santa+gets+an+RDL+present/61782/"&gt;ici&lt;/a&gt;.&lt;br /&gt;A partir de 2008 nous disposons d'un composant au nom pas forcément explicite, le "Range Bar" qui peut être utilisé pour faire rapidement un diagramme de Gantt assez rapide. En effet il s'agit d'un graphique à barres où lesdites barres disposent de deux propriétés, début &lt;strong&gt;et&lt;/strong&gt; fin.&lt;br /&gt;&lt;br /&gt;Bon première étape bidouiller des données de type MS Project, j'ai fait ça sous Excel: Tâche, Rôle, Date début, Date fin.&lt;br /&gt;Une fois un dataset et une data source créé sous SSRS, il ne reste plus qu'à créer une Range Bar.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_kbsOT_Eyf_M/THTc5qrXP0I/AAAAAAAAAko/q-EZom3yFdM/s1600/RangeBar.png"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 354px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5509271127447781186" border="0" alt="" src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/THTc5qrXP0I/AAAAAAAAAko/q-EZom3yFdM/s400/RangeBar.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Une fois le graphique créé, il faut choisir les données à représenter. Une valeur correspondra donc à une tâche, bornée par sa date de début et sa date de fin, et on affichera le nom de la tâche dans l'axe des ordonnées.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_kbsOT_Eyf_M/THTdcWY3-CI/AAAAAAAAAlI/Jom72mLwfus/s1600/Params.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 360px;" src="http://3.bp.blogspot.com/_kbsOT_Eyf_M/THTdcWY3-CI/AAAAAAAAAlI/Jom72mLwfus/s400/Params.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5509271723296946210" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pour représenter les rôles, pour copier Project on peut choisir de les afficher en tant que labels sur les barres. Il faut d'abord activer les labels:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_kbsOT_Eyf_M/THTdYjGXdAI/AAAAAAAAAlA/l3RRF-ydb-I/s1600/Labels.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 323px; height: 242px;" src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/THTdYjGXdAI/AAAAAAAAAlA/l3RRF-ydb-I/s400/Labels.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5509271657989501954" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Puis aller dans les propriétés de ces mêmes labels et ne pas afficher la valeur courant mais plutôt une expression, dans mon cas Fields!Role.Value.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_kbsOT_Eyf_M/THTdU_crtuI/AAAAAAAAAk4/u9-C-82urjk/s1600/labelsData.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 141px;" src="http://1.bp.blogspot.com/_kbsOT_Eyf_M/THTdU_crtuI/AAAAAAAAAk4/u9-C-82urjk/s400/labelsData.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5509271596879820514" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Il ne reste plus qu'à contempler le résultat... bon pas extraordinaire mais explicite.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_kbsOT_Eyf_M/THTdQIaRiHI/AAAAAAAAAkw/DvRf4fOFvqg/s1600/Gantt.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 213px;" src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/THTdQIaRiHI/AAAAAAAAAkw/DvRf4fOFvqg/s400/Gantt.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5509271513386289266" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A noter que pour un vrai Gantt, payant cette fois ci, vous pouvez vous rendre sur le site de Dundas, qui édite là encore un très joli composant, le Dundas Gantt Chart, dont une démo est disponible &lt;a href="http://demos3.dundas.com/reportingservices/Default.aspx?StartReport=/Microsoft%20Project%20Gantt/MSProjectGantt"&gt;ici&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;En espérant que mon Gantt moche - mais gratuit - vous ait donné des idées...&lt;br /&gt;A bientôt!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-6065310630116235784?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/6065310630116235784/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=6065310630116235784' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/6065310630116235784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/6065310630116235784'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/08/ssrs-un-presque-diagramme-de-gantt.html' title='[SSRS] Un (presque) diagramme de Gantt nativement sous Reporting Services'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kbsOT_Eyf_M/THTc5qrXP0I/AAAAAAAAAko/q-EZom3yFdM/s72-c/RangeBar.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-2945296214041492448</id><published>2010-08-12T14:00:00.009+02:00</published><updated>2011-04-01T17:19:43.329+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reporting Services'/><title type='text'>[SSRS] Comment utiliser des ESRI Shapefiles (shp) pour Reporting Services</title><content type='html'>Un tout petit post au milieu de l'été :). Pour rappel, Reporting Services 2008 R2 supporte en natif la cartographie. Les cartes affichées peuvent être de trois types:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Cartes intégrées à la&lt;strong&gt; Map Gallery&lt;/strong&gt; (basiquement les US)&lt;/li&gt;&lt;li&gt;Cartes issues de &lt;strong&gt;requêtes SQL&lt;/strong&gt; sur des types &lt;em&gt;geography&lt;/em&gt;&lt;/li&gt;&lt;li&gt;Cartes au format&lt;strong&gt; ESRI Shapefile&lt;/strong&gt; (*.shp)&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Ce dernier format est un standard de représentation vectoriel utilisé dans les systèmes d'informations géographiques (SIG ou GIS &lt;em&gt;in english) &lt;/em&gt;qu'il vous faudra trouver vous mêmes pour les intégrer dans votre rapport. Chaque carte shp est composée de polygones décrits par leurs métadonnées.&lt;/p&gt;&lt;p&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 320px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5504493484980611474" border="0" alt="" src="http://3.bp.blogspot.com/_kbsOT_Eyf_M/TGPjqRi4qZI/AAAAAAAAAkQ/LAr63HaJqXE/s400/ESRI.png" /&gt; Une fois votre carte choisie et ajoutée, il ne vous reste plus &lt;strong&gt;qu'à mapper vos données de dataset avec les identifiants des polygones du Shapefile&lt;/strong&gt;. Typiquement une région, une ville, un pays, représenté par un identifiant ISO, son nom... Dans mon exemple mon shapefile est composé de pays décrits par leur identifiant ISO, et j'ai ajouté l'identifiant en question à ma requête pour mettre en correspondance chaque polygone avec une valeur.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://2.bp.blogspot.com/_kbsOT_Eyf_M/TGPkJ2wtYsI/AAAAAAAAAkY/SlFL55xvhNc/s1600/esri2.png"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 205px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5504494027546649282" border="0" alt="" src="http://2.bp.blogspot.com/_kbsOT_Eyf_M/TGPkJ2wtYsI/AAAAAAAAAkY/SlFL55xvhNc/s400/esri2.png" /&gt;&lt;/a&gt;&lt;br /&gt;Ceci fait vous pouvez à votre guise &lt;strong&gt;colorer la carte selon la valeur&lt;/strong&gt;, et même mettre en place des actions (URL Action, Reporting Action) pour naviguer dans des rapports par des clics sur la carte. Chouette non?&lt;/p&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_kbsOT_Eyf_M/TGPpSw0UIxI/AAAAAAAAAkg/1zVOU9_APTE/s1600/Untitled.png"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 198px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5504499678128120594" border="0" alt="" src="http://1.bp.blogspot.com/_kbsOT_Eyf_M/TGPpSw0UIxI/AAAAAAAAAkg/1zVOU9_APTE/s400/Untitled.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Une dernière chose: je vous ai dit que vous deviez trouvez vous même les Shapefiles. Cela peut être laborieux, et certains shp ne passent pas dans SSRS en vous fournissant des erreurs assez gothiques. Je vous fournis donc quelques liens.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Pour des niveaux &lt;strong&gt;très fins et complets de tous les pays du monde, &lt;/strong&gt;go sur &lt;a href="http://www.diva-gis.org/datadown"&gt;Diva-GIS&lt;/a&gt;. Testé et approuvé.&lt;/li&gt;&lt;li&gt;Il est aussi possible d'en trouver sur &lt;a href="http://download.geofabrik.de/osm/"&gt;Geofabrik.de &lt;/a&gt;(en allemand) mais plus simples.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Voilà, à vous de tester maintenant!&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-2945296214041492448?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/2945296214041492448/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=2945296214041492448' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/2945296214041492448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/2945296214041492448'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/08/ssrs-ou-utiliser-des-esri-shapefiles.html' title='[SSRS] Comment utiliser des ESRI Shapefiles (shp) pour Reporting Services'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kbsOT_Eyf_M/TGPjqRi4qZI/AAAAAAAAAkQ/LAr63HaJqXE/s72-c/ESRI.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-3485578030015503174</id><published>2010-07-28T12:15:00.012+02:00</published><updated>2010-07-30T12:29:12.489+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reporting Services'/><title type='text'>[SSRS] Chart et Lookup: ça marche aussi!</title><content type='html'>Un précepte, que dis-je un commandement CharltonHestonnien est tombé avec la sortie de SSRS 2008 R2: le fait de ne pas pouvoir &lt;strong&gt;utiliser plusieurs DataSets dans une DataRegion.&lt;/strong&gt; Ce précepte est tombé avec l'arrivée des fonctions &lt;strong&gt;Lookup&lt;/strong&gt;, &lt;strong&gt;MultiLookup&lt;/strong&gt; et &lt;strong&gt;LookupSet&lt;/strong&gt;. Que font ces fonctions?&lt;br /&gt;&lt;br /&gt;Pour le Lookup par exemple, sur le modèle de son équivalent SSIS, il prend en paramètre une clé dans le &lt;strong&gt;DataSet&lt;/strong&gt; de la DataRegion (une colonne) et &lt;strong&gt;va chercher une valeur dans un second DataSet &lt;/strong&gt;dont la clé &lt;strong&gt;correspond&lt;/strong&gt; à la clé du premier (en gros une jointure qui ne ramènerait que le premier match). &lt;strong&gt;Multilookup&lt;/strong&gt; permet de passer un &lt;strong&gt;ensemble&lt;/strong&gt; de clés de la source et donc de retourner l'ensemble des premiers matchs pour chaque clé, &lt;strong&gt;LookupSet&lt;/strong&gt; permet de faire un Lookup qui ne retourne plus le premier match mais tous (une jointure interne, en somme). Pour les anglicistes, &lt;strong&gt;Stacia Misner&lt;/strong&gt; a fait un très bon papier &lt;a href="http://blog.datainspirations.com/2010/03/19/sql-server-2008-r2-reporting-services-look-up-look-down-look-all-around-part-i/"&gt;ici &lt;/a&gt;que je ne m'amuserai pas à paraphraser.&lt;br /&gt;&lt;br /&gt;Pour revenir au sujet en revanche personne n'a expliqué que cela pouvait être utile pour des &lt;strong&gt;charts. &lt;/strong&gt;Ce qui fait que j'ai beaucoup entendu que les charts restaient mono-dataset. Eh bien non et en voilà la démonstration:&lt;br /&gt;&lt;br /&gt;Ici j'ai fait un rapport tout bête sur AWDW2008R2: un DataSet qui renvoie la somme des InternetSales par année, un autre pour les ResellerSales. Je crée la courbe associée:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_kbsOT_Eyf_M/TFAHNy-UF_I/AAAAAAAAAjI/e0ZeNQoPBm8/s1600/1.png"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 185px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5498903078622205938" border="0" alt="" src="http://2.bp.blogspot.com/_kbsOT_Eyf_M/TFAHNy-UF_I/AAAAAAAAAjI/e0ZeNQoPBm8/s400/1.png" /&gt;&lt;/a&gt; Pour rajouter mon Lookup, je vais créer une série de valeurs calculée (Expressions).&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_kbsOT_Eyf_M/TFAJKRFJVYI/AAAAAAAAAjQ/tOx-_pYgCgo/s1600/2.png"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 219px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5498905217007703426" border="0" alt="" src="http://1.bp.blogspot.com/_kbsOT_Eyf_M/TFAJKRFJVYI/AAAAAAAAAjQ/tOx-_pYgCgo/s400/2.png" /&gt;&lt;/a&gt; Cette expression sera donc une recherche du champ Sales du DataSet InternetSales, en jointant avec les champs CalendarYear des deux DataSets.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_kbsOT_Eyf_M/TFAJOkSxnII/AAAAAAAAAjY/zMtoKGI0MRA/s1600/3.png"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 362px; DISPLAY: block; HEIGHT: 211px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5498905290884619394" border="0" alt="" src="http://2.bp.blogspot.com/_kbsOT_Eyf_M/TFAJOkSxnII/AAAAAAAAAjY/zMtoKGI0MRA/s400/3.png" /&gt;&lt;/a&gt; Et voilà le résultat!&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_kbsOT_Eyf_M/TFAJSlyuXMI/AAAAAAAAAjg/h8cBCOyYGgA/s1600/4.png"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 171px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5498905360006536386" border="0" alt="" src="http://3.bp.blogspot.com/_kbsOT_Eyf_M/TFAJSlyuXMI/AAAAAAAAAjg/h8cBCOyYGgA/s400/4.png" /&gt;&lt;/a&gt; A vous les charts avec plein de DataSets!&lt;br /&gt;A bientôt!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-3485578030015503174?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/3485578030015503174/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=3485578030015503174' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3485578030015503174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3485578030015503174'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/07/ssrs-chart-et-lookup-ca-marche-aussi.html' title='[SSRS] Chart et Lookup: ça marche aussi!'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kbsOT_Eyf_M/TFAHNy-UF_I/AAAAAAAAAjI/e0ZeNQoPBm8/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-8064613456743982974</id><published>2010-07-25T11:01:00.014+02:00</published><updated>2010-07-25T11:25:51.865+02:00</updated><title type='text'>[SSIS] "The package path references an object that cannot be found"</title><content type='html'>&lt;div style="text-align: left;"&gt;Alors ce message d'erreur: &lt;strong&gt;simple warning&lt;/strong&gt; ou &lt;strong&gt;erreur fatale&lt;/strong&gt;? Et bien les deux...&lt;/div&gt;&lt;div&gt;Revenons un peu en arrière et expliquons le contexte: un fichier de configuration SSIS contient sous forme Clé/Valeur &lt;strong&gt;des valeurs à &lt;/strong&gt;&lt;strong&gt;affecter au runtime à des propriétés&lt;/strong&gt; du package. En 2005, le fait &lt;strong&gt;qu'une propriété &lt;/strong&gt;&lt;strong&gt;n'existe pas&lt;/strong&gt; dans le package mais soit déclarée dans le fichier de configuration générait &lt;strong&gt;un petit warning&lt;/strong&gt; de rien du tout.&lt;/div&gt;&lt;div&gt;En 2008, un appel à DTEXEC avec en paramètre ce type de fichier de configuration générait une &lt;strong&gt;erreur de chargement fatale&lt;/strong&gt;. Résolu en SP1 CU4, ce bug - il faut donc l'appeller ainsi - a été longtemps considéré par tout le monde, moi y compris, comme une nouvelle feature, obligeant à arrêter de partager les fichiers de configuration entre les différents packages utilisant chacun des parties dédiées du fichier. Bien entendu ce "nouveau / ancien" mode de fonctionnement perdure sur R2:&lt;/div&gt;&lt;div&gt;Soit un nouveau Package comprenant la variable A. Cette variable comprend "A's Default Value". Le package comprend un unique composant script qui affiche cette valeur dans une MessageBox.&lt;/div&gt;&lt;div&gt;&lt;img src="http://2.bp.blogspot.com/_kbsOT_Eyf_M/TEwBhfdal3I/AAAAAAAAAio/ff4gUh7cgTA/s400/Package.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 90px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5497770920004720498" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Soit son fichier de configuration, qui en plus de donner à A la valeur "A's Configured Value" cherche aussi à configurer B qui n'existe pas.&lt;/div&gt;&lt;img src="http://2.bp.blogspot.com/_kbsOT_Eyf_M/TEwCFW2egVI/AAAAAAAAAiw/d9MXQahISac/s400/Config.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 128px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5497771536169206098" /&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A l'exécution on a bien un warning, mais la valeur de A a bien été affectée, comme en témoigne la MessageBox.&lt;/div&gt;&lt;div&gt;&lt;img src="http://3.bp.blogspot.com/_kbsOT_Eyf_M/TEwCN7llKMI/AAAAAAAAAi4/5_6T5MOVj3Q/s400/Dtexec.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 81px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5497771683469404354" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;em&gt;Le lien sur Connect: &lt;a href="http://support.microsoft.com/kb/974076"&gt;http://support.microsoft.com/kb/974076&lt;/a&gt; &lt;/em&gt; &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-8064613456743982974?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/8064613456743982974/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=8064613456743982974' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/8064613456743982974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/8064613456743982974'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/07/ssis-package-path-references-object.html' title='[SSIS] &quot;The package path references an object that cannot be found&quot;'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kbsOT_Eyf_M/TEwBhfdal3I/AAAAAAAAAio/ff4gUh7cgTA/s72-c/Package.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-2004919927962047240</id><published>2010-07-02T09:42:00.004+02:00</published><updated>2010-07-08T16:18:46.621+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Autres'/><title type='text'>Nouveau MVP!</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_kbsOT_Eyf_M/TDXeNi2N38I/AAAAAAAAAig/bCdFr7oh5yw/s1600/MVP_BlueOnly.png"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 111px; DISPLAY: block; HEIGHT: 172px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5491539644922060738" border="0" alt="" src="http://3.bp.blogspot.com/_kbsOT_Eyf_M/TDXeNi2N38I/AAAAAAAAAig/bCdFr7oh5yw/s400/MVP_BlueOnly.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;J'ai appris hier que j'avais été nommé&lt;strong&gt; MVP SQL Server&lt;/strong&gt;. Merci à Microsoft pour cette jolie preuve de considération!&lt;br /&gt;Et bien sûr un grand merci à &lt;a href="http://blogs.developpeur.org/tom/"&gt;Thomas&lt;/a&gt; et plus globalement à toute la fantastique équipe avec qui je bosse depuis bientôt un an.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-2004919927962047240?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/2004919927962047240/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=2004919927962047240' title='6 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/2004919927962047240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/2004919927962047240'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/07/nouveau-mvp.html' title='Nouveau MVP!'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kbsOT_Eyf_M/TDXeNi2N38I/AAAAAAAAAig/bCdFr7oh5yw/s72-c/MVP_BlueOnly.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-9182707829924715009</id><published>2010-06-18T14:44:00.004+02:00</published><updated>2011-04-01T17:19:12.192+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PowerPivot'/><title type='text'>[PowerPivot] "Could not load file or assembly ‘Microsoft.AnalysisServices.SharePoint.Integration.dll’" Suite et fin!</title><content type='html'>&lt;div&gt;Ca y est, &lt;a href="http://fjehl.blogspot.com/2010/05/powerpivot-could-not-load-file-or.html"&gt;je vous en avais parlé&lt;/a&gt; mais le problème est enfin trouvé: cette erreur d'installation est due à l'installation de PowerPivot et d'un SSAS natif sur le même serveur &lt;b&gt;en commençant par SSAS. &lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Msmdsrv &lt;/b&gt;(le processus SSAS natif) inclut une référence vers &lt;i&gt;Microsoft.AnalysisServices.SharePoint.Integration&lt;/i&gt;, qui n'est &lt;b&gt;pas installée&lt;/b&gt; en mode natif. Cette erreur de chargement de référence&lt;b&gt; empêche le chargement ultérieur&lt;/b&gt; de la dll lors de l'installation de l'instance Vertipaq.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La solution: installer PowerPivot &lt;b&gt;AVANT &lt;/b&gt;une instance SSAS. Ou alors paramétrer le setup de PowerPivot pour que la dll soit chargée malgré cet échec de référence. J'ai testé cette dernière option qui marche bien. Vous trouverez tous les détails sur l'article de &lt;b&gt;Dave Wickert&lt;/b&gt; (de Microsoft)&lt;b&gt; &lt;/b&gt;: &lt;a href="http://powerpivotgeek.com/2010/06/14/installation-failure-could-not-load-file-or-assembly-microsoft-analysisservices-sharepoint-integration-dll/"&gt;http://powerpivotgeek.com/2010/06/14/installation-failure-could-not-load-file-or-assembly-microsoft-analysisservices-sharepoint-integration-dll/&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A bientôt!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-9182707829924715009?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/9182707829924715009/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=9182707829924715009' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/9182707829924715009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/9182707829924715009'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/06/powerpivot-could-not-load-file-or.html' title='[PowerPivot] &quot;Could not load file or assembly ‘Microsoft.AnalysisServices.SharePoint.Integration.dll’&quot; Suite et fin!'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-2638325841999861138</id><published>2010-06-08T10:21:00.007+02:00</published><updated>2010-06-08T11:10:19.235+02:00</updated><title type='text'>[SSAS] Automatiser l'import export de traductions (Translations)</title><content type='html'>Il vous est déjà sûrement arrivé d'avoir à &lt;strong&gt;localiser&lt;/strong&gt; un cube, c'est à dire de traduire sa structure de manière à ce qu'une dimension Produit s'appelle "Produkt" lorsque le cube est consulté depuis un poste germanique, "Product" depuis un anglophone... etc...&lt;br /&gt;&lt;br /&gt;Le mécanisme utilisé est celui des &lt;strong&gt;traductions&lt;/strong&gt; (ou &lt;strong&gt;Translations&lt;/strong&gt; en VO) affectable depuis &lt;strong&gt;BIDS&lt;/strong&gt; dans l'onglet du même nom pour les cubes et les dimensions.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 170px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5480316272385968546" border="0" alt="" src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/TA3-nSBbyaI/AAAAAAAAAhg/FuIcKJxuols/s400/Translations.png" /&gt;&lt;br /&gt;Le fait que l'on doive l'éditer dans BIDS est intéressant mais &lt;strong&gt;problématique&lt;/strong&gt; lorsque l'on utilise un &lt;strong&gt;prestataire&lt;/strong&gt; pour traduire le cube: il faut en effet soit fournir un accès en remote au cube, soit forger soit même un fichier Excel par une multitude de &lt;strong&gt;copier/coller&lt;/strong&gt;.&lt;br /&gt;Etant assez peu fan de ce genre de procédé je me suis mis en tête de voir comment ce genre d'application pouvait &lt;strong&gt;s'automatiser&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Tout d'abord BIDS communique avec SSAS par AMO, il est donc intéressant de se plonger dans technet pour voir comment ces Translations sont représentées dans le modèle. Dans ce très &lt;a href="http://msdn.microsoft.com/en-us/library/ms345086.aspx#Transl"&gt;petit paragraphe&lt;/a&gt; de l'article "&lt;em&gt;&lt;strong&gt;Programming AMO Advanced Objects"&lt;/strong&gt;&lt;/em&gt; on remarque que Translations est une collection qui est attachée à &lt;strong&gt;tout objet pouvant être traduit&lt;/strong&gt;, et qui comprend des objets Translation.&lt;br /&gt;Cet objet comprend - toujours en se référant à la &lt;a href="http://technet.microsoft.com/en-us/library/microsoft.analysisservices.translation_members.aspx"&gt;doc &lt;/a&gt;- trois propriétés texte, Caption Description et DisplayFolder ainsi qu'un identifiant de langue entier (qu'on imagine être 1033 pour l'anglais, 1036 pour le français...).&lt;br /&gt;&lt;em&gt;&lt;strong&gt;1ère constatation:&lt;/strong&gt; il n'y a pas de repository central des translations, il faudra parcourir l'arbre des composants d'une base pour extraire ces objets.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Ensuite qu'est ce qui peut être &lt;strong&gt;traduit&lt;/strong&gt; sur un composant et comment est-ce associé à une propriété d'un objet Translation? Là pour le coup rien n'est défini dans le modèle, c'est là encore du côté de la doc et de &lt;a href="http://msdn.microsoft.com/en-us/library/ms174552(SQL.90).aspx"&gt;cet article &lt;/a&gt;que la réponse est venue.&lt;br /&gt;&lt;em&gt;&lt;strong&gt;2ème constation&lt;/strong&gt;: ce qui peut être traduit n'est pas déductible du modèle, il va falloir le modéliser&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Enfin en creusant un peu j'ai remarqué quelques &lt;strong&gt;incongruités&lt;/strong&gt; dans le modèle: les Attributes utilisent une spécialisation de Translation (&lt;strong&gt;&lt;a href="http://technet.microsoft.com/fr-fr/library/microsoft.analysisservices.attributetranslation(SQL.90).aspx"&gt;AttributeTranslation&lt;/a&gt;&lt;/strong&gt;), de même les collections de traductions ne s'appellent pas toujours &lt;strong&gt;Translations&lt;/strong&gt;.&lt;br /&gt;&lt;em&gt;&lt;strong&gt;3ème constatation&lt;/strong&gt;&lt;/em&gt;: &lt;em&gt;le modèle n'est pas très facile et cohérent, ce qui rend difficile son traitement automatisé.&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;strong&gt;La modélisation&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;La première étape pour se débarasser de ces problèmes est donc arriver à modéliser l'arbre des propriétés traductibles des objets de la base, ce en gérant les potentielles incongruités. Un arbre étant assez facile à modéliser en &lt;strong&gt;xml&lt;/strong&gt;, je m'y suis attelé, ce qui donne le fichier XML suivant:&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-BOTTOM: rgb(204,204,204) 1px dashed; TEXT-ALIGN: left; BORDER-LEFT: rgb(204,204,204) 1px dashed; PADDING-BOTTOM: 0px; LINE-HEIGHT: 20px; PADDING-LEFT: 0px; WIDTH: 99%; PADDING-RIGHT: 0px; FONT-FAMILY: arial; BACKGROUND: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) rgb(240,240,240); HEIGHT: auto; COLOR: rgb(0,0,0); FONT-SIZE: 12px; OVERFLOW: auto; BORDER-TOP: rgb(204,204,204) 1px dashed; BORDER-RIGHT: rgb(204,204,204) 1px dashed; PADDING-TOP: 0px; -moz-background-inline-policy: continuous; -moz-background-clip: border; -moz-background-origin: padding"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;&lt;br /&gt;&amp;lt;Object name="Databases"&amp;gt;&lt;br /&gt; &amp;lt;Object name="Cubes"&amp;gt;&lt;br /&gt;  &amp;lt;Object name="MeasureGroups"&amp;gt;&lt;br /&gt;   &amp;lt;Object name="Measures"&amp;gt;&lt;br /&gt;    &amp;lt;Property name="Name" translation="Caption"/&amp;gt;&lt;br /&gt;    &amp;lt;Property name="DisplayFolder" translation="DisplayFolder"/&amp;gt;&lt;br /&gt;   &amp;lt;/Object&amp;gt;&lt;br /&gt;   &amp;lt;Property name="Name" translation="Caption"/&amp;gt;&lt;br /&gt;  &amp;lt;/Object&amp;gt;&lt;br /&gt;  &amp;lt;Object name="Dimensions"&amp;gt;&lt;br /&gt;   &amp;lt;Property name="Name" translation="Caption"/&amp;gt;&lt;br /&gt;  &amp;lt;/Object&amp;gt;&lt;br /&gt;  &amp;lt;Object name="Perspectives"&amp;gt;&lt;br /&gt;   &amp;lt;Property name="Name" translation="Caption"/&amp;gt;&lt;br /&gt;  &amp;lt;/Object&amp;gt;&lt;br /&gt;  &amp;lt;Object name="Kpis"&amp;gt;&lt;br /&gt;   &amp;lt;Property name="Name" translation="Caption"/&amp;gt;&lt;br /&gt;   &amp;lt;Property name="Description" translation="Description"/&amp;gt;&lt;br /&gt;   &amp;lt;Property name="DisplayFolder" translation="DisplayFolder"/&amp;gt;&lt;br /&gt;  &amp;lt;/Object&amp;gt;&lt;br /&gt;  &amp;lt;Object name="Actions"&amp;gt;&lt;br /&gt;   &amp;lt;Property name="Name" translation="Caption"/&amp;gt;&lt;br /&gt;   &amp;lt;Property name="Name" translation="Description"/&amp;gt;&lt;br /&gt;  &amp;lt;/Object&amp;gt;&lt;br /&gt;  &amp;lt;Property name="Name" translation="Caption"/&amp;gt;&lt;br /&gt;  &amp;lt;Property name="Description" translation="Description"/&amp;gt;&lt;br /&gt; &amp;lt;/Object&amp;gt;&lt;br /&gt; &amp;lt;Object name="Dimensions"&amp;gt;&lt;br /&gt;  &amp;lt;Object name="Attributes"&amp;gt;&lt;br /&gt;   &amp;lt;Object name="AttributeRelationships" id="AttributeID"&amp;gt;&lt;br /&gt;    &amp;lt;Property name="Name" translation="Caption"/&amp;gt;&lt;br /&gt;   &amp;lt;/Object&amp;gt;&lt;br /&gt;   &amp;lt;Property name="Name" translation="Caption"/&amp;gt;&lt;br /&gt;   &amp;lt;Property name="AttributeHierarchyDisplayFolder" translation="DisplayFolder"/&amp;gt;&lt;br /&gt;   &amp;lt;Property name="MembersWithDataCaption" translation="MembersWithDataCaption"/&amp;gt;&lt;br /&gt;  &amp;lt;/Object&amp;gt;&lt;br /&gt;  &amp;lt;Object name="Hierarchies"&amp;gt;&lt;br /&gt;   &amp;lt;Object name="Levels"&amp;gt;&lt;br /&gt;    &amp;lt;Property name="Name" translation="Caption"/&amp;gt;&lt;br /&gt;   &amp;lt;/Object&amp;gt;&lt;br /&gt;   &amp;lt;Property name="Name" translation="Caption"/&amp;gt;&lt;br /&gt;   &amp;lt;Property name="AllMemberName" translation="Caption" collection="AllMemberTranslations"/&amp;gt;&lt;br /&gt;  &amp;lt;/Object&amp;gt;&lt;br /&gt;  &amp;lt;Property name="Name" translation="Caption"/&amp;gt;&lt;br /&gt;  &amp;lt;Property name="AttributeAllMemberName" translation="Caption" collection="AttributeAllMemberTranslations"/&amp;gt;&lt;br /&gt;  &amp;lt;Property name="UnknownMemberName" translation="Caption" collection="UnknownMemberTranslations"/&amp;gt;&lt;br /&gt; &amp;lt;/Object&amp;gt;&lt;br /&gt; &amp;lt;Property name="Name" translation="Caption"/&amp;gt;&lt;br /&gt; &amp;lt;Property name="Description" translation="Description"/&amp;gt;&lt;br /&gt;&amp;lt;/Object&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Bon, maintenant il est possible de &lt;strong&gt;parcourir cet arbre&lt;/strong&gt; et d'extraire les champs du cube devant être traduits en les documentant suffisamment pour faciliter leur &lt;strong&gt;import ultérieur.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Le code d'export&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Bon ça n'est pas le code le plus propre de l'année - il s'agit d'un prototype :) - mais bon ça marche. L'idée est simplement de partir du noeud Database (le paramètre ModelComponent) et de son élément XML associé pour faire un &lt;strong&gt;parcours en profondeur&lt;/strong&gt; et retrouver par réflexion les collections d'enfants et leurs membres.&lt;/p&gt;&lt;pre style="BORDER-BOTTOM: rgb(204,204,204) 1px dashed; TEXT-ALIGN: left; BORDER-LEFT: rgb(204,204,204) 1px dashed; PADDING-BOTTOM: 0px; LINE-HEIGHT: 20px; PADDING-LEFT: 0px; WIDTH: 99%; PADDING-RIGHT: 0px; FONT-FAMILY: arial; BACKGROUND: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) rgb(240,240,240); HEIGHT: auto; COLOR: rgb(0,0,0); FONT-SIZE: 12px; OVERFLOW: auto; BORDER-TOP: rgb(204,204,204) 1px dashed; BORDER-RIGHT: rgb(204,204,204) 1px dashed; PADDING-TOP: 0px; -moz-background-inline-policy: continuous; -moz-background-clip: border; -moz-background-origin: padding"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;    public IEnumerable&lt;outputline&gt; ExtractTranslations(ModelComponent c, XElement e)&lt;br /&gt;    {&lt;br /&gt;        Type t = c.GetType();&lt;br /&gt;        string ID = (e.Attribute("id") != null)&lt;br /&gt;           ? e.Attribute("id").Value&lt;br /&gt;           : "ID";&lt;br /&gt;        string path = e.Attribute("name").Value + "[" +&lt;br /&gt;            t.GetProperty(ID).GetValue(c, null).ToString() + "]";&lt;br /&gt;&lt;br /&gt;        //Pour chaque propriété du noeud courant on retourne une ligne&lt;br /&gt;        foreach (XElement p in e.Elements("Property"))&lt;br /&gt;        {&lt;br /&gt;            object propertyValue = t.GetProperty(p.Attribute("name").Value)&lt;br /&gt;               .GetValue(c, null);&lt;br /&gt;            if (propertyValue != null)&lt;br /&gt;            {&lt;br /&gt;                yield return new OutputLine()&lt;br /&gt;                {&lt;br /&gt;                    Path = path,&lt;br /&gt;                    Value = t.GetProperty(p.Attribute("name").Value)&lt;br /&gt;                       .GetValue(c, null).ToString(),&lt;br /&gt;                    Property = p.Attribute("translation").Value,&lt;br /&gt;                    CustomCollection = (p.Attribute("collection") != null)&lt;br /&gt;                       ? p.Attribute("collection").Value&lt;br /&gt;                       : "Translations"&lt;br /&gt;                };&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        //Puis on fait un appel récursif par enfant de chaque collection d'enfants&lt;br /&gt;        foreach (XElement o in e.Elements("Object"))&lt;br /&gt;        {&lt;br /&gt;            var childrenCollection = t.GetProperty(o.Attribute("name").Value)&lt;br /&gt;                .GetValue(c, null) as IEnumerable;&lt;br /&gt;            foreach (ModelComponent child in childrenCollection)&lt;br /&gt;            {&lt;br /&gt;                foreach (OutputLine ol in ExtractTranslations(child, o))&lt;br /&gt;                {&lt;br /&gt;                    ol.Path = path + "." + ol.Path;&lt;br /&gt;                    yield return ol;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Quel est le résultat en sortie? Un fichier fait un peu comme cela (j'ai laissé une seule ligne en exemple)ça: &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;Databases[Adventure Works DW 2008]&lt;br /&gt;.Cubes[Adventure Works]&lt;br /&gt;.MeasureGroups[Fact Internet Sales 1]&lt;br /&gt;;Translations&lt;br /&gt;;1033&lt;br /&gt;;Caption&lt;br /&gt;;Internet Sales&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Et cette chose là peut s'importer facilement: si si la preuve!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Code d'import&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;La on va descendre par réflexion le &lt;strong&gt;path&lt;/strong&gt; , pour affecter à la &lt;strong&gt;collection&lt;/strong&gt; de traductions (au nom fourni en paramètre) un membre qui comprendra pour le &lt;strong&gt;champ&lt;/strong&gt; fourni la &lt;strong&gt;valeur&lt;/strong&gt; récupérée.&lt;br /&gt;&lt;/p&gt;&lt;pre style="BORDER-BOTTOM: rgb(204,204,204) 1px dashed; TEXT-ALIGN: left; BORDER-LEFT: rgb(204,204,204) 1px dashed; PADDING-BOTTOM: 0px; LINE-HEIGHT: 20px; PADDING-LEFT: 0px; WIDTH: 99%; PADDING-RIGHT: 0px; FONT-FAMILY: arial; BACKGROUND: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) rgb(240,240,240); HEIGHT: auto; COLOR: rgb(0,0,0); FONT-SIZE: 12px; OVERFLOW: auto; BORDER-TOP: rgb(204,204,204) 1px dashed; BORDER-RIGHT: rgb(204,204,204) 1px dashed; PADDING-TOP: 0px; -moz-background-inline-policy: continuous; -moz-background-clip: border; -moz-background-origin: padding"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;&lt;br /&gt;public void PutTranslation(Server root, InputLine l)&lt;br /&gt;{&lt;br /&gt;    //D'abord on descend le path jusqu'a l'objet a traduire&lt;br /&gt;    MajorObject closerMajorObject = root;&lt;br /&gt;    ModelComponent current = root;&lt;br /&gt;    while (l.Path.Length &gt; 0)&lt;br /&gt;    {&lt;br /&gt;        string currentPath = l.Path.Split('.')[0];&lt;br /&gt;        object childrenCollection = current.GetType()&lt;br /&gt;            .GetProperty(currentPath.Split('[')[0])&lt;br /&gt;            .GetValue(current, null);&lt;br /&gt;        //On positionne le courant sur la collection fille, a l'index specifie&lt;br /&gt;        PropertyInfo accessor = childrenCollection.GetType()&lt;br /&gt;            .GetProperty("Item", new Type[] { typeof(string) });&lt;br /&gt;        current = accessor&lt;br /&gt;            .GetValue(childrenCollection&lt;br /&gt;            , new object[] { currentPath.Split('[')[1].TrimEnd(']') }) as ModelComponent;&lt;br /&gt;        //Si on est sur le dernier noeud on vide la chaine pour sortir&lt;br /&gt;        if (l.Path.Contains('.'))&lt;br /&gt;            l.Path = l.Path.Substring(currentPath.Length + 1);&lt;br /&gt;        else&lt;br /&gt;            l.Path = string.Empty;&lt;br /&gt;    }&lt;br /&gt;    //On recupere la collection a modifier&lt;br /&gt;    object translationCollection = current.GetType()&lt;br /&gt;        .GetProperty(l.CustomCollection)&lt;br /&gt;        .GetValue(current, null);&lt;br /&gt;&lt;br /&gt;    //On recherche le type de traduction attendue&lt;br /&gt;    //(les DimensionAttribute utilisent un type particulier)&lt;br /&gt;    string type = (current.GetType().Name == "DimensionAttribute")&lt;br /&gt;        ? "AttributeTranslation"&lt;br /&gt;        : "Translation";&lt;br /&gt;    //On recherche la methode add sur la collection&lt;br /&gt;    MethodInfo translationAdder = translationCollection.GetType()&lt;br /&gt;        .GetMethods()&lt;br /&gt;        .Where(m =&gt; m.Name == "Add" &amp;amp;&amp;amp; m.GetParameters()[0].ParameterType.Name == type)&lt;br /&gt;        .First();&lt;br /&gt;    //On recherche un objet de traduction pour ce langage si il existe&lt;br /&gt;    object translation = translationCollection.GetType()&lt;br /&gt;        .GetMethod("FindByLanguage")&lt;br /&gt;        .Invoke(translationCollection, new object[] { l.Language });&lt;br /&gt;    //Sinon on cree un nouvel objet en invoquant le constructeur (int32)&lt;br /&gt;    if (translation == null)&lt;br /&gt;    {&lt;br /&gt;        translation = translationAdder.GetParameters()[0].ParameterType&lt;br /&gt;            .GetConstructor(new Type[] { typeof(Int32) })&lt;br /&gt;            .Invoke(new object[] { l.Language });&lt;br /&gt;        translationAdder.Invoke(translationCollection, new object[] { translation });&lt;br /&gt;    }&lt;br /&gt;    //On affecte la valeur&lt;br /&gt;    translation.GetType()&lt;br /&gt;        .GetProperty(l.Property)&lt;br /&gt;        .SetValue(translation, l.Value, null);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Voilà avec ça ça suffit pour tout importer, et vous pouvez même le tester: j'ai intégré cela dans &lt;a href="http://cid-a23884c7072e2532.office.live.com/self.aspx/Public/SsasTranslator.dtsx"&gt;un petit lot SSIS sur mon SkyDrive&lt;/a&gt;. N'hésitez pas si vous avez des questions!&lt;/p&gt;&lt;p&gt;A bientôt!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-2638325841999861138?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/2638325841999861138/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=2638325841999861138' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/2638325841999861138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/2638325841999861138'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/06/ssas-automatiser-limport-export-de.html' title='[SSAS] Automatiser l&apos;import export de traductions (Translations)'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kbsOT_Eyf_M/TA3-nSBbyaI/AAAAAAAAAhg/FuIcKJxuols/s72-c/Translations.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-5781329503288086022</id><published>2010-05-27T14:34:00.011+02:00</published><updated>2011-04-01T17:18:57.076+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reporting Services'/><title type='text'>[SSRS] Afficher une image alternative si l'image n'existe pas</title><content type='html'>Bon question assez demandée, et pourtant assez peu référencée donc je donne &lt;b&gt;ma &lt;/b&gt;solution - qui est, n'en doutez pas, &lt;b&gt;perfectible&lt;/b&gt;. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bon d'abord on va dans les propriétés du rapport &lt;b&gt;ajouter du beau - sic - VB bien crade&lt;/b&gt;. Cette fonction &lt;i&gt;homemade &lt;/i&gt;va simplement faire une webrequest sur l'URL de l'image. Si celle ci se déroule bien on renvoie true, false dans tous les autres cas.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre style="BORDER-BOTTOM: rgb(204,204,204) 1px dashed; TEXT-ALIGN: left; BORDER-LEFT: rgb(204,204,204) 1px dashed; PADDING-BOTTOM: 0px; LINE-HEIGHT: 20px; PADDING-LEFT: 0px; WIDTH: 99%; PADDING-RIGHT: 0px; FONT-FAMILY: arial; BACKGROUND: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) rgb(240,240,240); HEIGHT: auto; COLOR: rgb(0,0,0); FONT-SIZE: 12px; OVERFLOW: auto; BORDER-TOP: rgb(204,204,204) 1px dashed; BORDER-RIGHT: rgb(204,204,204) 1px dashed; PADDING-TOP: 0px; -moz-background-inline-policy: continuous; -moz-background-clip: border; -moz-background-origin: padding"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;Public Function ImageExists(ByVal imgPath As String) As Boolean&lt;br /&gt;  Dim netCall As System.Net.HttpWebRequest = _&lt;br /&gt;  System.Net.HttpWebRequest.Create(imgPath)&lt;br /&gt;  netCall.Credentials =  System.Net.CredentialCache.DefaultCredentials&lt;br /&gt;  netCall.Timeout = 1000&lt;br /&gt;  Dim resp As System.Net.HttpWebResponse = Nothing&lt;br /&gt;  Try&lt;br /&gt;     resp = netCall.GetResponse()&lt;br /&gt;     If resp.StatusCode = System.Net.HttpStatusCode.OK&lt;br /&gt;        Then Return true&lt;br /&gt;  Catch ex As System.Exception&lt;br /&gt;     Return false&lt;br /&gt;  End Try&lt;br /&gt;End Function&lt;/code&gt;&lt;/pre&gt;Il ne reste plus qu'à utiliser ce "magnifique" code dans l'expression Source, comme ici:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_kbsOT_Eyf_M/S_5r0ie4G0I/AAAAAAAAAhA/IS7_l4z8vOw/s1600/Untitled.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 286px; DISPLAY: block; HEIGHT: 197px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5475932747282783042" border="0" alt="" src="http://3.bp.blogspot.com/_kbsOT_Eyf_M/S_5r0ie4G0I/AAAAAAAAAhA/IS7_l4z8vOw/s400/Untitled.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre style="BORDER-BOTTOM: rgb(204,204,204) 1px dashed; TEXT-ALIGN: left; BORDER-LEFT: rgb(204,204,204) 1px dashed; PADDING-BOTTOM: 0px; LINE-HEIGHT: 20px; PADDING-LEFT: 0px; WIDTH: 99%; PADDING-RIGHT: 0px; FONT-FAMILY: arial; BACKGROUND: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) rgb(240,240,240); HEIGHT: auto; COLOR: rgb(0,0,0); FONT-SIZE: 12px; OVERFLOW: auto; BORDER-TOP: rgb(204,204,204) 1px dashed; BORDER-RIGHT: rgb(204,204,204) 1px dashed; PADDING-TOP: 0px; -moz-background-inline-policy: continuous; -moz-background-clip: border; -moz-background-origin: padding"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;=IIf(Code.ImageExists(Fields!ImageURI.Value.ToString())&lt;br /&gt;,Fields!ImageURI.Value&lt;br /&gt;,&lt;a href="http://www./.../noImageAvailable.jpg"&gt;http://www./.../noImageAvailable.jpg&lt;/a&gt;)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_kbsOT_Eyf_M/S_5wDBDM2vI/AAAAAAAAAhY/XYlY8C6j-8A/s1600/Untitled.png"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 155px; DISPLAY: block; HEIGHT: 206px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5475937394052881138" border="0" alt="" src="http://1.bp.blogspot.com/_kbsOT_Eyf_M/S_5wDBDM2vI/AAAAAAAAAhY/XYlY8C6j-8A/s400/Untitled.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Voilà le résultat, à bientôt!&lt;/p&gt;&lt;p&gt;PS: bon ici c'est pour un accès par URL, pour un accès en local un File.Exists aurait suffi. Dans le cas d'une image BLOB ça se traite en SQL!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-5781329503288086022?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/5781329503288086022/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=5781329503288086022' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/5781329503288086022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/5781329503288086022'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/05/ssrs-afficher-une-image-alternative-si.html' title='[SSRS] Afficher une image alternative si l&apos;image n&apos;existe pas'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kbsOT_Eyf_M/S_5r0ie4G0I/AAAAAAAAAhA/IS7_l4z8vOw/s72-c/Untitled.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-8445687068295021520</id><published>2010-05-23T13:05:00.011+02:00</published><updated>2011-04-01T17:19:58.313+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Integration Services'/><title type='text'>[SSIS] Modifier l'apparence des packages via l'API [FAIL]</title><content type='html'>Ahhhh celle là on me l'a posée très récemment, au travers de la question &lt;b&gt;"Comment ajouter programmatiquement des commentaires à un package"&lt;/b&gt; et je dois avouer que je me suis cassé la tête des nuits dessus il y a quelques mois, à la suite de la lecture d'un thread très proche entre &lt;b&gt;Jamie Thomson&lt;/b&gt; et l'équipe de dev.&lt;div&gt; &lt;/div&gt;&lt;div&gt;SSIS vous le savez fournit &lt;b&gt;une très belle API de design de packages&lt;/b&gt;, qui permet de modifier tout un tas de composants appartenant à ce beau schéma que j'affectionne:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_kbsOT_Eyf_M/S_kVZGK4K7I/AAAAAAAAAgw/ykyzAq64MXo/s1600/Cc966389.Integration_001(fr-fr,TechNet.10).gif" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 298px; height: 400px;" src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/S_kVZGK4K7I/AAAAAAAAAgw/ykyzAq64MXo/s400/Cc966389.Integration_001(fr-fr,TechNet.10).gif" border="0" alt="" id="BLOGGER_PHOTO_ID_5474430342942698418" /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mais dans ce schéma et dans la doc de l'API, &lt;b&gt;aucune note sur l'apparence&lt;/b&gt;... Comment réorganiser les tâches, ajouter un commentaire? &lt;/div&gt;&lt;div&gt;Ouvrons donc un package SSIS en mode code pour voir comment cela est stocké. Un package est bien un fichier XML stockant toutes ses &lt;b&gt;propriétés et composants sous format XML&lt;/b&gt;, comme on peut le voir ci-dessous:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_kbsOT_Eyf_M/S_kWZj7plzI/AAAAAAAAAg4/hJYnENpWodM/s1600/image_thumb_5D8A05B4.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 145px;" src="http://3.bp.blogspot.com/_kbsOT_Eyf_M/S_kWZj7plzI/AAAAAAAAAg4/hJYnENpWodM/s400/image_thumb_5D8A05B4.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5474431450443519794" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En revanche dans ce code XML bien propre  &lt;b&gt;aucune mention de l'apparence, du positionnement des éléments, des commentaires.&lt;/b&gt; Par contre en scrollant un peu vers le bas, on trouve une propriété de package au nom étrange:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;DTS:Property DTS:Name="PackageVariableValue" DTS:DataType="8"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;Hmm... et cette propriété contient du code XML dont les balises &amp;gt; et &amp;lt; ont été échappées avec leur code (gt, lt). Ce code XML est très long et abscons et décrit des &lt;b&gt;positions &lt;/b&gt;d'objets. Un &lt;b&gt;commentaire&lt;/b&gt;, objet qui n'apparait pas dans l'api, apparaît ici sous cette forme (j'ai "deséchappé" les caractères pour que ça ressemble à du XML (le commentaire est encodé en binaire dans la propriété binary) :&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;lt;ddscontrol controlprogid=&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;"MSDDS.Text"&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; left="-5172" top="-129" logicalid="38" controlid="20" masterid="8" hint1="0" hint2="0" width="2970" height="344" noresize="1" nomove="0" nodefaultattachpoints="1" autodrag="1" usedefaultiddshape="1" selectable="0" showselectionhandles="0" allownudging="1" isannotation="0" dontautolayout="1" groupcollapsed="0" tabstop="0" visible="1" snaptogrid="0"&amp;gt;&amp;lt;control&amp;gt;&amp;lt;ddsxmlobjectstreaminitwrapper &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;binary&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;="000200009a0b000058010000030000000000050" /&amp;gt;&amp;lt;/control&amp;gt;&amp;lt;layoutobject&amp;gt;&amp;lt;ddsxmlobj&amp;gt;&amp;lt;property name="AnnotationAdornment" value="-1" vartype="11"/&amp;gt;&amp;lt;/ddsxmlobj&amp;gt;&amp;lt;/layoutobject&amp;gt;&amp;lt;shape groupshapeid="0" groupnode="0" /&amp;gt;&amp;lt;/ddscontrol&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;La première chose que l'on remarque ici c'est le nom du contrôle de commentaire, MSDDS.Text. Qu'est ce que c'est que ça?&lt;div&gt;Quelques recherches plus tard vous auriez appris que &lt;b&gt;DaVinci Design Surface &lt;/b&gt;est une très vieille API native de design de diagrammes (tiens donc...) utilisée dans Visual Studio 5.0 et 6.0 mais ayant &lt;b&gt;vocation à disparaître. &lt;/b&gt;La team SSIS l'aurait utilisé en 2005 faute de mieux.&lt;b&gt; &lt;/b&gt;Il y a donc une grosse différence entre MSDDS - le code XML échappé bourré au milieu des éléments -  et la structure des packages. &lt;/div&gt;&lt;div&gt;&lt;b&gt;Un commentaire ne fait pas partie des objets de package... Too bad.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Je vais vous épargner mes digressions au Reflector et mes réouvertures de packages en interop MSDDS pour modifier les commentaires, tentatives ayant toutes abouti &lt;b&gt;à créer des monstres&lt;/b&gt; imparsables (jouer au Dr Frankenstein n'est décidément pas rentable).&lt;/div&gt;&lt;div&gt;&lt;b&gt;Moralité&lt;/b&gt;: pour le moment, pour de la documentation automatique, &lt;b&gt;utilisez les champs Description&lt;/b&gt; des objets, c'est bien plus facile, accessible via l'API, et en plus ça tiendra probablement la migration en SSIS Denali, ce qui ne serait probablement pas le cas de mes cochoncetés en natif.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A bientôt!&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-8445687068295021520?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/8445687068295021520/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=8445687068295021520' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/8445687068295021520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/8445687068295021520'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/05/ssis-modifier-lapparence-des-packages.html' title='[SSIS] Modifier l&apos;apparence des packages via l&apos;API [FAIL]'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kbsOT_Eyf_M/S_kVZGK4K7I/AAAAAAAAAgw/ykyzAq64MXo/s72-c/Cc966389.Integration_001(fr-fr,TechNet.10).gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-4292188099657006050</id><published>2010-05-17T14:50:00.010+02:00</published><updated>2011-04-01T17:20:14.599+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PowerShell'/><category scheme='http://www.blogger.com/atom/ns#' term='Integration Services'/><title type='text'>[SSIS] Utiliser PowerShell pour remplacer DtUtil et le manifeste</title><content type='html'>Ceux qui lisent ce blog - merci à eux! - le savent, &lt;strong&gt;je ne supporte pas le manifeste de déploiement&lt;/strong&gt; et utilise plutôt l'utilitaire &lt;strong&gt;DtUtil&lt;/strong&gt; pour déployer mes packages.&lt;br /&gt;Il arrive malheureusement que l'on me rétorque que le manifeste de déploiement dispose de nombreux avantages par rapport à mon utilitaire préféré.&lt;br /&gt;...pour être honnête en réalité il n'en a que deux.&lt;br /&gt;&lt;br /&gt;1) Il est plutôt joli&lt;br /&gt;2) Il permet de &lt;strong&gt;modifier l'emplacement de la configuration&lt;/strong&gt; dans le package&lt;br /&gt;&lt;br /&gt;Si l'on omet le point numéro 1 (la cosmétique étant par nature subjective) on se dit que la seule chose sympatique que permet ce manifeste c'est d'éditer le lot pour changer sa node "Configuration".&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Quels seraient donc les specs de l'utilitaire "idéal"?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Il serait &lt;strong&gt;automatisable&lt;/strong&gt; - ce qu'est DtUtil mais pas le manifeste - et pourrait déployer des configurations tout en modifiant leur &lt;strong&gt;chemin&lt;/strong&gt; - ce que ne sait pas faire DtUtil. Il s'agirait donc &lt;strong&gt;d'un DtUtil&lt;/strong&gt; capable de &lt;strong&gt;modifier un dtsx.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;DtUtil et le manifeste supplantés par PowerShell!&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;L'API .NET SSIS et son objet Application permettent d'ouvrir un lot, de le modifier et de le déployer ou que ce soit (DTS, SQL, File), ils constituent donc une solution &lt;strong&gt;stable&lt;/strong&gt; (pas d'édition de XML très sale) et... scriptable donc automatisable, &lt;strong&gt;grâce à PowerShell&lt;/strong&gt;!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Un petit exemple&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;En trois temps:&lt;br /&gt;&lt;br /&gt;1) On modifie le package&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;$app = new-object Microsoft.SqlServer.Dts.Runtime.Application&lt;br /&gt;$pkg = $app.LoadPackage($oldPackagePath,$null)&lt;br /&gt;$oldConfigPath = $pkg.Configurations[0].ConfigurationString&lt;br /&gt;$pkg.Configurations[0].ConfigurationString = $newConfigPath&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;2)On déploie la configuration à sa destination&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;Copy-Item $oldConfigPath $newConfigPath&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;3) On déploie le package à sa destination (en fichier ici mais cela aurait pu être SQL)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;$app.SaveToXml($newPackagePath,$pkg,$null)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_kbsOT_Eyf_M/S_FSoq_K_GI/AAAAAAAAAgY/6TOGuc8MJpQ/s1600/D%C3%A9ploiement+SSIS.PNG"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; DISPLAY: block; CURSOR: hand" id="BLOGGER_PHOTO_ID_5472245880919358562" border="0" alt="" src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/S_FSoq_K_GI/AAAAAAAAAgY/6TOGuc8MJpQ/s400/D%C3%A9ploiement+SSIS.PNG" /&gt;&lt;/a&gt; Et voilà!&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_kbsOT_Eyf_M/S_FT8LGRUSI/AAAAAAAAAgg/rhePTZ9G4VA/s1600/DSTX.PNG"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; DISPLAY: block;  CURSOR: hand" id="BLOGGER_PHOTO_ID_5472247315468210466" border="0" alt="" src="http://1.bp.blogspot.com/_kbsOT_Eyf_M/S_FT8LGRUSI/AAAAAAAAAgg/rhePTZ9G4VA/s400/DSTX.PNG" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-4292188099657006050?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/4292188099657006050/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=4292188099657006050' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/4292188099657006050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/4292188099657006050'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/05/ssis-utiliser-powershell-pour-remplacer.html' title='[SSIS] Utiliser PowerShell pour remplacer DtUtil et le manifeste'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kbsOT_Eyf_M/S_FSoq_K_GI/AAAAAAAAAgY/6TOGuc8MJpQ/s72-c/D%C3%A9ploiement+SSIS.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-5496265489246911400</id><published>2010-05-17T12:03:00.004+02:00</published><updated>2010-05-17T12:10:00.620+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Integration Services'/><title type='text'>[SSIS 2008] Quoi?? "The package path references an object that cannot be found"</title><content type='html'>Mais que se passe-t-il? Ce fichier de configuration, que vous utilisiez en 2005 passait très bien en &lt;strong&gt;DtExex /ConfigFile &lt;/strong&gt;- certes avec quelques warning - mais le voilà qui vous lève l'erreur suivante:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;The package path references an object that cannot be found&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ce problème s'ajoute à la série des modifications de comportement de DtExec (voir aussi le fait déja abordé que les configurations définies dans le package prennent le pas sur celles de /ConfigFile)&lt;br /&gt;mais il ne s'agit pas ici une feature &lt;strong&gt;mais bien un bug corrigé dans le CU4 du SP1 de SQL Server 2008&lt;/strong&gt;. Si vous ne pouvez pas l'installer sachez que configurer le fichier en tant que configuration dans BIDS permet d'exécuter le package comme avant.&lt;br /&gt;&lt;br /&gt;Source: Lien sur le &lt;a href="http://support.microsoft.com/kb/974076/en-us"&gt;support &lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-5496265489246911400?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/5496265489246911400/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=5496265489246911400' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/5496265489246911400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/5496265489246911400'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/05/ssis-2008-quoi-package-path-references.html' title='[SSIS 2008] Quoi?? &quot;The package path references an object that cannot be found&quot;'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-3518925825538611801</id><published>2010-05-13T16:22:00.000+02:00</published><updated>2010-05-13T16:23:50.241+02:00</updated><title type='text'>[SSIS] Le Data Flow et les Expressions ("Ca marchait bien dans DTS!")</title><content type='html'>&lt;div&gt;L'autre jour me vient l'idée de modifier dynamiquement la propriété MinSimilarity d'un Fuzzy Lookup depuis un fichier de configuration... Et oh stupeur c'est impossible.&lt;/div&gt;&lt;div&gt;Parce qu'on ne peut pas tout modifier dans SSIS, ça n'est pas DTS...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Nous reparle pas de DTS!&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Ah DTS... les scripts ActiveX qui permettent de modifier n'importe quelle propriété du package quel "bonheur". En effet le modèle objet d'un lot DTS 2000 était&lt;b&gt; directement accessible en écriture depuis le lot lui même&lt;/b&gt;. Pratique mais un tel &lt;b&gt;nid à bug &lt;/b&gt;qu'un tout autre paradigme a été employé pour SSIS. Les assignations dynamiques de propriétés passent par des &lt;b&gt;Expressions &lt;/b&gt;strictement encadrées, mais qui n'enlèvent pas (ou peu) de fonctionnalités de paramétrage dynamique. (Voir ce &lt;a href="http://consultingblogs.emc.com/jamiethomson/archive/2005/02/28/1085.aspx"&gt;très vieux post&lt;/a&gt; de Jamie Thomson)&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Et le Data Flow?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;En ce qui concerne le Data Flow, &lt;b&gt;seul le conteneur&lt;/b&gt; est de type "exécutable" et possède donc des expressions. Ceci dit certains attributs de ses enfants peuvent être utilisés comme &lt;b&gt;expression&lt;/b&gt;: pour cela ils sont dupliqués en tant qu'attributs du &lt;b&gt;composant Data Flow&lt;/b&gt; à la création des composants enfants. Par exemple un DataFlow contenant un Lookup possèdera deux propriétés supplémentaires, [NomDuLookup].[SQLCommand] et  [NomDuLookup].[SQLCommandParam] qui correspondent aux propriétés avancées du Lookup. Celles ci sont donc assignables par expression..&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kbsOT_Eyf_M/S-LalcQDyaI/AAAAAAAAAgA/IOR2ZrtmFgM/s1600/DFT.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 157px;" src="http://1.bp.blogspot.com/_kbsOT_Eyf_M/S-LalcQDyaI/AAAAAAAAAgA/IOR2ZrtmFgM/s400/DFT.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5468173234354768290" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Mais on constatera rapidement que tout n'est pas exposé... et que certaines propriétés de composants de Data Flow seraient bien pratiques en tant qu'expressions. La liste de ces propriétés settables par expression est trouvable &lt;a href="http://msdn.microsoft.com/en-us/library/ms136104.aspx"&gt;ici sur MSDN&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Pourquoi elles ne sont pas toutes exposées...&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Lorsque l'on développe une tâche de Data Flow avec le framework, pour chaque attribut, on peut choisir sa valeur d'&lt;b&gt;ExpressionType&lt;/b&gt;. C'est elle qui définit si cette propriété sera exposée ou pas (par duplication dans le composant Data Flow parent) à l'éditeur d'expression, et qui permetrait&lt;/div&gt;&lt;div&gt;- de modifier une propriété par &lt;b&gt;expression&lt;/b&gt;&lt;/div&gt;&lt;div&gt;- de l'adresser via une &lt;b&gt;configuration&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Cette propriété ExpressionType est un index de l'énumération &lt;b&gt;DTSCustomPropertyExpressionType&lt;/b&gt;, positionné par défaut à &lt;b&gt;CPET_NONE &lt;/b&gt;(pas settable par expression). Or pour qu'un attribut soit adressable par expression, il faut explicitement que l'ExpressionType vale &lt;b&gt;CPET_NOTIFY.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Les développeurs de SSIS ont globalement setté cette propriété a plein d'endroits utiles...&lt;b&gt; mais ils ont parfois oublié de l'activer. &lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Et pour les autres propriétés? Dans le cas du MinSimilarity du Fuzzy Lookup?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Il faut donc ruser pour contourner et ça ne sera de toute manière pas très propre. La solution, puisqu'on ne peut pas modifier le package en cours va être de... le modifier depuis un package "lanceur".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;//On instancie une application pour éditer le lot&lt;/div&gt;&lt;div&gt; Microsoft.SqlServer.Dts.Runtime.Application application &lt;/div&gt;&lt;div&gt;   = new Microsoft.SqlServer.Dts.Runtime.Application();&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;//On récupère l'instance du FuzzyLookup via le connection Manager&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;b&gt;string &lt;/b&gt;packageName &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;= (&lt;b&gt;string&lt;/b&gt;)Dts.Connections["PackageTest.dtsx"].AcquireConnection(null);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;b&gt;Package &lt;/b&gt;package = application.LoadPackage(packageName.ToString(), null);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;b&gt;CManagedComponentWrapper &lt;/b&gt;fuzzyLookup&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; = ((MainPipe)((TaskHost)package.Executables["DFT"]).InnerObject)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; .ComponentMetaDataCollection["FL"].Instantiate();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;//On lui affecte la valeur d'une variable en readonly&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;int MinSimilarity = (int)Dts.Variables["MinSimilarity"].Value;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;fuzzyLookup.SetComponentProperty("MinSimilarity", MinSimilarity);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;//On sauvegarde (cela aurait pu être en SQL...)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;b&gt;application&lt;/b&gt;.SaveToXml(packageName, package, null);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;b&gt;Dts&lt;/b&gt;.TaskResult = (&lt;b&gt;int&lt;/b&gt;)ScriptResults.Success;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Voilà.&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-3518925825538611801?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/3518925825538611801/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=3518925825538611801' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3518925825538611801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3518925825538611801'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/05/ssis-le-data-flow-et-les-expressions-ca.html' title='[SSIS] Le Data Flow et les Expressions (&quot;Ca marchait bien dans DTS!&quot;)'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kbsOT_Eyf_M/S-LalcQDyaI/AAAAAAAAAgA/IOR2ZrtmFgM/s72-c/DFT.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-6792088633116358541</id><published>2010-05-13T16:16:00.005+02:00</published><updated>2010-05-13T16:24:32.550+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PowerPivot'/><title type='text'>[PowerPivot] Could not load file or assembly "Microsoft.AnalysisServices.Integration.dll"</title><content type='html'>Ce problème est signalé sur Connect, en RTM et marqué comme non résolu. Je viens de le rencontrer pour la seconde fois dans la même situation: à la fin de l'installation de &lt;b&gt;PowerPivot &lt;/b&gt;en mode &lt;b&gt;ExistingFarm &lt;/b&gt;sur une &lt;b&gt;instance SQL&lt;/b&gt; existante. Dans les deux cas une réparation (&lt;b&gt;Repair) &lt;/b&gt;de l'installation, &lt;b&gt;qui réinstalle les Client Tools&lt;/b&gt; semble remettre le système dans un état fonctionnel. J'espère pouvoir trouver plus d'informations prochainement...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-6792088633116358541?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/6792088633116358541/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=6792088633116358541' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/6792088633116358541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/6792088633116358541'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/05/powerpivot-could-not-load-file-or.html' title='[PowerPivot] Could not load file or assembly &quot;Microsoft.AnalysisServices.Integration.dll&quot;'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-956048261362662545</id><published>2010-04-30T18:49:00.010+02:00</published><updated>2010-05-17T12:11:28.627+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services'/><category scheme='http://www.blogger.com/atom/ns#' term='AMO'/><category scheme='http://www.blogger.com/atom/ns#' term='PowerShell'/><title type='text'>[SSAS] AMO et Powershell</title><content type='html'>Pour répondre à la question suivante "&lt;i&gt;Comment scripter ce traitement qui se fait très bien sur ma base AS avec Management Studio&lt;/i&gt;?" vous pensez immédiatement que la réponse sera de se coltiner du &lt;b&gt;XMLA &lt;/b&gt;exécuté avec &lt;b&gt;ASCmd&lt;/b&gt;. Mais il y a une alternative plus sympa: pourquoi ne pas utiliser AMO avec.... PowerShell! Pour, par exemple, copier-coller une base AS - question à laquelle j'ai répondu il y a quelques minutes, j'ai mis &lt;b&gt;au moins 2 minutes &lt;/b&gt;à écrire ce script mo-nu-men-tal:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;$srv=New-Object Microsoft.AnalysisServices.Server&lt;br /&gt;$srv.connect(".\SQL2008R2")&lt;br /&gt;$olddb=$srv.Databases.FindByName("Adventure Works DW 2008")&lt;br /&gt;$newdb=$olddb.Clone()&lt;br /&gt;$newdb.Name="Copie AW"&lt;br /&gt;$newdb.ID="Copie AW"&lt;br /&gt;$srv.Databases.Add($newdb)&lt;br /&gt;$newdb.Update([Microsoft.AnalysisServices.UpdateOptions]::ExpandFull)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Globalement &lt;b&gt;n'importe quel code AMO en C# ou VB peut être traduit&lt;/b&gt; en PowerShell, et s'y j'y arrive vous pouvez le faire :). On peut y penser pour des &lt;b&gt;procédures de déploiement&lt;/b&gt; par exemple, mais vous pouvez &lt;b&gt;&lt;span style="FONT-WEIGHT: normal" class="Apple-style-span"&gt;imaginer tout un tas de scenarii d'usage pour remplacer du XMLA amoureusement tapé à la main. &lt;b&gt;Powershell et AMO c'est bon,mangez en.&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-956048261362662545?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/956048261362662545/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=956048261362662545' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/956048261362662545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/956048261362662545'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/04/ssas-amo-et-powershell.html' title='[SSAS] AMO et Powershell'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-6069842440773035285</id><published>2010-04-29T13:45:00.010+02:00</published><updated>2010-04-30T08:48:59.162+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Master Data Services'/><title type='text'>[MDS] Master Data Services, pourquoi et comment?</title><content type='html'>Cela fait quelques mois que l'on parle de l'ajout de &lt;strong&gt;Master Data Management&lt;/strong&gt; dans SQL Server, au travers de &lt;strong&gt;Master Data Services&lt;/strong&gt; (issu du rachat de &lt;strong&gt;Stratature&lt;/strong&gt;). Cependant il semble que le principe et l'utilité du MDM dans une entreprise ne soit pas encore une notion bien appréhendée, d'où l'utilité de ce petit article.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 227px; DISPLAY: block; HEIGHT: 59px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5465570442657828098" border="0" alt="" src="http://2.bp.blogspot.com/_kbsOT_Eyf_M/S9mbXBl-jQI/AAAAAAAAAfw/Q0g6pKlgf-I/s400/MDS.png" /&gt;&lt;br /&gt;&lt;strong&gt;Pourquoi du Master Data Management?&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;Dans une entreprise, les applications horizontales (Comptabilité, GRH, Ventes, Finance...) disposent souvent de bases de données séparées. Si beaucoup de ces données sont spécifiques, un certain nombre d'entre elles sont &lt;strong&gt;communes&lt;/strong&gt; à l'ensemble de l'organisme et donc dupliquées dans les différents systèmes: ce sont les &lt;strong&gt;Master Data&lt;/strong&gt;. (Les données de ce type les plus connues sont les Clients, les Produits vendus par l'entreprise...)&lt;br /&gt;Comme ces données sont dupliquées et stockées dans des&lt;strong&gt; systèmes hétérogènes&lt;/strong&gt;, il y a un fort risque d'incohérences, et il est difficile d'extraire &lt;strong&gt;rapidement&lt;/strong&gt; une vision unifiée de ce type de données.&lt;br /&gt;&lt;br /&gt;Cas extrême: un client d'une entreprise la contacte car il ne reçoit plus ses factures. Le service client vérifie qu'il possède bien la bonne adresse pour ce client dans sa base CRM. Cependant le service de facturation ne possède pas la même vision de cet attribut du client dans l'application de facturation: il y a incohérence difficile à tracer et à résoudre. Sans compter l'image désastreuse si ce cas est généralisé.&lt;br /&gt;&lt;br /&gt;Etant très souvent amené à concevoir et alimenter des Data Marts relationnels, la race des consultants BI - dont je fais partie - a souvent maille à partir avec ce genre de problèmes, dont l'entreprise n'était généralement pas consciente avant la centralisation entreprise par les différents Data Marts.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;C'est donc du Data Warehousing?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Non mais le processus est très lié. Sans MDM, l'alimentation de chaque Data Mart doit se faire en prévoyant l'application de règles métier strictes en cas de problèmes de cohérence dans les Master Data. &lt;strong&gt;C'est un processus lourd qu'il serait souhaitable de ne pas recommencer à chaque Data Mart... &lt;/strong&gt;L'idée est donc que le MDM devienne la source de Master Data pour toute application désirant connaître la version &lt;em&gt;corporate&lt;/em&gt; de la réalité pour les données importantes.&lt;br /&gt;&lt;br /&gt;Pour insister sur la parenté avec les entrepôts de données les Master Data sont historisées et représentées conceptuellement sous forme d'entités, disposant d'attributs et de hiérarchies. Ces concepts sont effectivement très proches du Data Warehousing classique, à ceci près que MDS gère aussi la définition de règles de validation dans le modèle, ce qui n'est pas typiquement le cas d'un DW.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Et techniquement?&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Master Data Services&lt;/strong&gt; est avant tout basé sur une &lt;strong&gt;base de données SQL Server&lt;/strong&gt;. Les Master Data sont stockées dans cette base dédiée, dont les tables sont générées automatiquement lors de l'import de données.&lt;br /&gt;Tout le &lt;strong&gt;cycle de vie des données&lt;/strong&gt; (import, versionning, validation, notification, publication) est géré en SQL(le stockage comme le code) bien que les tables au nom doux comme [tbl_3_12_MS] ne doivent pas être utilisées directement: une &lt;strong&gt;API est disponible via WCF&lt;/strong&gt;, API qu'utilise le frontal web de définition d'entités installé avec MDS.&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kbsOT_Eyf_M/S9p9GK83zGI/AAAAAAAAAf4/HMFWQNyxSBo/s1600/mdmHomePage.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 300px; " src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/S9p9GK83zGI/AAAAAAAAAf4/HMFWQNyxSBo/s400/mdmHomePage.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5465818642739874914" /&gt;&lt;/a&gt;La donnéee stockée peut aussi être récupérée via des vues, qui permettront entre autres d'alimenter des Data Marts.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;Master Data Services est le quatrième "Services" (Après Integration, Analysis et Reporting, non Notification ne compte pas!) et de mon point de vue la quatrième "brique BI" de SQL Server. Il va permettre de &lt;strong&gt;décorréler la gestion des données sensibles&lt;/strong&gt; de l'alimentation de Data Marts, tant cette gestion revêt une importance bien plus grande au sein des entreprises.&lt;br /&gt;&lt;br /&gt;Intercalé entre les sources et les bases d'analyse, il va permettre aux projets BI de se concentrer sur leur but: fournir des outils d'analyse appropriées sans perdre du temps sur la redéfinition de règles d'alimentation en systèmes hétérogènes.&lt;br /&gt;&lt;br /&gt;Reste maintenant à manoeuvrer les leviers nécessaires pour vaincre les réticences politiques qui ne manqueront pas de se faire jour, mais prenons le pari qu'avec une architecture ouverte, reconnue (Stratature), intégrée et une préoccupation du MDM de plus en plus prégnante dans les entreprises, cette nouvelle brique de SQL Server ne tardera pas à s'imposer...&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-6069842440773035285?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/6069842440773035285/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=6069842440773035285' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/6069842440773035285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/6069842440773035285'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/04/mds-master-data-services-pourquoi-et.html' title='[MDS] Master Data Services, pourquoi et comment?'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kbsOT_Eyf_M/S9mbXBl-jQI/AAAAAAAAAfw/Q0g6pKlgf-I/s72-c/MDS.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-3106571289048502165</id><published>2010-04-27T16:01:00.003+02:00</published><updated>2010-05-03T10:41:24.472+02:00</updated><title type='text'>[PowerPivot] Clarifications techniques</title><content type='html'>&lt;div&gt;Cela fait quelques fois que l'on me pose des questions sur PowerPivot qui me semblent sensées, bien que très éloignées de la réalité du produit. Une de celles que j'aime beaucoup tient à la différence entre &lt;strong&gt;un cube Gemini et un .cub généré par AS&lt;/strong&gt;, qui implique des questions telles que:&lt;br /&gt;- "Puis-je me connecter en ADOMD.NET sur un cube Gemini en spécifiant "Data Source=fichier.xslx"?&lt;br /&gt;- ou encore "Je peux brancher Procla sur un Excel?"&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 149px; DISPLAY: block; HEIGHT: 161px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5465569207963880018" border="0" alt="" src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/S9maPKAAClI/AAAAAAAAAfg/Z4HU_cARgbM/s400/PowerPivot_Logo.png" /&gt;&lt;br /&gt;La réponse est non pour une raison simple: ce n'est pas le même format. Circulez. Rien à voir. Si vous avez lu ce &lt;a href="http://sqlblog.com/blogs/mosha/archive/2008/10/06/so-what-is-exactly-project-gemini.aspx"&gt;vieux post de Mosha, revenu d'outre-Bing, &lt;/a&gt;vous le sauriez.&lt;br /&gt;&lt;br /&gt;En gros, &lt;strong&gt;PowerPivot&lt;/strong&gt; c'est quoi:&lt;br /&gt;- une nouvelle version d'Analysis Services dont il existe deux versions: une standalone, mono-utilisateur (celle de l'addin Excel) et une serveur, multi-utilisateurs, que l'on peut intégrer dans Sharepoint.&lt;br /&gt;- et donc un format de stockage des cubes différents, pour s'adapter au nouveau mode de fonctionnement.&lt;br /&gt;&lt;br /&gt;Donc si on se résume on a bien deux grands types de moteurs et de stockage, une partie serveur et une partie client standalone.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;SSAS "classique"&lt;/strong&gt;&lt;br /&gt;- Serveur: SSAS Engine classique (msmdsrv)&lt;br /&gt;- Client standalone: cube engine de OLE DB for OLAP (msmdlocal) qui lit des .cub &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 192px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5465569368244120450" border="0" alt="" src="http://3.bp.blogspot.com/_kbsOT_Eyf_M/S9maYfFya4I/AAAAAAAAAfo/YfamGxJ_oPs/s400/IC55729.gif" /&gt;&lt;br /&gt;&lt;strong&gt;SSAS Vertipaq&lt;/strong&gt;&lt;br /&gt;- Serveur: SSAS en intégré Sharepoint&lt;br /&gt;- Client standalone: PowerPivot engine pour Excel qui lit les CustomData/item1.data des fichiers Excel&lt;br /&gt;&lt;br /&gt;La conséquence c'est &lt;strong&gt;l'incompatibilité entre les différents modes de stockage&lt;/strong&gt; (je préfère parler de représentation) et les serveurs. Pas la peine d'essayer de monter du Vertipaq dans votre vieux Local Cube Engine...&lt;br /&gt;A terme il serait évidemment souhaitable que ce fonctionnement soit transparent et que l'on puisse indistinctement extraire des cubes Vertipaq en .cub puis les remettre dans un serveur AS classique...&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En gros ce que préconise Chris Webb dans son billet: &lt;a href="http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!6404.entry?sa=705008310"&gt;http://cwebbbi.spaces.live.com/Blog/cns!7B84B0F2C239489A!6404.entry?sa=705008310&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-3106571289048502165?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/3106571289048502165/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=3106571289048502165' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3106571289048502165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3106571289048502165'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/04/powerpivot-clarifications-techniques.html' title='[PowerPivot] Clarifications techniques'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kbsOT_Eyf_M/S9maPKAAClI/AAAAAAAAAfg/Z4HU_cARgbM/s72-c/PowerPivot_Logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-8060039511491563701</id><published>2010-04-22T11:00:00.014+02:00</published><updated>2010-04-23T17:38:02.697+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annonces/Releases'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>[Releases] SQL Server 2008 R2 en RTM!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kbsOT_Eyf_M/S9AXzpsfiVI/AAAAAAAAAfQ/n5xi1lSnPTI/s1600/d.PNG"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 79px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5462892524133648722" border="0" alt="" src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/S9AXzpsfiVI/AAAAAAAAAfQ/n5xi1lSnPTI/s400/d.PNG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;Annoncé aujourd'hui sur &lt;a href="http://blogs.technet.com/dataplatforminsider/archive/2010/04/21/sql-server-2008-r2-released-to-manufacturing.aspx"&gt;le site produit US&lt;/a&gt; &lt;b&gt;SQL Server 2008 est passé en RTM.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Vous pouvez donc dès à présent l'essayer sur Technet et MSDN.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Ensuite les dates de sortie sont figées: le 3 mai pour les abonnés MSDN et Technet, le 13 pour le reste.Ensuite des précisions sur les éditions sorties: d'abord les deux éditions Core restent:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Standard &lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Enterprise&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;ainsi, bien sûr, que la &lt;b&gt;Web&lt;/b&gt;, &lt;b&gt;Workgroup&lt;/b&gt;, &lt;b&gt;Developer&lt;/b&gt;, &lt;b&gt;Express&lt;/b&gt; et &lt;b&gt;Compact&lt;/b&gt;. Deux éditions spécialisées (appliances) sont ajoutées:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Data Center&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Parallel Data Warehouse&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Enfin les nouvelles features de R2 sont disponibles selon les éditions:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Standard &lt;/b&gt;intègre la &lt;b&gt;compression des backups&lt;/b&gt; , les nouveautés de &lt;b&gt;Reporting Services&lt;/b&gt; (Maps...)&lt;b&gt;, StreamInsight Standard&lt;/b&gt; et peut s'intégrer dans les&lt;b&gt; outils de gestion multi-instance&lt;/b&gt; d'une édition supérieure&lt;/li&gt;&lt;li&gt;&lt;b&gt;Enterprise &lt;/b&gt;ajoute l'intégration &lt;b&gt;PowerPivot dans MOSS, &lt;/b&gt;&lt;b&gt;Master Data Services&lt;/b&gt;, la &lt;b&gt;gestion multi-instances&lt;/b&gt; (moins de 25) ainsi que des nouveaux outils de &lt;b&gt;développement et déploiement T-SQL&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Data Center&lt;/b&gt; permet de gérer un&lt;b&gt; nombre illimité de processeurs&lt;/b&gt; et de &lt;b&gt;mémoire&lt;/b&gt; (&lt;i&gt;régression par rapport à 2008, Enterprise semble maintenant limité à 8 sockets et 2 To de RAM&lt;/i&gt;), de &lt;b&gt;manager plus de 25 instances, et ajoute StreamInsight Premium &lt;/b&gt;(sans limite de nombre d'events)&lt;/li&gt;&lt;li&gt;&lt;b&gt;Parallel Data Warehouse &lt;/b&gt;est une Data Center utilisant les composants de processing massivement parallèles du projet Madison (issu du rachat de &lt;b&gt;DatAllegro&lt;/b&gt;) dont le but avoué est de permettre d'approcher des tailles de DW de l'ordre du PetaOctet... ça laisse rêveur.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Plus de précisions à suivre bientôt, pour plus d'infos n'hésitez pas à vous rendre sur &lt;a href="http://www.sqlserverlaunch.com/"&gt;http://www.sqlserverlaunch.com/&lt;/a&gt; (en anglais).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Source principale: &lt;a href="http://blogs.technet.com/microsoft_blog/archive/2010/04/21/SQL-Server-2008-R2-Helping-Customers-Get-More-Value-Out-of-Their-Data.aspx"&gt;http://blogs.technet.com/microsoft_blog/archive/2010/04/21/SQL-Server-2008-R2-Helping-Customers-Get-More-Value-Out-of-Their-Data.aspx&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-8060039511491563701?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/8060039511491563701/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=8060039511491563701' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/8060039511491563701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/8060039511491563701'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/04/releases-sql-server-2008-r2-en-rtm.html' title='[Releases] SQL Server 2008 R2 en RTM!'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kbsOT_Eyf_M/S9AXzpsfiVI/AAAAAAAAAfQ/n5xi1lSnPTI/s72-c/d.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-1173805466364219087</id><published>2010-04-21T10:41:00.008+02:00</published><updated>2010-04-21T10:55:46.449+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Autres'/><title type='text'>[Autres] Predixion Software?</title><content type='html'>J'en ai déjà parlé mais &lt;b&gt;Jamie McLennan&lt;/b&gt;, le principal responsable du développement du Data Mining dans SQL Server 2000 à 2008 a quitté Microsoft fin d'année dernière pour co-fonder &lt;a href="http://www.predixionsoftware.com/"&gt;Predixion Software&lt;/a&gt;, une société au nom évocateur dont l'équipe de dev se situe à... Redmond et compte parmi ses membres &lt;b&gt;Bogdan Crivat&lt;/b&gt;, autre ancien de l'équipe DM (connu principalement pour avoir développé l'addin Cloud pour Excel).&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Si on rajoute que le comité de direction compte Stuart Frost (ancien de DatAllegro, actuellement chez Microsoft) il n'est nul besoin de préciser que Predixion semble se développer avec a minima la bénediction d'un petit éditeur de logiciel local basé à Redmond :)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kbsOT_Eyf_M/S868a-mArRI/AAAAAAAAAfI/hHPLNX071CI/s1600/sm-logo.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 160px; DISPLAY: block; HEIGHT: 118px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5462510569712037138" border="0" alt="" src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/S868a-mArRI/AAAAAAAAAfI/hHPLNX071CI/s400/sm-logo.jpg" /&gt;&lt;/a&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kbsOT_Eyf_M/S868a-mArRI/AAAAAAAAAfI/hHPLNX071CI/s1600/sm-logo.jpg"&gt;&lt;/a&gt;&lt;div&gt;En regardant un peu sur leur proto site web, on peut noter que la plupart des pistes de développement tournent autour&lt;/div&gt;&lt;div&gt;- du &lt;b&gt;Cloud &lt;/b&gt;et du Data Mining&lt;/div&gt;&lt;div&gt;- de l'ajout de nouvelles &lt;b&gt;visualisations &lt;/b&gt;(SL...)&lt;/div&gt;&lt;div&gt;- de l'intégration de modèles de mining dans &lt;b&gt;Sharepoint&lt;/b&gt;&lt;/div&gt;&lt;div&gt;soit des features &lt;b&gt;d'intégration&lt;/b&gt; de modèles plus que de &lt;b&gt;développement &lt;/b&gt;de nouveaux algorithmes, chose que j'avais imaginé en premier lieu au vu du nom de la société&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Tout ça pour dire que ce que va produire Predixion est à mon sens très intéressant à suivre, tout comme la ligne directrice du Data Mining en interne chez MS pour &lt;b&gt;SQL Server Denali.&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-1173805466364219087?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/1173805466364219087/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=1173805466364219087' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/1173805466364219087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/1173805466364219087'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/04/autres-predixion-software.html' title='[Autres] Predixion Software?'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kbsOT_Eyf_M/S868a-mArRI/AAAAAAAAAfI/hHPLNX071CI/s72-c/sm-logo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-7192922415571316952</id><published>2010-04-21T09:58:00.003+02:00</published><updated>2010-04-21T10:56:03.171+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='T-SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>[T-SQL] Déconnecter tous les utilisateurs</title><content type='html'>Là encore rien de neuf mais cela fait deux fois qu'on me le demande en deux jours donc j'imagine que ce n'est pas évident...&lt;div&gt;La manière la plus simple de déconnecter tous les utilisateurs d'une base SQL Server c'est de &lt;b&gt;passer la base en mode SingleUser&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;Ceci dit SQL n'est pas chien et lorsque l'on lui demande de procéder à ce genre d'éjection sauvage, il se comporte par défaut en gentleman et &lt;b&gt;attend que toutes les transactions actives soient commitées.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Il faut donc le forcer à être un petit peu moins poli et ordonner le &lt;b&gt;rollback de toutes les transactions&lt;/b&gt; actives.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;ALTER DATABASE &lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span"  style="color:#000000;"&gt;[Base]&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;SET SINGLE_USER WITH ROLLBACK IMMEDIATE&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;GO&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;--Ici un traitement nécessitant d'être seul sur la base&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;--...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;--Puis retour à la normale&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;ALTER DATABASE&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt; &lt;/span&gt;[Base]&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;SET MULTI_USER&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;GO&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Voilà rien de révolutionnaire mais si ça peut aider...&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-7192922415571316952?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/7192922415571316952/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=7192922415571316952' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/7192922415571316952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/7192922415571316952'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/04/t-sql-deconnecter-tous-les-utilisateurs.html' title='[T-SQL] Déconnecter tous les utilisateurs'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-7168379665844594324</id><published>2010-04-20T23:41:00.002+02:00</published><updated>2010-04-20T23:44:10.859+02:00</updated><title type='text'>[SSAS] Union DMX (suite)</title><content type='html'>Juste un peu d'autocongratulation mal placée pour dire que l'on m'a signalé que mon &lt;a href="http://fjehl.blogspot.com/2009/11/ssas-loperateur-union-manquant-en-dmx.html"&gt;"magnifique" pseudo opérateur Union en DMX&lt;/a&gt; était référencé sur ASSP dans les Additional Resources. &lt;a href="http://asstoredprocedures.codeplex.com/wikipage?title=Additional%20Resources&amp;amp;referringTitle=Home"&gt;http://asstoredprocedures.codeplex.com/wikipage?title=Additional%20Resources&lt;/a&gt;&lt;div&gt;Pour plus de ressources ou discuter sur le sujet n'hésitez pas à me contacter avec le formulaire ad-hoc!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A bientôt!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-7168379665844594324?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/7168379665844594324/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=7168379665844594324' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/7168379665844594324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/7168379665844594324'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/04/ssas-union-dmx-suite.html' title='[SSAS] Union DMX (suite)'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-17730477211541133</id><published>2010-04-20T18:20:00.001+02:00</published><updated>2010-04-20T18:20:48.627+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services'/><category scheme='http://www.blogger.com/atom/ns#' term='Data Mining'/><category scheme='http://www.blogger.com/atom/ns#' term='PowerPivot'/><title type='text'>[SSAS] Data Mining avec PowerPivot</title><content type='html'>Cela fait quelques temps que je voulais parler de l'intégration de deux features de SSAS liées à Excel: le Data Mining et PowerPivot, ou comment utiliser des données&lt;strong&gt; issues de PowerPivot avec les addins Excel de Data Mining&lt;/strong&gt; (Table Tools et Data Mining Addin, sortis en 2007).&lt;br /&gt;&lt;br /&gt;L'excellent &lt;strong&gt;Kasper de Jonge&lt;/strong&gt; a sorti un super webcast résumant bien la technique. Le doublonnage d'informations n'étant pas mon dada je vais juste me contenter de vous donner la vidéo et de résumer le contenu pour les non anglophones.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ceci dit &lt;/strong&gt;- certes je suis un peu overbooké mais j'ai le temps de pondre un peu de réflexion -&lt;strong&gt; j'ai eu l'idée une petite feature&lt;/strong&gt; qu'il a sûrement oublié d'aborder en fin d'article: combiner les expressions PowerPivot avec du DMX grâce aux fonctions Excel type DMPREDICT.&lt;br /&gt;&lt;br /&gt;Alors voici l'objet:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/yYV7UhLc6-0&amp;amp;hl=fr_FR&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;br /&gt;&lt;embed src="http://www.youtube.com/v/yYV7UhLc6-0&amp;hl=fr_FR&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Les addins Data Mining ne fonctionnent pas - encore? - sur des PivotTables (si vous avez fait du VSTO vous savez sûrement que la PivotTable est un &lt;strong&gt;objet très "à part" dans le modèle&lt;/strong&gt; d'Excel), donc le but de l'affaire est de faire un&lt;strong&gt; Convert to formula d'une PivotTable&lt;/strong&gt; d'analyse (qui va la convertir en sheet "Classique"), les expressions venant du cube étant alors spécifiées en tant que fonction CUBEMEMBER/CUBEVALUE qui prennent en paramètre des expressions "MDX" (notez les guillemets).&lt;br /&gt;&lt;br /&gt;Dès lors utiliser les addins ne posent plus aucun problème, puisque vous êtes confrontés à des données "brutes", dont l'originie PowerPivotesque ne gène nullement l'analyse. A vous les "Analyze Key Influencers" et autres joyeusetés. Nota bene bene bene: les addins DM ne sont dispos qu'en... 32 bits donc oubliez le PowerPivot 64bits sur Excel 64bits. Espérons que cela changera...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Le tout petit rajout...&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Bon en gros vous savez sûrement qu'il est possible d'appeller du &lt;strong&gt;DMX indirectement depuis une sheet Excel&lt;/strong&gt;, basiquement cela a déjà été décrit par &lt;strong&gt;Bogdan Crivat&lt;/strong&gt; (dont le départ chez Predixion fera aussi l'objet d'un post lorsque-j'aurai-plus-de-temps) dans &lt;a href="http://www.bogdancrivat.net/dm/archives/13"&gt;ce post&lt;/a&gt; et qui peut être résumé ainsi:&lt;br /&gt;&lt;br /&gt;La fonction Excel &lt;strong&gt;DMPREDICT&lt;/strong&gt; permet de faire une requête de prédiction de type "simple" sur un modèle de mining dans Excel, elle a ce pattern:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;DMPREDICT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(&lt;br /&gt;"NomDeMaConnexionSSAS",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;"NomDeMonModele",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;"NomDeMaSortieDeModele",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;"NomParametre1", "ValeurParametre1",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;...,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;"NomParametreN","ValeurParametreN"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;p&gt;Il est donc parfaitement possible d'effectuer une requête DMX sur des données issues de &lt;strong&gt;PowerPivot et mises à plat en mode convert to formulas&lt;/strong&gt;... et donc de marier DAX et DMX... &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-17730477211541133?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/17730477211541133/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=17730477211541133' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/17730477211541133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/17730477211541133'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/04/ssas-data-mining-avec-powerpivot.html' title='[SSAS] Data Mining avec PowerPivot'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-2041877351998262706</id><published>2010-04-20T16:43:00.003+02:00</published><updated>2010-04-20T16:49:32.916+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='T-SQL'/><title type='text'>[T-SQL] ROW_NUMBER() OVER sans ORDER BY</title><content type='html'>Question bizarre et pourtant assez connue: comment numéroter avec ROW_NUMBER() sans effectuer de tri sur le résultat, ce qui peut être utile/souhaitable dans tout un tas de contextes.&lt;br /&gt;MSDN vous dit bien que ROW_NUMBER() OVER attend un ORDER BY...&lt;br /&gt;&lt;br /&gt;Bien sûr mais&lt;strong&gt; si vous placez une constante dans le ORDER BY&lt;/strong&gt;, l'optimiseur comprend que vous voulez une &lt;strong&gt;simple numérotation&lt;/strong&gt; des résultats&lt;strong&gt; sans tri&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:#000099;"&gt;SELECT&lt;/span&gt; &lt;span style="color:#cc33cc;"&gt;ROW_NUMBER()&lt;/span&gt; &lt;span style="color:#000099;"&gt;OVER &lt;/span&gt;(&lt;span style="color:#000099;"&gt;ORDER&lt;/span&gt; &lt;span style="color:#000099;"&gt;BY&lt;/span&gt; (&lt;span style="color:#000099;"&gt;SELECT&lt;/span&gt; 0) ) &lt;span style="color:#000099;"&gt;AS&lt;/span&gt;[Index]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:#000099;"&gt;FROM&lt;/span&gt; [MaTable]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Et voilà!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-2041877351998262706?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/2041877351998262706/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=2041877351998262706' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/2041877351998262706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/2041877351998262706'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/04/t-sql-rownumber-over-sans-order-by.html' title='[T-SQL] ROW_NUMBER() OVER sans ORDER BY'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-3499316071264072781</id><published>2010-03-13T22:06:00.002+01:00</published><updated>2010-03-13T22:10:35.718+01:00</updated><title type='text'>[TD 2010] Webcasts</title><content type='html'>Les Webcasts des TechDays 2010 sont en ligne à cette adresse: http://www.microsoft.com/france/vision/mstechdays10/. Pour ma petite personne vous trouverez ci-dessous les deux sessions que j'ai eu le plaisir d'animer:&lt;br /&gt;&lt;br /&gt;Celle sur la mise en place de cross-selling sur les sites e-commerce:&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://www.microsoft.com/france/vision/mstechdays10/Webcast-iframe.aspx?EID=1fa11288-4b1a-491a-a372-0a73f0e82dab" width="560px" height="480px" scrolling="no" frameborder="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Et celle sur le CEP avec StreamInsight:&lt;br /&gt;&lt;br /&gt;&lt;iframe src='http://www.microsoft.com/france/vision/mstechdays10/Webcast-iframe.aspx?EID=da22183d-b064-4567-9cf8-d1bcb4a914f0' width='560px' height='480px' scrolling='no' frameBorder='no'/&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;A bientôt et bon visionnage!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-3499316071264072781?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/3499316071264072781/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=3499316071264072781' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3499316071264072781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3499316071264072781'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/03/td-2010-webcasts.html' title='[TD 2010] Webcasts'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-7561662256364183890</id><published>2010-02-23T18:19:00.011+01:00</published><updated>2010-02-24T12:31:07.246+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services'/><category scheme='http://www.blogger.com/atom/ns#' term='Data Mining'/><title type='text'>Local Mining Models depuis des modèles serveur</title><content type='html'>Je me suis une fois posé cette question simple: est il possible, à la manière d'un CREATE GLOBAL CUBE, de &lt;span style="FONT-WEIGHT: bold"&gt;créer des modèles de mining locaux&lt;/span&gt; stockés dans des .cub (destinés à des applications embarquées)&lt;span style="FONT-WEIGHT: bold"&gt; depuis des modèles serveur&lt;/span&gt; déjà développés.&lt;br /&gt;&lt;br /&gt;Les applications seraient &lt;span style="FONT-WEIGHT: bold"&gt;énormes&lt;/span&gt; pour des terminaux mobiles déconnectés, dont on mettrait à jour périodiquement un petit modèle d'analyse généré en central.&lt;br /&gt;&lt;br /&gt;La réponse au problème est &lt;span style="FONT-WEIGHT: bold"&gt;oui&lt;/span&gt;, d'où ce post, modulo un petit peu de travail. J'ai fait le boulot sous SSIS pour plus de clarté mais l'intégralité peut se faire depuis du code .NET.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;1) Récupérer le script ASSL de création du modèle serveur&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dans une script task, un brin d'AMO suffit à récupérer ce script, grâce à l'&lt;span style="FONT-WEIGHT: bold"&gt;objet Scripter&lt;/span&gt; utilisé par l'ami Management Studio.&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: rgb(204,204,204) 1px dashed; PADDING-RIGHT: 0px; BORDER-TOP: rgb(204,204,204) 1px dashed; PADDING-LEFT: 0px; FONT-SIZE: 12px; BACKGROUND: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) rgb(240,240,240); PADDING-BOTTOM: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(204,204,204) 1px dashed; WIDTH: 99%; COLOR: rgb(0,0,0); LINE-HEIGHT: 20px; PADDING-TOP: 0px; BORDER-BOTTOM: rgb(204,204,204) 1px dashed; FONT-FAMILY: arial; HEIGHT: auto; TEXT-ALIGN: left; -moz-background-inline-policy: continuous"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt; // Connexion au serveur&lt;br /&gt;Server svr = new Server();&lt;br /&gt;svr.Connect(---);&lt;br /&gt;&lt;br /&gt;//Recuperation de la MiningStructure&lt;br /&gt;MajorObject[] source = new MajorObject[1];&lt;br /&gt;source[0] = (MajorObject)svr.Databases["Adventure Works DW 2008 EE"].MiningStructures["Targeted Mailing"];&lt;br /&gt;&lt;br /&gt;//Instanciation d'un scripter&lt;br /&gt;Scripter scr = new Scripter();&lt;br /&gt;XmlWriterSettings settings = new XmlWriterSettings();&lt;br /&gt;settings.OmitXmlDeclaration = true;&lt;br /&gt;&lt;br /&gt;//Ecriture en mémoire depuis un XMLWriter&lt;br /&gt;StringBuilder sb = new StringBuilder();&lt;br /&gt;XmlWriter writer = XmlWriter.Create(sb,settings);&lt;br /&gt;scr.ScriptCreate(source, writer, true);&lt;br /&gt;writer.Flush();&lt;br /&gt;writer.Close();&lt;br /&gt;svr.Disconnect();&lt;br /&gt;&lt;br /&gt;//Affectation de la variable;&lt;br /&gt;Dts.Variables["TempXMLAHolder"].Value = sb.ToString();&lt;br /&gt;Dts.TaskResult = (int)ScriptResults.Success;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;2) Retravailler le XMLA avec XPath &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Le XMLA généré n'est &lt;span style="FONT-WEIGHT: bold"&gt;pas très utilisable: &lt;/span&gt;il comprend encore des&lt;span style="FONT-WEIGHT: bold"&gt; bindings aux DSV&lt;/span&gt; de la source, ainsi que des &lt;span style="FONT-WEIGHT: bold"&gt;noms d'objets invalides&lt;/span&gt;. Un peu de DOM/XPath suffit à retravailler tout cela modulo la connaissance basique de XMLA.&lt;br /&gt;De plus &lt;span style="FONT-WEIGHT: bold"&gt;les modèles de mining embarqués ne supportent que les algos de clustering et de decision trees &lt;/span&gt;&lt;span style="font-size:0;"&gt;(les algos 2000), il faut donc supprimer les autres.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: rgb(204,204,204) 1px dashed; PADDING-RIGHT: 0px; BORDER-TOP: rgb(204,204,204) 1px dashed; PADDING-LEFT: 0px; FONT-SIZE: 12px; BACKGROUND: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) rgb(240,240,240); PADDING-BOTTOM: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(204,204,204) 1px dashed; WIDTH: 99%; COLOR: rgb(0,0,0); LINE-HEIGHT: 20px; PADDING-TOP: 0px; BORDER-BOTTOM: rgb(204,204,204) 1px dashed; FONT-FAMILY: arial; HEIGHT: auto; TEXT-ALIGN: left; -moz-background-inline-policy: continuous"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt; string xmla = Dts.Variables["TempXMLAHolder"].Value.ToString();&lt;br /&gt;string asDbName = Dts.Variables["SsasDatabaseName"].Value.ToString();&lt;br /&gt;&lt;br /&gt;//Chargement du doc XML&lt;br /&gt;XmlDocument doc = new XmlDocument();&lt;br /&gt;doc.Load(new StringReader(xmla));&lt;br /&gt;XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);&lt;br /&gt;mgr.AddNamespace("Ns", @"http://schemas.microsoft.com/analysisservices/2003/engine");&lt;br /&gt;&lt;br /&gt;//Changement de la base de données&lt;br /&gt;doc.SelectSingleNode("/Ns:Create/Ns:ParentObject/Ns:DatabaseID", mgr).InnerText = asDbName;&lt;br /&gt;&lt;br /&gt;//Suppression du binding de la MS à la DSV&lt;br /&gt;XmlNode n = doc.SelectSingleNode("/Ns:Create/Ns:ObjectDefinition/Ns:MiningStructure/Ns:Source", mgr);&lt;br /&gt;n.ParentNode.RemoveChild(n);&lt;br /&gt;&lt;br /&gt;//Suppression des MiningModels non conformes&lt;br /&gt;XmlNodeList l = doc.SelectNodes("/Ns:Create/Ns:ObjectDefinition/Ns:MiningStructure/Ns:MiningModels/Ns:MiningModel", mgr);&lt;br /&gt;string algo = string.Empty;&lt;br /&gt;for (int i = 0; i &lt;&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;; i++)&lt;br /&gt;{&lt;br /&gt;&lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;  algo = l[i].ChildNodes[2].InnerText;  &lt;br /&gt;&lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;  &lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;&lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;if (algo != "Microsoft_Decision_Trees" &amp;amp;&amp;amp; algo != "Microsoft_Clustering")&lt;br /&gt;&lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;  &lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;&lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;{&lt;br /&gt;&lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;    &lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;bool b = true;&lt;br /&gt;&lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;    &lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;Dts.Events.FireInformation(0,&lt;br /&gt;&lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;      &lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;string.Empty,&lt;br /&gt;&lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;      &lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;"Le modèle doit être de type MDT ou MC, modèle de type " + algo + " supprimé.",&lt;br /&gt;&lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;      &lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;string.Empty,&lt;br /&gt;&lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;      &lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;0, ref b);      &lt;br /&gt;&lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;     &lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;l[i].ParentNode.RemoveChild(l[i]);  &lt;br /&gt;&lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;&lt;/code&gt;&lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;   &lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt; &lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;}&lt;br /&gt;&lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;&lt;/code&gt;&lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;  &lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;}&lt;br /&gt;&lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;&lt;/code&gt;&lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;  &lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;Dts.Variables["TempXMLAHolder"].Value = doc.OuterXml;&lt;br /&gt;&lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;&lt;/code&gt;&lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;  &lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;&lt;/code&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;Dts.TaskResult = (int)ScriptResults.Success; &lt;/code&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="FONT-WEIGHT: bold"&gt;3) Créer un cube local et appliquer l'ASSL dessus&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ceci fait il ne reste qu'à&lt;span style="FONT-WEIGHT: bold"&gt; créer un cube local&lt;/span&gt;, grâce à &lt;a href="http://cwebbbi.spaces.live.com/blog/cns%217B84B0F2C239489A%211255.entry"&gt;la petite ruse de Chris Webb.&lt;/a&gt;&lt;br /&gt;Puis à &lt;span style="FONT-WEIGHT: bold"&gt;appliquer le script XMLA &lt;/span&gt;créé à ce cube (une simple AdomdCommand XMLA du script issu du Scripter AMO et retravaillé en XML).&lt;br /&gt;&lt;br /&gt;On dispose alors... de modèles de mining dans un cube local!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kbsOT_Eyf_M/S4QMycsCC1I/AAAAAAAAAcY/Gzl1wbbEaAA/s1600-h/mmlOCAUX.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5441488310604270418" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 298px; CURSOR: pointer; HEIGHT: 244px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_kbsOT_Eyf_M/S4QMycsCC1I/AAAAAAAAAcY/Gzl1wbbEaAA/s400/mmlOCAUX.PNG" border="0" /&gt;&lt;/a&gt;&lt;span style="FONT-WEIGHT: bold"&gt;4) Entrainer le modèle local&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mais il reste encore à les entraîner. Inutile de préciser que &lt;span style="FONT-WEIGHT: bold"&gt;les tâches SSIS classiques sont inopérantes&lt;/span&gt;. Elles envoient des erreurs exotiques aidant à comprendre que leur usage devra être contourné.&lt;br /&gt;Pour l'alimentation je suis passé par un &lt;span style="FONT-WEIGHT: bold"&gt;paramètre DMX de type DataTable&lt;/span&gt; dans un INSERT INTO MINING STRUCTURE &lt;a href="http://blogs.msdn.com/jamiemac/archive/2009/09/24/the-amazing-flexibility-of-dmx-table-valued-parameters.aspx"&gt;comme expliqué par Jamie McLennan &lt;/a&gt;dans un de ses posts pré-départ. Cette DataTable est dérivée du très oldschool ADO Recordset de SSIS - beuark - dans un script dédié. Modulo l'ordonnancement des colonnes pour la jointure naturelle voilà un modèle entraîné.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;4) Action!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Il suffit alors de l'utiliser, en ADOMD.NET avec une chaîne de connexion pointant sur &lt;span style="FONT-WEIGHT: bold"&gt;le fichier .cub en tant que Data Source&lt;/span&gt; et voici la "belle" application:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kbsOT_Eyf_M/S4QVzkALcRI/AAAAAAAAAdg/EquovGpgE68/s1600-h/appli.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5441498225352339730" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: pointer; HEIGHT: 185px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/S4QVzkALcRI/AAAAAAAAAdg/EquovGpgE68/s400/appli.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Le package complet est disponible &lt;a href="http://cid-a23884c7072e2532.skydrive.live.com/self.aspx/Public/LocalMMGenerator.dtsx"&gt;ici &lt;/a&gt;et vous pouvez le tester. Il ressemble à cela:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kbsOT_Eyf_M/S4QWEKPeuNI/AAAAAAAAAdo/MYCOC5d2uFM/s1600-h/cf.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5441498510494972114" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: pointer; HEIGHT: 316px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_kbsOT_Eyf_M/S4QWEKPeuNI/AAAAAAAAAdo/MYCOC5d2uFM/s400/cf.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En espérant avoir suscité quelques scénarii de mining embarqué...&lt;br /&gt;&lt;br /&gt;A bientôt!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-7561662256364183890?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/7561662256364183890/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=7561662256364183890' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/7561662256364183890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/7561662256364183890'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/02/local-mining-models-depuis-des-modeles.html' title='Local Mining Models depuis des modèles serveur'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kbsOT_Eyf_M/S4QMycsCC1I/AAAAAAAAAcY/Gzl1wbbEaAA/s72-c/mmlOCAUX.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-9008227686936033583</id><published>2010-02-22T15:07:00.015+01:00</published><updated>2010-02-24T11:56:21.628+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reporting Services'/><category scheme='http://www.blogger.com/atom/ns#' term='MDX'/><title type='text'>Recherche Google-Like dans une dimension en Reporting Services</title><content type='html'>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 &lt;span style="FONT-WEIGHT: bold"&gt;d'un champ libre dans un rapport &lt;/span&gt;dans lequel on peut rentrer un certain nombre de mots qui seront &lt;span style="FONT-WEIGHT: bold"&gt;des critères de recherche&lt;/span&gt; permettant de&lt;span style="FONT-WEIGHT: bold"&gt; séléctionner des membres&lt;/span&gt; selon leur caption dans un second paramètre en cascade - le tout en MDX est-il besoin de le préciser.&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Le côté sympa de RS pour&lt;span style="FONT-WEIGHT: bold"&gt; éviter un parsing compliqué&lt;/span&gt; est de pouvoir disposer de paramètres multivalués en saisie libre, ce qui donne à peu près ceci:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kbsOT_Eyf_M/S4K0NFsLHPI/AAAAAAAAAcI/o2ECKYZIEjA/s1600-h/Recherche1.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5441109436775734514" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 255px; CURSOR: pointer; HEIGHT: 92px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/S4K0NFsLHPI/AAAAAAAAAcI/o2ECKYZIEjA/s400/Recherche1.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: rgb(204,204,204) 1px dashed; PADDING-RIGHT: 0px; BORDER-TOP: rgb(204,204,204) 1px dashed; PADDING-LEFT: 0px; FONT-SIZE: 12px; BACKGROUND: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) rgb(240,240,240); PADDING-BOTTOM: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(204,204,204) 1px dashed; WIDTH: 99%; COLOR: rgb(0,0,0); LINE-HEIGHT: 20px; PADDING-TOP: 0px; BORDER-BOTTOM: rgb(204,204,204) 1px dashed; FONT-FAMILY: arial; HEIGHT: auto; TEXT-ALIGN: left; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;&lt;br /&gt;="{"+&lt;br /&gt;"Filter"+&lt;br /&gt;"("+&lt;br /&gt; "[Product].[Product Categories].Members"+&lt;br /&gt; ",VBA!InStr([Product].[Product Categories].CurrentMember.Member_caption,'"+&lt;br /&gt; Join&lt;br /&gt; (&lt;br /&gt;  Parameters!Filtre.Value,&lt;br /&gt;  "')),"+&lt;br /&gt;  "Filter"+&lt;br /&gt;  "("+&lt;br /&gt;   "[Product].[Product Categories].Members,"+&lt;br /&gt;   "VBA!InStr([Product].[Product Categories].CurrentMember.Member_caption,'"&lt;br /&gt; )+&lt;br /&gt;"'))}"&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;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 &lt;span style="FONT-WEIGHT: bold"&gt;ordonnées&lt;/span&gt; (plus les résultats comprennent de tokens satisfaisants, plus ils sont hauts). Qu'à cela ne tienne, un petit Order MDX plus tard:&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: rgb(204,204,204) 1px dashed; PADDING-RIGHT: 0px; BORDER-TOP: rgb(204,204,204) 1px dashed; PADDING-LEFT: 0px; FONT-SIZE: 12px; BACKGROUND: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) rgb(240,240,240); PADDING-BOTTOM: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(204,204,204) 1px dashed; WIDTH: 99%; COLOR: rgb(0,0,0); LINE-HEIGHT: 20px; PADDING-TOP: 0px; BORDER-BOTTOM: rgb(204,204,204) 1px dashed; FONT-FAMILY: arial; HEIGHT: auto; TEXT-ALIGN: left; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;&lt;br /&gt;="Order"+&lt;br /&gt;"("+&lt;br /&gt; "{"+&lt;br /&gt; "Filter"+&lt;br /&gt; "("+&lt;br /&gt;  "[Product].[Product Categories].Members"+&lt;br /&gt;  ",VBA!InStr([Product].[Product Categories].CurrentMember.Member_caption,'"+&lt;br /&gt;  Join&lt;br /&gt;  (&lt;br /&gt;   Parameters!Filtre.Value,&lt;br /&gt;   "')),"+&lt;br /&gt;   "Filter"+&lt;br /&gt;   "("+&lt;br /&gt;    "[Product].[Product Categories].Members,"+&lt;br /&gt;    "VBA!InStr([Product].[Product Categories].CurrentMember.Member_caption,'"&lt;br /&gt;  )+&lt;br /&gt; "'))}"+&lt;br /&gt; ","+&lt;br /&gt; "IIF(VBA!InStr([Product].[Product Categories].CurrentMember.Member_caption,'"+&lt;br /&gt; Join&lt;br /&gt; (&lt;br /&gt;   Parameters!Filtre.Value,&lt;br /&gt;   "')=0,0,1)+IIF(VBA!InStr([Product].[Product Categories].CurrentMember.Member_caption,'"&lt;br /&gt; )+&lt;br /&gt; "')=0,0,1)"+&lt;br /&gt;",BDESC)"&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;...on a un résultat ordonné. Comme je l'ai dit rien d'inédit mais c'est sympa à faire.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kbsOT_Eyf_M/S4K0TKGEinI/AAAAAAAAAcQ/oURsEWIkytc/s1600-h/Recherche.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5441109541037312626" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 552px; CURSOR: pointer; HEIGHT: 71px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_kbsOT_Eyf_M/S4K0TKGEinI/AAAAAAAAAcQ/oURsEWIkytc/s400/Recherche.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;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.&lt;br /&gt;PS2: A quand &lt;span style="FONT-WEIGHT: bold"&gt;VBA!Split en MDX!!!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-9008227686936033583?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/9008227686936033583/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=9008227686936033583' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/9008227686936033583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/9008227686936033583'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/02/recherche-google-like-dans-une.html' title='Recherche Google-Like dans une dimension en Reporting Services'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kbsOT_Eyf_M/S4K0NFsLHPI/AAAAAAAAAcI/o2ECKYZIEjA/s72-c/Recherche1.PNG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-3117251033735257983</id><published>2010-02-12T15:00:00.006+01:00</published><updated>2010-02-24T11:55:57.162+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services'/><category scheme='http://www.blogger.com/atom/ns#' term='Data Mining'/><title type='text'>Réentrainement incrémental dans Analysis Services Data Mining</title><content type='html'>Une question qui m'est assez souvent posée: la possibilité ou non de procédéer à un apprentissage incrémental dans Analysis Services.&lt;br /&gt;La réponse est &lt;span style="FONT-WEIGHT: bold"&gt;nativement non&lt;/span&gt; contrairement au fait qu'en AMO les modèles disposent d'une propriété &lt;span style="FONT-WEIGHT: bold"&gt;AllowIncrementalInsert&lt;/span&gt; qui peut être à true...&lt;br /&gt;C'est un objectif à terme mais aujourd'hui ce n'est pas le cas.&lt;br /&gt;&lt;br /&gt;Il faut donc ruser et dans ce type de problématique SSIS est encore une fois votre ami.&lt;br /&gt;&lt;br /&gt;L'idée générale est &lt;strong&gt;d'activer le DrillThrough&lt;/strong&gt; dans le modèle considéré et à chaque apprentissage de disposer de deux sources unionées:&lt;br /&gt;- Les nouvelles données récupérées via une OLE DB Source&lt;br /&gt;- Les anciennes données récupérées via une source OLE DB sur AS, avec une requêtre DMX du style&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT * FROM [Modèle].CASES&lt;/span&gt;&lt;br /&gt;&lt;p&gt;Voilà n'hésitez pas pour toute question.&lt;br /&gt;A bientôt!&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-3117251033735257983?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/3117251033735257983/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=3117251033735257983' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3117251033735257983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3117251033735257983'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/02/reentrainement-incremental-dans.html' title='Réentrainement incrémental dans Analysis Services Data Mining'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-7247516615133776314</id><published>2010-02-12T11:51:00.008+01:00</published><updated>2010-02-24T11:56:41.958+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='StreamInsight'/><title type='text'>StreamInsight, le licensing</title><content type='html'>&lt;img id="BLOGGER_PHOTO_ID_5437309761718160322" style="DISPLAY: block; MARGIN: 0px auto 10px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/S3U0a5D5i8I/AAAAAAAAAbY/ActRF_0fEJs/s400/R2Logo_2.png" border="0" /&gt;&lt;br /&gt;Une question est souvent revenue aux TechDays: le mode de licensing de StreamInsight et son intégration dans SQL Server 2008 R2.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;Les développeurs &lt;a href="http://blogs.msdn.com/streaminsight/archive/2010/02/10/streaminsight-versions-and-sql-server-skus.aspx"&gt;ont éclairci ce point récemment.&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;En clair, &lt;strong&gt;StreamInsight&lt;/strong&gt; existera en &lt;strong&gt;deux&lt;/strong&gt; éditions, nommées pour le moment &lt;strong&gt;Premium&lt;/strong&gt; et &lt;strong&gt;Standard&lt;/strong&gt; différentes par le nombre d'opérations concurrentes autorisées.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1)&lt;u&gt;La version Standard&lt;/u&gt;, qui permet de traiter jusqu'à 5000 évènements par seconde avec une latence tolérée supérieure à 5 secondes, sera livrée avec &lt;strong&gt;SQL Server 2008 R2 en versions Standard et Entreprise&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2)&lt;u&gt;La version Premium&lt;/u&gt;, pour des latences les plus faibles et les nombres d'évènements par seconde les plus élevés, uniquement disponibles sous &lt;strong&gt;SQL Server 2008 R2 en version Datacenter&lt;/strong&gt;. &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-7247516615133776314?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/7247516615133776314/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=7247516615133776314' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/7247516615133776314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/7247516615133776314'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/02/streaminsight-le-licensing.html' title='StreamInsight, le licensing'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kbsOT_Eyf_M/S3U0a5D5i8I/AAAAAAAAAbY/ActRF_0fEJs/s72-c/R2Logo_2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-319794716411111389</id><published>2010-02-11T17:49:00.003+01:00</published><updated>2010-02-24T11:57:05.834+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conférences'/><title type='text'>[TD2010] Merci!</title><content type='html'>Un petit mot pour remercier ceux qui ont assisté à mes - finalement - deux sessions de lundi et mercredi aux TechDays, ainsi plus généralement qu'à tous ceux croisés Porte Maillot. En espérant vous avoir montré quelques scénarii intéréssants!&lt;br /&gt;Je posterai les webcasts dès que ceux ci seront dispos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-319794716411111389?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/319794716411111389/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=319794716411111389' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/319794716411111389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/319794716411111389'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/02/td2010-merci.html' title='[TD2010] Merci!'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-57387160592080884</id><published>2010-02-07T12:23:00.000+01:00</published><updated>2010-02-24T12:29:41.355+01:00</updated><title type='text'>[Jamie Thomson] Stencils Visio pour SSIS</title><content type='html'>&lt;a href="http://sqlblog.com/blogs/jamie_thomson/archive/2010/02/03/visio-stencils-for-ssis.aspx"&gt;&lt;strong&gt;Jamie Thomson&lt;/strong&gt; le signalait&lt;/a&gt;: il existe des stencils SSIS pour vos diagrammes de specs/docs sous Visio.&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;img id="BLOGGER_PHOTO_ID_5441770254923354498" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 337px; CURSOR: hand; HEIGHT: 206px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_kbsOT_Eyf_M/S4UNNxH-UYI/AAAAAAAAAeI/KH1myphv-UY/s400/visio.PNG" border="0" /&gt;&lt;br /&gt;&lt;div&gt;Il les a uploadé sur son SkyDrive, vous pouvez les trouver &lt;a href="http://cid-550f681dad532637.skydrive.live.com/self.aspx/Public/BlogShare/20100203/MS%20Visio%20SQL%202005%20Stencils.zip"&gt;ici&lt;/a&gt;. Je viens de m'en servir, sympa :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-57387160592080884?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/57387160592080884/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=57387160592080884' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/57387160592080884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/57387160592080884'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/02/jamie-thomson-stencils-visio-pour-ssis.html' title='[Jamie Thomson] Stencils Visio pour SSIS'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kbsOT_Eyf_M/S4UNNxH-UYI/AAAAAAAAAeI/KH1myphv-UY/s72-c/visio.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-7304702210795204275</id><published>2010-01-31T12:46:00.003+01:00</published><updated>2010-02-24T11:57:31.598+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Articles'/><title type='text'>"Programmez!" de Février</title><content type='html'>Pour ceux qui souhaiteraient plus d'informations sur le sujet de l'interaction du &lt;span style="FONT-WEIGHT: bold"&gt;E-Commerce et du Data Mining&lt;/span&gt; sur plateforme Microsoft, j'ai écrit un petit article dans le magazine &lt;span style="FONT-WEIGHT: bold"&gt;Programmez!&lt;/span&gt; de février, disponible en ce moment.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kbsOT_Eyf_M/S2VujZNZQtI/AAAAAAAAAaw/wVo1hAA9U0U/s1600-h/logo.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5432870079833916114" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 250px; CURSOR: pointer; HEIGHT: 47px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_kbsOT_Eyf_M/S2VujZNZQtI/AAAAAAAAAaw/wVo1hAA9U0U/s400/logo.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Si vous souhaitez assister à la session de la semaine prochaine, cela en constitue une bonne introduction. Bonne lecture!&lt;br /&gt;&lt;br /&gt;A bientôt!&lt;br /&gt;&lt;br /&gt;PS: A ne pas rater dans ce même numéro l'excellent dossier "Microsoft 2010".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-7304702210795204275?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/7304702210795204275/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=7304702210795204275' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/7304702210795204275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/7304702210795204275'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/01/programmez-de-fevrier.html' title='&quot;Programmez!&quot; de Février'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kbsOT_Eyf_M/S2VujZNZQtI/AAAAAAAAAaw/wVo1hAA9U0U/s72-c/logo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-2698527519630439258</id><published>2010-01-15T08:12:00.008+01:00</published><updated>2010-02-24T11:57:46.951+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conférences'/><title type='text'>TechDays 2010</title><content type='html'>Evidemment je serai aux &lt;strong&gt;TechDays 2010&lt;/strong&gt;, l'évènement IT &lt;strong&gt;gratuit&lt;/strong&gt; de l'année, les&lt;strong&gt; 8-9-10 février&lt;/strong&gt; au &lt;strong&gt;Palais des Congrès&lt;/strong&gt; à Paris.&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5426863122687463266" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 267px; CURSOR: hand; HEIGHT: 91px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/S1AXQeB0D2I/AAAAAAAAAaI/8v2S7soHLAg/s400/signature_small.jpg" border="0" /&gt;&lt;br /&gt;&lt;div&gt;J'animerai même une session sur l'implémentation du cross-selling dans le e-commerce avec du Data Mining sous Analysis Services. &lt;strong&gt;Ce sera Mercredi 10 à 11h. &lt;/strong&gt;D'où le charmant petit logo sur la droite...&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Au programme de ces TechDays pour SQL Server: R2,R2,R2! Beaucoup de &lt;strong&gt;PowerPivot&lt;/strong&gt;, une pincée de &lt;strong&gt;StreamInsight&lt;/strong&gt; et de &lt;strong&gt;Master Data Services&lt;/strong&gt; et du &lt;strong&gt;Reporting Services.&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Je vous encourage à aller visiter &lt;a href="http://www.microsoft.com/france/mstechdays/default.aspx"&gt;le site officiel&lt;/a&gt; et à vous y inscrire avec votre LiveID.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;em&gt;&lt;strong&gt;Edit&lt;/strong&gt;: Merci à Jinroh pour avoir corrigé mon erreur de date :)&lt;/em&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-2698527519630439258?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/2698527519630439258/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=2698527519630439258' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/2698527519630439258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/2698527519630439258'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/01/techdays-2010.html' title='TechDays 2010'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kbsOT_Eyf_M/S1AXQeB0D2I/AAAAAAAAAaI/8v2S7soHLAg/s72-c/signature_small.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-326479768326861990</id><published>2010-01-11T15:36:00.008+01:00</published><updated>2010-02-24T11:57:18.972+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services'/><title type='text'>[SSAS] IgnoreUnrelatedDimension et Drillthrough</title><content type='html'>Je suis tombé sur ce que je pense être un &lt;strong&gt;petit bug&lt;/strong&gt; dont je n'avais &lt;strong&gt;jamais&lt;/strong&gt; entendu parler... et qui m'a bloqué une bonne demi journée! Peut être que vous le connaissez et que ça vous paraîtra trivial mais dans mon cas j'étais assez étonné.&lt;br /&gt;&lt;br /&gt;Mettez vous dans le cas d'un cube disposant de &lt;span style="FONT-WEIGHT: bold"&gt;deux MeasureGroups&lt;/span&gt;, un pour le &lt;span style="FONT-WEIGHT: bold"&gt;reporting financier&lt;/span&gt; sur des indicateurs, l'autre sur l'&lt;span style="FONT-WEIGHT: bold"&gt;analyse d'activité&lt;/span&gt; plus globale.&lt;br /&gt;Deux particularités:&lt;br /&gt;1) Une des dimensions de l'analyse d'activité dispose d'un DefaultMember qui n'est pas (All) pour complaire aux demandes fonctionnelles.&lt;br /&gt;2) Le groupe de mesure finance étant lié à peu de dimensions a été paramétré en IgnoreUnrelatedDimension=false pour donner un affichage plus user friendly. Il dispose d'une action de Drillthrough.&lt;br /&gt;Lorsque je tente un &lt;strong&gt;Drillthrough&lt;/strong&gt; sur les cellules de certaines requêtes sur le MG financier rien ne s'affiche (voir plus bas).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Qu'est ce qu'IgnoreUnrelatedDimension?&lt;/strong&gt;&lt;br /&gt;&lt;p&gt;En MDX lorsque l'on effectue analyse une mesure par les membres d'une dimension n'ayant &lt;strong&gt;aucun lien&lt;/strong&gt; avec le groupe de la mesure (pas de relation dans le &lt;strong&gt;Dimension&lt;/strong&gt; &lt;strong&gt;Usage&lt;/strong&gt;) c'est généralement le niveau (All) - ou le membre par défaut si différent - de la dimension qui est affiché, &lt;strong&gt;répété&lt;/strong&gt; sur tous les membres. &lt;/p&gt;&lt;p&gt;Pourquoi? Parce que par défaut les groupes de mesure appliquent le comportement de la fonction MDX &lt;a href="http://msdn.microsoft.com/en-us/library/ms145972.aspx"&gt;&lt;strong&gt;ValidMeasure&lt;/strong&gt; &lt;/a&gt;- qui positionne la cellule en cours sur le niveau (All) des dimensions non reliées au MG -, c'est le sens du setting &lt;strong&gt;IgnoreUnrelatedDimension&lt;/strong&gt;, par défaut à True sur un MG.&lt;/p&gt;&lt;p&gt;Parfois on peut souhaiter éviter cette répétition, et que les hiérarchies non reliées n'affichent tout bonnement rien. On affecte donc IgnoreUnrelatedDimension à False.&lt;/p&gt;&lt;strong&gt;Pour reproduire cette bizarrerie avec AdventureWorks&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Pour simuler ce comportement dans AdventureWorks, mettez par exemple la hiérarchie "Product.Category" avec un DefaultMember bidon. Processez la dimension.&lt;br /&gt;Puis mettez faites une requête:&lt;br /&gt;Date.Fiscal.Year en lignes, Measure.Amount en colonne et Product.Category.All en slicer. Faites un Drillthrough sur n'importe qu'elle cellule... c'est vide.&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5425497011490176338" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 147px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_kbsOT_Eyf_M/S0s8yVPQvVI/AAAAAAAAAZ4/O3DbUsnHugM/s400/Bug.PNG" border="0" /&gt;&lt;br /&gt;Retournez dans la dimension Product, remettez la catégorie en DefaultMember par défaut et miracle ça marche.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;img id="BLOGGER_PHOTO_ID_5425497339163950514" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 476px; CURSOR: hand; HEIGHT: 204px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/S0s9FZ6xvbI/AAAAAAAAAaA/ea07-Yco-5c/s400/SansBug.PNG" border="0" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Plus d'infos&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Ce bug est signalé sur Connect à &lt;a href="http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=216789"&gt;l'adresse suivante&lt;/a&gt;, et non résolu à ce jour. Je suis tombé dessus par &lt;a href="http://social.msdn.microsoft.com/Forums/en/sqlanalysisservices/thread/f531f249-a9de-45af-8ba8-b07b5253ecd4"&gt;ce&lt;/a&gt; post de Raymond-Lee sur MSDN alors que je ne soupçonnais pas du tout mon MeasureGroup d'être responsable de ça...&lt;/p&gt;&lt;p&gt;Plus globalement tout ce qui tourne autour de ValidMeasure mériterait à mon sens un peu plus d'investigation, que ce soit sur les impacts en termes de performance - il semble bon d'après Mosha d'utiliser ValidMeasure dans les cas de membres calculés sollicitant la feature de reconnexion au niveau (All) mais après? - que sur les éventuels problèmes similaires à celui ci - j'imagine qu'il y en a - et difficilement trouvables.&lt;/p&gt;&lt;p&gt;A bientôt.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-326479768326861990?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/326479768326861990/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=326479768326861990' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/326479768326861990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/326479768326861990'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2010/01/ssas-ignoreunrelateddimension-et.html' title='[SSAS] IgnoreUnrelatedDimension et Drillthrough'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kbsOT_Eyf_M/S0s8yVPQvVI/AAAAAAAAAZ4/O3DbUsnHugM/s72-c/Bug.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-1473599004569809844</id><published>2009-12-30T16:40:00.002+01:00</published><updated>2009-12-30T16:48:04.474+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MDX'/><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services'/><category scheme='http://www.blogger.com/atom/ns#' term='Autres'/><title type='text'>Good bye Mosha... and good luck!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kbsOT_Eyf_M/Szt2HslvWMI/AAAAAAAAAZQ/zHxNoRojpjU/s1600-h/mosha.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 100px; height: 127px;" src="http://3.bp.blogspot.com/_kbsOT_Eyf_M/Szt2HslvWMI/AAAAAAAAAZQ/zHxNoRojpjU/s400/mosha.png" alt="" id="BLOGGER_PHOTO_ID_5421056451071137986" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://sqlblog.com/blogs/mosha/archive/2009/12/29/good-bye-bi.aspx"&gt;Mosha Pasumanski l'annonce sur son blog&lt;/a&gt;: il ne mènera pas de front son travail sur Bing et ses activités sur Analysis Services. Il arrête donc de se consacrer à la BI et son blog - grâce auquel chacun a pu s'initier au MDX puis se perfectionner  - quoique toujours en ligne ne traitera plus de ces sujets...&lt;br /&gt;&lt;br /&gt;So good bye Mosha!&lt;br /&gt;&lt;br /&gt;PS: quelqu'un pour reprendre MDX Studio?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-1473599004569809844?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/1473599004569809844/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=1473599004569809844' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/1473599004569809844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/1473599004569809844'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2009/12/good-bye-mosha-and-good-luck.html' title='Good bye Mosha... and good luck!'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kbsOT_Eyf_M/Szt2HslvWMI/AAAAAAAAAZQ/zHxNoRojpjU/s72-c/mosha.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-3914146283563012007</id><published>2009-12-30T15:15:00.004+01:00</published><updated>2009-12-30T17:14:43.502+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services'/><title type='text'>[SSAS] Les réglages de mémoire (LowMemoryLimit, TotalMemoryLimit...)</title><content type='html'>Quelques rappels je pense utiles sur le paramétrage et le monitoring de cette chose si mal connue qu'est la mémoire sous Analysis Services. L'information existe certes mais elle est suffisament éparse pour perdre quelque peu le débutant et beaucoup de contre-vérités subsistent.&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5421050056524461122" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 219px; CURSOR: hand; HEIGHT: 150px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_kbsOT_Eyf_M/SztwTfDAdEI/AAAAAAAAAZI/0C1gjNFZVjs/s400/ram.jpg" border="0" /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Les réglages serveur&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Il existe deux "limites" de mémoire pour Analysis Services, réglables dans les propriétés serveur. La &lt;span style="FONT-WEIGHT: bold"&gt;LowMemoryLimit &lt;/span&gt;et la &lt;span style="FONT-WEIGHT: bold"&gt;TotalMemoryLimit &lt;/span&gt;- aussi appellée improprement mais peut être plus justement HighMemoryLimit dans certains ouvrages...&lt;br /&gt;&lt;br /&gt;Leur valeur est soit un pourcentage de la mémoire du système (par défaut LML=65% et HML=80%) si elle est en dessous de 100, une valeur absolue en octets sinon.&lt;br /&gt;&lt;br /&gt;Pour vérifier leur valeur effective, il suffit de regarder les compteurs &lt;span style="FONT-WEIGHT: bold"&gt;MSAS2008:Memory.MemoryLimitLowKB&lt;/span&gt; et &lt;span style="FONT-WEIGHT: bold"&gt;MSAS2008:Memory.MemoryLimitHighKB&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Effet de ces limites&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ce ne sont &lt;span style="FONT-WEIGHT: bold"&gt;pas des limites&lt;/span&gt; - le serveur peut allègrement les dépasser pour exécuter une requête ou un processing - &lt;span style="FONT-WEIGHT: bold"&gt;mais plutôt des caps&lt;/span&gt;, des niveaux qui déterminent le &lt;span style="FONT-WEIGHT: bold"&gt;mode de nettoyage&lt;/span&gt; à appliquer par le serveur sur sa mémoire de travail.&lt;span style="FONT-WEIGHT: bold"&gt; Il est donc fréquent de voir des serveur AS dépassant la HML.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dans une situation normale, en dessous de LowMemoryLimit, le serveur ne nettoie rien ou presque. Lorsque la mémoire utilisée (&lt;span style="FONT-WEIGHT: bold"&gt;MSAS2008:Memory.MemoryUsageKB)&lt;/span&gt; dépasse la LowMemoryLimit le serveur passe en mode &lt;span style="FONT-STYLE: italic"&gt;LowMemoryPressure&lt;/span&gt; ce qui a pour effet de démarrer le nettoyeur pour supprimer certaines ressources.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Ressources supprimables par le nettoyeur&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Grosso modo le nettoyeur va surtout s'occuper supprimer du cache. Il applique un algorithme de sélection qui va effacer les éléments les moins requêtés et les plus faciles à supprimer. Pour savoir si cette tâche est en cours il est possible de voir dans PerfMon le compteur &lt;span style="FONT-WEIGHT: bold"&gt;MSAS2008:Memory.CleanerCurrentPrice&lt;/span&gt;&lt;span style="font-size:0;"&gt; dépasser 0.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Et quand on dépasse la HighMemoryLimit?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La le nettoyeur passe en mode aggressif (le serveur est alors en &lt;span style="FONT-STYLE: italic"&gt;HighMemoryPressure)&lt;/span&gt; il supprime à tout va tout ce qui est supprimable donc basiquement le cache. Si cela ne suffit pas à descendre en dessous de HML- ce qui est alors souvent le cas - &lt;span style="FONT-WEIGHT: bold"&gt;il commence à demander l'arrêt des processings et requêtes&lt;/span&gt; en cours car il ne possède pas d'accès direct à leur mémoire et ne peut donc les "nettoyer".&lt;br /&gt;Il s'agit alors de la seule solution restante pour redescendre dans de saines limites.&lt;br /&gt;&lt;br /&gt;C'est la raison du fameux message:&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;Server: The operation has been cancelled due to memory pressure.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Et qu'est ce c'est que ce "PreAllocate"?&lt;span style="FONT-WEIGHT: bold"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;PreAllocate est un setting d'Analysis Services conçu pour pallier à des déficiences d'allocation de mémoire de Windows Server 2003. Basiquement il s'agit de préallouer un volume de mémoire fixé à SSAS pour éviter les lenteurs d'allocation.&lt;span style="FONT-WEIGHT: bold"&gt; Il ne sert plus à rien&lt;/span&gt; - voire même empire la situation - sous Windows Server 2008 (voir à ce sujet ce très bon &lt;a href="http://sqlcat.com/technicalnotes/archive/2008/07/16/running-microsoft-sql-server-2008-analysis-services-on-windows-server-2008-vs-windows-server-2003-and-memory-preallocation-lessons-learned.aspx"&gt;bench&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Pour finir pour savoir si vos requête arrivent bien à mettre et à taper en cache - ce qui veut dire que tout fonctionne bien finalement... - rien d 'équivalent à &lt;span style="FONT-WEIGHT: bold"&gt;l'excellentissime MDX Studio&lt;/span&gt;. Et si vous êtes plus intéressés par le sujet mémoire, un petit coup d'oeil au &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=3be0488d-e7aa-4078-a050-ae39912d2e43&amp;amp;displaylang=en"&gt;PerformanceGuide &lt;/a&gt;ne fait jamais de mal.&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;/span&gt;&lt;br /&gt;A bientôt!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-3914146283563012007?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/3914146283563012007/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=3914146283563012007' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3914146283563012007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3914146283563012007'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2009/12/ssas-les-reglages-de-memoire.html' title='[SSAS] Les réglages de mémoire (LowMemoryLimit, TotalMemoryLimit...)'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kbsOT_Eyf_M/SztwTfDAdEI/AAAAAAAAAZI/0C1gjNFZVjs/s72-c/ram.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-116468099912670072</id><published>2009-12-23T14:28:00.031+01:00</published><updated>2010-10-08T17:56:56.150+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MDX'/><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP'/><title type='text'>[SSAS] Afficher une Parent Child sur un seul niveau avec MDX</title><content type='html'>Curieuse demande en apparence, mais finalement assez compréhensible. Lorsque l'on utilise une hiérarchie - ce qui est très pratique pour certains états - il est fréquent de vouloir aussi disposer des informations sous une forme&lt;span style="FONT-WEIGHT: bold"&gt; non-hiérarchisée, une sorte de liste&lt;/span&gt;, &lt;span style="FONT-WEIGHT: bold"&gt;et que cette information soit disponible sous Excel 2007.&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;C'est particulièrement le cas fonctionnellement dans le domaine du &lt;span style="FONT-WEIGHT: bold"&gt;reporting financier&lt;/span&gt; et plus techniquement dans tous les domaines où tous les niveaux hiérarchiques peuvent porter des données, donc des dimensions généralement en Parent-Child.&lt;br /&gt;&lt;br /&gt;Pour générer une liste de tous les attributs d'une Parent-Child à plat, rien de plus simple: la hiérarchie d'attributs sur laquelle s'appuie la Parent-Child le fait nativement.&lt;br /&gt;Par exemple la hiérarchie Employee (sans S) d'AdventureWorks liste bien tous les Employés... mais lorsqu'on y associe une mesure&lt;span style="FONT-WEIGHT: bold"&gt; elle n'est capable d'afficher que les DataMember&lt;/span&gt;, autrement dit les mesures associés à ce membre précis et non la valeur aggrégée que la hiérachie rapporte.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kbsOT_Eyf_M/SzIguYOTzsI/AAAAAAAAAWI/1xmix0WrYVM/s1600-h/Customer.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5418429282828668610" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 353px; CURSOR: pointer; HEIGHT: 400px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_kbsOT_Eyf_M/SzIguYOTzsI/AAAAAAAAAWI/1xmix0WrYVM/s400/Customer.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Par exemple l'on regarde les valeurs de la Parent-Child (Employees) on constate:&lt;br /&gt;1) Que Ken Sanchez et Brian Welcker &lt;span style="FONT-WEIGHT: bold"&gt;n'apparaissaient pas&lt;/span&gt; dans la hiérarchie d'attributs: ils n'ont pas de faits associés.&lt;br /&gt;2) Qu'Amy Alberts elle apparaît bien à plat mais avec &lt;span style="FONT-WEIGHT: bold"&gt;une valeur fausse:&lt;/span&gt; la valeur affichée est en effet celle de son DataMember et pas l'aggrégation de celui ci et de ses enfants.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kbsOT_Eyf_M/SzIg2l-dCuI/AAAAAAAAAWQ/8keukylAKp0/s1600-h/Customers.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5418429423959214818" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 383px; CURSOR: pointer; HEIGHT: 400px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/SzIg2l-dCuI/AAAAAAAAAWQ/8keukylAKp0/s400/Customers.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;L'idée est donc de&lt;span style="FONT-WEIGHT: bold"&gt; recopier dans la hiérarchie d'attributs &lt;/span&gt;la valeur de la Parent-Child.&lt;br /&gt;L'instruction &lt;a href="http://msdn.microsoft.com/en-us/library/ms146058.aspx"&gt;&lt;span style="FONT-WEIGHT: bold;font-family:courier new;"&gt;LinkMember&lt;/span&gt;&lt;/a&gt; permet de récupérer un membre d'une hiérarchie à partir d'un membre d'une autre du moment qu'ils partagent la même clé (ce qui est le cas ici). Certes ce n'est pas le top niveau performance (même si dans la même dimension c'est légèrement mieux), mais de toute manière &lt;span style="FONT-WEIGHT: bold"&gt;cela ne concerne pas des dimensions de cardinalité trop élevée&lt;/span&gt; vues les applications métier.&lt;br /&gt;&lt;br /&gt;On peut réaliser cette affectation via &lt;span style="FONT-WEIGHT: bold"&gt;un SCOPE dans le script MDX&lt;/span&gt;, de cette manière:&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style="BORDER-RIGHT: rgb(204,204,204) 1px dashed; PADDING-RIGHT: 0px; BORDER-TOP: rgb(204,204,204) 1px dashed; PADDING-LEFT: 0px; FONT-SIZE: 12px; BACKGROUND: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) rgb(240,240,240); PADDING-BOTTOM: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(204,204,204) 1px dashed; WIDTH: 99%; COLOR: rgb(0,0,0); LINE-HEIGHT: 20px; PADDING-TOP: 0px; BORDER-BOTTOM: rgb(204,204,204) 1px dashed; FONT-FAMILY: arial; HEIGHT: auto; TEXT-ALIGN: left; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;SCOPE&lt;br /&gt;(&lt;br /&gt;[Employee].[Employee].[Employee].Members&lt;br /&gt;);&lt;br /&gt;This = LinkMember([Employee].[Employee].CurrentMember,[Employee].[Employees]);&lt;br /&gt;END SCOPE;&lt;/code&gt;&lt;/pre&gt;Le résultat est tout bonnement enthousiasmant et l'effet immédiat:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kbsOT_Eyf_M/SzIki2TyFoI/AAAAAAAAAW4/v6PJ_nK7UYU/s1600-h/EmployeeCorrig%C3%A9.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5418433482792769154" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 318px; CURSOR: pointer; HEIGHT: 400px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_kbsOT_Eyf_M/SzIki2TyFoI/AAAAAAAAAW4/v6PJ_nK7UYU/s400/EmployeeCorrig%C3%A9.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Les noeuds sans données apparaissent (Welcker, Sanchez...) ceux composites sont corrigés (Amy Alberts). Bref tout semble parfait. &lt;span style="FONT-WEIGHT: bold"&gt;Sauf qu'il y a un hic.&lt;/span&gt;&lt;br /&gt;Si l'on re-regarde la Parent-Child, qui s'appuie sur cette hiérarchie d'attributs, on constate que les chiffres sont complétement faux. En effet, la Parent-Child tire ses données... de la hiérarchie d'attributs... qui elle même tire ses données de la Parent-Child.&lt;br /&gt;&lt;br /&gt;Par exemple Amy Alberts est égale à son Data Member plus la somme de ses enfants. Son DataMember vaut 732.078,44 - voir premier screenshot - et la somme de ses enfants 14.803.867,81 - merci calc.exe -, le tout faisant 15.935.546,26, la valeur affichée dans la hiérarchie initialement.&lt;br /&gt;Or ici on a:&lt;br /&gt;15.935.546,26 (&lt;span style="FONT-WEIGHT: bold"&gt;la valeur réaffectée&lt;/span&gt; dans la hiérarchie d'attributs, &lt;span style="FONT-WEIGHT: bold"&gt;que SSAS considère à tort comme le DataMember&lt;/span&gt;)&lt;br /&gt;+ 14.803.867,81 (la somme des enfants)&lt;br /&gt;=&lt;span style="FONT-WEIGHT: bold"&gt;30.339.814,07&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kbsOT_Eyf_M/SzIlX-HS1SI/AAAAAAAAAXA/hMNnFmvxJdE/s1600-h/PCFausse.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5418434395420939554" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 367px; CURSOR: pointer; HEIGHT: 400px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_kbsOT_Eyf_M/SzIlX-HS1SI/AAAAAAAAAXA/hMNnFmvxJdE/s400/PCFausse.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Il faut donc &lt;span style="FONT-WEIGHT: bold"&gt;verrouiller la ParentChild&lt;/span&gt; avant de faire la modification de la hiérarchie d'attributs, ce que l'on peut faire avec l'instruction &lt;a href="http://msdn.microsoft.com/en-us/library/ms144733.aspx"&gt;&lt;span style="FONT-WEIGHT: bold;font-family:courier new;"&gt;Freeze&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;Le script précédent devient alors:&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: rgb(204,204,204) 1px dashed; PADDING-RIGHT: 0px; BORDER-TOP: rgb(204,204,204) 1px dashed; PADDING-LEFT: 0px; FONT-SIZE: 12px; BACKGROUND: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) rgb(240,240,240); PADDING-BOTTOM: 0px; OVERFLOW: auto; BORDER-LEFT: rgb(204,204,204) 1px dashed; WIDTH: 99%; COLOR: rgb(0,0,0); LINE-HEIGHT: 20px; PADDING-TOP: 0px; BORDER-BOTTOM: rgb(204,204,204) 1px dashed; FONT-FAMILY: arial; HEIGHT: auto; TEXT-ALIGN: left; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;FREEZE([Employee].[Employees].Members);&lt;br /&gt;SCOPE&lt;br /&gt;(&lt;br /&gt;[Employee].[Employee].[Employee].Members&lt;br /&gt;);&lt;br /&gt;This = LinkMember([Employee].[Employee].CurrentMember,[Employee].[Employees]);&lt;br /&gt;END SCOPE;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Du coup le résultat devient beaucoup plus acceptable:&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5418440975461260962" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; HEIGHT: 244px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_kbsOT_Eyf_M/SzIrW-rKHqI/AAAAAAAAAX4/V7mntwfyXWA/s400/PCJuste.PNG" border="0" /&gt;La hiérarchie peut donc maintenant &lt;span style="FONT-WEIGHT: bold"&gt;faire un rapport Excel&lt;/span&gt; à mettre à disposition via Excel Services par exemple, permettant d'analyser des membres de niveaux différents dans la même colonne. C'est l'idée générale qui permet de faire des rapports sur des statistiques, des comptes d'exploitation choisis et mis à plat, pour ne prendre que des exemple communs utilisant les Parent-Child...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kbsOT_Eyf_M/SzIw47FR7II/AAAAAAAAAYo/1_A148JW6cg/s1600-h/Rapport.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5418447056170773634" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: pointer; HEIGHT: 95px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_kbsOT_Eyf_M/SzIw47FR7II/AAAAAAAAAYo/1_A148JW6cg/s400/Rapport.PNG" border="0" /&gt;&lt;/a&gt;En espérant vous avoir donné des idées, mais attention cependant, il s'agit &lt;span style="FONT-WEIGHT: bold"&gt;clairement d'une manip&lt;/span&gt; (les parent-child et leur hiérarchie d'attributs sont très liées) dont je n'ai pas eu le temps de tester extensivement toutes les implications. Si vous constatez un comportement étrange n'hésitez pas à le mettre en commentaire.&lt;br /&gt;&lt;br /&gt;A bientôt!&lt;br /&gt;&lt;br /&gt;PS: &lt;span style="FONT-WEIGHT: bold"&gt;avec Excel 2010 ceci serait obsolète&lt;/span&gt;: les PivotTables disposent d'un Set Designer, il suffit alors de se créer un jeu contenant les employés souhaités. Mais 2007 est encore là pour quelques années... &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-116468099912670072?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/116468099912670072/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=116468099912670072' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/116468099912670072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/116468099912670072'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2009/12/ssas-mettre-une-parent-child-plat.html' title='[SSAS] Afficher une Parent Child sur un seul niveau avec MDX'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kbsOT_Eyf_M/SzIguYOTzsI/AAAAAAAAAWI/1xmix0WrYVM/s72-c/Customer.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-1865306349384067513</id><published>2009-12-16T11:06:00.010+01:00</published><updated>2009-12-21T14:42:54.069+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services'/><category scheme='http://www.blogger.com/atom/ns#' term='OLAP'/><title type='text'>[SSAS] Réhabilitation des ParentChild (ou pourquoi elles ne sont pas le mal absolu)</title><content type='html'>Je discutais l'autre jour avec quelques confrères lorsque j'ai entendu cette phrase au milieu d'un brouhaha technique.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic"&gt;"... les ParentChilds il faut que vous les enleviez: question performance c'est nul, fonctionnellement ça ne sert à rien. Analysis Services n'est pas fait pour ça, il les ont laissées pour s'adapter à certains types d'architectures existantes. Il suffit de lire le Performance Guide."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Je n'aime pas ce genre d'affirmation pontifiante. D'autant plus quand, comme toute assertion de ce type,&lt;span style="FONT-WEIGHT: bold"&gt; elle s'inspire de faits et documents réels en les dénaturant&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Je me propose donc modestement de remettre un petit peu de clarté la dedans.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kbsOT_Eyf_M/SyjuPMKTpaI/AAAAAAAAAVg/BAXZlx0-lKA/s1600-h/120px-ParentChildIcon.svg.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5415840496642925986" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 120px; CURSOR: pointer; HEIGHT: 120px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_kbsOT_Eyf_M/SyjuPMKTpaI/AAAAAAAAAVg/BAXZlx0-lKA/s400/120px-ParentChildIcon.svg.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold; FONT-STYLE: italic"&gt;"Les ParentChild, question performance c'est nul"&lt;span style="FONT-WEIGHT: bold"&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Les faits:&lt;/span&gt; dans une hiérarchie ParentChild, les aggrégations ne sont créées que pour l'attribut clé et le membre de All de la hiérarchie. Dit autrement des aggrégations ne sont pas calculées sur les niveaux intermédiaires.&lt;span style="FONT-WEIGHT: bold"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Réponse&lt;/span&gt;: Le coupable serait donc l'absence de calcul d'aggrégats. Ceux ci sont certes très utiles et jouent un rôle crucial. Mais considérer qu'ils constituent l'unique intérêt de l'OLAP et que leur absence est dans tous les cas catastrophique en terme de performances témoigne d'une certaine méconnaissance de ce genre de systèmes. L'idée de l'OLAP est certes de précalculer mais avant cela de &lt;span style="FONT-WEIGHT: bold"&gt;se baser sur un formalisme de stockage spécifique &lt;/span&gt;permettant rapidement de récupérer les informations. Un cube même sans aggrégats est bien plus efficace qu'une base relationnelle pour les calculs multidimensionnels habituels.&lt;br /&gt;&lt;br /&gt;Une ParentChild n'est donc &lt;span style="FONT-WEIGHT: bold"&gt;pas en tous les cas catastrophiques&lt;/span&gt; en termes de performances... Tout dépend de la volumétrie!&lt;br /&gt;Plus troublant dans certains cas une utilisation extensive du &lt;span style="FONT-WEIGHT: bold"&gt;HideMemberIf &lt;/span&gt;dans des &lt;span style="FONT-WEIGHT: bold"&gt;hiérarchies naturelles&lt;/span&gt; - pour permettre de disposer de hiérarchies irrégulières sur de nombreux niveaux - fait qu'une ParentChild&lt;span style="FONT-WEIGHT: bold"&gt; peut être plus performante&lt;/span&gt;. (cf &lt;a href="http://www.ssas-info.com/analysis-services-articles/52-parent-child/868-cube-structure-optimization-for-mdx-query-performance-in-analysis-services-2005-sp2-tips-for-parent-child-hierarchies-usage"&gt;ce post&lt;/a&gt; d'Ajit Singh pourtant grand pourfendeur des P/C sur SSAS-Info).&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold; FONT-STYLE: italic"&gt;"Il suffit de lire un peu la documentation enfin!"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Les faits:&lt;/span&gt; le Performance Guide déconseille d'utiliser les ParentChilds et recommande de passer à un design naturel... ...mais sur de grosses volumétries et sur beaucoup de dimensions et dans le cas ou fonctionnellement l'alternative est possible, comme visible ci dessous:&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Réponse:&lt;/span&gt; il s'agit simplement d'un raccourci sur le propos de cet excellent guide. L'extrait est ci-dessous.&lt;br /&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;i&gt;If you are in a design scenario with a large parent-child hierarchy (&lt;b&gt;greater than 250,000 members&lt;/b&gt;), you may want to consider altering the source schema to re-organize part or all of the hierarchy.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Analysis Services Performance Guide&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold; FONT-STYLE: italic"&gt;"Fonctionnellement ça ne sert à rien."&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Les faits:&lt;/span&gt; Je crois que c'est l'assertion la plus stupide. Cela ne se base sur rien et vient simplement d'un bouche à oreilles général.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Réponse&lt;/span&gt;:&lt;span style="FONT-WEIGHT: bold"&gt;&lt;/span&gt; Il est facile de trouver quelques cas où la modélisation sans ParentChild est fastidieuse. Même Mosha en convient, au début de ce &lt;a href="http://sqlblog.com/blogs/mosha/archive/2008/08/25/parent-child-dimension-table-naturalizer.aspx"&gt;post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;1) Un bien connu est une &lt;span style="FONT-WEIGHT: bold"&gt;hiérarchie opérationnelle&lt;/span&gt; récursive: les faits ne se situent pas au niveau le plus bas mais potentiellement partout (au niveau du manager, d'un membre de son équipe...). Les règles de Rollup sont de plus potentiellement compliquées.&lt;br /&gt;En Ragged c'est un enfer à gérer. En ParentChild cela se fait simplement. Et il est rare de disposer de plusieurs centaines de milliers de membres dans ce genre de dimension...&lt;br /&gt;&lt;br /&gt;2) Un autre exemple est une &lt;span style="FONT-WEIGHT: bold"&gt;hiérarchie de type plan de compte&lt;/span&gt;, sur le même modèle ou chaque élément de fait peut référencer un niveau qui n'est pas le plus bas. Dans ce scénario de plus, il est fréquent que les utilisateurs veuillent utiliser les indicateurs de plusieurs niveaux dans la même colonne d'un rapport Excel, et donc disposer de deux représentations: sur un niveau et multi-niveau: le ParentChild est la seule manière d'arriver à cela simplement. De plus là aussi on atteint rarement une volumétrie énorme!&lt;br /&gt;&lt;br /&gt;D'ailleurs &lt;span style="FONT-WEIGHT: bold"&gt;AdventureWorks&lt;/span&gt; contient deux exemples identiques... modélisés en ParentChild -Organization et Account. Pourquoi diable les montrer dans des exemples fonctionnels si comme certains l'affirment "&lt;span style="FONT-STYLE: italic"&gt;le ParentChild n'est là que pour la compatibilité avec des existants ou des habitudes&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kbsOT_Eyf_M/Syju7WK4zRI/AAAAAAAAAWA/0KMKzDhg2-o/s1600-h/Sans+titre.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5415841255243959570" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 188px; CURSOR: pointer; HEIGHT: 257px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/Syju7WK4zRI/AAAAAAAAAWA/0KMKzDhg2-o/s400/Sans+titre.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En conclusion &lt;span style="FONT-WEIGHT: bold"&gt;les P/C sont moins performantes que les hiérarchies naturelles&lt;/span&gt; sur des grosses volumétries de par leur lacune dans le calcul des aggrégats. &lt;span style="FONT-WEIGHT: bold"&gt;Elles sont cependant une nécessité fonctionnelle dans certains cas&lt;/span&gt; et il est absurde de s'empêcher de les utiliser sous des prétextes fallacieux.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-1865306349384067513?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/1865306349384067513/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=1865306349384067513' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/1865306349384067513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/1865306349384067513'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2009/12/ssas-rehabilitation-des-parentchild-ou.html' title='[SSAS] Réhabilitation des ParentChild (ou pourquoi elles ne sont pas le mal absolu)'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kbsOT_Eyf_M/SyjuPMKTpaI/AAAAAAAAAVg/BAXZlx0-lKA/s72-c/120px-ParentChildIcon.svg.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-2921538820254133945</id><published>2009-12-07T21:44:00.004+01:00</published><updated>2009-12-07T22:46:05.821+01:00</updated><title type='text'>[SSAS] Utiliser les viewers Data Mining dans un BackOffice Winforms</title><content type='html'>Petit post très court pour donner des idées. Pour intégrer les viewers de modèles de Data Mining disponibles dans Visual Studio au sein d'Excel, les développeurs de Redmond ne les ont pas recodés. Ils ont simplement profité du fait que ceux ci sont disponibles en tant que composants Winforms et que vous pouvez faire de même, à savoir les réutiliser dans vos applications.&lt;br /&gt;Il suffit pour cela de les ajouter à la Toolbox Winforms, en allant chercher l'assembly Microsoft.AnalysisServices.Viewer.dll qui doit se trouver dans le dossier &lt;span style="font-weight: bold;"&gt;Common7\IDE\PrivateAssemblies&lt;/span&gt; de votre installation de Visual Studio.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kbsOT_Eyf_M/Sx13Zu1YylI/AAAAAAAAAVY/NOrVjLvFFkQ/s1600-h/Untitled.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 332px; height: 300px;" src="http://2.bp.blogspot.com/_kbsOT_Eyf_M/Sx13Zu1YylI/AAAAAAAAAVY/NOrVjLvFFkQ/s400/Untitled.png" alt="" id="BLOGGER_PHOTO_ID_5412613611121592914" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A vous les jolis backoffices!&lt;br /&gt;A bientôt!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-2921538820254133945?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/2921538820254133945/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=2921538820254133945' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/2921538820254133945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/2921538820254133945'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2009/12/ssas-utiliser-les-viewers-data-mining.html' title='[SSAS] Utiliser les viewers Data Mining dans un BackOffice Winforms'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kbsOT_Eyf_M/Sx13Zu1YylI/AAAAAAAAAVY/NOrVjLvFFkQ/s72-c/Untitled.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-8714117221849193594</id><published>2009-11-25T12:55:00.002+01:00</published><updated>2009-11-30T09:23:18.594+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MDX'/><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services'/><title type='text'>[SSAS] Assembly ExcelMDX sur le serveur SSAS?</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_kbsOT_Eyf_M/Sw011lU5NpI/AAAAAAAAAVQ/C9DJezxGG_o/s1600/excel_box.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5408037922210920082" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 200px; CURSOR: hand; HEIGHT: 150px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_kbsOT_Eyf_M/Sw011lU5NpI/AAAAAAAAAVQ/C9DJezxGG_o/s400/excel_box.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;Une petite note très rapide sur l'assembly ExcelMDX: on m'a encore demandé pourquoi il na marchait pas sur le serveur de production d'une entreprise...&lt;br /&gt;ExcelMDX comme son nom l'indique est associé à... &lt;span style="FONT-WEIGHT: bold"&gt;Excel.&lt;br /&gt;&lt;/span&gt;Il &lt;span style="FONT-WEIGHT: bold"&gt;nécessite Excel&lt;/span&gt; pour fonctionner ce qui est rarement - qui a dit jamais? - le cas pour une configuration de production. Alors oui il apporte &lt;span style="FONT-WEIGHT: bold"&gt;quelques fonctions salutaires&lt;/span&gt; au MDX mais il vaut mieux ne jamais l'utiliser sous peine de faire face à des suprises au déploiement.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;C'est un choix d'architecture pour le moins... étonnant. &lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Pour un utilisateur de MDX la seule solution est de &lt;strong&gt;remplacer les fonctions&lt;/strong&gt; ExcelMDX: en se débrouillant avec le MDX existant ou en codant une &lt;strong&gt;procédure stockée managée&lt;/strong&gt;.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;A bientôt!&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;PS: Le &lt;a href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=124864"&gt;lien &lt;/a&gt;de cette bizarrerie sur Connect, posté initialement par Greg Galloway. Le &lt;a href="http://msdn.microsoft.com/en-us/library/ms176113.aspx"&gt;walkthrough &lt;/a&gt;MSDN de création de procédures stockées si cela peut vous aider. Merci à Gurvan et à son &lt;a href="http://gurvang.blogspot.com/"&gt;blog de haut vol &lt;/a&gt;de m'y avoir fait repenser.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-8714117221849193594?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/8714117221849193594/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=8714117221849193594' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/8714117221849193594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/8714117221849193594'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2009/11/ssas-assembly-excel-mdx.html' title='[SSAS] Assembly ExcelMDX sur le serveur SSAS?'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kbsOT_Eyf_M/Sw011lU5NpI/AAAAAAAAAVQ/C9DJezxGG_o/s72-c/excel_box.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-1102343572415787636</id><published>2009-11-23T16:31:00.008+01:00</published><updated>2009-11-23T17:35:48.507+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reporting Services'/><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services'/><category scheme='http://www.blogger.com/atom/ns#' term='Data Mining'/><title type='text'>[SSAS] L'opérateur UNION manquant en DMX</title><content type='html'>Il vous est peut être arrivé de vouloir intégrer un Forecast généré avec Analysis Services Data Mining dans une application. C'est très joli à présenter, et ça l'est encore plus au sein d'un &lt;strong&gt;rapport Reporting Services.&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 292px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5407332430750419570" border="0" alt="" src="http://3.bp.blogspot.com/_kbsOT_Eyf_M/Swq0Mk1UCnI/AAAAAAAAAU4/9jgns-yoXG0/s400/mts.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Malheureusement, l'instruction PredictTimeSeries() qui gouverne la sortie d'un modèle de type TimeSeries ne permet que d'effectuer des sorties de données passées OU futures mais &lt;strong&gt;pas les deux mixées... &lt;/strong&gt;Or l'ami Reporting Services ne supporte qu'un DataSet par DataRegion donc impossible de réaliser nativement une belle courbe avec le réel suivi du forecast...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Jamie Mc Lennan&lt;/strong&gt; l'architecte du produit, propose sur son &lt;a href="http://blogs.msdn.com/jamiemac/archive/2008/08/26/time-series-reporting-stored-procedure-part-1-of-3.aspx"&gt;blog de réaliser une SP managée pour rempalcer PredictTimeSeries&lt;/a&gt;. Solution efficace et que j'ai déjà testé, mais qui masque à mon avis un problème de DMX, &lt;strong&gt;le manque d'opérateur UNION&lt;/strong&gt; en n'adressant qu'une seule problématique induite.&lt;br /&gt;&lt;br /&gt;En codant un petit bout de C# on arrive pourtant facilement à obtenir un pseudo opérateur union parfaitement fonctionnel, d'abord en écrivant une méthode d'exécution de code DMX renvoyée sous forme de DataTable:&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style="BORDER-BOTTOM: #cccccc 1px dashed; TEXT-ALIGN: left; BORDER-LEFT: #cccccc 1px dashed; PADDING-BOTTOM: 0px; LINE-HEIGHT: 20px; PADDING-LEFT: 0px; WIDTH: 99%; PADDING-RIGHT: 0px; FONT-FAMILY: arial; BACKGROUND: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) #f0f0f0; HEIGHT: auto; COLOR: #000000; FONT-SIZE: 12px; OVERFLOW: auto; BORDER-TOP: #cccccc 1px dashed; BORDER-RIGHT: #cccccc 1px dashed; PADDING-TOP: 0px"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;private DataTable ExecuteQuery(string query)&lt;br /&gt;{&lt;br /&gt;    using (AdomdCommand cmd = new AdomdCommand(query))&lt;br /&gt;    {&lt;br /&gt;        AdomdDataReader dr = cmd.ExecuteReader();&lt;br /&gt;        DataTable destinationDt = new DataTable();&lt;br /&gt;        DataTable schemaDt = dr.GetSchemaTable();&lt;br /&gt;        foreach (DataRow schemaDr in schemaDt.Rows)&lt;br /&gt;        {&lt;br /&gt;            destinationDt.Columns.Add((string)schemaDr["ColumnName"], (Type)schemaDr["DataType"]);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        DataRow currentDr = null;&lt;br /&gt;        while (dr.Read())&lt;br /&gt;        {&lt;br /&gt;            currentDr = destinationDt.NewRow();&lt;br /&gt;            for (int i = 0; i &amp;lt; dr.FieldCount; i++)&lt;br /&gt;            {&lt;br /&gt;                currentDr[i] = dr[i];&lt;br /&gt;            }&lt;br /&gt;            destinationDt.Rows.Add(currentDr);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return destinationDt;&lt;br /&gt;} &lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Qu'il suffit ensuite d'utiliser avec cette méthode:&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;pre style="BORDER-BOTTOM: #cccccc 1px dashed; TEXT-ALIGN: left; BORDER-LEFT: #cccccc 1px dashed; PADDING-BOTTOM: 0px; LINE-HEIGHT: 20px; PADDING-LEFT: 0px; WIDTH: 99%; PADDING-RIGHT: 0px; FONT-FAMILY: arial; BACKGROUND: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) #f0f0f0; HEIGHT: auto; COLOR: #000000; FONT-SIZE: 12px; OVERFLOW: auto; BORDER-TOP: #cccccc 1px dashed; BORDER-RIGHT: #cccccc 1px dashed; PADDING-TOP: 0px"&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;private DataTable ForgeUnionDMX(params object[] dmxQueries)&lt;br /&gt;{&lt;br /&gt;    DataTable t1 = this.ExecuteQuery(dmxQueries[0].ToString());&lt;br /&gt;    for (int i = 1; i &amp;lt; dmxQueries.Length; i++)&lt;br /&gt;    {&lt;br /&gt;        t1.Merge(this.ExecuteQuery(dmxQueries[i].ToString()));&lt;br /&gt;    }&lt;br /&gt;    return t1;&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Malheureusement, et c'est le seul point que je n'ai pas réussi à résoudre, il semble qu'Analysis Services soit &lt;strong&gt;incapable de reconnaitre les procédures stockées acceptant un paramètre de type params&lt;/strong&gt; (ParamArray en VB).&lt;br /&gt;Ce n'est donc pas cette méthode qu'il faut exposer mais plutôt autant d'alias qu'on souhaite accepter de paramètres...&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-BOTTOM: #cccccc 1px dashed; TEXT-ALIGN: left; BORDER-LEFT: #cccccc 1px dashed; PADDING-BOTTOM: 0px; LINE-HEIGHT: 20px; PADDING-LEFT: 0px; WIDTH: 99%; PADDING-RIGHT: 0px; FONT-FAMILY: arial; BACKGROUND: url(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif) #f0f0f0; HEIGHT: auto; COLOR: #000000; FONT-SIZE: 12px; OVERFLOW: auto; BORDER-TOP: #cccccc 1px dashed; BORDER-RIGHT: #cccccc 1px dashed; PADDING-TOP: 0px"&gt;&lt;code style="WORD-WRAP: normal; COLOR: #000000"&gt;public DataTable UnionDMX(string dmxQuery1, string dmxQuery2)&lt;br /&gt;{&lt;br /&gt;  return this.ForgeUnionDMX(dmxQuery1, dmxQuery2);&lt;br /&gt;}&lt;br /&gt;public DataTable UnionDMX(string dmxQuery1, string dmxQuery2, string dmxQuery3)&lt;br /&gt;{&lt;br /&gt;  return this.ForgeUnionDMX(dmxQuery1, dmxQuery2, dmxQuery3);&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;Sale et dommage, mais inéluctable semble-t-il: &lt;strong&gt;Greg Galloway et Darren Gosbell ont fait de même &lt;/strong&gt;à de nombreux endroits dans le projet ASSP.&lt;br /&gt;&lt;br /&gt;Voilà à vous de coller ça dans un projet C# et de l'essayer: vous allez voir c'est très joli et cela constitue un argument assez immédiat en faveur de ce type d'applications&lt;br /&gt;&lt;br /&gt;A bientôt.&lt;br /&gt;&lt;br /&gt;&lt;code style="WORD-WRAP: normal" color="#000000"&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-1102343572415787636?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/1102343572415787636/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=1102343572415787636' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/1102343572415787636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/1102343572415787636'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2009/11/ssas-loperateur-union-manquant-en-dmx.html' title='[SSAS] L&apos;opérateur UNION manquant en DMX'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kbsOT_Eyf_M/Swq0Mk1UCnI/AAAAAAAAAU4/9jgns-yoXG0/s72-c/mts.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-1590835227143377245</id><published>2009-11-10T11:19:00.004+01:00</published><updated>2009-11-10T11:25:26.980+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Annonces/Releases'/><title type='text'>[SQL] R2 CTP3 Go Go Go!</title><content type='html'>SQL Server 2008 R2 November CTP est disponible! &lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/R2.aspx"&gt;Go!&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/R2.aspx"&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 349px; height: 175px;" src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/Svk_Q6b52FI/AAAAAAAAAUQ/Y0sirV5iBYE/s400/Untitled.png" alt="" id="BLOGGER_PHOTO_ID_5402418787804371026" border="0" /&gt;&lt;/a&gt;Cette version est &lt;span style="font-style: italic;"&gt;feature complete. &lt;/span&gt;Pour un résumé des nouveautés, allez sur l'excellent &lt;a href="http://prologika.com/CS/blogs/blog/archive/2009/11/09/sql-server-2008-r2-november-ctp-ctp3.aspx"&gt;post de Teo Lachev&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Bon test!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-1590835227143377245?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/1590835227143377245/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=1590835227143377245' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/1590835227143377245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/1590835227143377245'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2009/11/r2-ctp3-go-go-go.html' title='[SQL] R2 CTP3 Go Go Go!'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kbsOT_Eyf_M/Svk_Q6b52FI/AAAAAAAAAUQ/Y0sirV5iBYE/s72-c/Untitled.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-7469159214824466678</id><published>2009-11-10T10:46:00.006+01:00</published><updated>2010-02-24T11:58:03.753+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='StreamInsight'/><title type='text'>[SQL] On ne parle que de Gemini, on oublie StreamInsight!</title><content type='html'>C'est vrai, depuis quelques mois on ne parle que de Gemini ou plutôt &lt;a href="http://www.powerpivot.com/"&gt;PowerPivot&lt;/a&gt; la fonctionnalité de D-OLAP à la sauce Microsoft introduite dans Excel 2010 sur 2008 R2. Mais c'est oublier une autre nouveauté à mon sens presque plus critique: &lt;span style="FONT-WEIGHT: bold"&gt;StreamInsight&lt;/span&gt;, le moteur de CEP (Complex Event Processing).&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;CEP kézako?&lt;span style="FONT-WEIGHT: bold"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Le CEP en fait est facilement compréhensible par son nom: il s'agit de gestion d'&lt;span style="FONT-WEIGHT: bold"&gt;évènement complexes&lt;/span&gt;. Qu'est ce qu'un évènement complexe? Typiquement une &lt;span style="FONT-WEIGHT: bold"&gt;composition d'évènements simples&lt;/span&gt; détectables dans des bases de données, sur des senseurs...&lt;br /&gt;&lt;br /&gt;Un senseur qui passe dans le rouge est facile à détecter, la réaction est facile à coder. La programmation à base d'évènements simples est la base du développement moderne. En revanche définir, détecter et traiter des compositions d'évènements est bien plus complexe car généralement orienté business.&lt;br /&gt;&lt;br /&gt;Ce sont des &lt;span style="FONT-WEIGHT: bold"&gt;règles métier&lt;/span&gt; qui lui donnent une cohérence, une existence. Lorsque l'évenement est détecté, il déclenche un &lt;span style="FONT-WEIGHT: bold"&gt;processus de notification&lt;/span&gt;, d'action.&lt;br /&gt;Ces &lt;span style="FONT-WEIGHT: bold"&gt;règles métier&lt;/span&gt; sont appelées &lt;span style="FONT-WEIGHT: bold"&gt;Query Logic &lt;/span&gt;sous StreamInsight et &lt;span style="FONT-WEIGHT: bold"&gt;définies en LINQ.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Un moteur de CEP comme StreamInsight fournit donc des interfaces d'E/S et les librairies .NET nécessaires pour écrire d'une part les &lt;span style="FONT-WEIGHT: bold"&gt;Streams &lt;/span&gt;d'entrée et de sortie et d'autre part la &lt;span style="FONT-WEIGHT: bold"&gt;Query Logic&lt;/span&gt; de ces évènements complexes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kbsOT_Eyf_M/Svk329JdC0I/AAAAAAAAAUI/SybHI9oWVuk/s1600-h/Untitled.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5402410645274299202" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: pointer; HEIGHT: 286px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_kbsOT_Eyf_M/Svk329JdC0I/AAAAAAAAAUI/SybHI9oWVuk/s400/Untitled.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Des exemples?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Oui, autant que vous le souhaitez! LINQ de part son requêtage aussi puissant que SQL permet de définir des aggrégations et donc des &lt;span style="FONT-WEIGHT: bold"&gt;KPI&lt;/span&gt;: il est possible de&lt;span style="FONT-WEIGHT: bold"&gt; réagir en temps réel&lt;/span&gt;, sans passer par une phase de retraitement des données, &lt;span style="FONT-WEIGHT: bold"&gt;au changement d'un KPI comme celui-ci&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;var &lt;/span&gt;MoyenneCA = &lt;span style="FONT-WEIGHT: bold"&gt;from &lt;/span&gt;Groupe &lt;span style="FONT-WEIGHT: bold"&gt;in &lt;/span&gt;InputStream.&lt;span style="FONT-WEIGHT: bold"&gt;Snapshot&lt;/span&gt;()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;select new &lt;/span&gt;{ avg = Groupe.&lt;span style="FONT-WEIGHT: bold"&gt;Avg&lt;/span&gt;(Mesure =&gt; Mesure.CA))};&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Encore mieux: il est possible de combiner les sources des &lt;span style="FONT-WEIGHT: bold"&gt;Streams&lt;/span&gt; et d'&lt;span style="FONT-WEIGHT: bold"&gt;interroger un modèle de Data Mining&lt;/span&gt; pour vérifier la conformité en temps réel, et sans stocker de données!&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;br /&gt;Et on peut tester?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bien sûr! Pour le moment je n'ai testé que des choses très simples (Streams SQL qui envoient à un modèle de DM, Streams fichier qui sont traitées par des KPI simples...) mais &lt;span style="FONT-WEIGHT: bold"&gt;à vous &lt;/span&gt;de jouer pour des choses encore plus techniques!&lt;br /&gt;SQL Server 2008 R2 August CTP est disponible sur &lt;a href="http://technet.microsoft.com/en-us/evalcenter/ee315247.aspx"&gt;Technet&lt;/a&gt; et n'attend que vous!&lt;br /&gt;&lt;br /&gt;Bon test et à bientôt!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-7469159214824466678?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/7469159214824466678/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=7469159214824466678' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/7469159214824466678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/7469159214824466678'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2009/11/sql-on-ne-parle-que-de-gemini-on-oublie.html' title='[SQL] On ne parle que de Gemini, on oublie StreamInsight!'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kbsOT_Eyf_M/Svk329JdC0I/AAAAAAAAAUI/SybHI9oWVuk/s72-c/Untitled.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-134242482827648892</id><published>2009-11-08T17:55:00.002+01:00</published><updated>2009-11-09T11:33:49.483+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services'/><title type='text'>[SSAS] VisualTotals et Excel 2007</title><content type='html'>Je voulais  rappeler quelques informations au sujet de la gestion des VisualTotals sous Excel 2007. Pour rappel un VisualTotal  - ou "total visuel" qui dit bien ce que c'est - consiste simplement à afficher comme &lt;span style="font-weight: bold;"&gt;total d'un niveau aggrégé&lt;/span&gt; une valeur &lt;span style="font-weight: bold;"&gt;dépendante de la sélection.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En clair, dans une PivotTable, si je n'affiche que les produits A, B et C dans ma dimension Produit avec la mesure NbVentes, j'aurai au niveau supérieur la somme des ventes des produits A, B et C et non pas de tous les produits de même niveau que A, B et C. Ce qui peut être voulu ou pas &lt;span style="font-weight: bold;"&gt;selon le type de rapports.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cette fonctionnalité &lt;span style="font-weight: bold;"&gt;n'est pas&lt;/span&gt; désactivable en 2007, alors qu'elle l'était en 2003. C'est un effet de bord d'un changement de mode de requêtage qui intervient pour résoudre les &lt;span style="font-weight: bold;"&gt;problèmes de multisélection&lt;/span&gt; dans les filtres.&lt;br /&gt;&lt;br /&gt;En AS 2000, pour filtrer (slicer) sur un set (par exemple quelques pays) il n'est pas possible d'écrire cela:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;WHERE ({&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;[Pays].&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;[Pays]&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;.[Pays].&amp;amp;[UK],[Pays].[Pays].&amp;amp;[FR]})&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;La &lt;span style="font-weight: bold;"&gt;multiselection dans le slicer&lt;/span&gt; n'est pas supportée. C'est une fonctionnalité 2005 et supérieure. En 2003 (PivotTables v10), les filtres sont donc implémentés à la "manière 2000",  - c'est pareil dans ProClarity en fait -  les&lt;span style="font-weight: bold;"&gt; filtres sont générés dans des membres calculé&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;s&lt;/span&gt; et positionnés dans le slicer.&lt;br /&gt;&lt;pre class="MDX"&gt;&lt;span style="font-size:85%;"&gt;WITH MEMBER [Pays].[MonFiltre] AS&lt;br /&gt;Aggregate &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;Aggregate &lt;span style="font-family:courier new;"&gt;({&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;[Pays].&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;[Pays]&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;.[Pays].&amp;amp;[UK],[Pays].[Pays].&amp;amp;[FR]})&lt;/span&gt;&lt;br /&gt;...&lt;br /&gt;SELECT&lt;br /&gt;...&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;WHERE &lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;([Pays].[MonFiltre]&lt;/span&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt; (Ce qui implique de fameux problèmes avec le CurrentMember - le CurrentMember de ma hiérarchie Pays est où dans le cas précédent? C'est un set! - bien explicités par Mosha dans son fameux &lt;a href="http://www.mosha.com/msolap/articles/mdxmultiselectcalcs.htm"&gt;papier&lt;/a&gt;).&lt;br /&gt;Le fait d'autoriser cette multisélection dans le slicer n'a pas été exploité dans Excel 2007. Pour permettre des fonctionnalités de filtrage plus avancés en déléguant correctement les tâches de filtrage au moteur AS, &lt;span style="font-weight: bold;"&gt;Excel utilise les sous-requêtes&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;subselect&lt;/span&gt;) .La multisélection est donc gérée par un &lt;span style="font-weight: bold;"&gt;sous cube &lt;/span&gt;là aussi une nouvelle fonctionnalité introduite après 2000:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FROM&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   SELECT &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;({&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;[Pays].&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;[Pays]&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;.[Pays].&amp;amp;[UK],[Pays].[Pays].&amp;amp;[FR]}) ON 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   FROM [MonCube]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;L'effet de bord de gérer cette multisélection dans un sous-cube est donc de ne générer que des totaux visuels (&lt;span style="font-style: italic;"&gt;VisualTotals&lt;/span&gt;): on ne ramène jamais les totaux du cube.&lt;br /&gt;&lt;br /&gt;Pour faire cela, si vous en avez un besoin impérieux il existe une seule solution: &lt;span style="font-weight: bold;"&gt;créer des PivotTables en version précédente&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Cela peut se faire de trois manières:&lt;br /&gt;- En VBA en créant une Macro qui créera la PivotTable en version 10&lt;br /&gt;- En VSTO sur le même modèle (recréer un bouton "créer PivotTable" pour forcer l'utilisation de la version précédente, je l'ai fait, c'est assez élégant).&lt;br /&gt;- En utilisant le mode de compatibilité d'Excel, qui va créer la PivotTable en version précédente&lt;br /&gt;: &lt;span style="font-weight: bold;"&gt;attention cependant&lt;/span&gt; si vous enregistrez la feuille en compatibilité vers le mode standard, les PivotTables seront marquées pour mise à jour, et mises en version 12 au prochain Refresh, c'est à vous de l'interdire en... VBA en utilisant la propriété &lt;strong&gt;&lt;em&gt;UpgradeOnRefresh&lt;/em&gt;&lt;/strong&gt;  des PivotTables.&lt;br /&gt;(Merci au blog des développeurs d'Excel pour cette &lt;a href="http://blogs.msdn.com/excel/archive/2008/02/05/common-questions-around-excel-2007-OLAP-PivotTables.aspx"&gt;précision &lt;/a&gt;qui m'a évité de devenir fou :)&lt;br /&gt;&lt;br /&gt;En espérant que ce post ait pu être utile à quelques uns.&lt;br /&gt;A bientôt!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-134242482827648892?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/134242482827648892/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=134242482827648892' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/134242482827648892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/134242482827648892'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2009/11/ssas-visualtotals-et-excel-2007.html' title='[SSAS] VisualTotals et Excel 2007'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-3666725641481068861</id><published>2009-10-27T10:23:00.006+01:00</published><updated>2009-11-25T15:22:55.528+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MDX'/><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services'/><title type='text'>[SSAS] 2008 et les précédences de calcul</title><content type='html'>Il semble vraiment que la tendance amorcée depuis 2005 avec une simplification des règles d'évaluation des calculs MDX se perpétue en 2008.&lt;br /&gt;Tout cela remettant en cause pas mal de modes de développement choisis - à bon ou mauvais escient - sur les versions précédentes. La migration 2005/2008 peut donc poser des problèmes à certains dans des cas assez particuliers, sur lesquels je voulais attirer votre attention et dont je possède un exemple assez frais.&lt;br /&gt;&lt;br /&gt;Si vous parcourez BOL (&lt;a title="http://msdn.microsoft.com/fr-fr/library/ms143742.aspx" href="http://msdn.microsoft.com/fr-fr/library/ms143742.aspx"&gt;http://msdn.microsoft.com/fr-fr/library/ms143742.aspx&lt;/a&gt;) vous tomberez sur ceci:&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold; FONT-STYLE: italicfont-size:85%;" &gt;Si un cube contient une dimension avec des formules de niveau personnalisées ainsi que des dimensions avant et après avec des formules de membre personnalisées et/ou des opérateurs unaires, il se peut qu'il retourne des résultats différents de ceux des versions précédentes de Analysis Services. Cette situation se produit car le calcul des règles de précédence a changé.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Intéressant. En se plongeant dans les articles de BOL sur le SOLVE_ORDER et dans l'excellent AS Unleashed, on constate en effet un gros effort de documentation de ces règles de précédence et de calcul, qui contraste avec le peu de différences entre les versions de documentation sur les autres aspects du moteur.&lt;br /&gt;&lt;br /&gt;Pour résumer il semble que l&lt;span style="FONT-WEIGHT: bold"&gt;es bidouillages à base de CALCULATION_PASS et de SOLVE_ORDER voient leurs instants comptés&lt;/span&gt; dans le script MDX du cube, au bénéfice de l'ordonnancement de celui-ci. Cela se confirme par la dépréciation des CELL CALCULATION au profit des assignments qui eux ne disposent pas de propriétés d'ordre modifiables.&lt;br /&gt;Certes il n'est pas vrai que l'ordre du script soit toujours l'ordre d'évaluation - le MDX n'est pas du C#, cf l'utilité de FREEZE - mais il bénéficie au moins d'une prédictivité plus évidente.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Dans le cas de combinaisons avec des HighestPass &lt;/span&gt;(Unary, Custom Rollup)&lt;span style="FONT-WEIGHT: bold"&gt; l'ordre de résolution des calculs est maintenant plus clair&lt;/span&gt;: entre une CR et un ensemble de calculs donné du script on comprend désormais quelles sont les règles de précédence, même si elles sont parfois troublantes. Il reste possible de jouer avec le SOLVE_ORDER dans la CustomRollupPropertyColumn mais là encore l'ordre n'est pas garanti (en effet le SOLVE ORDER n'est pas le seul critère d'évaluation, cf &lt;a href="http://msdn.microsoft.com/en-us/library/ms145539.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms145539.aspx&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Ces changements peuvent parfois poser des problèmes: le fonctionnement peu clair de 2005 obligeait à des développement empiriques - comme celui sur lequel je travaille en ce moment.&lt;br /&gt;L'ordre de calcul entre deux expressions MDX et une C.R.Formula était pour le moins étrange: en 2005 la rollup s'évaluait au beau milieu des calculs de script sans que l'on en comprenne la raison.&lt;br /&gt;Une fois migrée en 2008, la rollup s'évalue dans mon cas avant conformément aux règles énoncées et cela peut poser des problèmes si on considérait la précédence 2005 comme acquise.&lt;br /&gt;&lt;br /&gt;La réponse de Microsoft à ce sujet est de&lt;span style="FONT-WEIGHT: bold"&gt; tenter de ne jamais mélanger assignments, membres calculés et CustomRollup sur un même calcul&lt;/span&gt; car même mieux documentées ces règles peuvent avoir un comportement défiant la logique initiale.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-3666725641481068861?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/3666725641481068861/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=3666725641481068861' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3666725641481068861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/3666725641481068861'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2009/10/ssas-2008-et-les-precedences-de-calcul.html' title='[SSAS] 2008 et les précédences de calcul'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-6077931195486648747</id><published>2009-10-12T18:15:00.010+02:00</published><updated>2009-11-25T15:23:13.325+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>[SQL] "Performance counter registry hive consistency check" failed.</title><content type='html'>Vous aurez peut être cette erreur un jour en installant SQL Server 2008 via le gentil SCC (System Configuration Checker). Je l'ai déjà eue plusieurs fois, et une dernière ce matin qui m'a donné envie de rappeller les causes.&lt;br /&gt;&lt;br /&gt;Basiquement cette erreur est liée à Perfmon et à la disponibilité des compteurs de performances. La recommandation faite par MS est une réparation fastifieuse de la base de compteurs, alors que le problème vient souvent d'un des deux points suivants.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1) Clé de registres incohérentes&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Possiblement généré par pas mal d'installations (ou un développeur aimant s'amuser dans le registre). Dans le registre sont en effet listés l'intégralité des compteurs de perfmon, précisément dans cette clé: &lt;strong&gt;HKEY_LOCAL_MACHINE\ SOFTWARE\ Microsoft\ Windows NT\ CurrentVersion\ Perflib\&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Et encore plus précisément dans deux valeurs qui sont Counter et Help.&lt;br /&gt;Si vous regardez ces deux valeurs (du texte très long) les compteurs sont numérotés et ordonnés. &lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;img id="BLOGGER_PHOTO_ID_5391753069474309122" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 222px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_kbsOT_Eyf_M/StNa2ZajZAI/AAAAAAAAAUA/okMTOJjAKKI/s400/Sans+titregfsdgsf.PNG" border="0" /&gt; &lt;div&gt;&lt;br /&gt;Normalement la dernière valeur d'id de compteur de Counter et Help sont respectivement reportées dans les valeurs LastCounter et LastHelp de la clé: &lt;strong&gt;HKEY_LOCAL_MACHINE\ SOFTWARE\ Microsoft\ Windows NT\ CurrentVersion\ Perflib\ 009\&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Si cela n'est pas le cas, à vous de corriger ces dernières! Si ette erreur ne se présente pas, passez au point suivant.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;2) Nom de clé non adapté à la locale&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;La clé précédente se termine par 009. Cela correspond à une installation &lt;strong&gt;anglaise (en-us)&lt;/strong&gt; de Windows. Et si ce n'est pas votre cas? Sur une &lt;strong&gt;installation française par exemple, ce dossier se nomme 00C&lt;/strong&gt;. A quoi cela correspond? Tout simplement à la conversion en héxa de la Culture sur 3 caractères. Il faut impérativement que ces deux valeurs correspondent.&lt;br /&gt;Avec ce petit bout de code C# vous pouvez le récupérer facilement.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;strong&gt;string&lt;/strong&gt; culture = &lt;strong&gt;string&lt;/strong&gt;.&lt;strong&gt;Format&lt;/strong&gt;("{0,3}", &lt;strong&gt;CultureInfo&lt;/strong&gt;.&lt;strong&gt;InstalledUICulture&lt;/strong&gt;.&lt;strong&gt;Parent&lt;/strong&gt;.&lt;strong&gt;LCID&lt;/strong&gt;.&lt;strong&gt;ToString&lt;/strong&gt;("X")).&lt;strong&gt;Replace&lt;/strong&gt;(" ", "0");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;Il ne vous reste plus qu'à réaliser un backup de la clé 009 et de la restaurer sous un nom approprié!&lt;br /&gt;En espérant vous avoir aidés.&lt;br /&gt;&lt;br /&gt;A bientôt!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-6077931195486648747?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/6077931195486648747/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=6077931195486648747' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/6077931195486648747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/6077931195486648747'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2009/10/sql-performance-counter-registry-hive.html' title='[SQL] &quot;Performance counter registry hive consistency check&quot; failed.'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kbsOT_Eyf_M/StNa2ZajZAI/AAAAAAAAAUA/okMTOJjAKKI/s72-c/Sans+titregfsdgsf.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-311596794633609067</id><published>2009-10-10T17:52:00.002+02:00</published><updated>2009-10-10T17:55:32.933+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Autres'/><title type='text'>Nouvelle(s) expérience(s)</title><content type='html'>Voilà, de retour de vacances, ce qui explique l'inactivité bloggesque de ces dernières semaines que je vais m'employer à réparer. De plus, je démarre dans une nouvelle structure dont je ne manquerai pas de parler dans les prochains mois, je vous tiendrai au courant. Une page se tourne et une expérience plus que sympathique se profile...&lt;br /&gt;&lt;br /&gt;Merci pour vos mails et le temps que vous passez à lire ma prose!&lt;br /&gt;&lt;br /&gt;A très vite.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-311596794633609067?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/311596794633609067/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=311596794633609067' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/311596794633609067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/311596794633609067'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2009/10/nouvelles-experiences.html' title='Nouvelle(s) expérience(s)'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-698046047515863498</id><published>2009-09-10T09:45:00.004+02:00</published><updated>2009-09-10T10:12:38.981+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services'/><category scheme='http://www.blogger.com/atom/ns#' term='Bibliothèque'/><title type='text'>[Biblio] "Expert Cube Development with AS", un must!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kbsOT_Eyf_M/Sqiy721P3hI/AAAAAAAAATI/JdLnqgWy8G0/s1600-h/1847197221.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 225px; height: 277px;" src="http://1.bp.blogspot.com/_kbsOT_Eyf_M/Sqiy721P3hI/AAAAAAAAATI/JdLnqgWy8G0/s400/1847197221.jpg" alt="" id="BLOGGER_PHOTO_ID_5379746496294936082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Quand on vous annonce que Chris Webb écrit un bouquin avancé sur AS associé à Alberto Ferrari et Marco Russo (les créateurs de SqlBI) il y a de quoi s'attendre à quelque chose d'intéressant.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Le résultat est tout bonnement... bluffant. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Il existe des dizaines de&lt;span style="font-weight: bold;"&gt; bouquins techniques&lt;/span&gt; sur AS, quelques uns sont bien, certains très bien (j'en ai déjà parlé). Le problème c'est qu'ils font un bon millier de pages et perdent souvent du temps sur des notions déjà connues. Ils abordent des sujets intéressants, voire passionnants mais qui ne servent pas à grand chose en mission. Ils sont un peu "geek" en somme.&lt;br /&gt;&lt;br /&gt;Il existe aussi pas mal de&lt;span style="font-weight: bold;"&gt; bouquins sur la gestion de projets&lt;/span&gt; BI, mais ils ont le défaut d'être souvent un peu dogmatiques et relativement déconnectés de la technique.  Ils sont un peu trop "chef de projet".&lt;br /&gt;&lt;br /&gt;En DataWarehousing il y a Kimball et Inmon, et leurs &lt;span style="font-weight: bold;"&gt;très gros pavés de design&lt;/span&gt; absolument essentiels, mais dans lesquels chacun doit faire son marché. Là aussi, peu d'interaction avec la technique pure, parfois un côté un peu "biblique". Ils sont un peu trop "prof".&lt;br /&gt;&lt;br /&gt;Chris Webb et Ferrari/Russo ont réussi  &lt;span style="font-weight: bold;"&gt;l'exploit d'écrire un bouquin de "consultants". &lt;/span&gt;Un livre calqué sur le développement d'un projet, du design du DW au tuning des bases OLAP. Pour chaque chapitre, les trois "vues" ci dessus sont abordées: la technique, la gestion du projet et la théorie mais uniquement dans le but de satisfaire &lt;span style="font-weight: bold;"&gt;un objectif unique, réussir son projet&lt;/span&gt;&lt;span&gt;, c'est à dire&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;span&gt;être en mesure &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;d'utiliser l'outil au meilleur&lt;/span&gt;&lt;span&gt; de ses possibilités, &lt;/span&gt;&lt;span&gt;dans &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;un temps minimal, &lt;/span&gt;&lt;span&gt;pour apporter &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;les réponses demandées.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On pouvait craindre un énième livre sur AS comme il en trône sur la bibliothèque de tous les consultants: il n'en est rien! Ce livre a été pensé et écrit pour être utile au jour le jour au public qu'il cible, le consultant BI MS, et à mon sens c'est une réussite. Il fait seulement 400 pages, coute 35€, il se lit en quelques trajets de métro et vous apprendrez énormément avec.&lt;br /&gt;Gardez le avec vous - tiens il est juste à côté de moi là! - il sera amené à vous servir énormément.&lt;br /&gt;&lt;br /&gt;Le seul inconvénient de ce livre finalement, c'est qu'il est d'un tel niveau qu'il vous enlève toute velléité d'écrire un bouquin sur le sujet un jour... On comprend ce que doit ressentir Dany Brillant devant une vidéo de Frank Sinatra.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-698046047515863498?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/698046047515863498/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=698046047515863498' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/698046047515863498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/698046047515863498'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2009/09/biblio-expert-cube-development-with-as.html' title='[Biblio] &quot;Expert Cube Development with AS&quot;, un must!'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kbsOT_Eyf_M/Sqiy721P3hI/AAAAAAAAATI/JdLnqgWy8G0/s72-c/1847197221.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-7814726387128973242</id><published>2009-08-21T12:09:00.005+02:00</published><updated>2009-08-21T16:15:06.425+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Integration Services'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>[SQL] Pourquoi le Change Data Capture va changer notre vie</title><content type='html'>Rien que ça... Mais je parierais que ça n'est pas immérité. Avec les latences dans les adoptions de nouvelles technos ma "prédiction" ne s'avèrera peut être vraie que dans 2 ou 3 ans (oui on bosse encore beaucoup et majoritairement en 2005!).&lt;br /&gt;Mais bon, reprenons depuis le début...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;"C'est quoi le CDC ou Change Data Capture?&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;C'est un mécanisme de &lt;span style="font-weight: bold;"&gt;tracking de modification&lt;/span&gt; de contenu de tables. Basiquement le CDC crée des tables de suivi des modifications DML (INSERT, UPDATE, DELETE) effectués dans une table de données. Ces tables sont nourries par des jobs qui scannent le log de la base, comme visible sur cette belle slide de formation ci-dessous.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kbsOT_Eyf_M/So5z-e_lz5I/AAAAAAAAASY/FuYyrRx1xx0/s1600-h/Untitled.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 234px;" src="http://3.bp.blogspot.com/_kbsOT_Eyf_M/So5z-e_lz5I/AAAAAAAAASY/FuYyrRx1xx0/s400/Untitled.png" alt="" id="BLOGGER_PHOTO_ID_5372358922808446866" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;"Change Data Capture" n'est pas le nom d'un produit. C'est une &lt;span style="font-weight: bold;"&gt;désignation &lt;/span&gt;de ce genre de feature. Ce processus existe par exemple chez Oracle (depuis 9i si mes souvenirs Oracliens sont bons, mais n'hésitez pas à me démentir), sous Infosphere, Sybase.... et généralement suivant le même principe (Un RDBMS maintient un Tran Log, pourquoi ne pas s'en servir après tout?)&lt;br /&gt;Il a été introduit en environnement Microsoft sous SQL Server 2008.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;"Mais ça va servir à quoi en Data Warehousing? On a déjà SSIS!"&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Le CDC n'a pas pour but de remplacer SSIS&lt;/span&gt; mais de faciliter les alimentations de Data Warehouses, en ce qui concerne les changements dans les sources. Soyons clair: &lt;span style="font-weight: bold;"&gt;SSIS est un fantastique outil&lt;/span&gt; qui permet de gérer des workflows complexes, d'implémenter des alimentations massivement multi-sources, des règles métier tordues et des SCD bizarroïdes, mais on génère &lt;span style="font-weight: bold;"&gt;un énorme overhead&lt;/span&gt; dans la gestion de la &lt;span style="font-weight: bold;"&gt;recherche des modifications sur les sources.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Par exemple on ne peut pas toujours compter sur une datation des lignes modifiées en production. On passe très - trop - souvent par une &lt;span style="font-weight: bold;"&gt;remontée intégrale sur le serveur ETL  &lt;/span&gt;des référentiels, et des comparaisons avec le DW pour tracker les modifications.&lt;br /&gt;&lt;br /&gt;Dans des cas plus sympathiques les modifications dans cette base de production sont trackées dans un champ de type DateTime qui stocke le dernier Update par exemple, et il suffit de récupérer les lignes déjà modifiées.&lt;br /&gt;Soit ça marche déjà mieux. Mais c'est limité!&lt;br /&gt;&lt;br /&gt;Et si vous voulez récupérer des modifications intermédiaires? Vous implémentez une gestion par trigger lentissime, à vidanger soit même...&lt;br /&gt;Le CDC résout &lt;span style="font-weight: bold;"&gt;ces problèmes&lt;/span&gt; sans vous demander une &lt;span style="font-weight: bold;"&gt;once d'implémentation&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;"Oui... enfin techniquement on doit bien faire quelque chose non?"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Je vous l'accorde. Il faut quand même faire quelques petites choses .&lt;br /&gt;1) Activer CDC sur la base concernée&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:Courier New;font-size:85%;"  &gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;EXEC&lt;/span&gt; &lt;span style="color: rgb(102, 0, 0);"&gt;&lt;strong&gt;sp_cdc_enable_db&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Courier New;font-size:85%;"  &gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;GO&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;2) Activer CDC pour une table à suivre&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;EXEC &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 0);"&gt;sys.sp_cdc_enable_table&lt;/span&gt;&lt;br /&gt;@source_schema = &lt;span style="color: rgb(255, 0, 0);"&gt;'MonSchéma'&lt;/span&gt;&lt;br /&gt;, @source_name = &lt;span style="color: rgb(255, 0, 0);"&gt;'MaTableASuivre'&lt;/span&gt;&lt;br /&gt;, @role_name = &lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;NULL &lt;/span&gt;&lt;span style="color: rgb(51, 204, 0); font-style: italic;"&gt;/*Rôle pour restreindre l'accès aux tables de tracking, Null si pas de restriction*/&lt;/span&gt;&lt;br /&gt;, @capture_instance = &lt;span style="color: rgb(255, 0, 0);"&gt;'NomDeCaptureInstanceDeMaTableASuivre'&lt;/span&gt;&lt;br /&gt;, @supports_net_changes = 1 &lt;span style="color: rgb(51, 204, 0); font-style: italic;"&gt;/*Suivi des modifications intermédiaires, 1 pour oui*/&lt;/span&gt;&lt;br /&gt;, @captured_column_list = &lt;span style="color: rgb(255, 0, 0);"&gt;'MaColonne1, MaColonne2'&lt;/span&gt;&lt;br /&gt;, @filegroup_name = &lt;span style="color: rgb(255, 0, 0);"&gt;'FileGroupPourStockerMaTableDeTracking&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Et c'est terminé. Le CDC est en route.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;"C'est stocké où? On récupère ça comment?"&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Vous avez vu ci-dessus: on spécifie un FileGroup. Tout simplement parce que c'est stocké dans une table par table tracée, et que cette table de tracking, nommée &lt;capture_instance&gt;_CT est stockée sur ce FileGroup dans un schéma dédié au cdc. &lt;span style="font-weight: bold;"&gt;Il est plus que conseillé de ne pas utiliser le FileGroup de données pour le CDC !&lt;/span&gt;&lt;br /&gt;Après on peut soit récupérer les infos directement... mais ça n'est pas la manière la plus aisée :)&lt;br /&gt;Soit utiliser deux fonctions de table:&lt;br /&gt;-&lt;span style="font-weight: bold;font-family:courier new;" &gt; fn_cdc_get_all_changes_&lt;/span&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;&lt;capture_instance&gt;&lt;/capture_instance&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;MaCaptureInstance&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt; qui récupère tous les changements (U,I,D) entre deux LSN&lt;br /&gt;- &lt;span style="font-weight: bold;font-family:courier new;" &gt;fn_cdc_get_net_change&lt;/span&gt;&lt;/capture_instance&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;s_&lt;/span&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;&lt;capture_instance&gt;&lt;/capture_instance&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;MaCaptureInstance&lt;/span&gt;&lt;capture_instance&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;qui récupère le dernier état de chaque tuple entre deux LSN&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;"LSN? Quel rapport avec le log?"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On l'a dit quelques lignes au dessus: le CDC marche sur le log donc les modifications sont tracées par LSN. Le LSN, ou &lt;span style="font-style: italic;"&gt;Log Sequence Number&lt;/span&gt; est la valeur unique associée à chaque enregistrement dans le log.&lt;br /&gt;Mais rassurez vous! On peut facilement faire correspondre une date à un LSN, en demandant à la fonction &lt;/capture_instance&gt; &lt;span style="font-weight: bold;"&gt;sys.fn_cdc_map_time_to_lsn&lt;/span&gt; de renvoyer le LSN le plus proche d'un DateTime.&lt;br /&gt;&lt;capture_instance&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;SELECT &lt;/span&gt;@lsn = &lt;span style="font-weight: bold; color: rgb(102, 0, 0);"&gt;sys.fn_cdc_map_time_to_lsn&lt;/span&gt; (&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);font-family:courier new;" &gt;'smallest greater than or equal'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;'2009-08-21 00:00:00.000'&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;"Ca m'inquiète ce lien avec le Log... alors on est obligés d'être en Full Recovery?"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Non. Mais c'est une bonne question. Cette forte intrication entre le Log et CDC implique quelques avertissements. Lorsque l'on est en Simple ou en Bulk, &lt;span style="font-weight: bold;"&gt;un mode de log plus verbeux est employé pour les opérations concernées par le CDC&lt;/span&gt;.&lt;br /&gt;De plus le CDC empêchent de vider le Log  tant que des informations concernées par la capture n'ont pas été lues. &lt;span style="font-weight: bold;"&gt;Ce qui désactive le SHRINK et donc l'AutoShrink &lt;/span&gt;et peut faire grossir des Logs en Simple.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;"Et les performances dans tout ça?"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Alors forcément il y a un impact. Le nier dénoterait un tempérament marchand de tapis que je récuse :)  Il faut absolument passer par le paramétrage de certains aspects du CDC&lt;/capture_instance&gt;&lt;br /&gt;&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Choisir les bons attributs&lt;/span&gt;: pas toutes les colonnes!&lt;br /&gt;- &lt;span style="font-weight: bold;"&gt;Tuner les jobs de capture:&lt;/span&gt; Jouer avec le paramètre &lt;span style="font-style: italic;"&gt;maxtrans&lt;/span&gt; pour déterminer le nombre de tran examinées par scan, ainsi  qu'avec le nombre de scans du log avant une pause avec &lt;span style="font-style: italic;"&gt;maxscans &lt;/span&gt;et la durée de ces pauses avec &lt;span style="font-style: italic;"&gt;pollinginterval.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;et beaucoup d'autres conseils et arguments exposés dans cet &lt;span style="font-weight: bold;"&gt;excellent &lt;/span&gt;document publié sur MSDN, le&lt;a href="http://msdn.microsoft.com/en-us/library/dd266396.aspx"&gt; guide du tuning du Change Data Capture&lt;/a&gt; du MTE allemand Steffen Krause.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Potentiellement, le CDC &lt;span style="font-weight: bold;"&gt;révolutionne le DataWarehousing&lt;/span&gt; en économisant du temps d'ETL (généralement 70-80% du projet BI). Ce temps gagné ne l'est pas en vain: toute économie sur des tâches techniques et redondantes permet de se consacrer plus profondément à la problématique métier, et c'est ce qui prime dans cette activité, plus encore qu'ailleurs, non?&lt;br /&gt;&lt;br /&gt;A bientôt!&lt;br /&gt;&lt;br /&gt;&lt;capture_instance&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/capture_instance&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8122605037444373064-7814726387128973242?l=fjehl.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://fjehl.blogspot.com/feeds/7814726387128973242/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8122605037444373064&amp;postID=7814726387128973242' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/7814726387128973242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8122605037444373064/posts/default/7814726387128973242'/><link rel='alternate' type='text/html' href='http://fjehl.blogspot.com/2009/08/ssis-pourquoi-le-change-data-capture-va.html' title='[SQL] Pourquoi le Change Data Capture va changer notre vie'/><author><name>François Jehl</name><uri>http://www.blogger.com/profile/03704130533967971852</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='30' height='32' src='http://4.bp.blogspot.com/-VHGz0P9prLU/TZXth8MBXWI/AAAAAAAAAow/9gVArdxnXyc/s220/Photo_491B4BAA-6F49-8B4F-0A19-295E1FC32691.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kbsOT_Eyf_M/So5z-e_lz5I/AAAAAAAAASY/FuYyrRx1xx0/s72-c/Untitled.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8122605037444373064.post-7609830896787590610</id><published>2009-08-15T16:12:00.013+02:00</published><updated>2010-05-17T13:04:51.252+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Integration Services'/><title type='text'>[SSIS] Déploiement  des Packages et Configurations en production</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kbsOT_Eyf_M/SobSEMMxm9I/AAAAAAAAASQ/NuRfj446ru0/s1600-h/martin_badge.png"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 225px; DISPLAY: block; HEIGHT: 225px; CURSOR: pointer" id="BLOGGER_PHOTO_ID_5370210575122013138" border="0" alt="" src="http://2.bp.blogspot.com/_kbsOT_Eyf_M/SobSEMMxm9I/AAAAAAAAASQ/NuRfj446ru0/s400/martin_badge.png" /&gt;&lt;/a&gt;&lt;br /&gt;Ah... vaste et grand sujet que les déploiements. Pour SSIS, c'est surtout le manque d'infos cohérentes qui trouble. Alors reprenons tout depuis le début.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;1) Rappels&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Alors SSIS principalement ce sont des &lt;span style="FONT-STYLE: italic"&gt;lots&lt;/span&gt; ou &lt;span style="FONT-STYLE: italic"&gt;packages &lt;/span&gt;c'est à dire des fichiers XML, exécutables via un utilitaire appellé DtExec.exe (vous pouvez chercher toutes les manières possibles, au final c'est bien DtExec qui est exécuté). On cherche donc à:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;déployer des fichiers .dtsx (xml) dans&lt;span style="FONT-WEIGHT: bold"&gt; une base de données ou un dossier&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;les éxécuter en production avec DtExec.exe (ou affilié) via un ordonnanceur&lt;/li&gt;&lt;/ul&gt;La subtilité supplémentaire, existant depuis 2005, ce sont les &lt;span style="FONT-WEIGHT: bold"&gt;configurations&lt;/span&gt;. Un ou plusieurs packages peuvent pointer sur une configuration, qui peut être de divers types (fichier, base, on y reviendra).&lt;br /&gt;Cette configuration comprend les valeurs devant être modifiées entre le dev et la prod. On peut par exemple stocker les chaines de connexion des serveur de dev dans un fichier, et de prod dans un autre. Concrètement:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;DTEXEC /FILE MonPackage.dtsx /CONFIGFILE Dev.dtsConfig&lt;/span&gt;&lt;br /&gt;exécutera le lot en tapant sur les bases SQL de dev.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;DTEXEC /FILE MonPackage.dtsx /CONFIGFILE Prod.dtsConfig&lt;/span&gt;&lt;br /&gt;exécutera le lot en tapant sur les bases SQL de prod.&lt;br /&gt;&lt;br /&gt;J'ai donc 3 étapes à suivre pour le déploiement.&lt;br /&gt;&lt;br /&gt;1) Déployer les packages&lt;br /&gt;2) Déployer leurs configurations&lt;br /&gt;3) Planifier leur exécution&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;2) Type de déploiement, en base ou en fichier?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Le package peut être stocké en base MSDB ou en fichier. En base MSDB il est stocké sous forme de varbinary dans la table sysssispackages (sysdtspackages90 en 2005). Les dossiers de packages sont eu gérés de manière logique et arborescente dans la table syssispackagefolders (sysdtspackagefolders90 en 2005). On les consulte ensuite via le service SSIS (oui c'est à cela qu'il sert principalement!).&lt;br /&gt;&lt;br /&gt;Alors que choisir? Personnellement je préfère MSDB, ça doit avoir un côté psychologique. J'aime bien l'idée que les choses soient dans une base de données et la gestion de sécurité et des backups m'apparait plus rassurante. En revanche je les mets volontiers en FileSystem si on me le demande et je comprends parfaitement les gens qui préfèrent "voir" les fichiers.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;3) Déploiement, manifeste ou DTUtil?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Le manifeste de déploiement est lui aussi un fichier XML. De type SSISDeploymentManifest (oui c'est long) il est en fait exécuté par DTSInstall.exe pour faire croire à l'utilisateur qu'il est en présence d'un beau MSI. &lt;span style="FONT-WEIGHT: bold"&gt;On le crée en activant CreateDeploymentUtility&lt;/span&gt; dans les propriétés du projet (cf image)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kbsOT_Eyf_M/SobElSOJ7OI/AAAAAAAAASI/3evT7cXg8hE/s1600-h/ssis_pkg6.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 266px; CURSOR: pointer" id="BLOGGER_PHOTO_ID_5370195750511308002" border="0" alt="" src="http://3.bp.blogspot.com/_kbsOT_Eyf_M/SobElSOJ7OI/AAAAAAAAASI/3evT7cXg8hE/s400/ssis_pkg6.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Comment marche cette joyeuseté? Et bien il importe les packages, au choix en base ou en fichier dans l'emplacement demandé. Puis il copie les éventuelles configurations dans le dossier demandé. &lt;span style="FONT-WEIGHT: bold"&gt;Ca a l'air idyllique comme ça mais en fait je déconseille.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pourquoi? Au hasard:&lt;br /&gt;- On ne peut pas déployer le package dans un dossier spécifique en MSDB&lt;br /&gt;- On ne peut pas déployer un lot particulier&lt;br /&gt;- ...&lt;br /&gt;&lt;br /&gt;En bref je le trouve limité pour notre utilisation de développeurs, et même pas donnable à un administrateur car trop complexe. Le genre d'outils à mon sens inutile si le projet à une volumétrie élevée et n'est pas le seul utiliser le serveur. Rajoutez à ça que si vous êtes à plusieurs c'est un enfer.&lt;br /&gt;&lt;br /&gt;Donc &lt;span style="FONT-WEIGHT: bold"&gt;je conseille DtUtil&lt;/span&gt;, très bien expliqué &lt;a href="http://msdn.microsoft.com/fr-fr/library/ms162820.aspx"&gt;ici sur MSDN&lt;/a&gt;. Pour le déploiement vous pouvez vous créer un petit batch un double clic dessus et vous gérez vos arborescences, vos encryptions spécifiques et... vos configurations.&lt;br /&gt;&lt;br /&gt;NB: &lt;a href="http://www.codeplex.com/bidshelper"&gt;BIDS Helper&lt;/a&gt; (merci Darren Gosbell et Greg Galloway) fournit la possibilité de déployer les packages depuis BIDS en cliquant droit lot par lot, ou sur tout le projet. Ils utilisent... DtUtil.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;3) L'enfer des configurations&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La dispute commence déjà par le type de configurations. Il en existe 4:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;XML configuration file&lt;/li&gt;&lt;li&gt;Environment variable&lt;/li&gt;&lt;li&gt;Registry entry&lt;/li&gt;&lt;li&gt;SQL Server&lt;/li&gt;&lt;/ul&gt;&lt;span style="FONT-STYLE: italic"&gt;NB: ParentPackageVariable existe aussi mais sert uniquement à récupérer une valeur depuis un package parent, on ne l'abordera pas. Il en reste donc 4 principales.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sachant qu'éditer une variable d'environnement ou une clé de registre pour trouver une chaine de connexion n'est pas des plus &lt;span style="FONT-STYLE: italic"&gt;userfriendly &lt;/span&gt;les deux principales sont donc SQL et XML.&lt;br /&gt;&lt;br /&gt;En XML on dispose d'un fichier, dtsConfig, qui contient autant de nodes (des configurations) que de valeurs à modifier dans le package. Une configuration pour une chaine de connexion apparait schématiquement comme cela:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;[Configuration ValueType="String" Path="\Package.Connections[MonConnectionManager].Properties[ConnectionString]"]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[ConfiguredValue]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Data Source=localhost;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[/ConfiguredValue]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[/Configuration]&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Pour modifier le fichier, un notepad suffit. C'est donc la configuration la plus employée.&lt;br /&gt;L'alternative en SQL est la création d'une table de configuration. Cette table aura cette structure:&lt;br /&gt;&lt;br /&gt;&lt;span id="ctl00_MTContentSelector1_mainContentContainer_ctl22"&gt;&lt;pre style="WHITE-SPACE: pre-wrap" id="ctl00_MTContentSelector1_mainContentContainer_ctl22T-SQL" class="libCScode" space="preserve"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;CREATE TABLE &lt;/span&gt;[dbo].[MaConfig]&lt;br /&gt;(&lt;br /&gt;ConfigurationFilter &lt;span style="FONT-WEIGHT: bold"&gt;NVARCHAR&lt;/span&gt;(255) &lt;span style="FONT-WEIGHT: bold"&gt;NOT NULL&lt;/span&gt;,&lt;br /&gt;ConfiguredValue      &lt;span style="FONT-WEIGHT: bold"&gt;NVARCHAR&lt;/span&gt;(255) &lt;span style="FONT-WEIGHT: bold"&gt;NULL&lt;/span&gt;,&lt;br /&gt;PackagePath          &lt;span style="FONT-WEIGHT: bold"&gt;NVARCHAR&lt;/span&gt;(255) &lt;span style="FONT-WEIGHT: bold"&gt;NOT NULL&lt;/span&gt;,&lt;br /&gt;ConfiguredValueType &lt;span style="FONT-WEIGHT: bold"&gt;NVARCHAR&lt;/span&gt;(20) &lt;span style="FONT-WEIGHT: bold"&gt;NOT NULL&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Georgia,serif;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;ConfigurationFilter est un "namespace" de configurations, pour pouvoir stocker plusieurs projets dans la même table par exemple. Les autres colonnes sont les valeurs du fichier XML.&lt;br /&gt;Alors que choisir? L'un et l'autres se valent. Cela dépend &lt;span style="FONT-WEIGHT: bold"&gt;du profil de la personne qui va éditer ponctuellement ces configurations.&lt;/span&gt;&lt;br /&gt;Un DBA préfèrera une base, un utilisateur classique préfèrera sûrement un bête fichier XML car il n'a pas de client SQL sur son poste. Bref cela varie.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Mais où est le problème alors?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Le problème est que &lt;span style="FONT-WEIGHT: bold"&gt;le package enregistre en Dtsx&lt;/span&gt; l'emplacement de sa configuration. Quand on va le déplacer, cette référence (chemin de fichier, chaîne de connexion) ne sera sûrement plus valide. Il faudrait éditer le lot au déploiement mais ça &lt;span style="FONT-WEIGHT: bold"&gt;DtUtil ne permet pas de le faire.&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;span style="FONT-WEIGHT: bold"&gt; Le seul capable de faire ça est le manifeste mais il n'est pas automatisable...&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Si on ne se sert pas du manifeste la première solution est d'avoir les mêmes noms de serveur, mêmes arborescences en dev et en prod. Comme nous ne vivons pas au paradis cela arrive plus que rarement.&lt;br /&gt;La seconde est d'avoir Visual Studio sur le serveur et d'éditer les lots à la main... nous n'aborderons pas cette solution.&lt;br /&gt;&lt;br /&gt;Il y a donc 3 paradigmes pour gérer le problème dans un cas réel.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic"&gt;a) Spécifier /CONFIGFILE à la ligne DtExec&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La solution la plus simple et la plus rencontrée. Si un package ne trouve pas une des configurations stockées (path invalide ou ce genre de choses), il ne va pas échouer et prendre ses valeurs par défaut, celles de conception. (Vous verrez juste une information dans le log "Attempting to configure from file ..." non suivi d'un "Success"). Ajoutez à cela que vous pouvez lui spécifier une configuration depuis la ligne de commande et &lt;span style="FONT-WEIGHT: bold"&gt;vous avez la solution la plus utilisée.&lt;/span&gt; Mais avouez que c'est dommage de ne jamais utiliser la possibilité de pointer directement sur la bonne configuration...&lt;br /&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(255,0,0)"&gt;[Edit du 20 Août 2009] Attention ceci dit! Si la configuration de développement est joignable (atteignable) cela ne change rien en 2005 mais &lt;/span&gt;&lt;span style="COLOR: rgb(255,0,0); FONT-WEIGHT: bold"&gt;en 2008 la configuration de développement est réappliquée et CONFIGFILE n'a pas d'effet.&lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR: rgb(255,0,0)"&gt;Merci à Romuald (Coutaud) pour cette précision de taille :)&lt;/span&gt;&lt;span style="COLOR: rgb(255,0,0); FONT-WEIGHT: bold"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="COLOR: rgb(255,0,0)"&gt;Le lien vers le blog de Douglas Laudenschlager qui explique très bien cette différence &lt;/span&gt;&lt;a style="COLOR: rgb(255,0,0)" href="http://dougbert.com/blogs/dougbert/archive/2009/04/07/understand-how-ssis-package-configurations-are-applied.aspx"&gt;ici&lt;/a&gt;&lt;span style="COLOR: rgb(255,0,0)"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic"&gt;b) Utiliser une Configurat
