﻿<?xml version="1.0" encoding="UTF-8"?>
<!--RSS généré par le Générateur RSS Microsoft SharePoint Foundation sur 19/05/2012 14:40:10 -->
<?xml-stylesheet type="text/xsl" href="/_layouts/RssXslt.aspx?List=80d8a6ec-f784-4878-944c-9531cfaaabbf" version="1.0"?>
<rss version="2.0">
  <channel>
    <title>Xavier VANNESTE : Billets</title>
    <link>http://blog.xvanneste.com/Lists/Billets/AllPosts.aspx</link>
    <description>Flux RSS pour la liste Billets.</description>
    <lastBuildDate>Sat, 19 May 2012 13:40:10 GMT</lastBuildDate>
    <generator>Générateur RSS Microsoft SharePoint Foundation</generator>
    <ttl>60</ttl>
    <language>fr-FR</language>
    <image>
      <title>Xavier VANNESTE : Billets</title>
      <url>http://blog.xvanneste.com/_layouts/images/siteIcon.png</url>
      <link>http://blog.xvanneste.com/Lists/Billets/AllPosts.aspx</link>
    </image>
    <item>
      <title>[Divers] Ma vision du moteur de recherche en entreprise</title>
      <link>http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=81</link>
      <description><![CDATA[<div><b>Corps:</b> <div class="ExternalClass13E56DFC1E994EC79235F62D69E54962"><div><div><h1>Le moteur de recherche dans l'entreprise </h1>
<div>Avant tout il y a le contenu, c'est par lui que tout commence. Telle une infection dans le système d'information, il se multiplie, s'étale, envahie toutes les parties du système. Puis il s'incruste, se déplace et quand on pense qu'il a disparu on s'aperçoit qu'il ne meurt jamais. Très vite les utilisateurs sont atteints d'une maladie : la « fouillonite » aigue. Ils fouillent, inlassablement, continuellement, mais ne trouvent pas ou peu ce qu'ils cherchent. Et ce temps passé à fouiller et parcourir le dédale des répertoires est une perte colossale pour l'entreprise, un gâchis. Tant bien même que le sésame est enfin repéré, l'utilisateur n'a pas la certitude d'avoir la dernière version de ce contenu. Pour palier cette aberration il existe des outils : « les moteurs de recherche ». </div>
<div>Cet article a pour but de dresser un état des lieux de l'utilisation du moteur de recherche en Entreprise, mais aussi ma vision pour le futur de celui-ci. (Même si certains aspects ne sont pas si futuristes qu'on pourrait le croire). </div>
<div>Nous verrons dans un premier temps l'historique de la gestion de l'information, avec trois étapes importantes, avant l'informatique, au début avec les répertoires partagés et maintenant avec la GED, enfin nous verrons l'utilité d'un moteur de recherche et son futur possible. </div>
<div> </div>
<h1>L'historique de la gestion de l'information </h1>
<div><span style="text-decoration:underline"><strong>Il y a 30 ans</strong></span>, avant la démocratisation de l'informatique (limite avant l'informatique), la gestion de l'information est déjà un casse-tête pour les Entreprises. L'information est mise sur des documents papier et le rangement de ceux-ci consiste à les classer dans des pochettes cartonnées. Ces pochettes cartonnées étant à leur tour classées dans des casiers. Lors de l'archivage on déplace des casiers (ou du moins leur contenu) dans une autre salle: la salle des archives. </div>
<div>S'y retrouver et retrouver l'information est un travail à part entière : celui de l'archiviste. </div>
<div><img src="/Lists/Photos/080411_1419_DiversMavis1.jpg" alt="" /> </div>
<div>La communication et l'échange de document passe par des tubes pneumatiques ou des coursiers et permet d'échanger des informations rapidement au sein de la société. </div>
<div><img src="/Lists/Photos/080411_1419_DiversMavis2.png" alt="" /> </div>
<div><span style="text-decoration:underline"><strong>Il y a 15 ans</strong></span>, dans les années 90, avec la démocratisation de l'informatique, le document papier fait lentement place au document électronique et le système d'information de l'entreprise est souvent basé sur un répertoire partagé où se trouve l'ensemble de l'information. La masse de document est, à l'époque, limitée par les capacités techniques. En effet il y a 15 ans le coût de stockage était sans commune mesure avec ce qu'il est aujourd'hui. </div>
<div><img src="/Lists/Photos/080411_1419_DiversMavis3.png" alt="" /> </div>
<div>Le document électronique, frère jumeau du document papier, hérite des mêmes caractéristiques génétiques, il est non structuré, souvent mal organisé, et prend vite beaucoup de place. Son classement représente le même casse-tête que celui de son frère. On le place dans des fiches cartonnées virtuelles (qu'on appelle dossier) elles-mêmes classées dans un casier (qu'on appelle disque dur) qui lui-même est entreposé dans un bâtiment (qu'on appelle serveur). La différence majeure entre ces deux frères jumeaux se situe dans l'espace qu'ils occupent... Néanmoins la situation en termes de rangement reste la même qu'avec le document papier, ceci afin de reproduire ce que connaît l'utilisateur pour son confort. </div>
<div><img src="/Lists/Photos/080411_1419_DiversMavis4.png" alt="" style="width:600px;height:454px" /> </div>
<div>Avec l'émergence d'internet dans les années 90 et l'utilisation croissante des emails, l'échange d'information va prendre une autre forme<br /><img src="/Lists/Photos/080411_1419_DiversMavis5.jpg" alt="" style="width:600px;height:432px" /> </div>
<div><span style="text-decoration:underline"><strong>Aujourd'hui</strong></span>, tout s'est accéléré, la quantité de documents électroniques stockée croisse de manière exponentielle. Avec les lois sur l'archivage électronique légal, l'avènement des nouveaux médias comme le son ou la vidéo , ainsi que les réseaux sociaux, il n'y a jamais eu autant d'informations stockées. <br />Le coût du stockage étant si faible que le gâchis d'espace disque n'est plus source de culpabilité, ouvrant ainsi la voie à une forte redondance de l'information. </div>
<div>Mon premier ordinateur, en 1996, possédait 1,6 Go d'espace disque, chaque journée s'apparentait à une bataille pour ne pas remplir ce disque. Aujourd'hui, mon ordinateur possède 465 Go, et la bataille consisterait plutôt à réussir à le remplir. </div>
<div>Dans les Entreprises on assiste au même scénario ; la profusion de documents et la duplication de ceux-ci sont immenses et ne cessent de croître. Le problème qui se pose désormais n'est plus de stocker l'information mais plutôt de la retrouver et surtout la dernière version valide de celle-ci. </div>
<div><img src="/Lists/Photos/080411_1419_DiversMavis6.png" alt="" /> </div>
<div><a href="http://www.perdu.com/">http://www.perdu.com</a> </div>
<div>Combien de fois n'est-il pas arrivé à un utilisateur de passer un temps monumental à rechercher un document, pour au final renoncer à le chercher en sollicitant son auteur s'il a la chance de le connaître, afin que celui-ci lui envoi ?<br />Moralité on stocke cette énième copie à un autre endroit, rendant ainsi le système d'information encore plus nébuleux. </div>
<div>Prenons un exemple, si j'envoie un document à 5 personnes pour validation. J'envoie le document qui est dans le répertoire « Mes documents », ce même document se trouve dans ma boite d'envoi, il arrive dans les 5 boites de réception de mes collègues, qui le stockent eux même dans le répertoire « Mes documents », puis me le renvoient validé, il se retrouve donc à nouveau dans 5 boites d'envoi avant d'arriver dans ma boite de réception en 5 exemplaires, pour le fusionner je copie les 5 documents dans le répertoire « Mes documents » et en sort un nouveau. </div>
<div>Récapitulons : </div>
<div>1 document original dans « mes documents » </div>
<div>1 document dans ma boite d'envoi </div>
<div>5 documents dans les boites de réception de mes collègues </div>
<div>5 documents dans « mes documents » sur l'ordinateur de mes collègues </div>
<div>5 documents dans leur boite d'envoi </div>
<div>5 documents dans ma boite de réception </div>
<div>5 documents dans « mes documents » </div>
<div>1 document fusionné </div>
<div><img src="/Lists/Photos/080411_1419_DiversMavis7.png" alt="" /> </div>
<div>Soit 28 exemplaires du même document. Dans trois semaines, si vous le recherchez lequel prendrez-vous ? </div>
<div>Alors on invente des solutions, les GED qui imitent lamentablement le système de classement par répertoire et ne font que déplacer le problème. </div>
<div>Cependant ils offrent les avantages de : </div>
<ul><li>s'échanger des liens plutôt que du document directement </li>
<li>La taxonomie qui permet à un même document d'être catégorisé dans plusieurs « répertoires » qu'on appelle tags, si cela est respecté par les personnes utilisant la GED </li>
<li>La folksonomie qui permet à n'importe qui de créer ses propres tags n'importe comment et on se retrouve avec des tags comme (SharePoint, CherePoint, SharePont) bref tout ce qui peut exister comme faute de frappe et notation phonétique. </li></ul>
<div>Ensuite certains outils sont très mal utilisés. Combien de fois j'ai vu une migration répertoire partagé vers SharePoint qui consistait en un gros copier-coller, et l'utilisateur de dire avec une pointe d'ironie « je ne comprends pas car je suis toujours aussi perdu alors qu'on a payé cher pour un nouvel outil ». </div>
<div>En fait, depuis 30 ans, peu de choses ont réellement changées. </div>
<div><img src="/Lists/Photos/080411_1419_DiversMavis8.jpg" alt="" /> </div>
<div>Bien entendu les traits sont volontairement grossis et tout n'est pas si noir. </div>
<div>Ce qui fait peur c'est qu'une des causes de l'explosion du contenu sur internet est le Social Networking, Social Networking qui arrive à grand pas dans les entreprises. La profusion de contenu et d'information sera donc logarithmique dans les entreprises déployant un RSE (Réseau social d'Entreprise). </div>
<h1>Le paradoxe privé/professionnel </h1>
<div>Dans l'entreprise il devient donc très difficile de trouver des informations et surtout d'obtenir les dernières informations à jours. <br />La confiance des utilisateurs est souvent mise à rudes épreuves lorsqu'ils ne trouvent pas d'information somme toute nécessaire. <br />Pire la plupart du temps l'information est dispersée dans différentes applications (document stocké dans un répertoire partagé, information client dans le CRM, sans compter la GED, l'ERP, le mail). <br />Dans le meilleur des cas, ces applications proviennent du même éditeur et peuvent donc communiquer et s'intégrer facilement l'une avec l'autre. Mais dans la réalité, le choix des applications est fonction des choix qui ont été fait à l'époque du déploiement, et des affinités, pour ne pas dire intérêt, à travailler avec tel ou tel éditeur, si bien qu'au final les applications ne sont pas du tout intégrables et les consultants/développeurs montent des rustines d'interopérabilité et d'ingéniosité dans tous les sens. </div>
<div>Si bien que dans l'entreprise, en tant que collaborateur, on cherche, on passe notre temps à chercher et à demander après l'information aux différentes personnes de la société. Différentes études montrent qu'un collaborateur perd jusqu'à 8 heures par semaine à chercher l'information dans l'entreprise : </div>
<div><a href="http://www.amplexor.com/ecm-bulletin/ecm-articles/enterprise-search-where-do-we-go-here">http://www.amplexor.com/ecm-bulletin/ecm-articles/enterprise-search-where-do-we-go-here</a> </div>
<div> </div>
<div>Mais en tant qu'internaute comment fait-on pour trouver une information ? Comment fait-on lorsqu'on veut trouver un article qui parle des centrales nucléaires, des tremblements de terre ou encore de la famine en Afrique ? On se rend simplement sur Google ou Bing.  Pire de plus en plus de personnes tapent directement l'adresse qu'elles recherchent (ou souhaitent consulter) dans le moteur de recherche. Les favoris ne sont presque plus utilisés. Le schéma ci-dessous montre bien l'explosion du nombre de requêtes : </div>
<div><img src="/Lists/Photos/080411_1419_DiversMavis9.png" alt="" /> </div>
<div>(Source : <a href="http://site-communautaire.blogspot.com/2010/01/classement-et-repartition-des-moteurs.html">http://site-communautaire.blogspot.com/2010/01/classement-et-repartition-des-moteurs.html</a> ) </div>
<div>Comme on peut le voir si l'utilisateur a à sa disposition plus d'une zone de saisie il a alors l'impression d'être noyé dans l'information voire d'être agressé (je viens de penser à certain intranet ou certains content manager s'obstinent à tout mettre sur la première page noyant l'utilisateur sous le flux d'information). </div>
<div>On en arrive au paradoxe suivant : il est plus simple de trouver des informations sur internet, un système générique par définition puisqu'il se doit de convenir à tout le monde mais surtout plus vaste et encore moins structuré que le système d'information de l'entreprise. </div>
<div>Maison : </div>
<div><img src="/Lists/Photos/080411_1419_DiversMavis10.jpg" alt="" /> </div>
<div>Entreprise : </div>
<div><img src="/Lists/Photos/080411_1419_DiversMavis11.gif" alt="" /> </div>
<div>La raison de ce paradoxe est simple : sur internet il existe ce que l'on appelle des moteurs de recherche qui permettent de trouver l'information. Ces moteurs de recherche indexent nuit et jour le contenu de n'importe quel site et, de plus en plus, de n'importe quel format de fichier (HTML, PDF, WORD, POWERPOINT…..). Ces moteurs de recherche travaillent sur des algorithmes de pertinence ce qui permet à l'utilisateur d'obtenir ce qu'il recherche en fonction d'un mot clé en haut du résultat de recherche. Afin de rendre l'expérience utilisateur meilleure, notamment pour les fonctions de filtre, les moteurs de recherche modernes s'équipent en barres d'affinage. </div>
<div><span style="text-decoration:underline">Google 24/07/2011 : </span></div>
<div><img src="/Lists/Photos/080411_1419_DiversMavis12.png" alt="" style="width:600px;height:454px" /> </div>
<div><span style="text-decoration:underline">Bing 24/07/2011 : </span></div>
<div><img src="/Lists/Photos/080411_1419_DiversMavis13.png" alt="" style="width:600px;height:455px" /> </div>
<div>En entreprise, jusqu'à il y a peu, on en était loin. Les entreprises qui déploient un moteur de recherche sont rares. De plus, la plupart des moteurs de recherche ne sont pas réellement adaptés à l'entreprise, ou juste à un métier particulier. </div>
<h1>Le moteur de recherche dans l'entreprise </h1>
<div>On le voit de VRAIES solutions existent sur internet et peuvent être adaptée à l'entreprise. Bien entendu beaucoup de personnes me rétorqueront « j'ai un moteur de recherche dans ma GED » la réponse sera rapide « Oui mais si elles ne cherchent que ce qui est stocké dans votre GED alors jetezle !». </div>
<div>En entreprise le gros avantage réside en la maitrise plus ou moins poussée du système d'information mais surtout celle du Métier de l'entreprise. En effet, prenons le terme Fond, dans une banque il représente un placement financier, dans une fabrique de meuble au contraire il représentera une pièce de meuble. Le moteur de recherche peut entièrement être adapté à l'entreprise et personnalisé en fonction de son métier et de ses termes inhérents. On peut donc avoir des règles différentes pour le mot Fond de notre banque et le mot Fond de notre fabricant de meubles. </div>
<div>Vu l'hétérogénéité des types de fichiers dans l'entreprise, le moteur de recherche en entreprise doit connaitre un maximum de format, l'idéal étant l'ensemble des formats utilisés par l'entreprise. </div>
<div>A l'heure de la mondialisation, l'internationalisation du système d'information se généralise, le moteur de recherche doit donc aussi reconnaitre les langues utilisées au sein de l'entreprise, par exemple le mot « CAR » : <br />-en anglais cela signifie une voiture ce qui peut être très utile chez un constructeur de voiture <br />-en français il doit être considéré comme un stop Word et ne pas être pris en compte. </div>
<div>Le moteur de recherche d'entreprise doit aussi s'adapter à son utilisateur et à sa fonction ou son rôle dans l'entreprise. En effet un commercial n'a pas du tout besoin du même résultat sur la recherche « SharePoint » qu'un technicien ou un développeur, si la recherche s'adapte à l'utilisateur cela est un plus. </div>
<div>La recherche doit aussi pouvoir être filtrée et permettre d'être triée simplement. Cela doit pouvoir être personnalisé. Trié la recherche par la date de création, au lieu de la pertinence, permet par exemple d'effectué la recherche sur les derniers documents créé. </div>
<div>La recherche dans l'entreprise doit aussi prendre en compte TOUT le système d'information de l'entreprise et pas uniquement les logiciels de l'éditeur du moteur de recherche. Ainsi si l'entreprise possède un Filenet, Documentum, un répertoire partagé, ou encore SharePoint, alors une recherche sur un mot clé devra retourner tout ce qui se trouve dans tous les conteneurs d'informations, et si les mails sont indexés aussi, on atteint le paradis. </div>
<div>La fédération est aussi très importante ; à l'heure des réseaux sociaux interconnectés entre eux, il est inconcevable d'avoir des moteurs de recherche qui recherchent sans s'appuyer sur d'autres. Si une recherche est infructueuse dans le système d'information de l'entreprise, le moteur de recherche se doit d'afficher automatiquement le résultant de la même recherche dans d'autre moteur comme Bing ou Google : </div>
<div><img src="/Lists/Photos/080411_1419_DiversMavis14.png" alt="" style="width:600px;height:350px" /> </div>
<div>SharePoint et Bing fédération. </div>
<div>La recherche peut aussi être fusionnée directement dans la recherche du poste utilisateur. Ainsi dans son poste utilisateur, en faisant une recherche sur un terme précis, l'utilisateur peut avoir l'ensemble du résultat, en fédérant les mails, le système d'information de l'entreprise et son poste local : </div>
<div><img src="/Lists/Photos/080411_1419_DiversMavis15.jpg" alt="" style="width:600px;height:396px" /> </div>
<div> </div>
<div>L'affichage en miniature de ce que l'on recherche est aussi un plus : sans les miniatures, on télécharge, on ouvre le document, on se rend compte que ce n'est pas le bon, on le referme et le détruit en local avant d'en télécharger un autre dans le moteur de recherche. Avec les miniatures on dispos d'un aperçu sur celui-ci, ( <a href="http://thumbextsp.codeplex.com/">http://thumbextsp.codeplex.com/</a> ) le moteur Google l'a très bien compris : </div>
<div><img src="/Lists/Photos/080411_1419_DiversMavis16.png" alt="" /> </div>
<div>Cependant, les moteurs de recherche comme il y a sur internet ne sont pas du tout adaptés à l'entreprise, mais à internet. Le cycle de vie et de mise à jour du contenu sur internet n'est pas le même qu'en entreprise. Ainsi il est peut être acceptable qu'un blog voyant le jour en janvier n'apparaisse dans le moteur de recherche qu'en juin. Maintenant imaginez la même chose avec la note de service de votre patron !!! Vous comprenez ce que je veux dire... </div>
<div>De plus, les moteurs de recherche sur internet sont basés sur le contenu, comme beaucoup de moteurs de recherche vendus en entreprise. Ainsi la recherche sur le mot-clé « <span style="text-decoration:underline">Molière »</span> remonte 8 830 000 résultats dans Google alors que la recherche sur « <span style="text-decoration:underline">Jean Baptiste Poquelin »</span> remonte elle 495 000 résultats malgré le fait que ce soit la même personne. Cela est dû au fait que l'on parle plus souvent de <span style="text-decoration:underline">Jean Baptiste Poquelin</span> par l'alias <span style="text-decoration:underline">Molière</span> et donc, comme Google est basé sur le contenu, il ne fait pas la relation entre les deux. </div>
<div>Le moteur de recherche en entreprise doit être plus intelligent et avoir la possibilité « d'apprendre » à utiliser les informations dans l'entreprise, c'est ici qu'intervient la notion de web sémantique. </div>
<h1>L'avenir du moteur de recherche </h1>
<h2>La recherche sémantique ou web 3.0 </h2>
<div>Définition de Wikipédia : </div>
<div> </div>
<pre><code>Le Web sémantique désigne un ensemble de technologies visant à rendre le contenu des ressources du World Wide Web accessible </code></pre>
<pre><code>et utilisable par les programmes et agents logiciels, grâce à un système de métadonnées formelles, </code></pre>
<pre><code>utilisant notamment la famille de langages développés par le W3C.
</code></pre>
<div> </div>
<div> </div>
<div>Actuellement il y a encore du travail. Cependant il y a des avancés évidentes. Certains moteurs de recherche permettent d'extraire dans « un espace fermé comme celui de l'entreprise » les dites métadonnées. </div>
<div>Un exemple, au Luxembourg les banques anonymisent de plus en plus les documents, ainsi dans beaucoup de documents clients, le nom du client n'est pas mentionné mais plutôt sa référence. <br />Un moteur de recherche, comme les moteurs de recherche d'internet, se base sur le contenu du document. Ainsi les documents du client John Doe ne contenant pas les mots « John Doe » car anonymisés, mais contenant la référence « 1234 » ne seront pas remontés par le moteur de recherche en cas de recherche sur les mots clé « John Doe », il faudrait effectuer à la place une recherche par la référence du client pour obtenir le résultat désiré, un peu comme avec Molière et Jean Baptiste Poquelin. <br />Un moteur de recherche intelligent et sémantique, identifiera la référence « 1234 » et interrogera une base de données clients effectuant le mapping entre le client et sa référence. Ainsi la recherche John Doe remontera les documents contenant John Doe mais aussi la référence « 1234 ». </div>
<div><span style="text-decoration:underline">Recherche basée sur le contenu </span></div>
<div><img src="/Lists/Photos/080411_1419_DiversMavis17.png" alt="" /> </div>
<div><span style="text-decoration:underline">Recherche avec extraction d'informations dans une source de données </span></div>
<div><img src="/Lists/Photos/080411_1419_DiversMavis19.png" alt="" /> </div>
<div>Cette intégration complète dans le système d'information permet d'avoir une transparence pour l'utilisateur. En effet, pour lui, peu importe que l'information soit dans le dernier SQL Server, dans la meilleur GED du monde ou dans le dernier portail collaboratif. Ce qu'il désire est accéder à l'information et de manière aussi simple que sur internet. </div>
<div>Prenons un autre exemple :<br />Une liste de documents qui parlent de fond dans une banque.<br />Si vous avez la liste des fonds et le nom des administrateurs des fonds vous pouvez « enseigner » à votre moteur de recherche le nom de ces fonds et des administrateurs, voire le lien entre chacun d'eux. Ainsi si le nom d'un administrateur du fond A est présent dans un document alors vous pouvez taguer automatiquement le document avec le nom du fond ET le nom de l'administrateur. Ensuite, la communication avec d'autres machines et logiciels sera très simple. </div>
<div>La recherche sémantique inclut aussi la recherche en langage naturel. <br />Prenons un exemple, vous êtes sur une place dans une ville et vous tapez sur votre téléphone, lui-même connecté à votre moteur de recherche, « Où puis-je manger ? ». Si vous dites cela a n'importe quelle personne elle saura vous répondre, mais comment un moteur de recherche peut faire le lien entre manger avec restaurant, brasserie, friterie, gîte etc…. On est très loin du moteur de recherche de contenu qu'on connait naturellement sur internet, à cela s'ajoute le fait que le moteur de recherche doive connaitre votre profil, savoir ce que vous aimez comme plat, si vous avez des allergies alimentaires ou des régimes spéciaux (Ducan par exemple <span style="font-family:wingdings">J</span> ) et pour finir il doit savoir où vous êtes. </div>
<div>Mais la recherche en langage naturel est la clé de voute du Web 3.0, dans l'entreprise les questions seraient différentes. </div>
<div>Imaginons qu'on soit dans un cabinet d'avocat et que la question soit : </div>
<div>« Affichage des articles de lois concernant l'accident de voiture de mon client qui, roulant sur un parking, s'est fait rentrer dedans par une personne venant de droite avec au volant une fille de 15 ans n'ayant pas son permis et apprenant à conduire avec son père » (fait divers qui m'est arrivé) </div>
<div>Il est clair qu'un moteur de recherche basé sur le contenu est perdu dès les premiers mots. Un moteur de recherche sémantique avec langage naturel reconnaitra la demande et saura en sortir l'information. </div>
<div>Le langage naturel n'en est qu'à ses débuts, cependant Bing a déjà commencé et des recherches du style « Air jordan under $100 » fonctionnent dès à présent : </div>
<div><a href="http://www.bing.com/community/site_blogs/b/search/archive/2011/03/01/bing-feature-update-searching-for-a-good-deal-new-natural-language-capabilities-in-bing-shopping-understand-prices.aspx">http://www.bing.com/community/site_blogs/b/search/archive/2011/03/01/bing-feature-update-searching-for-a-good-deal-new-natural-language-capabilities-in-bing-shopping-understand-prices.aspx</a> </div>
<div>Le Web 3.0 vient aussi avec ses standards : </div>
<div><a href="http://en.wikipedia.org/wiki/File:Semantic-web-stack.png"><img src="/Lists/Photos/080411_1419_DiversMavis21.png" border="0" alt="" /></a> </div>
<div><a href="http://en.wikipedia.org/wiki/File:Semantic-web-stack.png">http://en.wikipedia.org/wiki/File:Semantic-web-stack.png</a> </div>
<div>Malgré tout, dire qu'un simple moteur de recherche puisse, à lui seul, se targuer de faire du web sémantique relève encore de l'utopie à l'heure actuelle. </div>
<h2>Un moteur de recherche sans recherche <span style="font-family:wingdings">J</span> </h2>
<div>On peut ajouter la recherche suggestive. Quand fait-on une recherche à l'aide d'un moteur de recherche ? Quand a-t-on besoin d'informations ? Lorsqu'on réalise une tâche dans le cadre de notre travail. </div>
<div>Imaginez que votre manager vous assigne la tâche « Sortir tous les textes de loi sur l'adoption en France ». Vous lisez cette tâche et votre premier réflexe est de chercher dans le système d'information de l'entreprise puis sur internet les textes de lois en question. </div>
<div>Imaginez maintenant que lorsque vous ouvrez la tâche, une zone de l'écran a déjà effectué la recherche à votre place car cette zone est prévue pour afficher les résultats de la recherche inhérente au titre de la tâche. Le gain de temps est énorme ! </div>
<div><img src="/Lists/Photos/080411_1419_DiversMavis22.png" alt="" /> </div>
<div>La recherche peut aller beaucoup plus loin, comme on l'a vu précédemment on peut lier au système d'information le moteur de recherche. Si le moteur de recherche est lié à la base des projets, des employés et des clients, il connait donc les trois entités. Ainsi, pendant l'indexation il pourra <span style="text-decoration:underline"><strong>lier </strong></span>les trois entités entre elles en fonction de leur apparition dans les documents. </div>
<div>Quand le moteur de recherche aura indexé: </div>
<ul><li>les CV comportant les connaissances et nom des consultants  </li>
<li>Les Fiches de mission comportant le nom des projets, clients, consultants  </li>
<li>Les offres commerciales  </li>
<li>Les cahiers des charges </li>
<li>etc…. </li></ul>
<div>Il sera à même de lier le contenu et de savoir quel projet est lié à quel client et à quel consultant. </div>
<div><img src="/Lists/Photos/080411_1419_DiversMavis24.png" alt="" /> </div>
<div>Imaginez maintenant avec beaucoup plus d'entités liées comme les commerciaux, les produits, les incidents etc…. </div>
<div>Ceci offre des possibilités et des scénarios d'utilisation énormes et que nous n'avions même pas imaginés possibles il y a quelques années. </div>
<h2>La recherche sur les nouveaux médias </h2>
<div>Indexer du texte, voilà ce que les moteurs de recherche font depuis des années, mais maintenant, avec les réseaux sociaux, les nouveaux moyens de communication utilisés en entreprise, en résumé les nouveaux types de fichiers comme le son, la vidéo et les images, indexer des documents n'est plus forcément pertinent. </div>
<div>En effet si vous indexez une vidéo et que les seules informations que vous en ressortez sont le nom de la vidéo, sa résolution, sa durée, et le nombre d'images par seconde cela ne vous aidera pas forcement, prenons une image, les données <a href="http://fr.wikipedia.org/wiki/Exchangeable_image_file_format">EXIF</a> sont peut être intéressantes mais pas forcément pertinentes non plus. </div>
<div><img src="/Lists/Photos/080411_1419_DiversMavis25.png" alt="" /> </div>
<div>Maintenant les technologies de reconnaissance vocale, faciale et d'objets sont au point et abordables (Picassa par exemple le prouve). Inclue dans un moteur de recherche vous pourriez retrouver toutes les images de la personne (Megan Fox) sans que la photo n'apparaissent sur une page contenant le mot Megan Fox ou ne s'appelle Megan_Fox.jpg par exemple. </div>
<div><a href="/Lists/Billets/Post.aspx?ID=71">http://blog.xvanneste.com/Lists/Billets/Post.aspx?ID=71</a> </div>
<div>Certains sites comme Facebook intègrent désormais un moteur de reconnaissance faciale, cela permet d'indexer très facilement les photos (fini le long tagging des photos), d'autres comme Google ont acquis des technologies de reconnaissance faciale pour la suite : </div>
<div><a href="http://www.eweek.com/c/a/Search-Engines/Google-to-Boost-Google-with-PittPatt-Facial-Recognition-690874/">http://www.eweek.com/c/a/Search-Engines/Google-to-Boost-Google-with-PittPatt-Facial-Recognition-690874/</a> </div>
<div>Ainsi, si vous recherchez dans votre entreprise le nom d'une personne vous retrouverez tous les documents qu'il a rédigé, mais aussi toutes les images et vidéos où il apparait, et les sons où son nom est prononcé. Cela donne une nouvelle dimension à la recherche. </div>
<h2>La recherche, cerveau de votre contenu (Content Intelligence) </h2>
<div>Le logiciel qui connait le mieux le système d'information de votre entreprise ou du moins l'information qui y réside est le moteur de recherche. Ce dernier peut indexer les informations à intervalle de quelques minutes, permettant d'obtenir une pertinence des résultats assez rapide. </div>
<div>Connaissant votre système d'information et donc le contenu et les documents, le moteur de recherche pourrait ressortir l'ensemble des documents de type « bon de commande » d'un client particulier, comparer à votre système de Business intelligence vous pourrez en ressortir (5 bons de commande dans le système d'information contre 6 commandes effectives par le client) cela peut mettre en exergue certains problèmes. On pourrait aussi imaginer ressortir les bons de commande en comparaison des offres et des factures, en donnant un cliché à un instant T du suivi du client. En quoi cela change de la Business Intelligence ? </div>
<div>Je dirais l'absence de la base de données. Le moteur de recherche puise le contenu directement dans les documents, la réception d'un email suffit à pouvoir mettre à jour l'ensemble de l'information après indexation de celui-ci. </div>
<div>Bien entendu cela est possible avec des moteurs de recherche permettant d'effectuer des requêtes sur l'ensemble de l'index de manière aussi simple qu'avec le langage SQL. Des langages comme Fast Query Langage ou Google Query Language permettent d'imaginer ce genre d'application : </div>
<div><a href="http://msdn.microsoft.com/fr-fr/library/ff394606.aspx">http://msdn.microsoft.com/fr-fr/library/ff394606.aspx</a> </div>
<div><a href="http://code.google.com/appengine/docs/python/datastore/gqlreference.html">http://code.google.com/appengine/docs/python/datastore/gqlreference.html</a> </div>
<div>Contrairement à la base de données, la configuration du moteur de recherche est des plus importantes en Content Intelligence, mais, à la différence de la base de données les requêtes sont plus simples, certains diront plus simpliste. </div>
<div>Avec ce genre de langage qui permet de faire des requêtes directement dans le contenu de l'index, on peut faire de la Content Intelligence, qui contrairement à la Business intelligence se base sur le contenu du système d'information, le moteur de recherche étant le cerveau du système d'information c'est le plus apte à répondre à cette demande. </div>
<div><a href="http://searchbusinessanalytics.techtarget.com/podcast/Content-intelligence-Content-management-meets-business-intelligence">http://searchbusinessanalytics.techtarget.com/podcast/Content-intelligence-Content-management-meets-business-intelligence</a> </div>
<div><a href="http://semanticweb.com/is-content-intelligence-the-new-business-intelligence_b10703">http://semanticweb.com/is-content-intelligence-the-new-business-intelligence_b10703</a> </div>
<div><a href="http://www.bizsphere.com/blog/3-reasons-why-the-enterprise-urgently-needs-content-intelligence/">http://www.bizsphere.com/blog/3-reasons-why-the-enterprise-urgently-needs-content-intelligence/</a> </div>
<h2>Search Driven Application (Content Intelligence II) </h2>
<div>Probablement le concept autour du moteur de recherche le moins aboutis actuellement, mais paradoxalement celui qui pourrait voir le jour le plus vite. </div>
<div>Voici un exemple réalisé par Microsoft : </div>
<div><img src="/Lists/Photos/080411_1419_DiversMavis26.jpg" alt="" style="width:600px;height:462px" /> </div>
<div>Les applications de nos jours sont des Data Driven Application, elles sont basées sur une base de données, un fichier XML, ou un web services, bref elles sont basées sur une source de données structurées. </div>
<div>Les Search Driven Application sont des applications basées sur le moteur de recherche, la source de données est le moteur de recherche et les demandes passent par des langages de Query complets comme le Fast Query Language ou le Google Query Language. </div>
<div>A partir de là, des Dashboard (Tableau de bord) peuvent être créés et affichés (comme ci-dessus). </div>
<h1>Conclusion </h1>
<div>Le moteur de recherche n'a pas réellement évolué depuis la sortie de Google et le taux de pénétration du moteur de recherche en entreprise n'est pas très élevé. A l'heure où les entreprises commencent à faire entrer les réseaux sociaux, où les medias commencent à faire partie du contenu et où le nombre de documents croit de manière exponentielle, la recherche va devenir la clé de voute du système d'information, car un système d'information réussi n'est pas un système qui a beaucoup de contenu de différent types mais c'est un système qui permet de trouver l'information tout simplement.<br />Je suis en train de coder certain exemple de ces concepts en utilisant le moteur de recherche Fast Search For SharePoint (aka fs4sp). Wait and See ! </div>
<div>Merci à Nicolas Esprit et à mon épouse pour la relecture.</div></div></div></div></div>
<div><b>Catégorie:</b> <a onclick="OpenPopUpPage('http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=3&RootFolder=*', RefreshPage); return false;" href="http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=3&RootFolder=*">SharePoint 2010</a></div>
<div><b>Publié:</b> 04/08/2011 15:21</div>
]]></description>
      <author>Xavier VANNESTE</author>
      <category>SharePoint 2010</category>
      <pubDate>Thu, 04 Aug 2011 14:21:12 GMT</pubDate>
      <guid isPermaLink="true">http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=81</guid>
    </item>
    <item>
      <title>[SharePoint 2010] La Core Result WebPart Votre meilleur source d’informations </title>
      <link>http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=105</link>
      <description><![CDATA[<div><b>Corps:</b> <div class="ExternalClass3B2D336E62E44BDC86436480F216ACA3"><h1>Introduction
</h1><p>Lorsqu'on parle de la Core Result Web Part ou la webpart de résultat de recherche, la première chose qui vient en tête c'est la webpart qui se trouve dans le centre de recherche SharePoint et qui affiche le résultat de recherche. Elle est assez rarement utilisée, voire jamais, ailleurs que dans le centre de recherche. Cependant elle peut véritablement servir à beaucoup plus qu'afficher juste le résultat de la recherche dans le centre de recherche.
</p><p>Imaginez que vous vouliez afficher les derniers documents du site, les documents écris par telle personne mais aussi pouvoir filtrer par site, afficher que les PDF ou les documents Word ? Qu'allez-vous faire ? En discutant avec des développeurs SharePoint la première chose qui vient en tête c'est une requête CAML avec l'utilisation de la classe SPSiteDataQuery. Etes-vous sûr qu'il faille développer quelque chose ? On le verra il y a beaucoup plus simple.
</p><h1>Mise en place
</h1><p>Commençons par le début, on va créer une page qui accueillera notre recherche d'information, pour cela on va sur « Site Actions » <span style="font-family:Wingdings">à</span> « More option » <span style="font-family:Wingdings">à</span> « Web Part Page » :
</p><p><img src="/Lists/Photos/032712_1201_SharePoint21.png" alt="" />
	</p><p>Et on clique sur Create, pour l'exemple on va appeler notre page VerticalSearch avec le layout « Header, Left Column, Body » et notre page dans Site Pages: 
</p><p><img src="/Lists/Photos/032712_1201_SharePoint22.png" alt="" />
	</p><p><img src="/Lists/Photos/032712_1201_SharePoint23.png" alt="" />
	</p><p>On va ajouter les Core Result WebPart dans les trois zones :
</p><p><img src="/Lists/Photos/032712_1201_SharePoint24.png" alt="" />
	</p><p><img src="/Lists/Photos/032712_1201_SharePoint25.png" alt="" />
	</p><p>Maintenant on peut les paramétrer et afficher les informations sur une page.
</p><h1>Quelques cas concret
</h1><h2>Les documents du mois
</h2><p>La première chose que je souhaite c'est avoir tous les documents qui ont été écris ce mois-ci. Pour cela si je suis dans le centre de recherche je peux taper [write=&quot;this month&quot;]
</p><p><img src="/Lists/Photos/032712_1201_SharePoint26.png" alt="" />
	</p><p>Cela est intéressant mais ce que je veux c'est uniquement les documents, soit la Managed Property IsDocument avec la valeur true :
</p><p><img src="/Lists/Photos/032712_1201_SharePoint27.png" alt="" />
	</p><p>J'ai cependant encore des parasites dans mon résultat, en effet les pages ne m'intéresse pas du tout et encore moins la page que j'ai créé pour l'exemple, il suffit d'enlever l'extension « aspx » de mon résultat :
</p><p><img src="/Lists/Photos/032712_1201_SharePoint28.png" alt="" />
	</p><p>Voilà maintenant dans mon résultat j'ai mes deux documents créent ce mois-ci et pas les pages du site. Mais ce qui m'intéresse c'est de les mettre dans ma page VerticalSearch. Pour cela je customise ma page (Site Action<span style="font-family:Wingdings">à</span>Edit page) et sur la webpart de la zone body je clique sur « Edit Web Part » :
</p><p><img src="/Lists/Photos/032712_1201_SharePoint29.png" alt="" />
	</p><p>Le but ici est de mettre la query quelque en prédéfinie dans la webpart. C'est le rôle de la propriété « Fixed Keyword Query » qui est dans la zone Result Query Option :
</p><p><img src="/Lists/Photos/032712_1201_SharePoint210.png" alt="" />
	</p><p>J'entre donc ma requête précédemment faite :
</p><p><img src="/Lists/Photos/032712_1201_SharePoint211.png" alt="" />
	</p><p>Et voila le résultat :
</p><p><img src="/Lists/Photos/032712_1201_SharePoint212.png" alt="" />
	</p><p>Après avoir mis le titre et changer le chrome type :
</p><p><img src="/Lists/Photos/032712_1201_SharePoint213.png" alt="" />
	</p><p><img src="/Lists/Photos/032712_1201_SharePoint214.png" alt="" />
	</p><p>
 </p><p>
 </p><h2>Les évènements
</h2><p>Je souhaite ajouter une vue sur les évènements inscrits dans le site. Pour cela je vais demander tous les items dont le Content Type est équivalent à event soit [contenttype= « event »]
</p><p><img src="/Lists/Photos/032712_1201_SharePoint215.png" alt="" />
	</p><p>Si j'ajoute comme je l'ai fait la query a ma webpart dans la zone Left Column :
</p><p><img src="/Lists/Photos/032712_1201_SharePoint216.png" alt="" />
	</p><p>Voici ce que j'obtiens :
</p><p><img src="/Lists/Photos/032712_1201_SharePoint217.png" alt="" />
	</p><p>Les deux webparts ont changé, en fait il faut cloisonner les requêtes des webparts sinon le QueryManager transmettra la même information de résultat à toutes les webparts. On va changer le Cross-Web Part query ID en Query2 :
</p><p><img src="/Lists/Photos/032712_1201_SharePoint218.png" alt="" />
	</p><p>Le résultat escompté est maintenant atteint :
</p><p><img src="/Lists/Photos/032712_1201_SharePoint219.png" alt="" />
	</p><p>On pourrait les trier par date :
</p><p><img src="/Lists/Photos/032712_1201_SharePoint220.png" alt="" />
	</p><p>Ici le résultat par page sera le nombre maximum d'items qui apparaitront car la webpart de paginations n'a pas été mise.
</p><p>Comme on a accés a toutes les managed properties on peut récupérer les liste vide par exemple :
</p><p><img src="/Lists/Photos/032712_1201_SharePoint221.png" alt="" />
	</p><p>Ou alors tous les fichiers qui sont superieur a 1mb (soit 1048576 octets)
</p><p><img src="/Lists/Photos/032712_1201_SharePoint222.png" alt="" />
	</p><p>Si on ajoute cela a notre page en Query 3 et qu'on change l'affichage:
</p><p><img src="/Lists/Photos/032712_1201_SharePoint223.png" alt="" />
	</p><p><img src="/Lists/Photos/032712_1201_SharePoint224.png" alt="" />
	</p><p>Voici le résultat :
</p><p><img src="/Lists/Photos/032712_1201_SharePoint225.png" alt="" />
	</p><p>On pourrait aussi modifier le XSLT qui fait le rendu du résultat de recherche pour personnaliser encore plus l'affichage.
</p><h1>Référence
</h1><p><a href="http://msdn.microsoft.com/en-us/library/hh644280(v=office.14).aspx">http://msdn.microsoft.com/en-us/library/hh644280(v=office.14).aspx</a>
	</p></div></div>
<div><b>Catégorie:</b> <a onclick="OpenPopUpPage('http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=1&RootFolder=*', RefreshPage); return false;" href="http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=1&RootFolder=*">SharePoint 2010 Server</a></div>
<div><b>Publié:</b> 27/03/2012 13:03</div>
]]></description>
      <author>Xavier VANNESTE</author>
      <category>SharePoint 2010 Server</category>
      <pubDate>Tue, 27 Mar 2012 12:03:12 GMT</pubDate>
      <guid isPermaLink="true">http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=105</guid>
    </item>
    <item>
      <title>[Techdays 2012] WebCast de ma session au techdays</title>
      <link>http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=104</link>
      <description><![CDATA[<div><b>Corps:</b> <div class="ExternalClassD329A7B5282A47C5994480EE52FFCDE0"><p>Retrouvez le webcast de ma session au techdays, mais aussi toutes les sessions des techdays sur :</p>
<p><a href="http://www.microsoft.com/fr-fr/showcase/details.aspx?uuid=4d6176b3-fff7-481e-8c81-971b23c0964f">http://www.microsoft.com/fr-fr/showcase/details.aspx?uuid=4d6176b3-fff7-481e-8c81-971b23c0964f</a>​</p></div></div>
<div><b>Catégorie:</b> <a onclick="OpenPopUpPage('http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=5&RootFolder=*', RefreshPage); return false;" href="http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=5&RootFolder=*">Fast Search for SharePoint</a></div>
<div><b>Publié:</b> 09/03/2012 09:41</div>
<div><b>Tags:</b> Evenement</div>
]]></description>
      <author>Xavier VANNESTE</author>
      <category>Fast Search for SharePoint</category>
      <pubDate>Fri, 09 Mar 2012 08:42:22 GMT</pubDate>
      <guid isPermaLink="true">http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=104</guid>
    </item>
    <item>
      <title>[Techdays 2012]Retrouvez moi avec Nicolas Schmitt et Geoffrey Lalanne</title>
      <link>http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=102</link>
      <description><![CDATA[<div><b>Corps:</b> <div class="ExternalClassE2989EF3BD85418E8257D7FA94B3BC95"><p>Une personne passe encore en moyenne 8 heures par semaine à chercher une information (<a href="http://www.amplexor.com/ecm-bulletin/ecm-articles/enterprise-search-where-do-we-go-here)">http://www.amplexor.com/ecm-bulletin/ecm-articles/enterprise-search-where-do-we-go-here)</a>. Un moteur de recherche d'entreprise, dit &quot;à facettes&quot;, fait bien plus qu'un simple moteur de recherche Web, car vos besoins sont spécifiques : taxonomie, folksonomie, sécurité, intégration à la GED, social search et interopérabilité. Venez découvrir ce qu'un vrai moteur de recherche d'entreprise peut faire pour vous, en accroissant votre productivité au quotidien, à travers 5 cas d'usages déployés chez nos clients : jusqu'où pourrez-vous aller grâce à Fast for SharePoint 2010?</p>  <p>Jeudi 9 février de 11h00 a 12h00.</p>  <p><a title="http://www.microsoft.com/france/mstechdays/programmes/parcours.aspx#SessionID=62191f19-06e3-4093-90a6-2e5f7ffa0264" href="http://www.microsoft.com/france/mstechdays/programmes/parcours.aspx#SessionID=62191f19-06e3-4093-90a6-2e5f7ffa0264">http://www.microsoft.com/france/mstechdays/programmes/parcours.aspx#SessionID=62191f19-06e3-4093-90a6-2e5f7ffa0264</a></p></div></div>
<div><b>Catégorie:</b> <a onclick="OpenPopUpPage('http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=5&RootFolder=*', RefreshPage); return false;" href="http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=5&RootFolder=*">Fast Search for SharePoint</a></div>
<div><b>Publié:</b> 05/02/2012 20:44</div>
]]></description>
      <author>Xavier VANNESTE</author>
      <category>Fast Search for SharePoint</category>
      <pubDate>Sun, 05 Feb 2012 19:44:20 GMT</pubDate>
      <guid isPermaLink="true">http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=102</guid>
    </item>
    <item>
      <title>[SharePoint 2010] BCS Partie 6: Visual Studio 2010 et le Streamer (StreamAccessor)</title>
      <link>http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=101</link>
      <description><![CDATA[<div><b>Corps:</b> <div class="ExternalClass3CDD3D396885469D8CE831152E8AF16C"><h1>Introduction </h1>
<p>Jusque maintenant on ne peut pas dire que ce qu'on a fait avec Visual Studio soit simple, et on ne peut pas dire qu'on ait un résultat plus probant qu'avec SharePoint Designer. </p>
<p>Jusque maintenant aussi, on ne peut pas dire qu'on ait autre chose qu'une liste, alors que la plupart du temps on utilise les library dans SharePoint, dans lequel des documents sont stockés. </p>
<p>Dans notre exemple on indexe une GED, hors on n'a pas encore remonté les documents. C'est le but du StreamAccessor. </p>
<p>Dans cet article on verra comment remonter les documents stockés dans notre base de données. </p>
<p>Avec Rise les documents sont stockés directement dans la base de données on va donc apporter quelque modification au code pour utiliser ReadItem afin de récupérer le contenu des documents, ensuite nous créerons notre Method Instance StreamAccessor. </p>
<h1>Le BCS Designer </h1>
<p>On ajoute une méthode à l'entité RiseDocument dans le BCS Designer : </p>
<p><img src="/Lists/Photos/020112_1528_SharePoint21.png" alt="" /> </p>
<p>On ajoute deux paramètres, DocID et returnParameter, DocID est de direction in et returnParameter est de direction Return, le type descriptor sera DocIDTypeDescriptor et DocRise: </p>
<p><img src="/Lists/Photos/020112_1528_SharePoint22.png" alt="" style="width:800px;height:48px" /> </p>
<p>Les Paramètres pour DocIDTypeDescriptor sont </p>
<p><img src="/Lists/Photos/020112_1528_SharePoint23.png" alt="" /> </p>
<p>Le type correspond au type de l'identifier DocID. </p>
<p>Pour DocRise les paramétres vont être un peu plus complexe, on reprendra l'entité DocRise de ReadItem auquel on va ajouter Content de Type System.IO.Stream : </p>
<p><img src="/Lists/Photos/020112_1528_SharePoint24.png" alt="" /> </p>
<p>Maintenant on a les fondations pour notre BDC, il nous reste à ajouter notre méthode instance de type StreamAccessor : </p>
<p><img src="/Lists/Photos/020112_1528_SharePoint25.png" alt="" /> </p>
<p>Le return parameter name sera le typedescriptor returnParameter qui contient toutes les informations de RiseDocument, mais le return type descriptor sera content car c'est cette propriété qui contient le contenu qui doit être retourné. </p>
<p>Si on en reste là, le téléchargement ne sera pas terrible car il y'aura pas de nom de fichier, pas d'extension et pas de mimetype. </p>
<p>Pour cela on doit rajouter le lien vers les propriétés titre et mimetype du fichier. Dans les custom properties de la méthode instance on ajoute : </p>
<p><img src="/Lists/Photos/020112_1528_SharePoint26.png" alt="" /> </p>
<p>MimeTypeField prend en valeur le nom du type descriptor qui contient le nom du fichier, et FileNameField contient le nom du document qui sera téléchargé. </p>
<p>Suite à ces changements le Service a été modifié et il nous reste à mettre le code dans notre assemblie .net </p>
<h1>Changement du code </h1>
<p>On va changer le code de RiseDocument, afin de refléter le retour du contenu. </p>
<p>Pour cela on va ajouter une propriété de type Stream s'appelant Content : </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Collections.Generic; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Linq; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Text; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.IO; </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">namespace</span> BDCRiseCMS.BdcModel1 </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> This class contains the properties for Entity1. The properties keep the data for Entity1.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> If you want to rename the class, don't forget to rename the entity in the model xml as well.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;/summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">partial</span> <span style="color:blue">class</span> <span style="color:#2b91af">RiseDocument</span> </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:green">//TODO: Implement additional properties here. The property Message is just a sample how a property could look like.</span> </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">long</span> DocID { <span style="color:blue">get</span>; <span style="color:blue">set</span>; } </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">string</span> MimeType { <span style="color:blue">get</span>; <span style="color:blue">set</span>; } </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">string</span> Title { <span style="color:blue">get</span>; <span style="color:blue">set</span>; } </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">string</span> Description { <span style="color:blue">get</span>; <span style="color:blue">set</span>; } </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">string</span> Langue { <span style="color:blue">get</span>; <span style="color:blue">set</span>; } </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:#2b91af">Stream</span> Content { <span style="color:blue">get</span>; <span style="color:blue">set</span>; } </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p> </p>
<p>Maintenant on va modifier le Service RiseDocumentService pour remplir la propriété Content : </p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Collections.Generic; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Linq; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Text; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Data.SqlClient; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Data; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.IO; </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">namespace</span> BDCRiseCMS.BdcModel1 </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> All the methods for retrieving, updating and deleting data are implemented in this class file.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> The samples below show the finder and specific finder method for Entity1.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;/summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">class</span> <span style="color:#2b91af">RiseDocumentService</span> </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> This is a sample specific finder method for Entity1.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> If you want to delete or rename the method think about changing the xml in the BDC model file as well.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;/summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;param name=&quot;id&quot;&gt;&lt;/param&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;returns&gt;<span style="color:green">Entity1<span style="color:gray">&lt;/returns&gt;</span> </span></span></span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> </span></span></span></p>
<p> </p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">private</span> <span style="color:blue">static</span> <span style="color:#2b91af">SqlConnection</span> getSQLConnection() </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">SqlConnection</span> _cnData; </span></p>
<p><span style="font-family:consolas;font-size:9pt">_cnData = <span style="color:blue">new</span> <span style="color:#2b91af">SqlConnection</span>(<span style="color:#a31515">&quot;Data Source=srvsql; Initial Catalog=CMSRise;User ID=SA; Password=P@ssw0rd;&quot;</span>); </span></p>
<p><span style="font-family:consolas;font-size:9pt">_cnData.Open(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">return</span> _cnData; </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">static</span> <span style="color:#2b91af">RiseDocument</span> ReadItem(<span style="color:blue">long</span> docID) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">RiseDocument</span> rd = <span style="color:blue">new</span> <span style="color:#2b91af">RiseDocument</span>(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">MemoryStream</span> ms = <span style="color:blue">new</span> <span style="color:#2b91af">MemoryStream</span>(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> (<span style="color:#2b91af">SqlConnection</span> cndata = getSQLConnection()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> (<span style="color:#2b91af">SqlCommand</span> cmdata = <span style="color:blue">new</span> <span style="color:#2b91af">SqlCommand</span>()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.Connection = cndata; </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.CommandText = <span style="color:#a31515">&quot;SELECT t_cms_u_Document.c_id, t_cms_u_Document.c_u_MimeType, &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;t_cms_u_Document.c_u_Data, t_cms_u_Content.c_u_Title, t_cms_u_Content.c_u_Description, &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;t_cms_u_Content.c_u_Language &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;FROM t_cms_u_Content INNER JOIN t_cms_u_Document ON t_cms_u_Content.c_id = t_cms_u_Document.c_r_Content &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;where t_cms_u_Document.c_id=@docID&quot;</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.Parameters.AddWithValue(<span style="color:#a31515">&quot;@docID&quot;</span>, docID); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">SqlDataReader</span> drData = cmdata.ExecuteReader(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">if</span> (drData.Read()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.DocID = drData.GetInt64(0); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.MimeType = drData.GetString(1); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">byte</span>[] bContent = (<span style="color:blue">byte</span>[])drData.GetValue(2); </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt">ms.Write(bContent, 0, bContent.Length); </span></p>
<p><span style="font-family:consolas;font-size:9pt">ms.Flush(); </span></p>
<p><span style="font-family:consolas;font-size:9pt">ms.Position = 0; </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Content = ms; </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Title = drData.GetString(3); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Description = drData.GetString(4); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Langue = drData.GetString(5); </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">else</span> </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.DocID = -1; </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.MimeType = <span style="color:#a31515">&quot;&quot;</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Content = <span style="color:blue">null</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Title = <span style="color:#a31515">&quot;&quot;</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Description = <span style="color:#a31515">&quot;&quot;</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Langue = <span style="color:#a31515">&quot;&quot;</span>; </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">return</span> rd; </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> This is a sample finder method for Entity1.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> If you want to delete or rename the method think about changing the xml in the BDC model file as well.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;/summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;returns&gt;<span style="color:green">IEnumerable of Entities<span style="color:gray">&lt;/returns&gt;</span> </span></span></span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">static</span> <span style="color:#2b91af">IEnumerable</span>&lt;<span style="color:#2b91af">RiseDocument</span>&gt; ReadList() </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">List</span>&lt;<span style="color:#2b91af">RiseDocument</span>&gt; rds = <span style="color:blue">new</span> <span style="color:#2b91af">List</span>&lt;<span style="color:#2b91af">RiseDocument</span>&gt;(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> (<span style="color:#2b91af">SqlConnection</span> cndata = getSQLConnection()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> (<span style="color:#2b91af">SqlCommand</span> cmdata = <span style="color:blue">new</span> <span style="color:#2b91af">SqlCommand</span>()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.Connection = cndata; </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.CommandText = <span style="color:#a31515">&quot;SELECT t_cms_u_Document.c_id, t_cms_u_Document.c_u_MimeType, &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;t_cms_u_Document.c_u_Data, t_cms_u_Content.c_u_Title, t_cms_u_Content.c_u_Description, &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;t_cms_u_Content.c_u_Language &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;FROM t_cms_u_Content INNER JOIN t_cms_u_Document ON t_cms_u_Content.c_id = t_cms_u_Document.c_r_Content &quot;</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">SqlDataReader</span> drData = cmdata.ExecuteReader(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">while</span> (drData.Read()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">RiseDocument</span> rd = <span style="color:blue">new</span> <span style="color:#2b91af">RiseDocument</span>(); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.DocID = drData.GetInt64(0); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.MimeType = drData.GetString(1); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Title = drData.GetString(3); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Description = drData.GetString(4); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Langue = drData.GetString(5); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rds.Add(rd); </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">return</span> rds; </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">static</span> <span style="color:#2b91af">IEnumerable</span>&lt;<span style="color:#2b91af">RiseSite</span>&gt; RiseDocumentToSite(<span style="color:blue">long</span> docID) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">List</span>&lt;<span style="color:#2b91af">RiseSite</span>&gt; lstRs = <span style="color:blue">new</span> <span style="color:#2b91af">List</span>&lt;<span style="color:#2b91af">RiseSite</span>&gt;(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> (<span style="color:#2b91af">SqlConnection</span> cndata = getSQLConnection()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> (<span style="color:#2b91af">SqlCommand</span> cmdata = <span style="color:blue">new</span> <span style="color:#2b91af">SqlCommand</span>()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.Connection = cndata; </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.CommandText = <span style="color:#a31515">&quot;SELECT t_cms_u_Site.c_id, t_cms_u_Site.c_u_Name &quot;</span>+ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;FROM t_cms_u_Content INNER JOIN &quot;</span>+ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;t_cms_u_Document ON t_cms_u_Content.c_id = t_cms_u_Document.c_r_Content INNER JOIN &quot;</span>+ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;t_cms_u_Site ON t_cms_u_Content.c_r_Site = t_cms_u_Site.c_id WHERE (t_cms_u_Document.c_id = @docID) &quot;</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.Parameters.AddWithValue(<span style="color:#a31515">&quot;@docID&quot;</span>, docID); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">SqlDataReader</span> drData = cmdata.ExecuteReader(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">while</span> (drData.Read()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">RiseSite</span> rs = <span style="color:blue">new</span> <span style="color:#2b91af">RiseSite</span>(); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rs.SiteID = (<span style="color:blue">int</span>)drData.GetInt64(0); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rs.SiteName = drData.GetString(1); </span></p>
<p><span style="font-family:consolas;font-size:9pt">lstRs.Add(rs); </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">return</span> lstRs; </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">static</span> <span style="color:#2b91af">Stream</span> GetContentForDocID(<span style="color:blue">long</span> DocID) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">return</span> ReadItem(DocID).Content; </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p> </p>
<p>On a ajouté une méthode GetDocumentForDocID qui retournera le stream pour le StreamAccessor et on a modifié ReadItem pour remplir la propriété Content. </p>
<p>Cependant on a vu que le Mimetype et le nom du document est important aussi pour le download du document toutes les propriétés doivent donc être remplis. </p>
<p> </p>
<h1>Le résultat </h1>
<p>Le résultat est le suivant : </p>
<p><img src="/Lists/Photos/020112_1528_SharePoint27.png" alt="" style="width:800px;height:344px" /> </p>
<p>Le lien Click here to download est créé automatiquement si on clique dessus il récupére le nom du fichier et le mimetype et revoit le fichier stocké dans la base de données : </p>
<p><img src="/Lists/Photos/020112_1528_SharePoint28.png" alt="" style="width:800px;height:394px" /> </p>
<p>Si on clique sur open le document s'ouvre automatiquement. </p>
<p>Maintenant on obtient quelque chose de plus proche de ce que SharePoint peut faire. </p>
<p>Avec la webpart Business Data list on obtient ce qui se rapproche le plus d'une document library : </p>
<p><img src="/Lists/Photos/020112_1528_SharePoint29.png" alt="" /> </p></div></div>
<div><b>Catégorie:</b> <a onclick="OpenPopUpPage('http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=3&RootFolder=*', RefreshPage); return false;" href="http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=3&RootFolder=*">SharePoint 2010</a></div>
<div><b>Publié:</b> 01/02/2012 16:50</div>
]]></description>
      <author>Xavier VANNESTE</author>
      <category>SharePoint 2010</category>
      <pubDate>Wed, 01 Feb 2012 15:50:09 GMT</pubDate>
      <guid isPermaLink="true">http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=101</guid>
    </item>
    <item>
      <title>[SharePoint 2010] Bonne année et MVP une année de plus</title>
      <link>http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=98</link>
      <description><![CDATA[<div><b>Corps:</b> <div class="ExternalClassE12A8913AD1646B38AADF368DEB5F806"><p>Bonjour à tous je vous souhaite une très bonne année 2012. </p>
<p>Mon année démarre rapidement puisque je viens d'être renouvelé MVP pour un an de plus<span style="font-family:wingdings">J</span>. </p>
<p>Le programme pour 2012 n'est pas encore définit clairement comme l'année dernière mais beaucoup de choses sont prévu, un ensemble d'article sur les BCS et deux release majeur pour le <a href="http://pivotviewersp.codeplex.com/">Pivot Viewer for SharePoint</a> et le <a href="http://thumbextsp.codeplex.com/">Thumbnail extender for SharePoint</a> mais aussi deux autres projets en cours, <a href="http://pivotviewer365.codeplex.com/">Pivot Viewer for Office 365</a> et un quatrième en cours d'analyse. </p>
<p>Xavier VANNESTE</p></div></div>
<div><b>Catégorie:</b> <a onclick="OpenPopUpPage('http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=3&RootFolder=*', RefreshPage); return false;" href="http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=3&RootFolder=*">SharePoint 2010</a></div>
<div><b>Publié:</b> 01/01/2012 16:36</div>
]]></description>
      <author>Xavier VANNESTE</author>
      <category>SharePoint 2010</category>
      <pubDate>Sun, 01 Jan 2012 15:36:22 GMT</pubDate>
      <guid isPermaLink="true">http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=98</guid>
    </item>
    <item>
      <title>[SharePoint 2010] BCS Partie 3: Les Associations</title>
      <link>http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=90</link>
      <description><![CDATA[<div><b>Corps:</b> <div class="ExternalClass1AA2F6278A81439282F24B37E5C4507E"><h1>Série D'articles: </h1>
<ul><li><a href="/Lists/Billets/Post.aspx?ID=88">[SharePoint 2010] BCS Partie 1: Qu'est-ce que c'est ?</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=89">[SharePoint 2010] BCS Partie 2: SharePoint Designer</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=90">[SharePoint 2010] BCS Partie 3: Les Associations</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=99">[SharePoint 2010] BCS Partie 4: Visual Studio 2010</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=100">[SharePoint 2010] BCS Partie 5: Visual Studio 2010 les associations</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=93">[SharePoint 2010] BCS Partie 6: Visual Studio 2010 et le Streamer</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=94">[SharePoint 2010] BCS Partie 7: Visual Studio et le security Trimming</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=95">[SharePoint 2010] BCS Partie 8: Visual Studio 2010 et L'indexation</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=96">[SharePoint 2010] BCS Partie 9: Repensons l'indexation</a> </li></ul>
<h1>Introduction </h1>
<p><span style="font-family:times new roman;font-size:12pt">Faire un BCS pour une table sera relativement rare quand même, la plupart du temps vous utiliserez le BCS avec plusieurs tables et des associations entre elle. </span></p>
<p><span style="font-family:times new roman;font-size:12pt">L'avantage avec les BCS et qu'ils fournissent une vue master détail assez facilement. On le verra, avec SharePoint Designer on peut facilement créer les liens et faire des pages Master Details. </span></p>
<h1>Préparation. </h1>
<p><span style="font-family:times new roman;font-size:12pt">On va créer deux external content type comme vu précédemment un pour ProductSubCategory et un pour ProductCategory : </span></p>
<p><img src="/Lists/Photos/121611_0737_SharePoint21.png" alt="" /><span style="font-family:times new roman;font-size:12pt"> </span></p>
<p><span style="font-family:times new roman;font-size:12pt">Create All Operation sur la table SubCat : </span></p>
<p><img src="/Lists/Photos/121611_0737_SharePoint22.png" alt="" /><span style="font-family:times new roman;font-size:12pt"> </span></p>
<p><span style="font-family:times new roman;font-size:12pt">Name en Show in DataPicker </span></p>
<p><img src="/Lists/Photos/121611_0737_SharePoint23.png" alt="" style="width:800px;height:592px" /><span style="font-family:times new roman;font-size:12pt"> </span></p>
<p><span style="font-family:times new roman;font-size:12pt">On n'oublie pas la création de la profile page: </span></p>
<p><img src="/Lists/Photos/121611_0737_SharePoint24.png" alt="" /><span style="font-family:times new roman;font-size:12pt"> </span></p>
<p><span style="font-family:times new roman;font-size:12pt">Pareil pour la catégorie : </span></p>
<p><img src="/Lists/Photos/121611_0737_SharePoint25.png" alt="" /><span style="font-family:times new roman;font-size:12pt"> </span></p>
<p><img src="/Lists/Photos/121611_0737_SharePoint26.png" alt="" /><span style="font-family:times new roman;font-size:12pt"> </span></p>
<p><img src="/Lists/Photos/121611_0737_SharePoint27.png" alt="" style="width:800px;height:595px" /><span style="font-family:times new roman;font-size:12pt"> </span></p>
<p><span style="font-family:times new roman;font-size:12pt">Comme on peut le voir les External Content Type sont regroupé par Namespace : </span></p>
<p><img src="/Lists/Photos/121611_0737_SharePoint28.png" alt="" /><span style="font-family:times new roman;font-size:12pt"> </span></p>
<p><span style="font-family:times new roman;font-size:12pt">Comme dans cet article on n'a pas réécrit les namespaces l'url du site est prise par défaut pour faire les External Content Type. </span></p>
<h1>Les relations </h1>
<p><span style="font-family:times new roman;font-size:12pt">On va ré-ouvrir notre external content type Adventure Works. </span></p>
<p><span style="font-family:times new roman;font-size:12pt">Et cliquez sur </span></p>
<p><img src="/Lists/Photos/121611_0737_SharePoint29.png" alt="" /><span style="font-family:times new roman;font-size:12pt"> </span></p>
<p><span style="font-family:times new roman;font-size:12pt">On revient sur le design de notre external content type. </span></p>
<p><span style="font-family:times new roman;font-size:12pt">On fait un clic avec le bouton droit sur la table qui a servie à faire l'external content type à savoir product et on clique sur new association : </span></p>
<p><img src="/Lists/Photos/121611_0737_SharePoint210.png" alt="" /><span style="font-family:times new roman;font-size:12pt"> </span></p>
<p><img src="/Lists/Photos/121611_0737_SharePoint211.png" alt="" /><span style="font-family:times new roman;font-size:12pt"> </span></p>
<p><span style="font-family:times new roman;font-size:12pt">On va le lier a un external content type en cliquant sur browse : </span></p>
<p><img src="/Lists/Photos/121611_0737_SharePoint212.png" alt="" /><span style="font-family:times new roman;font-size:12pt"> </span></p>
<p><span style="font-family:times new roman;font-size:12pt">On selection sub cat car dans la DB on a un lien entre product et subcategorie. </span></p>
<p><span style="font-family:times new roman;font-size:12pt">SharePoint designer découvre de lui-même la relation. </span></p>
<p><img src="/Lists/Photos/121611_0737_SharePoint213.png" alt="" style="width:800px;height:595px" /><span style="font-family:times new roman;font-size:12pt"> </span></p>
<p><span style="font-family:times new roman;font-size:12pt">On selectionne ProductSubCategoryID comme identifier : </span></p>
<p><img src="/Lists/Photos/121611_0737_SharePoint214.png" alt="" style="width:800px;height:594px" /><span style="font-family:times new roman;font-size:12pt"> </span></p>
<p><span style="font-family:times new roman;font-size:12pt">On continue jusque la fin avec Next sans rien modifier. </span></p>
<p><span style="font-family:times new roman;font-size:12pt">On fait pareil avec SubCategory en faisant une relation avec Catégorie. </span></p>
<p><span style="font-family:times new roman;font-size:12pt">Une fois les relations faites il faut refaire les Profile page des Categorie et SubCategorie car leur page fera un Master Details (on sélectionne une catégorie on a les sourcategories et on sélectionne une sous-catégorie on a les produits). </span></p>
<p><span style="font-family:times new roman;font-size:12pt">Après avoir refait les profils pages on obtient : </span></p>
<p><img src="/Lists/Photos/121611_0737_SharePoint215.png" alt="" style="width:800px;height:266px" /><span style="font-family:times new roman;font-size:12pt"> </span></p>
<p><span style="font-family:times new roman;font-size:12pt">La même chose avec les sous catégories : </span></p>
<p><img src="/Lists/Photos/121611_0737_SharePoint216.png" alt="" style="width:800px;height:360px" /><span style="font-family:times new roman;font-size:12pt"> </span></p>
<p><span style="font-family:times new roman;font-size:12pt">Petite déception pas de liens actifs pour naviguer sur les produits ou les sous catégories à partir de la page parente. </span></p>
<h1>XSLT </h1>
<p><span style="font-family:times new roman;font-size:12pt">Pas grave on va éditer le XSLT : </span></p>
<p><span style="font-family:times new roman;font-size:12pt">On édite la page avec les catégories et on édite la webpart de navigation : </span></p>
<p><img src="/Lists/Photos/121611_0737_SharePoint217.png" alt="" /><span style="font-family:times new roman;font-size:12pt"> </span></p>
<p><span style="font-family:times new roman;font-size:12pt">On clique sur XSL Editor : </span></p>
<p><img src="/Lists/Photos/121611_0737_SharePoint218.png" alt="" /><span style="font-family:times new roman;font-size:12pt"> </span></p>
<p><span style="font-family:times new roman;font-size:12pt">Et on change la partie suivante : </span></p>
<p><span style="color:blue"><span style="font-family:consolas;font-size:9pt">&lt;<span style="color:#a31515">td<span style="color:blue"> <span style="color:red">class<span style="color:blue">=<span style="color:red">&quot;<span style="color:blue">ms-vb<span style="color:red">&quot;<span style="color:blue">&gt;<span style="color:red"> </span></span></span></span></span></span></span></span></span></span><span style="font-family:times new roman;font-size:12pt"></span></span></p>
<p><span style="color:blue"><span style="font-family:consolas;font-size:9pt">&lt;<span style="color:#2b91af">xsl:attribute<span style="color:blue"> <span style="color:red">name<span style="color:blue">=<span style="color:red">&quot;<span style="color:blue">style<span style="color:red">&quot;<span style="color:blue">&gt;<span style="color:red"> </span></span></span></span></span></span></span></span></span></span><span style="font-family:times new roman;font-size:12pt"></span></span></p>
<p><span style="color:blue"><span style="font-family:consolas;font-size:9pt">&lt;<span style="color:#2b91af">xsl:choose<span style="color:blue">&gt;<span style="color:#2b91af"> </span></span></span></span><span style="font-family:times new roman;font-size:12pt"></span></span></p>
<p><span style="color:blue"><span style="font-family:consolas;font-size:9pt">&lt;<span style="color:#2b91af">xsl:when<span style="color:blue"> <span style="color:red">test<span style="color:blue">=<span style="color:red">&quot;<span style="color:blue">$dvt_1_form_selectkey = @*[name()=$ColumnKey]<span style="color:red">&quot;<span style="color:blue">&gt;<span style="color:red">color:blue<span style="color:blue">&lt;/<span style="color:#2b91af">xsl:when<span style="color:blue">&gt;<span style="color:#2b91af"> </span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="font-family:times new roman;font-size:12pt"></span></span></p>
<p><span style="color:blue"><span style="font-family:consolas;font-size:9pt">&lt;<span style="color:#2b91af">xsl:otherwise<span style="color:blue"> /&gt;<span style="color:#2b91af"> </span></span></span></span><span style="font-family:times new roman;font-size:12pt"></span></span></p>
<p><span style="color:blue"><span style="font-family:consolas;font-size:9pt">&lt;/<span style="color:#2b91af">xsl:choose<span style="color:blue">&gt;<span style="color:#2b91af"> </span></span></span></span><span style="font-family:times new roman;font-size:12pt"></span></span></p>
<p><span style="color:blue"><span style="font-family:consolas;font-size:9pt">&lt;/<span style="color:#2b91af">xsl:attribute<span style="color:blue">&gt;<span style="color:#2b91af"> </span></span></span></span><span style="font-family:times new roman;font-size:12pt"></span></span></p>
<p><span style="color:blue"><span style="font-family:consolas;font-size:9pt">&lt;<span style="color:#2b91af">xsl:value-of<span style="color:blue"> <span style="color:red">select<span style="color:blue">=<span style="color:red">&quot;<span style="color:blue">@ProductSubcategoryID<span style="color:red">&quot;<span style="color:blue"> /&gt;<span style="color:red"> </span></span></span></span></span></span></span></span></span></span><span style="font-family:times new roman;font-size:12pt"></span></span></p>
<p><span style="color:blue"><span style="font-family:consolas;font-size:9pt">&lt;/<span style="color:#a31515">td<span style="color:blue">&gt;<span style="color:#a31515"> </span></span></span></span><span style="font-family:times new roman;font-size:12pt"></span></span></p>
<p>   </p>
<p><span style="font-family:times new roman;font-size:12pt">Avec celle la : </span></p>
<p>   </p>
<p><span style="color:blue"><span style="font-family:consolas;font-size:9pt">&lt;<span style="color:#a31515">td<span style="color:blue"> <span style="color:red">class<span style="color:blue">=<span style="color:red">&quot;<span style="color:blue">ms-vb<span style="color:red">&quot;<span style="color:blue">&gt;<span style="color:red"> </span></span></span></span></span></span></span></span></span></span><span style="font-family:times new roman;font-size:12pt"></span></span></p>
<p><span style="color:blue"><span style="font-family:consolas;font-size:9pt">&lt;<span style="color:#2b91af">xsl:attribute<span style="color:blue"> <span style="color:red">name<span style="color:blue">=<span style="color:red">&quot;<span style="color:blue">style<span style="color:red">&quot;<span style="color:blue">&gt;<span style="color:red"> </span></span></span></span></span></span></span></span></span></span><span style="font-family:times new roman;font-size:12pt"></span></span></p>
<p><span style="color:blue"><span style="font-family:consolas;font-size:9pt">&lt;<span style="color:#2b91af">xsl:choose<span style="color:blue">&gt;<span style="color:#2b91af"> </span></span></span></span><span style="font-family:times new roman;font-size:12pt"></span></span></p>
<p><span style="color:blue"><span style="font-family:consolas;font-size:9pt">&lt;<span style="color:#2b91af">xsl:when<span style="color:blue"> <span style="color:red">test<span style="color:blue">=<span style="color:red">&quot;<span style="color:blue">$dvt_1_form_selectkey = @*[name()=$ColumnKey]<span style="color:red">&quot;<span style="color:blue">&gt;<span style="color:red">color:blue<span style="color:blue">&lt;/<span style="color:#2b91af">xsl:when<span style="color:blue">&gt;<span style="color:#2b91af"> </span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="font-family:times new roman;font-size:12pt"></span></span></p>
<p><span style="color:blue"><span style="font-family:consolas;font-size:9pt">&lt;<span style="color:#2b91af">xsl:otherwise<span style="color:blue"> /&gt;<span style="color:#2b91af"> </span></span></span></span><span style="font-family:times new roman;font-size:12pt"></span></span></p>
<p><span style="color:blue"><span style="font-family:consolas;font-size:9pt">&lt;/<span style="color:#2b91af">xsl:choose<span style="color:blue">&gt;<span style="color:#2b91af"> </span></span></span></span><span style="font-family:times new roman;font-size:12pt"></span></span></p>
<p><span style="color:blue"><span style="font-family:consolas;font-size:9pt">&lt;/<span style="color:#2b91af">xsl:attribute<span style="color:blue">&gt;<span style="color:#2b91af"> </span></span></span></span><span style="font-family:times new roman;font-size:12pt"></span></span></p>
<p><span style="color:blue"><span style="font-family:consolas;font-size:9pt">&lt;<span style="color:#a31515">a<span style="color:blue">&gt;<span style="color:#a31515"> </span></span></span></span><span style="font-family:times new roman;font-size:12pt"></span></span></p>
<p><span style="color:blue"><span style="font-family:consolas;font-size:9pt">&lt;<span style="color:#2b91af">xsl:attribute<span style="color:blue"> <span style="color:red">name<span style="color:blue">=<span style="color:red">&quot;<span style="color:blue">href<span style="color:red">&quot;<span style="color:blue">&gt;<span style="color:red"> </span></span></span></span></span></span></span></span></span></span><span style="font-family:times new roman;font-size:12pt"></span></span></p>
<p><span style="color:blue"><span style="font-family:consolas;font-size:9pt">&lt;![CDATA[<span style="color:gray">http://srvmoss:80/_bdc/http___srvmoss/AdventureWorksSubCat_1.aspx?ProductSubcategoryID=<span style="color:blue">]]&gt;&lt;<span style="color:#2b91af">xsl:value-of<span style="color:blue"> <span style="color:red">select<span style="color:blue">=<span style="color:red">&quot;<span style="color:blue">@ProductSubcategoryID<span style="color:red">&quot;<span style="color:blue"> /&gt;<span style="color:red"> </span></span></span></span></span></span></span></span></span></span></span></span><span style="font-family:times new roman;font-size:12pt"></span></span></p>
<p><span style="color:blue"><span style="font-family:consolas;font-size:9pt">&lt;/<span style="color:#2b91af">xsl:attribute<span style="color:blue">&gt;<span style="color:#2b91af"> </span></span></span></span><span style="font-family:times new roman;font-size:12pt"></span></span></p>
<p><span style="color:blue"><span style="font-family:consolas;font-size:9pt">&lt;<span style="color:#2b91af">xsl:value-of<span style="color:blue"> <span style="color:red">select<span style="color:blue">=<span style="color:red">&quot;<span style="color:blue">@ProductSubcategoryID<span style="color:red">&quot;<span style="color:blue"> /&gt;<span style="color:red"> </span></span></span></span></span></span></span></span></span></span><span style="font-family:times new roman;font-size:12pt"></span></span></p>
<p><span style="color:blue"><span style="font-family:consolas;font-size:9pt">&lt;/<span style="color:#a31515">a<span style="color:blue">&gt;<span style="color:#a31515"> </span></span></span></span><span style="font-family:times new roman;font-size:12pt"></span></span></p>
<p><span style="color:blue"><span style="font-family:consolas;font-size:9pt">&lt;/<span style="color:#a31515">td<span style="color:blue">&gt;<span style="color:#a31515"> </span></span></span></span><span style="font-family:times new roman;font-size:12pt"></span></span></p>
<p>   </p>
<p><span style="font-family:times new roman;font-size:12pt">Bien entendu la page profil doit être adaptée. </span></p>
<p><span style="font-family:times new roman;font-size:12pt">Le résultat est le suivant : </span></p>
<p><img src="/Lists/Photos/121611_0737_SharePoint219.png" alt="" /><span style="font-family:times new roman;font-size:12pt"> </span></p>
<p><span style="font-family:times new roman;font-size:12pt">Il suffit de cliquer dessus pour naviguer sur la page de la sous-catégorie. Il suffira de faire de même avec la page des sous catégories pour naviguer vers produits. </span></p></div></div>
<div><b>Catégorie:</b> <a onclick="OpenPopUpPage('http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=3&RootFolder=*', RefreshPage); return false;" href="http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=3&RootFolder=*">SharePoint 2010</a></div>
<div><b>Publié:</b> 16/12/2011 08:37</div>
]]></description>
      <author>Xavier VANNESTE</author>
      <category>SharePoint 2010</category>
      <pubDate>Fri, 16 Dec 2011 07:37:24 GMT</pubDate>
      <guid isPermaLink="true">http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=90</guid>
    </item>
    <item>
      <title>[SharePoint 2010] BCS Partie 5: Visual Studio 2010 les associations</title>
      <link>http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=100</link>
      <description><![CDATA[<div><b>Corps:</b> <div class="ExternalClassA35D961922804478B21ECCA977F47765"><h1>Série D'articles: </h1>
<ul><li><a href="/Lists/Billets/Post.aspx?ID=88">[SharePoint 2010] BCS Partie 1: Qu'est-ce que c'est ?</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=89">[SharePoint 2010] BCS Partie 2: SharePoint Designer</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=90">[SharePoint 2010] BCS Partie 3: Les Associations</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=99">[SharePoint 2010] BCS Partie 4: Visual Studio 2010</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=100">[SharePoint 2010] BCS Partie 5: Visual Studio 2010 les associations</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=93">[SharePoint 2010] BCS Partie 6: Visual Studio 2010 et le Streamer</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=94">[SharePoint 2010] BCS Partie 7: Visual Studio et le security Trimming</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=95">[SharePoint 2010] BCS Partie 8: Visual Studio 2010 et L'indexation</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=96">[SharePoint 2010] BCS Partie 9: Repensons l'indexation</a> </li></ul>
<h1>Introduction </h1>
<p>Comme on a vu avec SharePoint designer on peut faire les associations entre les entités de votre BCS afin de mettre en place des vues Master/Details sur des associations. On va reprendre la création de notre BCS fait avec Visual Studio, on va lui ajouter une entité Site et on va faire les changements permettant de l'exploiter, on verra que suite à ces changements, on aura le même comportement qu'avec SharePoint Designer, pour l'instant on recherche le même comportement on verra par la suite les avantages à utiliser Visual Studio. </p>
<p>Avant de continuer on va se pencher sur la description de méthode et de méthode instance : </p>
<h1>Modification de l'existant  </h1>
<p>Premièrement on va supprimer le type descriptor « Site » dans le BDC Explorer. </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint21.png" alt="" /> </p>
<p>Puis on va modifier le code des classes pour ne plus retourner « Site » : </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Collections.Generic; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Linq; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Text; </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">namespace</span> BDCRiseCMS.BdcModel1 </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> This class contains the properties for Entity1. The properties keep the data for Entity1.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> If you want to rename the class, don't forget to rename the entity in the model xml as well.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;/summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">partial</span> <span style="color:blue">class</span> <span style="color:#2b91af">RiseDocument</span> </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:green">//TODO: Implement additional properties here. The property Message is just a sample how a property could look like.</span> </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">long</span> DocID { <span style="color:blue">get</span>; <span style="color:blue">set</span>; } </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">string</span> MimeType { <span style="color:blue">get</span>; <span style="color:blue">set</span>; } </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">string</span> Title { <span style="color:blue">get</span>; <span style="color:blue">set</span>; } </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">string</span> Description { <span style="color:blue">get</span>; <span style="color:blue">set</span>; } </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">string</span> Langue { <span style="color:blue">get</span>; <span style="color:blue">set</span>; } </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">byte</span>[] Content { <span style="color:blue">get</span>; <span style="color:blue">set</span>; } </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Collections.Generic; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Linq; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Text; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Data.SqlClient; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Data; </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">namespace</span> BDCRiseCMS.BdcModel1 </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> All the methods for retrieving, updating and deleting data are implemented in this class file.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> The samples below show the finder and specific finder method for Entity1.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;/summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">class</span> <span style="color:#2b91af">RiseDocumentService</span> </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> This is a sample specific finder method for Entity1.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> If you want to delete or rename the method think about changing the xml in the BDC model file as well.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;/summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;param name=&quot;id&quot;&gt;&lt;/param&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;returns&gt;<span style="color:green">Entity1<span style="color:gray">&lt;/returns&gt;</span> </span></span></span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> </span></span></span></p>
<p> </p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">private</span> <span style="color:blue">static</span> <span style="color:#2b91af">SqlConnection</span> getSQLConnection() </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">SqlConnection</span> _cnData; </span></p>
<p><span style="font-family:consolas;font-size:9pt">_cnData = <span style="color:blue">new</span> <span style="color:#2b91af">SqlConnection</span>(<span style="color:#a31515">&quot;Data Source=srvsql; Initial Catalog=CMSRise;User ID=SA; Password=P@ssw0rd;&quot;</span>); </span></p>
<p><span style="font-family:consolas;font-size:9pt">_cnData.Open(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">return</span> _cnData; </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">static</span> <span style="color:#2b91af">RiseDocument</span> ReadItem(<span style="color:blue">long</span> docID) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">RiseDocument</span> rd = <span style="color:blue">new</span> <span style="color:#2b91af">RiseDocument</span>(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> (<span style="color:#2b91af">SqlConnection</span> cndata = getSQLConnection()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> (<span style="color:#2b91af">SqlCommand</span> cmdata = <span style="color:blue">new</span> <span style="color:#2b91af">SqlCommand</span>()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.Connection = cndata; </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.CommandText = <span style="color:#a31515">&quot;SELECT t_cms_u_Document.c_id, t_cms_u_Document.c_u_MimeType, &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;t_cms_u_Document.c_u_Data, t_cms_u_Content.c_u_Title, t_cms_u_Content.c_u_Description, &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;t_cms_u_Content.c_u_Language &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;FROM t_cms_u_Content INNER JOIN t_cms_u_Document ON t_cms_u_Content.c_id = t_cms_u_Document.c_r_Content &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;where t_cms_u_Document.c_id=@docID&quot;</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.Parameters.AddWithValue(<span style="color:#a31515">&quot;@docID&quot;</span>, docID); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">SqlDataReader</span> drData = cmdata.ExecuteReader(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">if</span> (drData.Read()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.DocID = drData.GetInt64(0); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.MimeType = drData.GetString(1); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Content = (<span style="color:blue">byte</span>[])drData.GetValue(2); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Title = drData.GetString(3); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Description = drData.GetString(4); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Langue = drData.GetString(5); </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">else</span> </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.DocID = -1; </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.MimeType = <span style="color:#a31515">&quot;&quot;</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Content = <span style="color:blue">null</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Title = <span style="color:#a31515">&quot;&quot;</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Description = <span style="color:#a31515">&quot;&quot;</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Langue = <span style="color:#a31515">&quot;&quot;</span>; </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">return</span> rd; </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> This is a sample finder method for Entity1.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> If you want to delete or rename the method think about changing the xml in the BDC model file as well.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;/summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;returns&gt;<span style="color:green">IEnumerable of Entities<span style="color:gray">&lt;/returns&gt;</span> </span></span></span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">static</span> <span style="color:#2b91af">IEnumerable</span>&lt;<span style="color:#2b91af">RiseDocument</span>&gt; ReadList() </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">List</span>&lt;<span style="color:#2b91af">RiseDocument</span>&gt; rds = <span style="color:blue">new</span> <span style="color:#2b91af">List</span>&lt;<span style="color:#2b91af">RiseDocument</span>&gt;(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> (<span style="color:#2b91af">SqlConnection</span> cndata = getSQLConnection()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> (<span style="color:#2b91af">SqlCommand</span> cmdata = <span style="color:blue">new</span> <span style="color:#2b91af">SqlCommand</span>()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.Connection = cndata; </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.CommandText = <span style="color:#a31515">&quot;SELECT t_cms_u_Document.c_id, t_cms_u_Document.c_u_MimeType, &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;t_cms_u_Document.c_u_Data, t_cms_u_Content.c_u_Title, t_cms_u_Content.c_u_Description, &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;t_cms_u_Content.c_u_Language &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;FROM t_cms_u_Content INNER JOIN t_cms_u_Document ON t_cms_u_Content.c_id = t_cms_u_Document.c_r_Content &quot;</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">SqlDataReader</span> drData = cmdata.ExecuteReader(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">while</span> (drData.Read()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">RiseDocument</span> rd = <span style="color:blue">new</span> <span style="color:#2b91af">RiseDocument</span>(); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.DocID = drData.GetInt64(0); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.MimeType = drData.GetString(1); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Content = (<span style="color:blue">byte</span>[])drData.GetValue(2); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Title = drData.GetString(3); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Description = drData.GetString(4); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Langue = drData.GetString(5); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rds.Add(rd); </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">return</span> rds; </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p> </p>
<p>Maintenant on peut passer à la création de notre entité &lt;Site&gt; </p>
<h1>Création de nouvelles entités </h1>
<p>On va commencer par le BCS designer : </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint22.png" alt="" style="width:800px;height:294px" /> </p>
<p>On va nommer l'entité Site puis on va mettre un nouvelle identifier SiteID : </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint23.png" alt="" /> </p>
<p>Sans oublier de mettre le bon type pour SiteID : </p>
<p> </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint24.png" alt="" /> </p>
<p>On ajoute les deux méthodes ReadList et ReadItem </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint25.png" alt="" /> </p>
<p>Pour nous aider a designer les méthodes on utilisera le BDC Method Detail : </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint26.png" alt="" style="width:800px;height:289px" /> </p>
<p>On va créer les paramètres pour ReadList : </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint27.png" alt="" /> </p>
<p>Voici le contenu, on change le nom du type descriptor et la direction en Return : </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint28.png" alt="" /> </p>
<p>Maintenant on va créer notre List Instance </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint29.png" alt="" style="width:800px;height:629px" /> </p>
<p>Une Méthode instance permet de spécifier quand utiliser la méthode (retour de l'ensemble des entités, d'une seule entité, mise a jours d'une entité, suppression d'une entité…….) </p>
<p> </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint210.png" alt="" /> </p>
<p>On specifie le return parameter : </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint211.png" alt="" /> </p>
<p>On va faire de même avec ReadItem : </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint212.png" alt="" /> </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint213.png" alt="" /> </p>
<p>On spécifie le return parameter : </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint214.png" alt="" /> </p>
<p> </p>
<p>Si l'on regarde dans le solution explorer on se rend compte qu'on n'a pas le site entity mais que le SiteService, on va donc créer la classe Site. </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Collections.Generic; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Linq; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Text; </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">namespace</span> BDCRiseCMS.BdcModel1 </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">class</span> <span style="color:#2b91af">RiseSite</span> </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">int</span> SiteID { <span style="color:blue">get</span>; <span style="color:blue">set</span>; } </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:#2b91af">String</span> SiteName { <span style="color:blue">get</span>; <span style="color:blue">set</span>; } </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p> </p>
<p>Maintenant qu'on l'a créé on peut terminer le schema de notre BCS, dans le BDC explorer on va changer le type des type descriptor SiteRise et SiteRiseList : </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint215.png" alt="" /> </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint216.png" alt="" /> </p>
<p>Pour SiteRiseList on coche en plus is Enumerable : </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint217.png" alt="" /> </p>
<p>SiteID : </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint218.png" alt="" /> </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint219.png" alt="" /> </p>
<p> </p>
<p>On finit l'entité SiteRise : </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint220.png" alt="" /> </p>
<p>SiteService a été généré par le designer : </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Collections.Generic; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Linq; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Text; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">namespace</span> BDCRiseCMS.BdcModel1 </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">partial</span> <span style="color:blue">class</span> <span style="color:#2b91af">SiteService</span> </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">static</span> <span style="color:#2b91af">IEnumerable</span>&lt;<span style="color:#2b91af">RiseSite</span>&gt; ReadList() </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">throw</span> <span style="color:blue">new</span> System.<span style="color:#2b91af">NotImplementedException</span>(); </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">static</span> <span style="color:#2b91af">RiseSite</span> ReadItem(<span style="color:blue">int</span> ID) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">throw</span> <span style="color:blue">new</span> System.<span style="color:#2b91af">NotImplementedException</span>(); </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p> </p>
<p>Avec le code : </p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Collections.Generic; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Linq; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Text; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Data.SqlClient; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">namespace</span> BDCRiseCMS.BdcModel1 </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">partial</span> <span style="color:blue">class</span> <span style="color:#2b91af">SiteService</span> </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">private</span> <span style="color:blue">static</span> <span style="color:#2b91af">SqlConnection</span> getSQLConnection() </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">SqlConnection</span> _cnData; </span></p>
<p><span style="font-family:consolas;font-size:9pt">_cnData = <span style="color:blue">new</span> <span style="color:#2b91af">SqlConnection</span>(<span style="color:#a31515">&quot;Data Source=srvsql; Initial Catalog=CMSRise;User ID=SA; Password=P@ssw0rd;&quot;</span>); </span></p>
<p><span style="font-family:consolas;font-size:9pt">_cnData.Open(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">return</span> _cnData; </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">static</span> <span style="color:#2b91af">IEnumerable</span>&lt;<span style="color:#2b91af">RiseSite</span>&gt; ReadList() </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">List</span>&lt;<span style="color:#2b91af">RiseSite</span>&gt; lstRS = <span style="color:blue">new</span> <span style="color:#2b91af">List</span>&lt;<span style="color:#2b91af">RiseSite</span>&gt;(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> (<span style="color:#2b91af">SqlConnection</span> cndata = getSQLConnection()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> (<span style="color:#2b91af">SqlCommand</span> cmdata = <span style="color:blue">new</span> <span style="color:#2b91af">SqlCommand</span>()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.Connection = cndata; </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.CommandText = <span style="color:#a31515">&quot;SELECT c_id, c_u_Name FROM t_cms_u_Site&quot;</span> ; </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">SqlDataReader</span> drData = cmdata.ExecuteReader(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">while</span> (drData.Read()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">RiseSite</span> rs=<span style="color:blue">new</span> <span style="color:#2b91af">RiseSite</span>(); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rs.SiteID = (int)drData.GetInt64(0); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rs.SiteName = drData.GetString(1); </span></p>
<p><span style="font-family:consolas;font-size:9pt">lstRS.Add(rs); </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">return</span> lstRS; </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">static</span> <span style="color:#2b91af">RiseSite</span> ReadItem(<span style="color:blue">int</span> ID) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">RiseSite</span> rs = <span style="color:blue">new</span> <span style="color:#2b91af">RiseSite</span>(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> (<span style="color:#2b91af">SqlConnection</span> cndata = getSQLConnection()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> (<span style="color:#2b91af">SqlCommand</span> cmdata = <span style="color:blue">new</span> <span style="color:#2b91af">SqlCommand</span>()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.Connection = cndata; </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.CommandText = <span style="color:#a31515">&quot;SELECT c_id, c_u_Name FROM t_cms_u_Site &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;where c_id=@ID&quot;</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.Parameters.AddWithValue(<span style="color:#a31515">&quot;@ID&quot;</span>, ID); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">SqlDataReader</span> drData = cmdata.ExecuteReader(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">if</span> (drData.Read()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt">rs.SiteID = drData.GetInt32(0); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rs.SiteName = drData.GetString(1); </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">else</span> </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt">rs.SiteID = -1; </span></p>
<p><span style="font-family:consolas;font-size:9pt">rs.SiteName = <span style="color:#a31515">&quot;&quot;</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">return</span> rs; </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p>Le résultat une fois la profile page terminé : </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint221.png" alt="" style="width:800px;height:234px" /> </p>
<p> </p>
<p> </p>
<h1>Mise en place de l'association </h1>
<p>Très bien maintenant passons au plus simple, on va créer une association entre les deux entités, cette association générera une méthode dans chaque entité permettant de faire une vue Master/Details. </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint222.png" alt="" /> </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint223.png" alt="" /> </p>
<p>On ne remplit rien d'autre, seul le code sera à modifier : </p>
<p>Code dans SIteService </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">static</span> <span style="color:#2b91af">IEnumerable</span>&lt;<span style="color:#2b91af">RiseDocument</span>&gt; SiteToRiseDocument(<span style="color:blue">int</span> siteID) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">List</span>&lt;<span style="color:#2b91af">RiseDocument</span>&gt; rds = <span style="color:blue">new</span> <span style="color:#2b91af">List</span>&lt;<span style="color:#2b91af">RiseDocument</span>&gt;(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> (<span style="color:#2b91af">SqlConnection</span> cndata = getSQLConnection()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> (<span style="color:#2b91af">SqlCommand</span> cmdata = <span style="color:blue">new</span> <span style="color:#2b91af">SqlCommand</span>()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.Connection = cndata; </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.CommandText = <span style="color:#a31515">&quot;SELECT t_cms_u_Document.c_id, t_cms_u_Document.c_u_MimeType, &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;t_cms_u_Document.c_u_Data, t_cms_u_Content.c_u_Title, t_cms_u_Content.c_u_Description, &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;t_cms_u_Content.c_u_Language &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;FROM t_cms_u_Content INNER JOIN &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;t_cms_u_Document ON t_cms_u_Content.c_id = t_cms_u_Document.c_r_Content INNER JOIN &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;t_cms_u_Site ON t_cms_u_Content.c_r_Site = t_cms_u_Site.c_id WHERE (t_cms_u_Site.c_id = @siteID) &quot;</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.Parameters.AddWithValue(<span style="color:#a31515">&quot;@siteID&quot;</span>, siteID); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">SqlDataReader</span> drData = cmdata.ExecuteReader(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">while</span> (drData.Read()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">RiseDocument</span> rd = <span style="color:blue">new</span> <span style="color:#2b91af">RiseDocument</span>(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">if</span>(!drData.IsDBNull(0)) </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.DocID = drData.GetInt64(0); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">if</span> (!drData.IsDBNull(1)) </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.MimeType = drData.GetString(1); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">if</span> (!drData.IsDBNull(2)) </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Content = (<span style="color:blue">byte</span>[])drData.GetValue(2); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">if</span> (!drData.IsDBNull(3)) </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Title = drData.GetString(3); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">if</span> (!drData.IsDBNull(4)) </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Description = drData.GetString(4); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">if</span> (!drData.IsDBNull(5)) </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Langue = drData.GetString(5); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rds.Add(rd); </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">return</span> rds; </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p> </p>
<p>Code dans RiseDocumentServices : </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">static</span> <span style="color:#2b91af">IEnumerable</span>&lt;<span style="color:#2b91af">RiseSite</span>&gt; RiseDocumentToSite(<span style="color:blue">long</span> docID) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">List</span>&lt;<span style="color:#2b91af">RiseSite</span>&gt; lstRs = <span style="color:blue">new</span> <span style="color:#2b91af">List</span>&lt;<span style="color:#2b91af">RiseSite</span>&gt;(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> (<span style="color:#2b91af">SqlConnection</span> cndata = getSQLConnection()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> (<span style="color:#2b91af">SqlCommand</span> cmdata = <span style="color:blue">new</span> <span style="color:#2b91af">SqlCommand</span>()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.Connection = cndata; </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.CommandText = <span style="color:#a31515">&quot;SELECT t_cms_u_Site.c_id, t_cms_u_Site.c_u_Name &quot;</span>+ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;FROM t_cms_u_Content INNER JOIN &quot;</span>+ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;t_cms_u_Document ON t_cms_u_Content.c_id = t_cms_u_Document.c_r_Content INNER JOIN &quot;</span>+ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;t_cms_u_Site ON t_cms_u_Content.c_r_Site = t_cms_u_Site.c_id WHERE (t_cms_u_Document.c_id = @docID) &quot;</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.Parameters.AddWithValue(<span style="color:#a31515">&quot;@docID&quot;</span>, docID); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">SqlDataReader</span> drData = cmdata.ExecuteReader(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">while</span> (drData.Read()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">RiseSite</span> rs = <span style="color:blue">new</span> <span style="color:#2b91af">RiseSite</span>(); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rs.SiteID = (<span style="color:blue">int</span>)drData.GetInt64(0); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rs.SiteName = drData.GetString(1); </span></p>
<p><span style="font-family:consolas;font-size:9pt">lstRs.Add(rs); </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">return</span> lstRs; </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p> </p>
<p>Le résultat est le suivant : </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint224.png" alt="" /> </p>
<p><img src="/Lists/Photos/012512_1626_SharePoint225.png" alt="" /> </p>
<p>Le master detail est bien en place. On a donc le même comportement qu'avec SharePoint Designer. </p>
<h1>Résultat </h1>
<p>Le résultat est proche de SharePoint designer, même si actuellement il est impossible d'indexer ce BCS. Ici on se rend compte que faire la même chose que SharePoint Designer n'est pas si simple avec Visual Studio, cependant à partir de maintenant les possibilités réélles de Visual Studio vont être utilisées.</p></div></div>
<div><b>Catégorie:</b> <a onclick="OpenPopUpPage('http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=3&RootFolder=*', RefreshPage); return false;" href="http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=3&RootFolder=*">SharePoint 2010</a></div>
<div><b>Publié:</b> 25/01/2012 17:28</div>
]]></description>
      <author>Xavier VANNESTE</author>
      <category>SharePoint 2010</category>
      <pubDate>Wed, 25 Jan 2012 16:28:20 GMT</pubDate>
      <guid isPermaLink="true">http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=100</guid>
    </item>
    <item>
      <title>[SharePoint 2010] BCS Partie 1: Qu’est-ce que c’est ?</title>
      <link>http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=88</link>
      <description><![CDATA[<div><b>Corps:</b> <div class="ExternalClassFE3ECB812A774AA1A727FD2DC8F804B7"><h1>Série D'articles: </h1>
<ul><li><a href="/Lists/Billets/Post.aspx?ID=88">[SharePoint 2010] BCS Partie 1: Qu'est-ce que c'est ?</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=89">[SharePoint 2010] BCS Partie 2: SharePoint Designer</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=90">[SharePoint 2010] BCS Partie 3: Les Associations</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=99">[SharePoint 2010] BCS Partie 4: Visual Studio 2010</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=100">[SharePoint 2010] BCS Partie 5: Visual Studio 2010 les associations</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=93">[SharePoint 2010] BCS Partie 6: Visual Studio 2010 et le Streamer</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=94">[SharePoint 2010] BCS Partie 7: Visual Studio et le security Trimming</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=95">[SharePoint 2010] BCS Partie 8: Visual Studio 2010 et L'indexation</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=96">[SharePoint 2010] BCS Partie 9: Repensons l'indexation</a> </li></ul>
<h1>Introduction </h1>
<p>BCS pour Business Connectivity Services de SharePoint 2010 est le successeur des BDC pour Business Data Catalog , de SharePoint 2007. <br />Sour SharePoint 2010, les BCS se présentent comme un Service Application, ce qui signifie qu'il est distribuable. Les BCS permettent d'utiliser des sources de données externes, et pas seulement des Bases de Données comme beaucoup pourrait le penser, à SharePoint et de les intégrer dans SharePoint comme si le contenu faisait partie intégrante de la plateforme. <br />Contrairement au BDC, les BCS de SharePoint 2010 permettent de faire du CRUD (Create, Read, Update, Delete) ce qui présente un énorme avantage. <br />Un autre avantage des BCS est qu'il est possible de faire des références non seulement aux Bases de données mais aussi au service Web WCF et aux assemblies .Net, d'où la remarque insistant sur le fait qu'on parle de sources de données et nom de Base de données. En utilisant les assemblies .Net on peut donc considérer qu'on développe un connecteur a des sources de données externes du moment qu'elle soit interrogeable en .Net.<br />Ainsi il est pensable d'avoir un BCS pour interroger une base de données Oracle, MySQL, DB2, d'interroger des web services externes, sur le cloud par exemple ou alors de développer un connecteur pour un fileshare spécifique (novell par exemple qui, une fois indexé, ne remontant pas les ACL, il ne fait pas de security trimming). </p>
<p>Les BCS est un sujet très vaste car une fois la connexion à la source de données faite, il reste l'affichage de ces informations, en effet c'est bien beau d'avoir les données encore faut-il les afficher, leur indexation par le moteur de recherche avec le security trimming, le retour des binaires s'il y a, l'intégration avec les informations de SharePoint, et l'expérience utilisateur. </p>
<p>Lorsqu'on découvre les BCS on a l'impression que cela est confus et un peu complexe, le but de cet article est de délier ensemble cette complexité et de donner des pistes aux différents problèmes. </p>
<p>Au cours de cette série d'article nous aborderons comment faire des BCS avec SharePoint Designer, mais aussi avec Visual Studio, ainsi que les différentes possibilités qui nous sont offerte par la plateforme </p>
<h1>L'architecture      </h1>
<p><img src="/Lists/Photos/bcsArchi.png" alt="" /> </p>
<p>L'architecture des BCS est basée sur les services application de SharePoint 2010, ce qui signifie que les BCS fournissent un WCF pour y accéder depuis l'extérieur mais aussi une base de données pour stocker les informations de configurations (le template de la DB est Bdc_Service_DB_{GUID}). <br />Les BCS peuvent interagir directement avec SharePoint au travers des listes externes, de la recherche, des colonnes externes, des profils utilisateurs, des web parts ou des Workflow. Sur les BCS on peut développer nos propres applications et utiliser SharePoint comme Middleware pour accéder aux données, tout en s'appuyant sur l'architecture des Services Applications. <br />Le Secure Store permet de mettre en place la sécurité entre le monde SharePoint et le monde Externe (Single Sign On). <br />L'api Cliente permet de récupérer dans le BCS Client Cache les données afin de les exploiter dans les clients, cela est inclut nativement dans Office 2010 dans les applications SharePoint Workspace, Outlook, Infopath, Word et Access et à travers des Office Business Application il est aussi possible d'exploiter ces informations. </p>
<p>Le développement d'un BCS se base sur un XML (comme dans les BDC) de paramétrage qui renseigne les entités et les informations d'accès à l'information. Dans le fichier XML on met les différents paramètre, ainsi s'il s'agit d'un accès a une base de données on retrouvera directement les requêtes SQL. Ceux qui ont eu la chance de faire des BDC dans SharePoint 2007, se rappellent surement la joie de faire ces fichiers XML a la main. </p>
<h1>Le BDCM </h1>
<p>Regardons de suite un BDCM : </p>
<p>Source :<a href="http://msdn.microsoft.com/en-us/library/ee558376.aspx">http://msdn.microsoft.com/en-us/library/ee558376.aspx</a> </p>
<p><span style="font-family:courier new;color:red;font-size:10pt"><span style="background-color:yellow">&lt;?</span><span style="color:blue"><span style="background-color:white">xml<span style="color:black"> <span style="color:red">version<span style="color:black">=<span style="color:#8000ff"><strong>&quot;1.0&quot;</strong><span style="color:black"> <span style="color:red">encoding<span style="color:black">=<span style="color:#8000ff"><strong>&quot;utf-8&quot;</strong><span style="color:black"> <span style="color:red">standalone<span style="color:black">=<span style="color:#8000ff"><strong>&quot;yes&quot;</strong></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color:red"><span style="background-color:yellow">?&gt;</span><span style="background-color:white;color:black"><strong> </strong></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:blue;font-size:10pt">&lt;Model<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;ExampleApplicationDefinition&quot;</strong><span style="color:black"> <span style="color:red">xmlns<span style="color:black">=<span style="color:#8000ff"><strong>&quot;http://schemas.microsoft.com/windows/2007/BusinessDataCatalog&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;LobSystems&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;LobSystem<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;ExampleCRM&quot;</strong><span style="color:black"> <span style="color:red">Type<span style="color:black">=<span style="color:#8000ff"><strong>&quot;Database&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Properties&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- This database uses % symbol for the LIKE operator. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Property<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;WildcardCharacter&quot;</strong><span style="color:black"> <span style="color:red">Type<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.String&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong>%</strong><span style="color:blue">&lt;/Property&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/Properties&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;LobSystemInstances&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;LobSystemInstance<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;ExampleServer&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Properties&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Property<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;AuthenticationMode&quot;</strong><span style="color:black"> <span style="color:red">Type<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.String&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong>PassThrough</strong><span style="color:blue">&lt;/Property&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- The database instance is named ExampleSQL and is running on the same computer as the application using this Model. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Property<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;RdbConnection Data Source&quot;</strong><span style="color:black"> <span style="color:red">Type<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.String&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong>(local)\ExampleSQL</strong><span style="color:blue">&lt;/Property&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- The database to be used is named ExampleDB. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Property<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;RdbConnection Initial Catalog&quot;</strong><span style="color:black"> <span style="color:red">Type<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.String&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong>ExampleDB</strong><span style="color:blue">&lt;/Property&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- The database instance is using integrated security. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Property<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;RdbConnection Integrated Security&quot;</strong><span style="color:black"> <span style="color:red">Type<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.String&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong>SSPI</strong><span style="color:blue">&lt;/Property&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/Properties&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/LobSystemInstance&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/LobSystemInstances&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Entities&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Entity<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;Customer&quot;</strong><span style="color:black"> <span style="color:red">Namespace<span style="color:black">=<span style="color:#8000ff"><strong>&quot;example.com&quot;</strong><span style="color:black"> <span style="color:red">Version<span style="color:black">=<span style="color:#8000ff"><strong>&quot;1.0.0.0&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Identifiers&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Identifier<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;CustomerIdentifier&quot;</strong><span style="color:black"> <span style="color:red">TypeName<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.Int32&quot;</strong><span style="color:black"> <span style="color:blue">/&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/Identifiers&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Methods&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Method<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;GetCustomers&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Properties&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- sp_getCustomer is the name of the stored procedure that implements this method. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Property<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;RdbCommandText&quot;</strong><span style="color:black"> <span style="color:red">Type<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.String&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong>sp_GetCustomers</strong><span style="color:blue">&lt;/Property&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- Using stored procedures is a best practice when connecting to database systems. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Property<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;RdbCommandType&quot;</strong><span style="color:black"> <span style="color:red">Type<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.Data.CommandType, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong>StoredProcedure</strong><span style="color:blue">&lt;/Property&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/Properties&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Parameters&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- The parameter name @CustomerId as expected by the stored procedure. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Parameter<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;@CustomerId&quot;</strong><span style="color:black"> <span style="color:red">Direction<span style="color:black">=<span style="color:#8000ff"><strong>&quot;In&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- The IdentifierName attribute is required here. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;TypeDescriptor<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;Id&quot;</strong><span style="color:black"> <span style="color:red">TypeName<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.Int32&quot;</strong><span style="color:black"> <span style="color:red">IdentifierName<span style="color:black">=<span style="color:#8000ff"><strong>&quot;CustomerIdentifier&quot;</strong><span style="color:black"> <span style="color:blue">/&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/Parameter&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Parameter<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;Customers&quot;</strong><span style="color:black"> <span style="color:red">Direction<span style="color:black">=<span style="color:#8000ff"><strong>&quot;Return&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- This SQL command returns a result set containing precisely one row, but it is still wrapped by a data reader and appears as a collection. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;TypeDescriptor<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;CustomerDataReader&quot;</strong><span style="color:black"> <span style="color:red">TypeName<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.Data.SqlClient.SqlDataReader, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;</strong><span style="color:black"> <span style="color:red">IsCollection<span style="color:black">=<span style="color:#8000ff"><strong>&quot;true&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;TypeDescriptors&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- This is a data record corresponding to a single row of the result set. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;TypeDescriptor<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;Customer&quot;</strong><span style="color:black"> <span style="color:red">TypeName<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.Data.IDataRecord, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;TypeDescriptors&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- The IdentifierName attribute is required here to associate the field with the Identifier. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;TypeDescriptor<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;Id&quot;</strong><span style="color:black"> <span style="color:red">TypeName<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.Int32&quot;</strong><span style="color:black"> <span style="color:red">IdentifierName<span style="color:black">=<span style="color:#8000ff"><strong>&quot;CustomerIdentifier&quot;</strong><span style="color:black"> <span style="color:blue">/&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;TypeDescriptor<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;FirstName&quot;</strong><span style="color:black"> <span style="color:red">TypeName<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.String&quot;</strong><span style="color:black"> <span style="color:blue">/&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;TypeDescriptor<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;LastName&quot;</strong><span style="color:black"> <span style="color:red">TypeName<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.String&quot;</strong><span style="color:black"> <span style="color:blue">/&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/TypeDescriptors&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/TypeDescriptor&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/TypeDescriptors&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/TypeDescriptor&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/Parameter&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/Parameters&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;MethodInstances&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- The ReturnParameterName and ReturnTypeDescriptor are pointing to the data record to be returned. The result set that is wrapping it is not important and can be ignored when processing results. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;MethodInstance<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;GetCustomer&quot;</strong><span style="color:black"> <span style="color:red">Type<span style="color:black">=<span style="color:#8000ff"><strong>&quot;SpecificFinder&quot;</strong><span style="color:black"> <span style="color:red">ReturnParameterName<span style="color:black">=<span style="color:#8000ff"><strong>&quot;Customers&quot;</strong><span style="color:black"> <span style="color:red">ReturnTypeDescriptorPath<span style="color:black">=<span style="color:#8000ff"><strong>&quot;CustomerDataReader[0]&quot;</strong><span style="color:blue">/&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/MethodInstances&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/Method&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/Methods&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/Entity&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/Entities&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/LobSystem&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/LobSystems&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="font-family:courier new;color:blue;font-size:10pt"><span style="background-color:white">&lt;/Model&gt;</span> </span></p>
<p>N'ayez pas peur, normalement vous n'aurez pas à le faire à la main si vous travaillez avec SharePoint 2010, voici la documentation du schéma complet <a href="http://msdn.microsoft.com/en-us/library/ee556387.aspx">http://msdn.microsoft.com/en-us/library/ee556387.aspx</a> </p>
<p>Dans ce simple exemple on a tout d'abord : </p>
<p>Le Model qui permet de définir l'élément racine du XML et le nom de notre BCS. </p>
<p><span style="background-color:white;font-family:courier new;color:blue;font-size:10pt">&lt;Model<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;ExampleApplicationDefinition&quot;</strong><span style="color:black"> <span style="color:red">xmlns<span style="color:black">=<span style="color:#8000ff"><strong>&quot;http://schemas.microsoft.com/windows/2007/BusinessDataCatalog&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></p>
<p> </p>
<p>Ensuite nous avons les informations global a notre lobsystem et lobsysteminstance ces éléments sont un peu comme une classe application, ils définissent des éléments et des propriétés communes a l'ensemble du BCS, le lobsystem englobe la totalité du BCS et il est lui-même inclut dans le Model. </p>
<p><span style="background-color:white;font-family:courier new;color:blue;font-size:10pt">&lt;LobSystem<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;ExampleCRM&quot;</strong><span style="color:black"> <span style="color:red">Type<span style="color:black">=<span style="color:#8000ff"><strong>&quot;Database&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Properties&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- This database uses % symbol for the LIKE operator. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Property<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;WildcardCharacter&quot;</strong><span style="color:black"> <span style="color:red">Type<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.String&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong>%</strong><span style="color:blue">&lt;/Property&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/Properties&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;LobSystemInstances&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;LobSystemInstance<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;ExampleServer&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Properties&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Property<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;AuthenticationMode&quot;</strong><span style="color:black"> <span style="color:red">Type<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.String&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong>PassThrough</strong><span style="color:blue">&lt;/Property&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- The database instance is named ExampleSQL and is running on the same computer as the application using this Model. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Property<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;RdbConnection Data Source&quot;</strong><span style="color:black"> <span style="color:red">Type<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.String&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong>(local)\ExampleSQL</strong><span style="color:blue">&lt;/Property&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- The database to be used is named ExampleDB. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Property<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;RdbConnection Initial Catalog&quot;</strong><span style="color:black"> <span style="color:red">Type<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.String&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong>ExampleDB</strong><span style="color:blue">&lt;/Property&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- The database instance is using integrated security. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Property<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;RdbConnection Integrated Security&quot;</strong><span style="color:black"> <span style="color:red">Type<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.String&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong>SSPI</strong><span style="color:blue">&lt;/Property&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/Properties&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/LobSystemInstance&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="color:black"><span style="background-color:white;font-family:courier new;font-size:10pt"><strong></strong><span style="color:blue">&lt;/LobSystemInstances&gt;</span></span> </span></p>
<p>Ensuite les entities correspondent à ceux qu'on peut appeler les External Content Type, c'est un peu comme les tables ou vues dans SQL Server. </p>
<p><span style="background-color:white;font-family:courier new;color:blue;font-size:10pt">&lt;Entities&gt;<span style="color:black"><strong> </strong></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Entity<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;Customer&quot;</strong><span style="color:black"> <span style="color:red">Namespace<span style="color:black">=<span style="color:#8000ff"><strong>&quot;example.com&quot;</strong><span style="color:black"> <span style="color:red">Version<span style="color:black">=<span style="color:#8000ff"><strong>&quot;1.0.0.0&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Identifiers&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Identifier<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;CustomerIdentifier&quot;</strong><span style="color:black"> <span style="color:red">TypeName<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.Int32&quot;</strong><span style="color:black"> <span style="color:blue">/&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/Identifiers&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p> </p>
<p>Dans nos entities on a des méthodes qui définissent un modèle de méthodes comme un select all ou un select by id ou l'appel a une procédure stockées ou une fonction .net avec des paramètres en entrée et des paramètres en sortie. </p>
<p style="margin-left:36pt"><span style="background-color:white;font-family:courier new;color:blue;font-size:10pt">&lt;Methods&gt;<span style="color:black"><strong> </strong></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Method<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;GetCustomers&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Properties&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- sp_getCustomer is the name of the stored procedure that implements this method. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Property<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;RdbCommandText&quot;</strong><span style="color:black"> <span style="color:red">Type<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.String&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong>sp_GetCustomers</strong><span style="color:blue">&lt;/Property&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- Using stored procedures is a best practice when connecting to database systems. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Property<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;RdbCommandType&quot;</strong><span style="color:black"> <span style="color:red">Type<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.Data.CommandType, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong>StoredProcedure</strong><span style="color:blue">&lt;/Property&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/Properties&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p style="margin-left:72pt"><span style="background-color:white;font-family:courier new;color:blue;font-size:10pt">&lt;Parameters&gt;<span style="color:black"><strong> </strong></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- The parameter name @CustomerId as expected by the stored procedure. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;Parameter<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;@CustomerId&quot;</strong><span style="color:black"> <span style="color:red">Direction<span style="color:black">=<span style="color:#8000ff"><strong>&quot;In&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- The IdentifierName attribute is required here. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;TypeDescriptor<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;Id&quot;</strong><span style="color:black"> <span style="color:red">TypeName<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.Int32&quot;</strong><span style="color:black"> <span style="color:red">IdentifierName<span style="color:black">=<span style="color:#8000ff"><strong>&quot;CustomerIdentifier&quot;</strong><span style="color:black"> <span style="color:blue">/&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/Parameter&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p> </p>
<p>Ces paramètres sont décrits suivant des types simples ou combiné pour créer des types complexes en retour. </p>
<p style="margin-left:36pt"><span style="background-color:white;font-family:courier new;color:blue;font-size:10pt">&lt;Parameter<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;Customers&quot;</strong><span style="color:black"> <span style="color:red">Direction<span style="color:black">=<span style="color:#8000ff"><strong>&quot;Return&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- This SQL command returns a result set containing precisely one row, but it is still wrapped by a data reader and appears as a collection. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;TypeDescriptor<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;CustomerDataReader&quot;</strong><span style="color:black"> <span style="color:red">TypeName<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.Data.SqlClient.SqlDataReader, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;</strong><span style="color:black"> <span style="color:red">IsCollection<span style="color:black">=<span style="color:#8000ff"><strong>&quot;true&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;TypeDescriptors&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- This is a data record corresponding to a single row of the result set. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;TypeDescriptor<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;Customer&quot;</strong><span style="color:black"> <span style="color:red">TypeName<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.Data.IDataRecord, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&quot;</strong><span style="color:blue">&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;TypeDescriptors&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- The IdentifierName attribute is required here to associate the field with the Identifier. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;TypeDescriptor<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;Id&quot;</strong><span style="color:black"> <span style="color:red">TypeName<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.Int32&quot;</strong><span style="color:black"> <span style="color:red">IdentifierName<span style="color:black">=<span style="color:#8000ff"><strong>&quot;CustomerIdentifier&quot;</strong><span style="color:black"> <span style="color:blue">/&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;TypeDescriptor<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;FirstName&quot;</strong><span style="color:black"> <span style="color:red">TypeName<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.String&quot;</strong><span style="color:black"> <span style="color:blue">/&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;TypeDescriptor<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;LastName&quot;</strong><span style="color:black"> <span style="color:red">TypeName<span style="color:black">=<span style="color:#8000ff"><strong>&quot;System.String&quot;</strong><span style="color:black"> <span style="color:blue">/&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/TypeDescriptors&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/TypeDescriptor&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/TypeDescriptors&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/TypeDescriptor&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/Parameter&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/Parameters&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p> </p>
<p>Ces méthodes sont appelées dans le cadre de méthodes instance qui elles définissent s'il faut les appeler en cas de Finder ou SpecificFinder etc… </p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;MethodInstances&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:green">&lt;!-- The ReturnParameterName and ReturnTypeDescriptor are pointing to the data record to be returned. The result set that is wrapping it is not important and can be ignored when processing results. --&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;MethodInstance<span style="color:black"> <span style="color:red">Name<span style="color:black">=<span style="color:#8000ff"><strong>&quot;GetCustomer&quot;</strong><span style="color:black"> <span style="color:red">Type<span style="color:black">=<span style="color:#8000ff"><strong>&quot;SpecificFinder&quot;</strong><span style="color:black"> <span style="color:red">ReturnParameterName<span style="color:black">=<span style="color:#8000ff"><strong>&quot;Customers&quot;</strong><span style="color:black"> <span style="color:red">ReturnTypeDescriptorPath<span style="color:black">=<span style="color:#8000ff"><strong>&quot;CustomerDataReader[0]&quot;</strong><span style="color:blue">/&gt;<span style="color:black"><strong> </strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="background-color:white;font-family:courier new;color:black;font-size:10pt"><strong></strong><span style="color:blue">&lt;/MethodInstances&gt;<span style="color:black"><strong> </strong></span></span></span></p>
<p> </p>
<h1>Les Limitations </h1>
<p>Cependant, Il est important de comprendre les limites des External list : </p>
<p>-Pas de versionning, ce qui est normal puisque les données sont stockées dans la base de données pas dans SharePoint, il serait donc impossible de gérer le versionning </p>
<p>-Pas de Information Management Policy, ce qui est aussi normal puisqu'on ne va pas pouvoir demander à stocker les informations autre part </p>
<p>-Pas de workflow en out of the box, mais on verra comment contourner ce problème </p>
<p>-Pas d'inline editing (la moi pas comprendre), en effet cela est techniquement possible </p>
<p>-Pas de Rating </p>
<p>-Impossible d'exporter en Excel ou d'ouvrir avec Visio, Access ou Project. (<a href="http://exportexternallist.codeplex.com/">http://exportexternallist.codeplex.com/</a> export vers excel) </p>
<p>-Pas d'accès Rest avec ListData.svc </p>
<p>-Pas de flux RSS </p>
<p>-Pas de permission niveau item (ou pas on verra comment contourner le problème) </p>
<p>-Pas de lookup </p>
<p>-Pas d'attachements </p>
<p>Certaine limite sont assez normale, SharePoint gère ses enregistrements et il connait ceux qui sont supprimés, mis à jours etc… Comment peut-il avoir la même flexibilité avec des données externes comme SQL Serveur, WCF qui, par définition peuvent être mis à jours sans que SharePoint n'en soit conscient. Prenons le flux RSS, il affiche les dernières informations donc les derniers enregistrements, comment SharePoint peut savoir quelles sont les dernières lignes ajoutées dans une base de données ? On pourrait dire dans ce cas on met une colonne ou une information « dernière mise a jours » mais cela devient une contrainte sur un environnement existant sur lequel on souhaite s'intégrer. </p>
<p> </p>
<h1>Référence </h1>
<p> </p>
<p><a href="http://msdn.microsoft.com/fr-fr/sharepoint/ff660755">http://msdn.microsoft.com/fr-fr/sharepoint/ff660755</a> </p>
<p><a href="http://msdn.microsoft.com/en-us/library/ee558376.aspx">http://msdn.microsoft.com/en-us/library/ee558376.aspx</a> </p>
<p><a href="http://msdn.microsoft.com/en-us/library/ee556387.aspx">http://msdn.microsoft.com/en-us/library/ee556387.aspx</a> </p>
<p><a href="http://www.sharepointanalysthq.com/2010/07/bcs-external-list-limitations/">http://www.sharepointanalysthq.com/2010/07/bcs-external-list-limitations/</a> </p>
<p> </p></div>
</div>
<div><b>Catégorie:</b> <a onclick="OpenPopUpPage('http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=3&RootFolder=*', RefreshPage); return false;" href="http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=3&RootFolder=*">SharePoint 2010</a></div>
<div><b>Publié:</b> 16/12/2011 08:37</div>
]]></description>
      <author>Xavier VANNESTE</author>
      <category>SharePoint 2010</category>
      <pubDate>Fri, 16 Dec 2011 07:37:04 GMT</pubDate>
      <guid isPermaLink="true">http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=88</guid>
    </item>
    <item>
      <title>[SharePoint 2010] BCS Partie 2: SharePoint Designer</title>
      <link>http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=89</link>
      <description><![CDATA[<div><b>Corps:</b> <div class="ExternalClass6DB74C18F28F4018BE790321F1155120"><h1>Série D'articles: </h1>
<ul><li><a href="/Lists/Billets/Post.aspx?ID=88">[SharePoint 2010] BCS Partie 1: Qu'est-ce que c'est ?</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=89">[SharePoint 2010] BCS Partie 2: SharePoint Designer</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=90">[SharePoint 2010] BCS Partie 3: Les Associations</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=99">[SharePoint 2010] BCS Partie 4: Visual Studio 2010</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=100">[SharePoint 2010] BCS Partie 5: Visual Studio 2010 les associations</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=93">[SharePoint 2010] BCS Partie 6: Visual Studio 2010 et le Streamer</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=94">[SharePoint 2010] BCS Partie 7: Visual Studio et le security Trimming</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=95">[SharePoint 2010] BCS Partie 8: Visual Studio 2010 et L'indexation</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=96">[SharePoint 2010] BCS Partie 9: Repensons l'indexation</a> </li></ul>
<h1>Introduction </h1>
<p>Comme nous avons pu le voir dans la partie 1, faire un BCS n'est pas simple. Nous aborderons ici la création d'un BCS sur une base de données, dans un premier temps sans le Secure Store puis nous utiliserons le Secure store pour faire une authentification SQL au lieu d'une authentification Windows. </p>
<p>Dans l'article suivant nous verrons les associations entre les entités directement dans SharePoint Designer. La base de données qui sera utilisée est la base de données AdventureWorks. Nous aborderons aussi les limitations et la création de liste externe. Nous verrons l'étendue de ce qui est fait avec SharePoint Designer et comment utiliser ce qui a été généré pour faire un déploiement sur une autre machine pour passer de Test a UAT ou de UAT a Prod par exemple. </p>
<h1>SharePoint Designer </h1>
<p>Commençons par regarder les deux tables que l'on va utiliser : </p>
<p>La table Production.Product </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint21.png" alt="" /> </p>
<p>La table Person.Contact </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint22.png" alt="" /> </p>
<h2>Table Product </h2>
<p>La première chose à faire est d'ouvrir le site sur lequel on veut déployer le BCS. Au niveau de SharePoint Designer il y a un paradoxe, qui, on le verra plus tard à cause d'un bug, se produit aussi avec Visual Studio, en effet on crée un BCS qui est censé être déployé de manière globale dans le BCS Service Application, et la première chose qu'on nous demande, c'est le nom d'un site. </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint23.png" alt="" /> </p>
<p>Dans SharePoint designer on sélectionne External Content Type (Si vous en avez déjà de définit ils apparaitront à ce niveau-là). </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint24.png" alt="" /> </p>
<p>On va en ajouter un qu'on appellera AdventureWorks. Pour cela on clique sur External Content Type en haut à droite : </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint25.png" alt="" /> </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint26.png" alt="" /> </p>
<p>On va le renommer en client sur « New External Content Type » à coté de Name et on met AdventureWorks, on fait de même pour le NameSpace : </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint27.png" alt="" /> </p>
<p>Pour cette table on va utiliser une Generic List et autoriser la synchronisation OffLine. Ensuite on clique sur « Click Here to discover external data sources…. » </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint28.png" alt="" /> </p>
<p>On n'a plus qu'à ajouter notre connexion : </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint29.png" alt="" /> </p>
<p>Bien entendu les paramètres sont à mettre à jours en fonction de votre environnement. </p>
<p>Ensuite on sélectionne product et on clique sur Create All Operations : </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint210.png" alt="" /> </p>
<p>Comme on peut voir on va créer un Create/Read Item/Update/Delete/Read List, on est bien dans un model CRUD. </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint211.png" alt="" /> </p>
<p>On va aussi sélectionner que quelque colonne comme datapicker afin que les colonnes techniques (foreign key, primary key etc…) ne viennent pas polluer ce qui sera affiché à l'utilisateur: </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint212.png" alt="" /> </p>
<p>Les colonnes choisies sont Name, ProductNumber, Color, SafetyStockLevel, ReorderPoint, StandardCost, Size, Weight, SellStartDate et SellEndDate. On verifie bien entendu que l'identifier ProductID a la propriété Map To Identifier de cochée. </p>
<p>On ne va pas mettre de filtre maintenant, on clique sur Finish : </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint213.png" alt="" /> </p>
<p>A droite on peut voir l'ensemble des fonctions crées. </p>
<p>On retourne sur AdventureWorks : </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint214.png" alt="" /> </p>
<p>On va cliquer sur Create List and form, si un warning demandant d'enregistrer l'external content type apparait il suffit de l'enregistrer, on ne va pas créer les formulaires infopath. </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint215.png" alt="" /> </p>
<p>Dans SharePoint notre external list existe : </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint216.png" alt="" /> </p>
<h2>Table Contact </h2>
<p>On va refaire la même chose avec l'autre table et le type sera Contact, on recrée un External Content type : </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint217.png" alt="" /> </p>
<p>On va créer les opérations en lecture : </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint218.png" alt="" /> </p>
<p> </p>
<p> </p>
<p> </p>
<p>Dans le wizard du read item on doit mapper les propriétés de la table a des propriétés offices : </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint219.png" alt="" /> </p>
<p>On mappe Title avec Title, FirstName avec First Name, MiddleName avec Middle Name, LastName avec Last Name, EmailAddress avec Email 1 Address, Phone avec primary Telephone Number, suffix avec suffixe. On va aussi checker la propriété Show in Picker pour les colonnes qu'on a mappées. </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint220.png" alt="" /> </p>
<p>Pour le ReadList on crée un filtre : </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint221.png" alt="" /> </p>
<p>Qu'on limit a 1000 car le throttle ne permet que 2000 element d'etre retourné de la DB. </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint222.png" alt="" /> </p>
<p>On crée la liste AdventureWorksContact: </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint223.png" alt="" /> </p>
<p> </p>
<p>Et voici le résultat : </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint224.png" alt="" /> </p>
<h2>Résultat </h2>
<p>Penchons-nous sur ce que l'on a. </p>
<p>On a deux connecteurs sur table de base de données. Ces connecteurs affichent les données dans SharePoint et « donne » l'impression que les données sont dans SharePoint. </p>
<p>Si l'on va dans le Business Connectivity Services de Sharepoint au niveau de l'administration central on retrouve nos external content type : </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint225.png" alt="" /> </p>
<p>Même si on ne l'a pas fait avec SharePoint Designer il est possible de créer des Default Action : </p>
<p>Cliquer sur Configure et mettez l'url par defaut du site qui va héberger le BCS : </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint226.png" alt="" /> </p>
<p>Cliquez sur Create/Upgrade : </p>
<p> </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint227.png" alt="" /> </p>
<p> </p>
<p>La page de profil par défaut : </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint228.png" alt="" /> </p>
<p> </p>
<p>On a aussi la possibilité de les indexer et de les inclure dans le moteur de recherche de SharePoint, dans les BDC nos deux external content type sont regroupés dans l'External System adventureWorks : </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint229.png" alt="" /> </p>
<p>On peut indexer le LOB (Line Of Business) en créant une nouvelle content source dans SharePoint (Fast ou SharePoint) : </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint230.png" alt="" /> </p>
<p>Au niveau des clients offices: </p>
<p>Outlook </p>
<p>Un VSTO est créé et envoyé au client pour installation : </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint231.png" alt="" /> </p>
<p>Dans Outlook voilà le résultat pour les contacts. </p>
<p><img src="/Lists/Photos/121611_0738_SharePoint232.png" alt="" /> </p>
<h1>Conclusion </h1>
<p>Les choses sont simples et belles MAIS dans la vie de tous les jours c'est rarement aussi simple, que se passe-t-il maintenant si en plus des produits vous voulez la catégorie des produits et pouvoir les regrouper par catégories ? ou alors vous voulez les ventes ou les types de contacts etc…. c'est ce qu'on verra dans l'article suivant avec les associations</p></div>
</div>
<div><b>Catégorie:</b> <a onclick="OpenPopUpPage('http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=3&RootFolder=*', RefreshPage); return false;" href="http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=3&RootFolder=*">SharePoint 2010</a></div>
<div><b>Publié:</b> 16/12/2011 08:37</div>
]]></description>
      <author>Xavier VANNESTE</author>
      <category>SharePoint 2010</category>
      <pubDate>Fri, 16 Dec 2011 07:37:13 GMT</pubDate>
      <guid isPermaLink="true">http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=89</guid>
    </item>
    <item>
      <title>[SharePoint 2010] BCS Partie 4: Visual Studio 2010</title>
      <link>http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=99</link>
      <description><![CDATA[<div><b>Corps:</b> <div class="ExternalClass891E197834D74968BA4C24655DC4581F"><h1>Série D'articles: </h1>
<ul><li><a href="/Lists/Billets/Post.aspx?ID=88">[SharePoint 2010] BCS Partie 1: Qu'est-ce que c'est ?</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=89">[SharePoint 2010] BCS Partie 2: SharePoint Designer</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=90">[SharePoint 2010] BCS Partie 3: Les Associations</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=99">[SharePoint 2010] BCS Partie 4: Visual Studio 2010</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=100">[SharePoint 2010] BCS Partie 5: Visual Studio 2010 les associations</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=93">[SharePoint 2010] BCS Partie 6: Visual Studio 2010 et le Streamer</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=94">[SharePoint 2010] BCS Partie 7: Visual Studio et le security Trimming</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=95">[SharePoint 2010] BCS Partie 8: Visual Studio 2010 et L'indexation</a> </li>
<li><a href="/Lists/Billets/Post.aspx?ID=96">[SharePoint 2010] BCS Partie 9: Repensons l'indexation</a> </li></ul>
<h1>Introduction </h1>
<p>J'ai beaucoup utilisé les BDC dans SharePoint 2007, il est clair que l'édition de fichiers XML était loin d'être la chose que j'appréciais le plus. Lorsque j'ai abordé les BCS avec SharePoint 2010 (pendant des BDC de SharePoint 2007) j'ai été ravi de voir qu'un éditeur BCS était présent dans Visual Studio. Puis ma joie a fait place à la déception. En effet il ne faut pas vous attendre à un éditeur qui fasse tout, il est là pour vous aider mais en aucune manière il est possible d'accéder au BCS sans connaitre le schéma BDCM. Par exemple l'éditeur de Visual Studio n'offre pas d'assistant directement vers SQL Server, ou une autre base de données ou même WCF. Tout doit être fait à la main. </p>
<p> </p>
<h1>L'application </h1>
<p>L'application est simple, votre entreprise a fait le choix d'un ECM qui s'appelle RISE (ndlr : ce CMS est disponible dans la galerie Visual Studio). </p>
<p><img src="/Lists/Photos/011812_1545_SharePoint21.png" alt="" /> </p>
<p>Dans ce CMS pour l'administration de votre société certains documents ont été publiés. La demande est de créer un connecteur entre ce CMS et SharePoint. Vous avez donc la responsabilité de développer le connecteur. </p>
<p>Il peut être relativement aisé de développer une web part vers le CMS. Mais, on le verra à travers les différents articles, le fait de le faire par un BCS offrira beaucoup d'avantage non négligeable. On abordera aussi les limites de l'éditeur. </p>
<h1>Création du projet </h1>
<p>Dans Visual Studio on prendra le type de projet Business Data Connectivity Model : </p>
<p><img src="/Lists/Photos/011812_1545_SharePoint22.png" alt="" /> </p>
<p><img src="/Lists/Photos/011812_1545_SharePoint23.png" alt="" /> </p>
<p>Une fois le projet créé l'éditeur s'ouvre sur le model BDCM. </p>
<p><img src="/Lists/Photos/011812_1545_SharePoint24.png" alt="" /> </p>
<p>C'est ici qu'on va travailler le plus pour la configuration, pour le code on a deux class qui sont créés, Entity1 qui représente les données renvoyées, c'est entity1 qui représente le schéma du type de contenu, l'ensemble des champs de votre external content type correspondra à l'ensemble des propriétés de votre entité qui seront mappé dans le schéma BDCM. Ensuite on a Entity1Service qui représentes le chargement des données tous simplement. </p>
<p>On va commencer par donner des noms plus user friendly. </p>
<p><img src="/Lists/Photos/011812_1545_SharePoint25.png" alt="" /> </p>
<p>On va mettre RiseDocument à la place de « Entity1 » car on va remplir les entités en partant des tables Document et Content du CMS Rise. </p>
<p>La classe ainsi obtenue RiseDocument contiendra une propriété par champs pertinent de la table: </p>
<p>Voici le schéma des deux tables : </p>
<p><img src="/Lists/Photos/011812_1545_SharePoint26.png" alt="" /> </p>
<p><img src="/Lists/Photos/011812_1545_SharePoint27.png" alt="" /> </p>
<p>Voici le code de la classe RiseDocument </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Collections.Generic; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Linq; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Text; </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">namespace</span> BDCRiseCMS.BdcModel1 </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> This class contains the properties for Entity1. The properties keep the data for Entity1.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> If you want to rename the class, don't forget to rename the entity in the model xml as well.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;/summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">partial</span> <span style="color:blue">class</span> <span style="color:#2b91af">RiseDocument</span> </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:green">//TODO: Implement additional properties here. The property Message is just a sample how a property could look like.</span> </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">long</span> DocID { <span style="color:blue">get</span>; <span style="color:blue">set</span>; } </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">string</span> MimeType { <span style="color:blue">get</span>; <span style="color:blue">set</span>; } </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">string</span> Title { <span style="color:blue">get</span>; <span style="color:blue">set</span>; } </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">string</span> Description { <span style="color:blue">get</span>; <span style="color:blue">set</span>; } </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">string</span> Langue { <span style="color:blue">get</span>; <span style="color:blue">set</span>; } </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">string</span> site { <span style="color:blue">get</span>; <span style="color:blue">set</span>; } </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">byte</span>[] Content { <span style="color:blue">get</span>; <span style="color:blue">set</span>; } </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p>Voici le code de la classe RiseDocumentService </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Collections.Generic; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Linq; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Text; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Data.SqlClient; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> System.Data; </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">namespace</span> BDCRiseCMS.BdcModel1 </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> All the methods for retrieving, updating and deleting data are implemented in this class file.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> The samples below show the finder and specific finder method for Entity1.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;/summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">class</span> <span style="color:#2b91af">RiseDocumentService</span> </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> This is a sample specific finder method for Entity1.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> If you want to delete or rename the method think about changing the xml in the BDC model file as well.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;/summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;param name=&quot;id&quot;&gt;&lt;/param&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;returns&gt;<span style="color:green">Entity1<span style="color:gray">&lt;/returns&gt;</span> </span></span></span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> </span></span></span></p>
<p> </p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">private</span> <span style="color:blue">static</span> <span style="color:#2b91af">SqlConnection</span> getSQLConnection() </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">SqlConnection</span> _cnData; </span></p>
<p><span style="font-family:consolas;font-size:9pt">_cnData = <span style="color:blue">new</span> <span style="color:#2b91af">SqlConnection</span>(<span style="color:#a31515">&quot;Data Source=srvsql; Initial Catalog=CMSRise;User ID=SA; Password=P@ssw0rd;&quot;</span>); </span></p>
<p><span style="font-family:consolas;font-size:9pt">_cnData.Open(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">return</span> _cnData; </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">static</span> <span style="color:#2b91af">RiseDocument</span> ReadItem(<span style="color:blue">long</span> docID) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">RiseDocument</span> rd = <span style="color:blue">new</span> <span style="color:#2b91af">RiseDocument</span>(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> (<span style="color:#2b91af">SqlConnection</span> cndata = getSQLConnection()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> (<span style="color:#2b91af">SqlCommand</span> cmdata = <span style="color:blue">new</span> <span style="color:#2b91af">SqlCommand</span>()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.Connection = cndata; </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.CommandText = <span style="color:#a31515">&quot;SELECT t_cms_u_Document.c_id, t_cms_u_Document.c_u_MimeType, &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;t_cms_u_Document.c_u_Data, t_cms_u_Content.c_u_Title, t_cms_u_Content.c_u_Description, &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;t_cms_u_Content.c_u_Language, t_cms_u_Site.c_u_Name &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;FROM t_cms_u_Content INNER JOIN t_cms_u_Document ON t_cms_u_Content.c_id = t_cms_u_Document.c_r_Content &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;INNER JOIN t_cms_u_Site ON t_cms_u_Content.c_r_Site = t_cms_u_Site.c_id where t_cms_u_Document.c_id=@docID&quot;</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.Parameters.AddWithValue(<span style="color:#a31515">&quot;@docID&quot;</span>, docID); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">SqlDataReader</span> drData = cmdata.ExecuteReader(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">if</span> (drData.Read()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.DocID = drData.GetInt64(0); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.MimeType = drData.GetString(1); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Content = (<span style="color:blue">byte</span>[])drData.GetValue(2); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Title = drData.GetString(3); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Description = drData.GetString(4); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Langue = drData.GetString(5); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.site = drData.GetString(6); </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">else</span> </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.DocID = -1; </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.MimeType = <span style="color:#a31515">&quot;&quot;</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Content = <span style="color:blue">null</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Title = <span style="color:#a31515">&quot;&quot;</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Description = <span style="color:#a31515">&quot;&quot;</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Langue = <span style="color:#a31515">&quot;&quot;</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.site = <span style="color:#a31515">&quot;&quot;</span>; </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">return</span> rd; </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> This is a sample finder method for Entity1.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> If you want to delete or rename the method think about changing the xml in the BDC model file as well.</span> </span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;/summary&gt;</span> </span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:gray">///<span style="color:green"> <span style="color:gray">&lt;returns&gt;<span style="color:green">IEnumerable of Entities<span style="color:gray">&lt;/returns&gt;</span> </span></span></span></span></span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">public</span> <span style="color:blue">static</span> <span style="color:#2b91af">IEnumerable</span>&lt;<span style="color:#2b91af">RiseDocument</span>&gt; ReadList() </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">List</span>&lt;<span style="color:#2b91af">RiseDocument</span>&gt; rds = <span style="color:blue">new</span> <span style="color:#2b91af">List</span>&lt;<span style="color:#2b91af">RiseDocument</span>&gt;(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> (<span style="color:#2b91af">SqlConnection</span> cndata = getSQLConnection()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">using</span> (<span style="color:#2b91af">SqlCommand</span> cmdata = <span style="color:blue">new</span> <span style="color:#2b91af">SqlCommand</span>()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.Connection = cndata; </span></p>
<p><span style="font-family:consolas;font-size:9pt">cmdata.CommandText = <span style="color:#a31515">&quot;SELECT t_cms_u_Document.c_id, t_cms_u_Document.c_u_MimeType, &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;t_cms_u_Document.c_u_Data, t_cms_u_Content.c_u_Title, t_cms_u_Content.c_u_Description, &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;t_cms_u_Content.c_u_Language, t_cms_u_Site.c_u_Name &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;FROM t_cms_u_Content INNER JOIN t_cms_u_Document ON t_cms_u_Content.c_id = t_cms_u_Document.c_r_Content &quot;</span> + </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#a31515">&quot;INNER JOIN t_cms_u_Site ON t_cms_u_Content.c_r_Site = t_cms_u_Site.c_id&quot;</span>; </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">SqlDataReader</span> drData = cmdata.ExecuteReader(); </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">while</span> (drData.Read()) </span></p>
<p><span style="font-family:consolas;font-size:9pt">{ </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:#2b91af">RiseDocument</span> rd = <span style="color:blue">new</span> <span style="color:#2b91af">RiseDocument</span>(); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.DocID = drData.GetInt64(0); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.MimeType = drData.GetString(1); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Content = (<span style="color:blue">byte</span>[])drData.GetValue(2); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Title = drData.GetString(3); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Description = drData.GetString(4); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.Langue = drData.GetString(5); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rd.site = drData.GetString(6); </span></p>
<p><span style="font-family:consolas;font-size:9pt">rds.Add(rd); </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt"><span style="color:blue">return</span> rds; </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p><span style="font-family:consolas;font-size:9pt">} </span></p>
<p> </p>
<p>On va changer aussi le nom ET le type de l'identifier de notre entity RiseDocument : </p>
<p><img src="/Lists/Photos/011812_1545_SharePoint28.png" alt="" /> </p>
<p><img src="/Lists/Photos/011812_1545_SharePoint29.png" alt="" /> </p>
<h1>Le BDC Explorer </h1>
<p>Lorsque le model BCS est ouvert (et uniquement dans ce cas) une fenêtre apparait, le BDC Explorer : </p>
<p><img src="/Lists/Photos/011812_1545_SharePoint210.png" alt="" /> </p>
<p>Il peut être très pratique de mettre la fenêtre des propriétés en dessous du BDC Explorer, il sera ainsi plus facile de travailler avec les type descriptor, On renomme le model pour avoir des noms plus simple : </p>
<p><img src="/Lists/Photos/011812_1545_SharePoint211.png" alt="" /> </p>
<p>Pour cela on va utiliser la fenêtre des propriétés pour renommer les model. </p>
<p><img src="/Lists/Photos/011812_1545_SharePoint212.png" alt="" /> </p>
<h2>Pour la methode ReadItem() : </h2>
<p>On renomme l'identifier1 en DocID et les entités en dessous de returnparameter pour coller EXACTEMENT a ce que contient la classe RiseDocument, On ajoute des propriétés (ou type descriptor dans le cas du BDCExplorer) en faisant un clique avec le bouton droit et Add Type Descriptor : </p>
<p><img src="/Lists/Photos/011812_1545_SharePoint213.png" alt="" /> </p>
<p>Voici a quoi correspond notre entité : </p>
<p><img src="/Lists/Photos/011812_1545_SharePoint214.png" alt="" /> </p>
<p>Il faut bien paramétrer les TypeDescriptor (Nom et Type). </p>
<p>Une fois la partie ReadItem faites on va copier/coller l'entité DocRise en dessous de DocRiseList : </p>
<p><img src="/Lists/Photos/011812_1545_SharePoint215.png" alt="" /> </p>
<p><img src="/Lists/Photos/011812_1545_SharePoint216.png" alt="" /> </p>
<p><img src="/Lists/Photos/011812_1545_SharePoint217.png" alt="" /> </p>
<p>Voici le résultat final : </p>
<p><img src="/Lists/Photos/011812_1545_SharePoint218.png" alt="" /> </p>
<h1><span style="font-size:11pt">Quand on a terminé on lance le débuggueur, si vous avez mis des points d'arrêt dans le code ils apparaitront sur la page de profil. </span></h1>
<p>Voici ce qu'on a dans la service application Business Data Service : </p>
<p><img src="/Lists/Photos/011812_1545_SharePoint219.png" alt="" /> </p>
<p>On retrouve RiseDocument, on va créer la page de profile en cochant la case à côté de RiseDocument et en cliquen sur Create/Upgrade : </p>
<p><img src="/Lists/Photos/011812_1545_SharePoint220.png" alt="" /> </p>
<p>On clique sur OK </p>
<p>Ensuite on va sur la page de profil en remplaçant {0} dans l'url par l'ID de la DB qu'on souhaite voir, ici 2 : </p>
<p><img src="/Lists/Photos/011812_1545_SharePoint221.png" alt="" /> </p></div>
</div>
<div><b>Catégorie:</b> <a onclick="OpenPopUpPage('http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=3&RootFolder=*', RefreshPage); return false;" href="http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=3&RootFolder=*">SharePoint 2010</a></div>
<div><b>Publié:</b> 18/01/2012 17:39</div>
]]></description>
      <author>Xavier VANNESTE</author>
      <category>SharePoint 2010</category>
      <pubDate>Wed, 18 Jan 2012 16:39:57 GMT</pubDate>
      <guid isPermaLink="true">http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=99</guid>
    </item>
    <item>
      <title>[Fast Search for SharePoint] Récupérer les Visual Best Bet et les Best Bet avec Keyword Query et Fast Search</title>
      <link>http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=97</link>
      <description><![CDATA[<div><b>Corps:</b> <div class="ExternalClassF2A5455098AC4F16BA579F526D86E2AD"><p><strong>Source : <a href="http://techmikael.blogspot.com/2011/12/returning-best-bets-and-visual-best.html">http://techmikael.blogspot.com/2011/12/returning-best-bets-and-visual-best.html</a>
		</strong></p><p>
 </p><p>Quand vous utilisez les Best Bet ou Visual Best Bet dans le centre de rechercher SharePoint, celle-ci fonctionne parfaitement, cependant il est difficile de les faire fonctionner avec la classe de l'api KeywordQuery de SharePoint. 
</p><p>J'avais fait quelques recherches, après avoir été contacté par Xavier VANNESTE qui a blogué à propos de cette difficulté (<a href="/Lists/Billets/Post.aspx?ID=82">http://blog.xvanneste.com/Lists/Billets/Post.aspx?ID=82</a> ), mais je n'avais pas été en mesure de résoudre cette issue à ce moment-là. 
</p><p>Etant actuellement en train d'écrire un livre sur FS4SP, j'ai dû me résoudre à trouver une solution. Le temps de sortir les outils! 
</p><p>Une heure plus tard après avoir utilisé le plugin Reflector pour Visual Studio a mettre des points d'arrêt dans le code des Search Service Application et j'ai compris. Et dans un sens, la solution fût évidente. 
</p><p>Tous les paramètres de mot clé avec FAST nécessitent un Search Setting Group et vous aurez un groupe pour chaque collection de sites dans votre batterie de serveurs SharePoint. L'ID du groupe de paramètre de recherche est le GUID de la collection de sites. Et cet ID est la solution. 
</p><p>
 </p><p>KeywordQuery a une propriété nommée &quot; UserContextGroupID &quot;, et le MSDN déclare: 
</p><p>Obtient ou définit l'identifiant utilisé pour le groupe de mots clé correspondant au best bets et visual best bets. 
</p><p>En attribuant la propriété UserContextGroupID et en demandant de récupérer les SpecialTermResults cela fonctionne parfaitement. 
</p><p>
 </p><p>Voici un petit exemple qui retourne les visual best bet attribué au terme «FAST Search for SharePoint&quot; :
</p><blockquote><p>var searchProxy = (SearchServiceApplicationProxy)SearchServiceApplicationProxy.GetProxy(SPServiceContext.Current); <span style="font-family:Times New Roman;font-size:12pt">
			</span></p></blockquote><blockquote><p>KeywordQuery kq = new<span style="font-family:Times New Roman;font-size:12pt">
			</span>KeywordQuery(searchProxy); <span style="font-family:Times New Roman;font-size:12pt">
			</span></p></blockquote><blockquote><p>kq.QueryText = &quot;FAST Search for SharePoint&quot;; <span style="font-family:Times New Roman;font-size:12pt">
			</span></p></blockquote><blockquote><p>kq.ResultsProvider = SearchProvider.FASTSearch; <span style="font-family:Times New Roman;font-size:12pt">
			</span></p></blockquote><blockquote><p>// specify best bets/visual best bets <span style="font-family:Times New Roman;font-size:12pt">
			</span></p></blockquote><blockquote><p>kq.ResultTypes = ResultType.SpecialTermResults; <span style="font-family:Times New Roman;font-size:12pt">
			</span></p></blockquote><blockquote><p>// specify the Search Settings Group ID <span style="font-family:Times New Roman;font-size:12pt">
			</span></p></blockquote><blockquote><p><span style="color:red"><strong>kq.UserContextGroupID = SPContext.Current.Site.ID.ToString(); <span style="font-family:Times New Roman;font-size:12pt">
					</span></strong></span></p></blockquote><blockquote><p>ResultTableCollection resultTableCollection = kq.Execute(); <span style="font-family:Times New Roman;font-size:12pt">
			</span></p></blockquote><blockquote><p>ResultTable visualBestBetsTable = resultTableCollection[ResultType.VisualBestBetsResults]; <span style="font-family:Times New Roman;font-size:12pt">
			</span></p></blockquote><blockquote><p>foreach<span style="font-family:Times New Roman;font-size:12pt">
			</span>(DataRow row in<span style="font-family:Times New Roman;font-size:12pt">
			</span>visualBestBetsTable.Table.Rows) <span style="font-family:Times New Roman;font-size:12pt">
			</span></p></blockquote><blockquote><p>{ <span style="font-family:Times New Roman;font-size:12pt">
			</span></p></blockquote><blockquote><p>string<span style="font-family:Times New Roman;font-size:12pt">
			</span>name = (string)row[&quot;Name&quot;]; <span style="font-family:Times New Roman;font-size:12pt">
			</span></p></blockquote><blockquote><p>string<span style="font-family:Times New Roman;font-size:12pt">
			</span>uri = (string)row[&quot;Uri&quot;]; <span style="font-family:Times New Roman;font-size:12pt">
			</span></p></blockquote><blockquote><p>string<span style="font-family:Times New Roman;font-size:12pt">
			</span>description = (string)row[&quot;Description&quot;]; <span style="font-family:Times New Roman;font-size:12pt">
			</span></p></blockquote><blockquote><p>string<span style="font-family:Times New Roman;font-size:12pt">
			</span>keyword = (string)row[&quot;Keyword&quot;]; <span style="font-family:Times New Roman;font-size:12pt">
			</span></p></blockquote><blockquote><p>string<span style="font-family:Times New Roman;font-size:12pt">
			</span>teaser = (string)row[&quot;Teaser&quot;]; <span style="font-family:Times New Roman;font-size:12pt">
			</span></p></blockquote><blockquote><p>string<span style="font-family:Times New Roman;font-size:12pt">
			</span>contentType = (string)row[&quot;TeaserContentType&quot;]; <span style="font-family:Times New Roman;font-size:12pt">
			</span></p></blockquote><blockquote><p>}<span style="font-family:Times New Roman;font-size:12pt">
			</span></p></blockquote><p>Article traduit avec l'accord de Mikael Svenson.
</p></div></div>
<div><b>Catégorie:</b> <a onclick="OpenPopUpPage('http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=5&RootFolder=*', RefreshPage); return false;" href="http://blog.xvanneste.com/_layouts/listform.aspx?PageType=4&ListId={87843A03-B96D-4381-AC42-0A03CE2CCCD2}&ID=5&RootFolder=*">Fast Search for SharePoint</a></div>
<div><b>Publié:</b> 19/12/2011 17:22</div>
]]></description>
      <author>Xavier VANNESTE</author>
      <category>Fast Search for SharePoint</category>
      <pubDate>Mon, 19 Dec 2011 16:22:34 GMT</pubDate>
      <guid isPermaLink="true">http://blog.xvanneste.com/Lists/Billets/ViewPost.aspx?ID=97</guid>
    </item>
  </channel>
</rss>
