<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog de Philippe Vialatte &#187; SharePoint</title>
	<atom:link href="https://blog.developpez.com/philippe/pcategory/sharepoint/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/philippe</link>
	<description></description>
	<lastBuildDate>Fri, 03 Jan 2014 15:12:09 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Créer un fournisseur de menu personnalisé</title>
		<link>https://blog.developpez.com/philippe/p8009/sharepoint/sharepoint_fournisseur_menu_personnalise</link>
		<comments>https://blog.developpez.com/philippe/p8009/sharepoint/sharepoint_fournisseur_menu_personnalise#comments</comments>
		<pubDate>Wed, 02 Sep 2009 07:29:00 +0000</pubDate>
		<dc:creator><![CDATA[Philippe Vialatte]]></dc:creator>
				<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Suite a une petite discussion sur le forum Sharepoint, je me disais que ca ferait du bien de soumettre ce petit développement a l&#8217;appréciation de tous. Sharepoint dispose, par défaut, d&#8217;un certain nombre de fournisseurs de menus (avec WSS, par exemple, SPNavigationProvider, SPSiteMapProvider, ou SPContentMapProvider) Il peut arriver que, pour des raisons diverses et variées, on ait besoin d&#8217;avoir un comportement différent (menus différents selon les utilisateurs, ou autres) Une bonne façon de faire est [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Suite a une petite discussion sur le forum Sharepoint, je me disais que ca ferait du bien de soumettre ce petit développement a l&rsquo;appréciation de tous.</p>
<p>Sharepoint dispose, par défaut, d&rsquo;un certain nombre de fournisseurs de menus (avec WSS, par exemple, SPNavigationProvider, SPSiteMapProvider, ou SPContentMapProvider)</p>
<p>Il peut arriver que, pour des raisons diverses et variées, on ait besoin d&rsquo;avoir un comportement différent (menus différents selon les utilisateurs, ou autres)</p>
<p>Une bonne façon de faire est d&rsquo;étendre le Provider, pour pouvoir éventuellement ajouter des éléments. Dans le cas présent, on va aller piocher dans une liste des éléments supplémentaires, de façon a générer un menu déroulant dans WSS v3 (et oui, pas de gestion native des sous-menus).</p>
<p><span id="more-113"></span></p>
<p>Pour cela, on va créer une classe TopNavBarProvider (parce qu&rsquo;on va s&rsquo;en servir dans la &#8230;top navbar <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> ), qui hérite de SPNavigationProvider et on va surcharger sa méthode GetChildNodes. La méthode GetChildNodes est utilisée pour récupérer les noeuds descendants du noeud courant.</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Courier New"><font size="2"></font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">class</font><font color="#000000"> </font><font color="#008080">TopNavBarProvider</font><font color="#000000"> : </font><font color="#008080">SPNavigationProvider</font><font color="#000000"> {          </p>
<p>    [</font><font color="#008080">SharePointPermission</font><font color="#000000">(</font><font color="#008080">SecurityAction</font><font color="#000000">.Demand, ObjectModel = </font><font color="#0000ff">true</font><font color="#000000">)]          <br />    </font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">override</font><font color="#000000"> </font><font color="#008080">SiteMapNodeCollection</font><font color="#000000"> GetChildNodes(</font><font color="#008080">SiteMapNode</font><font color="#000000"> node)</font></font> </div>
</p></div>
<p>Dans cette méthode, on va aller essayer de récupérer le contenu d&rsquo;une liste Menu, qui contient un titre, une url, et un parent.</p>
<p>On va avoir deux familles de cas : </p>
<ul>
<li>soit on a un noeud qui est un noeud &laquo;&nbsp;sharepoint&nbsp;&raquo;, a savoir le noeud racine, ou un noeud déclaré dans la barre de navigation standard </li>
<li>soit on a un de nos noeuds customisés (il n&rsquo;est pas possible de creer des noeuds de type SPSiteMapNode) </li>
</ul>
<p>Dans la première famille, il va falloir déterminer si le noeud est un noeud &laquo;&nbsp;standard&nbsp;&raquo;, ou la racine. Si le noeud est la racine du site, il va falloir lui adjoindre tous les noeuds parents de notre liste.</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Courier New"><font size="2"></font><font color="#0000ff">if</font><font color="#000000"> (type.FullName.EndsWith(</font><font color="#800000">&laquo;&nbsp;SPSiteMapNode&nbsp;&raquo;</font><font color="#000000">)) {          <br />    collection = </font><font color="#0000ff">base</font><font color="#000000">.GetChildNodes(node);          <br />    </font><font color="#0000ff">return</font><font color="#000000"> LoadSiteMapNodes(node, web);          <br />}</font></font> </div>
</p></div>
<p>Pour ca, on va faire un test un peu sale (mais qui marche), a savoir :</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Courier New"><font size="2"></font><font color="#0000ff">private</font><font color="#000000"> </font><font color="#008080">SiteMapNodeCollection</font><font color="#000000"> LoadSiteMapNodes(</font><font color="#008080">SiteMapNode</font><font color="#000000"> parentNode, </font><font color="#008080">SPWeb</font><font color="#000000"> web) {          </p>
<p>    </font><font color="#008080">SiteMapNodeCollection</font><font color="#000000"> collection = </font><font color="#0000ff">new</font><font color="#000000"> </font><font color="#008080">SiteMapNodeCollection</font><font color="#000000">();          </p>
<p>    </font><font color="#0000ff">if</font><font color="#000000"> (parentNode.Url.EndsWith(web.Name + </font><font color="#800000">&laquo;&nbsp;/default.aspx&nbsp;&raquo;</font><font color="#000000">)) {          <br />        </font><font color="#0000ff">foreach</font><font color="#000000"> (</font><font color="#008080">CustomNode</font><font color="#000000"> tmpNode </font><font color="#0000ff">in</font><font color="#000000"> LoadTopLevelNodes(parentNode, web)) {          <br />            collection.Add(GenerateSiteNode(tmpNode));           <br />        }           <br />    }           <br />    </font><font color="#0000ff">return</font><font color="#000000"> collection;          <br />}</font></font> </div>
</p></div>
<p>La fonction LoadTopLevelNodes va ressembler a ca :</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Courier New"><font size="2"></font><font color="#008080">Guid</font><font color="#000000"> webId = web.ID;          <br /></font><font color="#008080">Guid</font><font color="#000000"> siteId = web.Site.ID;          <br /></font><font color="#008080">List &lt;</font><font color="#008080">CustomNode&gt;</font><font color="#000000"> tmpNodes = </font><font color="#0000ff">new</font><font color="#000000"> </font><font color="#008080">List&lt;</font><font color="#008080">CustomNode&gt;</font><font color="#000000">();          </p>
<p></font><font color="#008080">SPSecurity</font><font color="#000000">.RunWithElevatedPrivileges(</font><font color="#0000ff">delegate</font><font color="#000000"> {          <br />    </font><font color="#0000ff">using</font><font color="#000000"> (</font><font color="#008080">SPSite</font><font color="#000000"> site = </font><font color="#0000ff">new</font><font color="#000000"> </font><font color="#008080">SPSite</font><font color="#000000">(siteId)) {          <br />        </font><font color="#0000ff">using</font><font color="#000000"> (</font><font color="#008080">SPWeb</font><font color="#000000"> tmpWeb = site.OpenWeb(webId)) {          </p>
<p>            </font><font color="#0000ff">if</font><font color="#000000"> (!ListExists(tmpWeb, </font><font color="#800000">&laquo;&nbsp;Menu&nbsp;&raquo;</font><font color="#000000">)) </font><font color="#0000ff">return</font><font color="#000000">;          </p>
<p>            </font><font color="#008080">SPList</font><font color="#000000"> list = tmpWeb.Lists[</font><font color="#800000">&laquo;&nbsp;Menu&nbsp;&raquo;</font><font color="#000000">];          <br />            </font><font color="#008080">SPQuery</font><font color="#000000"> query = </font><font color="#0000ff">new</font><font color="#000000"> </font><font color="#008080">SPQuery</font><font color="#000000">();          </p>
<p>            </font><font color="#0000ff">string</font><font color="#000000"> queryValue = </font><font color="#800000">&laquo;&nbsp;&lt;Query&gt;&lt;Where&gt;&lt;And&gt;&nbsp;&raquo;</font><font color="#000000">;          <br />            queryValue += </font><font color="#800000">&laquo;&nbsp;&lt;IsNull&gt;&lt;FieldRef Name=&rsquo;Parent&rsquo; /&gt;&lt;/IsNull&gt;&nbsp;&raquo;</font><font color="#000000">;          <br />            queryValue += </font><font color="#800000">&laquo;&nbsp;&lt;Eq&gt;&lt;FieldRef Name=&rsquo;Published&rsquo; /&gt;&lt;Value Type=&rsquo;Boolean&rsquo;&gt;1&lt;/Value&gt;&lt;/Eq&gt;&nbsp;&raquo;</font><font color="#000000">;          <br />            queryValue += </font><font color="#800000">&laquo;&nbsp;&lt;/And&gt;&lt;/Where&gt;&lt;/Query&gt;&nbsp;&raquo;</font><font color="#000000">;          </p>
<p>            query.Query = queryValue;           </p>
<p>            </font><font color="#008080">SPListItemCollection</font><font color="#000000"> myItems = list.GetItems(query);          </p>
<p>            </font><font color="#0000ff">foreach</font><font color="#000000"> (</font><font color="#008080">SPListItem</font><font color="#000000"> menu </font><font color="#0000ff">in</font><font color="#000000"> myItems) {          <br />               </font><font color="#000000">tmpNodes.Add(<font color="#0000ff">new</font><font color="#000000"> </font><font color="#008080">CustomNode</font><font color="#000000">(menu, tmpWeb.Url)</font>);           <br />            }           <br />        }           <br />    }           <br />});</font></font> </div>
</p></div>
<p>Si on travaille avec un noeud courant qui n&rsquo;est pas de type SPSiteMapNode, on se retrouve avec soit le cas d&rsquo;un noeud parent, soit le cas d&rsquo;un enfant. On va donc simplement chercher tous les enfants du noeud courant, et les renvoyer. Pour cela, on va plus ou moins utiliser la même fonction, en changeant juste la requête CAML.</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Courier New"><font size="2"></font><font color="#008080">SPSecurity</font><font color="#000000">.RunWithElevatedPrivileges(</font><font color="#0000ff">delegate</font><font color="#000000"> {          <br />    </font><font color="#0000ff">using</font><font color="#000000"> (</font><font color="#008080">SPSite</font><font color="#000000"> site = </font><font color="#0000ff">new</font><font color="#000000"> </font><font color="#008080">SPSite</font><font color="#000000">(siteId)) {          <br />        </font><font color="#0000ff">using</font><font color="#000000"> (</font><font color="#008080">SPWeb</font><font color="#000000"> tmpWeb = site.OpenWeb(webId)) {          </p>
<p>            </font><font color="#0000ff">if</font><font color="#000000"> (!ListExists(tmpWeb, </font><font color="#800000">&laquo;&nbsp;Menu&nbsp;&raquo;</font><font color="#000000">)) </font><font color="#0000ff">return</font><font color="#000000">;          </p>
<p>            </font><font color="#008080">SPList</font><font color="#000000"> list = tmpWeb.Lists[</font><font color="#800000">&laquo;&nbsp;Menu&nbsp;&raquo;</font><font color="#000000">];          <br />            </font><font color="#008080">SPQuery</font><font color="#000000"> query = </font><font color="#0000ff">new</font><font color="#000000"> </font><font color="#008080">SPQuery</font><font color="#000000">();          </p>
<p>            </font><font color="#0000ff">string</font><font color="#000000"> queryValue = </font><font color="#800000">&laquo;&nbsp;&lt;Query&gt;&lt;Where&gt;&lt;And&gt;&nbsp;&raquo;</font><font color="#000000">;          <br />            queryValue += </font><font color="#800000">&laquo;&nbsp;&lt;IsNull&gt;&lt;FieldRef Name=&rsquo;Parent&rsquo; /&gt;&lt;/IsNotNull&gt;&nbsp;&raquo;</font><font color="#000000">;          <br />            queryValue += </font><font color="#800000">&laquo;&nbsp;&lt;Eq&gt;&lt;FieldRef Name=&rsquo;Published&rsquo; /&gt;&lt;Value Type=&rsquo;Boolean&rsquo;&gt;1&lt;/Value&gt;&lt;/Eq&gt;&nbsp;&raquo;</font><font color="#000000">;          <br />            queryValue += </font><font color="#800000">&laquo;&nbsp;&lt;/And&gt;&lt;/Where&gt;&lt;/Query&gt;&nbsp;&raquo;</font><font color="#000000">;          </p>
<p>            query.Query = queryValue;           <br />            </font><font color="#008080">SPListItemCollection</font><font color="#000000"> myItems = list.GetItems(query);          </p>
<p>            </font><font color="#0000ff">foreach</font><font color="#000000"> (</font><font color="#008080">SPListItem</font><font color="#000000"> menu </font><font color="#0000ff">in</font><font color="#000000"> myItems) {          <br />                </font><font color="#0000ff">string</font><font color="#000000"> parent = menu[</font><font color="#800000">&laquo;&nbsp;Parent&nbsp;&raquo;</font><font color="#000000">] </font><font color="#0000ff">as</font><font color="#000000"> </font><font color="#0000ff">string</font><font color="#000000">;          <br /><font color="#000000">                </font><font color="#0000ff">string</font><font color="#000000"> parentId = parent.Split(&lsquo;;&rsquo;)[0]</font><font color="#0000ff"></font><font color="#000000">;</font>           <br />                </font><font color="#0000ff">if</font><font color="#000000"> (parentId.Equals(parentNode.Key.Replace(</font><font color="#800000">&laquo;&nbsp;CustomNode&nbsp;&raquo;</font><font color="#000000">, </font><font color="#800000">&laquo;&nbsp;&nbsp;&raquo;</font><font color="#000000">))) {          <br />                    </font><font color="#000000">tmpNodes.Add(<font color="#0000ff">new</font><font color="#000000"> </font><font color="#008080">PMONode</font><font color="#000000">(menu, tmpWeb.Url)</font>);           <br />                }           <br />            }           <br />        }           <br />    }           <br />});</font></font> </div>
</p></div>
<p>Voila, c&rsquo;est volontairement parcellaire, mais ca devrait permettre a ceux qui sont intéressés de se dépatouiller <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Une référence de STSADM interactive en Silverlight</title>
		<link>https://blog.developpez.com/philippe/p7724/sharepoint/admin/une_reference_de_stsadm_interactive_en_s</link>
		<comments>https://blog.developpez.com/philippe/p7724/sharepoint/admin/une_reference_de_stsadm_interactive_en_s#comments</comments>
		<pubDate>Tue, 09 Jun 2009 07:00:00 +0000</pubDate>
		<dc:creator><![CDATA[Philippe Vialatte]]></dc:creator>
				<category><![CDATA[Admin]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Pour tous ceux qui se sont un jour gratté désespérément la tête en cherchant LA ligne de commande STSADM a utiliser pour faire juste ce qu&#8217;ils voulaient, Microsoft a sorti (récemment ?) une page montrant les différentes options de l&#8217;utilitaire, groupées par aires fonctionnelles. Joie suprême, plutôt que de juste proposer une nouvelle page avec un tableau statique, cette fois-ci, on a droit a une jolie interface en Silverlight et tout et tout&#8230; Et avec [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Pour tous ceux qui se sont un jour gratté désespérément la tête en cherchant <strong>LA </strong>ligne de commande STSADM a utiliser pour faire juste ce qu&rsquo;ils voulaient, Microsoft a sorti (récemment ?) une page montrant les différentes options de l&rsquo;utilitaire, groupées par aires fonctionnelles.</p>
<p><span id="more-117"></span></p>
<p>Joie suprême, plutôt que de juste proposer une nouvelle page avec un tableau statique, cette fois-ci, on a droit a une jolie interface en Silverlight et tout et tout&#8230;</p>
<p><a href="http://philippe.ftp-developpez.com/blog/UnerfrencedeSTSADMinteractiveenSilverlig_8CCE/tmp1.png"><img title="tmp1" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="256" alt="tmp1" src="http://philippe.ftp-developpez.com/blog/UnerfrencedeSTSADMinteractiveenSilverlig_8CCE/tmp1_thumb.png" width="456" border="0" /></a> </p>
<p>Et avec les filtres sur le service pack et la recherche super réactive <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
<p><a href="http://philippe.ftp-developpez.com/blog/UnerfrencedeSTSADMinteractiveenSilverlig_8CCE/image.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="145" alt="image" src="http://philippe.ftp-developpez.com/blog/UnerfrencedeSTSADMinteractiveenSilverlig_8CCE/image_thumb.png" width="443" border="0" /></a> </p>
<p>à voir ici:</p>
<p><a title="http://technet.microsoft.com/en-us/office/sharepointserver/cc948709.aspx" href="http://technet.microsoft.com/en-us/office/sharepointserver/cc948709.aspx">http://technet.microsoft.com/en-us/office/sharepointserver/cc948709.aspx</a></p>
<p>Et en passant, la référence sous forme de table <strike>moche</strike> classique est ici (et en français, SVP) :</p>
<p><a title="http://technet.microsoft.com/fr-fr/library/cc263384.aspx" href="http://technet.microsoft.com/fr-fr/library/cc263384.aspx">http://technet.microsoft.com/fr-fr/library/cc263384.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Sharepoint] Gérer les formules d&#8217;une liste</title>
		<link>https://blog.developpez.com/philippe/p7709/sharepoint/api/sharepoint_gerer_les_formules_d_une_list</link>
		<comments>https://blog.developpez.com/philippe/p7709/sharepoint/api/sharepoint_gerer_les_formules_d_une_list#comments</comments>
		<pubDate>Fri, 05 Jun 2009 07:17:00 +0000</pubDate>
		<dc:creator><![CDATA[Philippe Vialatte]]></dc:creator>
				<category><![CDATA[API]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Que se passe-t&#8217;il quand, alors que 150 sites ont été déployés a partir d&#8217;un Template, on se rends compte qu&#8217;une formule ne fonctionne pas correctement ? (Ne pas répondre: t&#8217;avais qu&#8217;a utiliser des types de contenu, pour un ensemble de raisons, c&#8217;était exclus&#8230; ) Parce grosso modo, c&#8217;était mon petit truc rigolo de la semaine&#8230; Donc, comme d&#8217;habitude, je passe une petite heure dans la msdn, jusqu&#8217;a trouver *the* solution, dans les champs de la [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Que se passe-t&rsquo;il quand, alors que 150 sites ont été déployés a partir d&rsquo;un Template, on se rends compte qu&rsquo;une formule ne fonctionne pas correctement ?</p>
<p>(Ne pas répondre: t&rsquo;avais qu&rsquo;a utiliser des types de contenu, pour un ensemble de raisons, c&rsquo;était exclus&#8230; <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> )</p>
<p>Parce grosso modo, c&rsquo;était mon petit truc rigolo de la semaine&#8230;</p>
<p>Donc, comme d&rsquo;habitude, je passe une petite heure dans la msdn, jusqu&rsquo;a trouver *the* solution, dans les champs de la classe SPFieldCalculated.</p>
<p>Pour ceux qui seraient intéressés par ce genre de manip, cela se fait simplement comme cela :</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Consolas"><font size="2"><span>    </span><font color="#800000">SPList</font><font color="#000000"> </font><font color="#008080">list</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#008080">web</font><font color="#000080">.</font><font color="#008080">Lists</font><font color="#000000">[</font><font color="#0000ff">&laquo;&nbsp;Liste1&Prime;</font><font color="#000000">];            <br />    </font><font color="#800000">SPFieldCalculated</font><font color="#000000"> </font><font color="#008080">calc</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#008080">list</font><font color="#000080">.</font><font color="#008080">Fields</font><font color="#000000">[</font><font color="#0000ff">&laquo;&nbsp;Column3&Prime;</font><font color="#000000">] </font><font color="#000080">as</font><font color="#000000"> </font><font color="#800000">SPFieldCalculated</font><font color="#000000">;            <br />    </font><font color="#008080">calc</font><font color="#000080">.</font><font color="#008080">Formula</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#0000ff">&laquo;&nbsp;=IF(Column1=Column2, \&nbsp;&raquo;OK\&nbsp;&raquo;, \&nbsp;&raquo;Not OK\&nbsp;&raquo;)&nbsp;&raquo;</font><font color="#000000">;            <br />    </font><font color="#008080">calc</font><font color="#000080">.</font><font color="#008080">Update</font><font color="#000000">(); </font></font></font></div>
</p></div>
<p>Il faut convertir le champ en SPFieldCalculated, car Fields renvoie une collection de SPField, lesquels n&rsquo;ont pas la colonne Formula.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La base de contenu de WSS, 2/n : Groups, GroupMembership, SchedSubscriptions et ImmedSubscriptions</title>
		<link>https://blog.developpez.com/philippe/p7634/sharepoint/la_base_de_contenu_de_wss_2_n_groups_gro</link>
		<comments>https://blog.developpez.com/philippe/p7634/sharepoint/la_base_de_contenu_de_wss_2_n_groups_gro#comments</comments>
		<pubDate>Wed, 20 May 2009 15:37:00 +0000</pubDate>
		<dc:creator><![CDATA[Philippe Vialatte]]></dc:creator>
				<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Voila, un peu plus d&#8217;un mois après le premier post sur le sujet, un un second petit post sur la base de contenu de WSS. Apres avoir vu la structure des Sites, des Webs et des Utilisateurs, on va jeter un oeil sur les groupes de nos utilisateurs, ainsi que sur leurs alertes. En effet, dans sa version 3, Sharepoint a restreint a 2 le nombre de table nécessaire pour la gestion des groupes (contre [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Voila, un peu plus d&rsquo;un mois après le premier post sur le sujet, un un second petit post sur la base de contenu de WSS.</p>
<p>Apres avoir vu <a href="http://blog.developpez.com/philippe/p7453/sharepoint/sharepoint-base-de-contenu-wss-1-n/">la structure des Sites, des Webs et des Utilisateurs</a>, on va jeter un oeil sur les groupes de nos utilisateurs, ainsi que sur leurs alertes.</p>
<p><span id="more-112"></span></p>
<p>En effet, dans sa version 3, Sharepoint a restreint a 2 le nombre de table nécessaire pour la gestion des groupes (contre 4 auparavant, avec une distinction des groupes sites et des groupes web&#8230;)</p>
<p>La table des groupes contient tous les groupes déclarés dans l&rsquo;application Web. Elle va principalement contenir l&rsquo;UniqueId du Site auquel le groupe est rattache, l&rsquo;id du groupe, son nom, une description, l&rsquo;id du propriétaire du groupe, et l&rsquo;email permettant d&rsquo;envoyer une requête pour rejoindre ce groupe.</p>
<p>Cette table des groupes en elle-même ne sert a rien. en effet, pour pouvoir être utilisée, elle est liée a la table Users par la table GroupMembership, qui détermine les appartenances des utilisateurs aux groupes. GroupMembership est juste une table d&rsquo;intersection, et contient juste l&rsquo;identifiant du site, l&rsquo;identifiant de l&rsquo;utilisateur, et l&rsquo;identifiant du groupe.</p>
<p><strong><u>Attention, l&rsquo;ID des groupes et des utilisateurs n&rsquo;est unique que pour un site donné !!!</u></strong></p>
<p>Les tables SchedSubscriptions et ImmedSubscriptions sont quasiment identiques, la table SchedSubscriptions contenant juste trois champs supplémentaires, permettant de gérer la fréquence de notification (NotifyFreq), ainsi que l&rsquo;heure de prochaine notification, selon le fuseau horaire du serveur (NotifyTime), et en Temps universel coordonné (NotifyTimeUTC).</p>
<p>On va pouvoir, en partant de ces tables, effectuer, par exemple, les requêtes suivantes:</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Courier New"><font size="2"></font><font color="#0000ff">SELECT</font><font color="#000000"> Id</font><font color="#808080">,</font><font color="#000000"> tp_Login</font><font color="#808080">,</font><font color="#000000"> NotifyFreq</font><font color="#808080">,</font><font color="#000000"> </font><font color="#808080">(</font><font color="#000000">SiteUrl</font><font color="#808080">+</font><font color="#000000">WebUrl</font><font color="#808080">)</font><font color="#000000"> </font><font color="#0000ff">AS</font><font color="#000000"> URL</font><font color="#808080">,</font><font color="#000000"> ListTitle</font><font color="#808080">,</font><font color="#000000"> AlertTitle</font><font color="#808080">,</font><font color="#000000"> AlertType</font><font color="#808080">,</font><font color="#000000"> </font><font color="#0000ff">Status</font><font color="#000000">  <br /></font><font color="#0000ff">FROM</font><font color="#000000"> SchedSubscriptions </font><font color="#0000ff">WITH</font><font color="#000000"> </font><font color="#808080">(</font><font color="#0000ff">NOLOCK</font><font color="#808080">)</font><font color="#000000"> </font><font color="#808080">INNER</font><font color="#000000"> </font><font color="#808080">JOIN          <br /></font><font color="#000000">      UserInfo  </font><font color="#0000ff">WITH</font><font color="#000000"> </font><font color="#808080">(</font><font color="#0000ff">NOLOCK</font><font color="#808080">)</font><font color="#000000"> </font><font color="#0000ff">ON</font><font color="#000000"> SchedSubscriptions</font><font color="#808080">.</font><font color="#000000">UserId </font><font color="#808080">=</font><font color="#000000"> UserInfo</font><font color="#808080">.</font><font color="#000000">tp_ID </font><font color="#808080">AND</font><font color="#000000">  <br />          SchedSubscriptions</font><font color="#808080">.</font><font color="#000000">SiteId </font><font color="#808080">=</font><font color="#000000"> UserInfo</font><font color="#808080">.</font><font color="#000000">tp_SiteID          <br /></font><font color="#0000ff">Where</font><font color="#000000"> SchedSubscriptions</font><font color="#808080">.</font><font color="#000000">Deleted </font><font color="#808080">=</font><font color="#000000"> 0  <br /></font><font color="#0000ff">UNION</font><font color="#000000">  <br /></font><font color="#0000ff">SELECT</font><font color="#000000"> Id</font><font color="#808080">,</font><font color="#000000"> tp_Login</font><font color="#808080">,</font><font color="#000000"> 0</font><font color="#808080">,</font><font color="#000000"> </font><font color="#808080">(</font><font color="#000000">SiteUrl</font><font color="#808080">+</font><font color="#000000">WebUrl</font><font color="#808080">)</font><font color="#000000"> </font><font color="#0000ff">AS</font><font color="#000000"> URL</font><font color="#808080">,</font><font color="#000000"> ListTitle</font><font color="#808080">,</font><font color="#000000"> AlertTitle</font><font color="#808080">,</font><font color="#000000"> AlertType</font><font color="#808080">,</font><font color="#000000"> </font><font color="#0000ff">Status          <br />FROM</font><font color="#000000"> ImmedSubscriptions </font><font color="#0000ff">WITH</font><font color="#000000"> </font><font color="#808080">(</font><font color="#0000ff">NOLOCK</font><font color="#808080">)</font><font color="#000000"> </font><font color="#808080">INNER</font><font color="#000000"> </font><font color="#808080">JOIN          <br /></font><font color="#000000">      UserInfo  </font><font color="#0000ff">WITH</font><font color="#000000"> </font><font color="#808080">(</font><font color="#0000ff">NOLOCK</font><font color="#808080">)</font><font color="#000000"> </font><font color="#0000ff">ON</font><font color="#000000"> ImmedSubscriptions</font><font color="#808080">.</font><font color="#000000">UserId </font><font color="#808080">=</font><font color="#000000"> UserInfo</font><font color="#808080">.</font><font color="#000000">tp_ID </font><font color="#808080">AND</font><font color="#000000">  <br />          ImmedSubscriptions</font><font color="#808080">.</font><font color="#000000">SiteId </font><font color="#808080">=</font><font color="#000000"> UserInfo</font><font color="#808080">.</font><font color="#000000">tp_SiteID          <br /></font><font color="#0000ff">WHERE</font><font color="#000000"> ImmedSubscriptions</font><font color="#808080">.</font><font color="#000000">Deleted </font><font color="#808080">=</font><font color="#000000"> 0</font></font> </div>
</p></div>
<p>Cette requête va nous donner toutes les alertes actives pour tous les utilisateurs de nos sites</p>
</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Courier New"><font size="2"></font><font color="#0000ff">SELECT</font><font color="#000000"> tp_Login</font><font color="#808080">,</font><font color="#000000"> Groups</font><font color="#808080">.</font><font color="#000000">Title</font><font color="#808080">,</font><font color="#000000"> Groups</font><font color="#808080">.</font><font color="#000000">Description          <br /></font><font color="#0000ff">FROM</font><font color="#000000"> GroupMembership </font><font color="#0000ff">WITH</font><font color="#000000"> </font><font color="#808080">(</font><font color="#0000ff">NOLOCK</font><font color="#808080">)</font><font color="#000000">  </font><font color="#808080">INNER</font><font color="#000000"> </font><font color="#808080">JOIN          <br /></font><font color="#000000">     Groups </font><font color="#0000ff">WITH</font><font color="#000000"> </font><font color="#808080">(</font><font color="#0000ff">NOLOCK</font><font color="#808080">)</font><font color="#000000"> </font><font color="#0000ff">ON</font><font color="#000000"> GroupMembership</font><font color="#808080">.</font><font color="#000000">SiteId </font><font color="#808080">=</font><font color="#000000"> Groups</font><font color="#808080">.</font><font color="#000000">SiteId </font><font color="#808080">INNER</font><font color="#000000"> </font><font color="#808080">JOIN          <br /></font><font color="#000000">     UserInfo </font><font color="#0000ff">WITH</font><font color="#000000"> </font><font color="#808080">(</font><font color="#0000ff">NOLOCK</font><font color="#808080">)</font><font color="#000000"> </font><font color="#0000ff">ON</font><font color="#000000"> GroupMembership</font><font color="#808080">.</font><font color="#000000">SiteId </font><font color="#808080">=</font><font color="#000000"> UserInfo</font><font color="#808080">.</font><font color="#000000">tp_SiteID</font></font> </div>
</p></div>
</p>
<p>Cette requête retournera tous les utilisateurs définis, ainsi que leur groupes</p>
<p>Attention, a ne pas utiliser telle quelle&#8230;Chez moi, sur un environnement avec une 50aine de sites, la requête ci-dessus renvoie plus de 180 000 enregistrements <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
<p>Il vaut mieux, si vous utilisez ce genre de requête, se limiter a un site donné&#8230;.ce qui n&rsquo;est pas si simple.</p>
<p>En effet, le site en lui-même n&rsquo;a pas une représentation facile a déterminer&#8230;car l&rsquo;url &laquo;&nbsp;du site&nbsp;&raquo; est en fait l&rsquo;Url du Web de niveau supérieur (pour ceux qui ne suivent pas, retournez au premier article <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> ) </p>
<p>Pour trouver tous les utilisateurs définis sur un site donne, dont on á, par exemple, l&rsquo;url, on va faire:</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Courier New"><font size="2"></font><font color="#0000ff">SELECT</font><font color="#000000"> tp_Login</font><font color="#808080">,</font><font color="#000000"> Groups</font><font color="#808080">.</font><font color="#000000">Title</font><font color="#808080">,</font><font color="#000000"> Groups</font><font color="#808080">.</font><font color="#000000">Description</font><font color="#808080">,</font><font color="#000000">  <br />       Webs</font><font color="#808080">.</font><font color="#000000">Title </font><font color="#0000ff">AS</font><font color="#000000"> WebTitle</font><font color="#808080">,</font><font color="#000000"> FullUrl          <br /></font><font color="#0000ff">FROM</font><font color="#000000"> Webs </font><font color="#808080">INNER</font><font color="#000000"> </font><font color="#808080">JOIN          <br /></font><font color="#000000">  GroupMembership </font><font color="#0000ff">WITH</font><font color="#000000"> </font><font color="#808080">(</font><font color="#0000ff">NOLOCK</font><font color="#808080">)</font><font color="#000000"> </font><font color="#808080">INNER</font><font color="#000000"> </font><font color="#808080">JOIN          <br /></font><font color="#000000">  Groups </font><font color="#0000ff">WITH</font><font color="#000000"> </font><font color="#808080">(</font><font color="#0000ff">NOLOCK</font><font color="#808080">)</font><font color="#000000"> </font><font color="#0000ff">ON</font><font color="#000000"> GroupMembership</font><font color="#808080">.</font><font color="#000000">SiteId </font><font color="#808080">=</font><font color="#000000"> Groups</font><font color="#808080">.</font><font color="#000000">SiteId </font><font color="#808080">INNER</font><font color="#000000"> </font><font color="#808080">JOIN          <br /></font><font color="#000000">  UserInfo </font><font color="#0000ff">WITH</font><font color="#000000"> </font><font color="#808080">(</font><font color="#0000ff">NOLOCK</font><font color="#808080">)</font><font color="#000000"> </font><font color="#0000ff">ON</font><font color="#000000"> GroupMembership</font><font color="#808080">.</font><font color="#000000">SiteId </font><font color="#808080">=</font><font color="#000000"> UserInfo</font><font color="#808080">.</font><font color="#000000">tp_SiteID </font><font color="#0000ff">ON</font><font color="#000000"> Webs</font><font color="#808080">.</font><font color="#000000">SiteId </font><font color="#808080">=</font><font color="#000000"> GroupMembership</font><font color="#808080">.</font><font color="#000000">SiteId          <br /></font><font color="#0000ff">WHERE</font><font color="#000000"> Webs</font><font color="#808080">.</font><font color="#000000">ParentWebId </font><font color="#808080">IS</font><font color="#000000"> </font><font color="#808080">NULL          <br /></font><font color="#000000">  </font><font color="#808080">AND</font><font color="#000000"> Webs</font><font color="#808080">.</font>FullUrl<font color="#808080">=</font><font color="#ff0000">&lsquo;URL DE MON SITE PARENT&rsquo;</font></font> </div>
</p></div>
<p>Voila, doucement, mais surement, ca avance, il reste..euh&#8230;40 tables ??? (je ne les ferais pas toutes <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> )</p>
<p>Ah, et, oui, si vous détruisez votre site SharePoint par mégarde, ne me tenez pas pour responsable (on rappelle, <strong>pas d&rsquo;insert, pas d&rsquo;update, pas de delete</strong>)</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Créer des sites et des collections de sites avec l&#8217;API Sharepoint</title>
		<link>https://blog.developpez.com/philippe/p7621/net/creer_des_sites_et_des_collections_de_si</link>
		<comments>https://blog.developpez.com/philippe/p7621/net/creer_des_sites_et_des_collections_de_si#comments</comments>
		<pubDate>Tue, 19 May 2009 08:41:00 +0000</pubDate>
		<dc:creator><![CDATA[Philippe Vialatte]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[(Si une personne suit, oui, je suis en train de me taper un petit outil pour automatiser la création de mes sites&#8230;et ca commence a bien marcher) Dans mes aventures avec l&#8217;API, encore un gros arrachage de cheveux en vue Cela fait déjà quelques mois que j&#8217;ai un système a peu prés stable pour créer automatiquement des webs, leur appliquer un modèle, des customisations de listes et Co. Récemment, les exigences on t changes, il [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>(Si une personne suit, oui, je suis en train de me taper un petit outil pour automatiser la création de mes sites&#8230;et ca commence a bien marcher)</p>
<p>Dans mes aventures avec l&rsquo;API, encore un gros arrachage de cheveux en vue <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
<p><span id="more-111"></span></p>
<p>Cela fait déjà quelques mois que j&rsquo;ai un système a peu prés stable pour créer automatiquement des webs, leur appliquer un modèle, des customisations de listes et Co.</p>
<p>Récemment, les exigences on t changes, il faut maintenant créer des collections de sites.</p>
<p>Première réaction, ok, facile, il suffit de trouver la &laquo;&nbsp;bonne ligne de commande ©T&nbsp;&raquo;</p>
<p>&#8230;en fait, c&rsquo;est loin d&rsquo;être aussi simple.</p>
<p>Premièrement, la ou on doit simplement ajouter notre site a la liste des modèles de sites pour créer un modèle de site, pour les modèles de collection de site, il faut aussi ajouter le modèle aux modèles disponibles. Pour cela, ca se passe cote serveur, avec stsadm&#8230;</p>
<p>Il faut donc:</p>
<ol>
<li>Créer le modèle de site (dans les actions du site, sauver en tant que modèle) </li>
<li>Copier le modèle sur le serveur physique hébergeant l&rsquo;application web (admettons, sur c:\montemplate.stp) </li>
<li>Lancer un coup de stsadm      <br /><strong>stsadm -o addtemplate -filename &laquo;&nbsp;C:\montemplate.stp&nbsp;&raquo; -title &laquo;&nbsp;mon site projet&nbsp;&raquo; -description &laquo;&nbsp;mon modèle de site projet&nbsp;&raquo;</strong> </li>
<li>Vérifier que le modèle a bien été ajouté, avec stsadm      <br /><strong>stsadm -o enumtemplates</strong>       <br />-> <em>&laquo;&nbsp;mon site projet&nbsp;&raquo; &#8211; Language: 1033 &#8211; Site Template: _GLOBAL_#0 &#8211; Template Id: 1</em> </li>
</ol>
<p>(Note, pour revenir sur mes exemples avec la base de contenu, si le modèle est bien ajouté, ou le retrouvera aussi dans la base de Configuration, dans la table <strong>CustomTemplates </strong>)</p>
<p>Ok, maintenant, mon modèle est au bon endroit&#8230;ne reste qu&rsquo;a l&rsquo;exploiter &#8230;</p>
<p>Pour créer une nouvelle collection de sites, je vais simplement remonter au niveau de ma web application, récupérer la liste des Sites (Sites étant une collection de site, et pas des webs&#8230;), et ajouter un nouveau SPSite.</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Consolas"><font size="2"></font><font color="#000080"><span>using</span><font color="#000000"> (</font><font color="#800000">SPSite</font><font color="#000000"> </font><font color="#008080">parentSite</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#000080">new</font><font color="#000000"> </font><font color="#800000">SPSite</font><font color="#000000">(</font><font color="#0000ff">&laquo;&nbsp;http://monserveur&nbsp;&raquo;</font><font color="#000000">)) {            <br />    </font><font color="#800000">SPSiteCollection</font><font color="#000000"> </font><font color="#008080">allSites</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#008080">parentSite</font><font color="#000080">.</font><font color="#008080">WebApplication</font><font color="#000080">.</font><font color="#008080">Sites</font><font color="#000000">;            </p>
<p>    </font><font color="#800000">SPSite</font><font color="#000000"> </font><font color="#008080">newSite</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#008080">allSites</font><font color="#000080">.</font><font color="#008080">Add</font><font color="#000000">(</font><font color="#0000ff">&laquo;&nbsp;sites/nouveau site&nbsp;&raquo;</font><font color="#000000">, </font><font color="#0000ff">&laquo;&nbsp;nom du site&nbsp;&raquo;</font><font color="#000000">,            <br />        </font><font color="#0000ff">&laquo;&nbsp;description du site&nbsp;&raquo;</font><font color="#000000">, </font><font color="#ff0000">1033</font><font color="#000000">, </font><font color="#008080">templateID</font><font color="#000000">, </font><font color="#0000ff">&laquo;&nbsp;MonDomaine\\MonUser&nbsp;&raquo;</font><font color="#000000">,            <br />        </font><font color="#0000ff">&laquo;&nbsp;mon nom a moi&nbsp;&raquo;</font><font color="#000000">, </font><font color="#0000ff">&laquo;&nbsp;philippe.vialatte@monserveuremail.com&nbsp;&raquo;</font><font color="#000000">);            <br />}</font></font></font> </div>
</p></div>
<p>&#8230;sauf que ce n&rsquo;est pas si simple&#8230;En effet, la ou, pour les SPWeb, on passe directement un template, comme ca :</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Consolas"><font size="2"></font><font color="#000080"><span>using</span><font color="#000000"> (</font><font color="#800000">SPSite</font><font color="#000000"> </font><font color="#008080">parentSite</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#000080">new</font><font color="#000000"> </font><font color="#800000">SPSite</font><font color="#000000">(</font><font color="#008080">siteUrl</font><font color="#000000">)) {            </p>
<p>    </font><font color="#800000">SPWeb</font><font color="#000000"> </font><font color="#008080">parentWeb</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#008080">parentSite</font><font color="#000080">.</font><font color="#008080">OpenWeb</font><font color="#000000">();            <br />    </font><font color="#800000">SPWebTemplateCollection</font><font color="#000000"> </font><font color="#008080">templates</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#008080">parentSite</font><font color="#000080">.</font><font color="#008080">GetCustomWebTemplates</font><font color="#000000">(</font><font color="#008080">_localeU</font><font color="#000000">);            <br />    </font><font color="#800000">SPWebTemplate</font><font color="#000000"> </font><font color="#008080">siteTemplate</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#008080">templates</font><font color="#000000">[</font><font color="#008080">siteTemplateName</font><font color="#000000">];  </p>
<p></font><font color="#000000">    </font><font color="#000080">return</font><font color="#000000"> </font><font color="#008080">parentWeb</font><font color="#000080">.</font><font color="#008080">Webs</font><font color="#000080">.</font><font color="#008080">Add</font><font color="#000000">(</font><font color="#008080">webName</font><font color="#000000">, </font><font color="#008080">webName</font><font color="#000000">, </font><font color="#0000ff">&laquo;&nbsp;&nbsp;&raquo;</font><font color="#000000">, </font><font color="#008080">_localeU</font><font color="#000000">, </font><font color="#008080">siteTemplate</font><font color="#000000">, </font><font color="#000080">false</font><font color="#000000">, </font><font color="#000080">false</font><font color="#000000">);            <br />}</font></font></font> </div>
</p></div>
<p>Pour les SPSite, il faut l&rsquo;ID interne du modèle, qui est généré directement par Sharepoint (je vous laisse imaginer le bonheur si il faut maintenir un ID genre _GLOBAL_#1)</p>
<p>Une solution, si on connait le nom du fichier STP, ou si on se base sur le titre du modèle, est de passer par la collection des modèles </p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Consolas"><span><font color="#000080">string</font><font color="#000000"> </font><font color="#008080">templateID</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#000080">null</font><font color="#000000">;            </p>
<p></font><font color="#000080">foreach</font><font color="#000000"> (</font><font color="#800000">SPWebTemplate</font><font color="#000000"> </font><font color="#008080">template</font><font color="#000000"> </font><font color="#000080">in</font><font color="#000000"> </font><font color="#008080">parentSite</font><font color="#000080">.</font><font color="#008080">GetWebTemplates</font><font color="#000000">(</font><font color="#ff0000">1033</font><font color="#000000">)) {            <br />   </font><font color="#000080">if</font><font color="#000000"> (</font><font color="#008080">template</font><font color="#000080">.</font><font color="#008080">Title</font><font color="#000080">.</font><font color="#008080">ToLowerInvariant</font><font color="#000000">()</font><font color="#000080">.</font><font color="#008080">Equals</font><font color="#000000">(</font><font color="#0000ff">&laquo;&nbsp;mon site projet&nbsp;&raquo;</font><font color="#000000">)) {            <br />      </font><font color="#008080">templateID</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#008080">template</font><font color="#000080">.</font><font color="#008080">Name</font><font color="#000000">; // _GLOBAL_#0            <br />   }             <br />}</font></span></font> </div>
</p></div>
</p>
<p>Attention, il faut bien préciser le bon ID pour la locale, sinon, pas moyen de retrouver le modèle.</p>
<p>Si ca intéresse du monde, je rajouterais un projet un peu plus complet, pour montrer le procédé plus en détail <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Petites finesses de l&#8217;API Sharepoint</title>
		<link>https://blog.developpez.com/philippe/p7613/sharepoint/petites_finesses_de_l_api_sharepoint</link>
		<comments>https://blog.developpez.com/philippe/p7613/sharepoint/petites_finesses_de_l_api_sharepoint#comments</comments>
		<pubDate>Mon, 18 May 2009 09:10:00 +0000</pubDate>
		<dc:creator><![CDATA[Philippe Vialatte]]></dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ca faisait un moment que je n&#8217;avais plus fait de développement avec Sharepoint, et en m&#8217;y remettant, j&#8217;avais oublie deux petites finesses, qui peuvent éventuellement provoquer l&#8217;apparition spontanée de cheveux blancs, alors&#8230;pour ne plus les oublier 1. BreakRoleInheritance et AllowUnsafeUpdates Lorsque l&#8217;on appelle BreakRoleInheritance, la référence au SPWeb courant est invalidée, ce qui provoque un reset de AllowUnsafeUpdates a false. Ce sera aussi le cas lorsque l&#8217;on changera le nom ou l&#8217;URL du site (après [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Ca faisait un moment que je n&rsquo;avais plus fait de développement avec Sharepoint, et en m&rsquo;y remettant, j&rsquo;avais oublie deux petites finesses, qui peuvent éventuellement provoquer l&rsquo;apparition spontanée de cheveux blancs, alors&#8230;pour ne plus les oublier</p>
<p><strong><u>1. BreakRoleInheritance et AllowUnsafeUpdates</u></strong></p>
<p>Lorsque l&rsquo;on appelle <strong>BreakRoleInheritance</strong>, la référence au <strong>SPWeb</strong> courant est invalidée, ce qui provoque un reset de <strong>AllowUnsafeUpdates</strong> a false. Ce sera aussi le cas lorsque l&rsquo;on changera le nom ou l&rsquo;URL du site (après avoir appelé Update), ou lorsque l&rsquo;on appellera <strong>BreakInheritance</strong>(),<strong>ResetRoleInheritance</strong>(). Par conséquent, a chaque appel a <strong>BreakRoleInheritance</strong>, il faut penser a sauvegarder préalablement la valeur de dans un booléen, et le remettre a sa valeur d&rsquo;origine après.</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Consolas"><font size="2"><span> </span><font color="#000080">bool</font><font color="#000000"> </font><font color="#008080">updateRights</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#008080">_web</font><font color="#000080">.</font><font color="#008080">AllowUnsafeUpdates</font><font color="#000000">;            <br /> </font><font color="#008080">_web</font><font color="#000080">.</font><font color="#008080">BreakRoleInheritance</font><font color="#000000">(</font><font color="#000080">false</font><font color="#000000">);            <br /> </font><font color="#008080">_web</font><font color="#000080">.</font><font color="#008080">AllowUnsafeUpdates</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#008080">updateRights</font><font color="#000000">;</font></font></font> </div>
</p></div>
<p><strong><u>2. RunWithElevatedPrivileges et le site courant</u></strong></p>
<p><strong>RunWithElevatedPrivileges</strong> est super utile comme fonction lorsque l&rsquo;on doit exécuter une portion de code avec des privilèges admin. Le seul petit piège de cette fonction, qui va exécuter une portion de code comme si elle tournait avec l&rsquo;identifiant du pool d&rsquo;application, est que, si on essaye de manipuler une référence a un site, a un web ou a une liste récupérée depuis l&rsquo;extérieur de la zone de privilèges élevés, cette référence aura toujours les droits qu&rsquo;avaient l&rsquo;utilisateur <u><strong>AVANT</strong> <strong>RunWithElevatedPrivileges</strong></u>.</p>
<p>Donc, pour que cela fonctionne correctement, il faudra recharger les sites, web, listes et compagnie depuis l&rsquo;intérieur de la zone impersonnée&#8230;</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Consolas"><span><font color="#800000">SPSecurity</font><font color="#000080">.</font><font color="#008080">RunWithElevatedPrivileges</font><font color="#000000">(</font><font color="#000080">delegate</font><font color="#000000"> {   <br /></font><font color="#000080">   using</font><font color="#000000"> (</font><font color="#800000">SPSite</font><font color="#000000"> </font><font color="#008080">site</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#000080">new</font><font color="#000000"> </font><font color="#800000">SPSite</font><font color="#000000">(</font><font color="#008080">siteUrl</font><font color="#000000">)) {            <br />      </font><font color="#000080">using</font><font color="#000000"> (</font><font color="#800000">SPWeb</font><font color="#000000"> </font><font color="#008080">tmpWeb</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#008080">site</font><font color="#000080">.</font><font color="#008080">OpenWeb</font><font color="#000000">(</font><font color="#0000ff">&laquo;&nbsp;/&nbsp;&raquo;</font><font color="#000000">)) {            <br />         </font><font color="#800000">SPList</font><font color="#000000"> </font><font color="#008080">MaListe</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#008080">tmpWeb</font><font color="#000080">.</font><font color="#008080">Lists</font><font color="#000000">[</font><font color="#0000ff">&laquo;&nbsp;MaListe&nbsp;&raquo;</font><font color="#000000">]);            <br />      }             <br />   }             <br />});</font></span></font> </div>
</p></div>
<p>ou sinon, si on préfère :</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Consolas"><font size="2"></font><font color="#800000"><span>Guid</span><font color="#000000"> </font><font color="#008080">currentWebId</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#008080">web</font><font color="#000080">.</font><font color="#008080">ID</font><font color="#000000">;            <br /></font><font color="#800000">Guid</font><font color="#000000"> </font><font color="#008080">currentSiteId</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#008080">web</font><font color="#000080">.</font><font color="#008080">Site</font><font color="#000080">.</font><font color="#008080">ID</font><font color="#000000">;            </p>
<p></font><font color="#800000">SPSecurity</font><font color="#000080">.</font><font color="#008080">RunWithElevatedPrivileges</font><font color="#000000">(</font><font color="#000080">delegate</font><font color="#000000"> {    <br /></font>   <font color="#000080">using</font><font color="#000000"> (</font><font color="#800000">SPSite</font><font color="#000000"> </font><font color="#008080">site</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#000080">new</font><font color="#000000"> </font><font color="#800000">SPSite</font><font color="#000000">(</font><font color="#008080">currentSiteId</font><font color="#000000">)) {            <br /></font>      <font color="#000080">using</font><font color="#000000"> (</font><font color="#800000">SPWeb</font><font color="#000000"> </font><font color="#008080">tmpWeb</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#008080">site</font><font color="#000080">.</font><font color="#008080">OpenWeb</font><font color="#000000">(</font><font color="#008080">currentWebId</font><font color="#000000">)) {            <br /></font>         <font color="#800000">SPList</font><font color="#000000"> </font><font color="#008080">MaListe</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#008080">tmpWeb</font><font color="#000080">.</font><font color="#008080">Lists</font><font color="#000000">[</font><font color="#0000ff">&laquo;&nbsp;MaListe&nbsp;&raquo;</font><font color="#000000">]);            <br />      }             <br />   }             <br />});</font></font></font> </div>
</p></div>
<p>Voila, avec un peu de chance, j&rsquo;y penserais tout de suite la prochaine fois (mais bien sur&#8230;)</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Sharepoint]Gérer les pièces jointes d&#8217;un SPListItem</title>
		<link>https://blog.developpez.com/philippe/p7565/sharepoint/sharepoint_gerer_les_pieces_jointes_d_un</link>
		<comments>https://blog.developpez.com/philippe/p7565/sharepoint/sharepoint_gerer_les_pieces_jointes_d_un#comments</comments>
		<pubDate>Mon, 04 May 2009 11:29:00 +0000</pubDate>
		<dc:creator><![CDATA[Philippe Vialatte]]></dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Comme la question avait été posée sur le forum, une petite fonction pour gérer les pièces jointes a un Item. Avec Sharepoint, les objets de type SPListItem ont une propriété en lecture seule Attachments, qui retourne un objet de type SPAttachmentCollection public SPAttachmentCollection Attachments { get; } Ajouter ou supprimer une nouvelle pièce jointe se fait assez simplement, du moment que l&#8217;on a un tableau de byte, soit :     SPListItem item;     byte[] content;     string name;     [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Comme la question avait été posée sur le forum, une petite fonction pour gérer les pièces jointes a un Item.</p>
<p>Avec Sharepoint, les objets de type <strong>SPListItem</strong> ont une propriété en lecture seule <strong>Attachments</strong>, qui retourne un objet de type <strong>SPAttachmentCollection</strong></p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Consolas"><font size="2"></font><font color="#000080"><span>public</span><font color="#000000"> </font><font color="#800000">SPAttachmentCollection</font><font color="#000000"> </font><font color="#008080">Attachments</font><font color="#000000"> { </font><font color="#000080">get</font><font color="#000000">; }</font></font></font> </div>
</p></div>
<p>Ajouter ou supprimer une nouvelle pièce jointe se fait assez simplement, du moment que l&rsquo;on a un tableau de byte, soit :</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Consolas"><font size="2"><span>    </span><font color="#800000">SPListItem</font><font color="#000000"> </font><font color="#008080">item</font><font color="#000000">;            <br />    </font><font color="#000080">byte</font><font color="#000000">[] </font><font color="#008080">content</font><font color="#000000">;            <br />    </font><font color="#000080">string</font><font color="#000000"> </font><font color="#008080">name</font><font color="#000000">;            </p>
<p>    </font><font color="#008080">item</font><font color="#000080">.</font><font color="#008080">Attachments</font><font color="#000080">.</font><font color="#008080">AddNow</font><font color="#000000">(</font><font color="#008080">name</font><font color="#000000">, </font><font color="#008080">content</font><font color="#000000">);            <br />    </font><font color="#808080">// utiliser AddNow permets de ne pas avoir à appeler item.Update();  <br /></font><font color="#000000">    </font><font color="#008080">item</font><font color="#000080">.</font><font color="#008080">Attachments</font><font color="#000080">.</font><font color="#008080">DeleteNow</font><font color="#000000">(</font><font color="#008080">name</font><font color="#000000">);            <br />    </font><font color="#808080">// utiliser DeleteNow permets de ne pas avoir à appeler item.Update(); </font></font></font></div>
</p></div>
<p>Attacher le contenu d&rsquo;un fichier venant du site Sharepoint se fait aussi assez simplement :</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Consolas"><font size="2"></font><font color="#800000"><span>   SPFile</span><font color="#000000"> </font><font color="#008080">file</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#008080">myWeb</font><font color="#000080">.</font><font color="#008080">Folders</font><font color="#000000">(</font><font color="#0000ff">&laquo;&nbsp;monDossier&nbsp;&raquo;</font><font color="#000000">)</font><font color="#000080">.</font><font color="#008080">Files</font><font color="#000000">(</font><font color="#0000ff">&laquo;&nbsp;Monfichier&nbsp;&raquo;</font><font color="#000000">);            <br /></font><font color="#000080">   string</font><font color="#000000"> </font><font color="#008080">fileName</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#008080">file</font><font color="#000080">.</font><font color="#008080">Name</font><font color="#000000">;            <br /></font><font color="#000080">   byte</font><font color="#000000">[] </font><font color="#008080">fileContent</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#008080">file</font><font color="#000080">.</font><font color="#008080">OpenBinary</font><font color="#000000">();</font></font></font> </div>
</p></div>
<p>La ou cela devient beaucoup plus rigolo, c&rsquo;est lorsque l&rsquo;on veut lister les attachments&#8230;</p>
<p>En effet, si on fais un foreach sur les attachements, on ne vas pas retourner des objets SPAttachment (par exemple), ni même <strong>SPFile</strong>, mais&#8230;le nom du fichier :-\</p>
<p>Apres un peu de recherche, ces items sont stockés dans un sous-répertoire de la liste, nommé Attachments, les fichiers étant exactement stockes dans un répertoire identifié par l&rsquo;ID de l&rsquo;item de la liste concerné. On peut donc y accéder ainsi :</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Consolas"><font size="2"><span>    </span><font color="#800000">SPFolder</font><font color="#000000"> </font><font color="#008080">folder</font><font color="#000000"> </font><font color="#000080">=</font><font color="#000000"> </font><font color="#008080">site</font><font color="#000080">.</font><font color="#008080">Folders</font><font color="#000000">(</font><font color="#0000ff">&laquo;&nbsp;Lists&nbsp;&raquo;</font><font color="#000000">)</font><font color="#000080">.            <br /></font><font color="#000000">        </font><font color="#008080">SubFolders</font><font color="#000000">(</font><font color="#008080">listItem</font><font color="#000080">.</font><font color="#008080">ParentList</font><font color="#000080">.</font><font color="#008080">Title</font><font color="#000000">)</font><font color="#000080">.            <br /></font><font color="#000000">        </font><font color="#008080">SubFolders</font><font color="#000000">(</font><font color="#0000ff">&laquo;&nbsp;Attachments&nbsp;&raquo;</font><font color="#000000">)</font><font color="#000080">.            <br /></font><font color="#000000">        </font><font color="#008080">SubFolders</font><font color="#000000">(</font><font color="#008080">listItem</font><font color="#000080">.</font><font color="#008080">ID</font><font color="#000080">.</font><font color="#008080">ToString</font><font color="#000000">());            </p>
<p>    </font><font color="#000080">foreach</font><font color="#000000"> (</font><font color="#800000">SPFile</font><font color="#000000"> </font><font color="#008080">file</font><font color="#000000"> </font><font color="#000080">in</font><font color="#000000"> </font><font color="#008080">folder</font><font color="#000080">.</font><font color="#008080">Files</font><font color="#000000">) {            <br />        </font><font color="#808080">// manipulations diverses et variées sur les fichiers            <br /></font><font color="#000000">    } </font></font></font></div>
</p></div>
<p>(NB. : Ca a l&rsquo;air trivial comme ca, mais à l&rsquo;époque, ca m&rsquo;a couté pas mal de cheveux <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> )</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Office  2010 officiellement annoncé pour mi-2010</title>
		<link>https://blog.developpez.com/philippe/p7491/sharepoint/office_2010_annonce</link>
		<comments>https://blog.developpez.com/philippe/p7491/sharepoint/office_2010_annonce#comments</comments>
		<pubDate>Thu, 16 Apr 2009 07:58:00 +0000</pubDate>
		<dc:creator><![CDATA[Philippe Vialatte]]></dc:creator>
				<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[L&#8217;annonce du jour concerne toute la suite Office 2010 (et pas seulement Sharepoint, pour changer ). En effet, Microsoft a publié hier, sur PressPass, un entretien avec le &#171;&#160;senior vice president of Microsoft&#8217;s Information Worker Product Management Group&#160;&#187; (ouf !), au cours du quel il annonce une roadmap (une version française, quelqu&#8217;un ?) des sorties des différents produits de la suite 2010. On aura donc, dés la fin 2009, Exchange 2010 (qui est d&#8217;ors et [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>L&rsquo;annonce du jour concerne toute la suite Office 2010 (et pas seulement Sharepoint, pour changer <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> ).</p>
<p>En effet, Microsoft a publié hier, sur PressPass, un entretien avec le &laquo;&nbsp;senior vice president of Microsoft&rsquo;s Information Worker Product Management Group&nbsp;&raquo; (ouf !), au cours du quel il annonce une roadmap (une version française, quelqu&rsquo;un ?) des sorties des différents produits de la suite 2010.</p>
<p>On aura donc, dés la fin 2009, Exchange 2010 (qui est d&rsquo;ors et déjà disponible en beta), tandis que la suite Office 2010 sera disponible en CTP des le troisième quart de 2009, pour une livraison finale en début 2010.</p>
<p><a title="http://www.microsoft.com/presspass/features/2009/Apr09/04-15Office2010.mspx" href="http://www.microsoft.com/presspass/features/2009/Apr09/04-15Office2010.mspx">http://www.microsoft.com/presspass/features/2009/Apr09/04-15Office2010.mspx</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Sharepoint] La base de contenu de WSS, 1/n : Sites, Webs et UserInfo</title>
		<link>https://blog.developpez.com/philippe/p7453/sharepoint/sharepoint_base_de_contenu_wss_1_n</link>
		<comments>https://blog.developpez.com/philippe/p7453/sharepoint/sharepoint_base_de_contenu_wss_1_n#comments</comments>
		<pubDate>Mon, 06 Apr 2009 14:53:00 +0000</pubDate>
		<dc:creator><![CDATA[Philippe Vialatte]]></dc:creator>
				<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ayant pas mal patouillé dans la base de contenu récemment, je me suis dit que cela pourrait toujours servir a quelqu&#8217;un d&#8217;autre un jour ou l&#8217;autre. En conséquence de quoi, voila le premier article dans une liste de je ne sais pas pas encore combien, qui concernera la base de contenu de Sharepoint V3. Avant de commencer, on va commencer par les précautions d&#8217;usage au niveau de la base de contenu: Ne jamais faire de [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Ayant pas mal patouillé dans la base de contenu récemment, je me suis dit que cela pourrait toujours servir a quelqu&rsquo;un d&rsquo;autre un jour ou l&rsquo;autre. En conséquence de quoi, voila le premier article dans une liste de je ne sais pas pas encore combien, qui concernera la base de contenu de Sharepoint V3.</p>
<p><span id="more-108"></span></p>
<p>Avant de commencer, on va commencer par les précautions d&rsquo;usage au niveau de la base de contenu:</p>
<ol>
<li>Ne jamais faire de mise a jour ou d&rsquo;insertion directement dans la base de contenu. L&rsquo;API est la pour ca, permets de tout faire, et est prévue pour. </li>
<li>Ne pas mettre en production un programme faisant des requêtes fréquentes sur la base de contenu. Un lock sur la base de contenu peut avoir des effets désastreux </li>
<li>Dans la mesure du possible, si c&rsquo;est pour faire un test, ne pas travailler sur une base de production. Toujours faire les tests sur des backups. </li>
</ol>
<p>&#8230;et évidemment, si vous détruisez par inadvertance votre base Sharepoint en faisant des manips, ne m&rsquo;envoyez pas un mail rageur <img src="https://blog.developpez.com/philippe/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
<p><strong><font color="#ff0000">J&rsquo;insiste lourdement, une modification inconsidérée de la base de contenu peut détruire votre site Sharepoint&#8230;</font></strong></p>
<p>On va commencer par trois tables qui vont parler a tous les développeurs Sharepoint, la table Sites, la table Webs, et la table des utilisateurs, Users.</p>
<p>Pour les non-Sharepointeurs, un peu de vocabulaire (un peu simplifié).</p>
<ul>
<li>La base de contenu est une base SQL Server qui va contenir les données du site Sharepoint (les items, les documents etc&#8230;) </li>
<li>Une ferme est un ou plusieurs serveurs physique, sur lequel les pages applicatives et le &laquo;&nbsp;programme&nbsp;&raquo; Sharepoint vont être installés. </li>
<li>Une Web Application est un site au sens IIS, qui est géré par l&rsquo;applicatif Sharepoint </li>
<li>Chaque Web Application va contenir une ou plusieurs collections de Sites (SPSite coté API, table Sites de la base de contenus) </li>
<li>Une collection de site va contenir au moins un Web (SPWeb, table Web), qui sera le Web de niveau supérieur, et pourra contenir autant de sous-sites (chacun étant un SPWeb) que nécessaire, et chaque Web pouvant aussi contenir des Webs </li>
<li>Une fois qu&rsquo;on est au niveau Web, on trouvera des listes et des bibliothèques de documents </li>
</ul>
<p><a href="http://philippe.ftp-developpez.com/blog/SharepointLabasedecontenudeWSS1nSitesWeb_10588/image.png"><img title="image" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="393" alt="image" src="http://philippe.ftp-developpez.com/blog/SharepointLabasedecontenudeWSS1nSitesWeb_10588/image_thumb.png" width="355" border="0" /></a></p>
<p>Voila pour la petite intro. </p>
<p>La table des Sites va contenir toutes les collections de site de l&rsquo;application Sharepoint qui utilise la base de contenu courante. </p>
<p>On trouvera dans cette table, entre autre, les infos sur les quota, la taille occupée (pour le site et pour la corbeille) les différents Url (absolues), les propriétaires de la collection de site (primaires et secondaires), et les dates de certaines action (créations, dernière modification, etc&#8230;)</p>
<p>La table des Web va contenir tous les SPWeb contenu dans l&rsquo;application web courante. On trouvera dans cette table le titre du Web, son Url relative, des statistiques (utilisation quotidienne, mensuelle), les informations de locale et de calendrier, l&rsquo;Id unique du Web, et l&rsquo;Id du Web parent si il existe.</p>
<p>On va pouvoir, en partant de ces tables, effectuer, par exemple, les requêtes suivantes:</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Courier New"><font size="2"></font><font color="#0000ff">SELECT</font><font color="#000000"> FullUrl</font><font color="#808080">,</font><font color="#000000"> Title</font><font color="#808080">,</font><font color="#000000"> Author</font><font color="#808080">,</font><font color="#000000"> TimeCreated         <br /></font><font color="#0000ff">FROM</font><font color="#000000"> Webs         <br /></font><font color="#0000ff">WHERE</font><font color="#000000"> </font><font color="#000000">ParentWebId </font><font color="#808080">IS</font><font color="#000000"> </font><font color="#808080">NULL</font></font></div>
</p></div>
<p>Cette requête va nous donner tous les sites Web de niveau supérieurs (1 par collection&#8230;)</p>
<p>Inversement, celle ci va nous donner tous les Webs appartenant a un Web de niveau supérieur:</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Courier New"><font size="2"></font><font color="#0000ff">SELECT</font><font color="#000000"> FullUrl</font><font color="#808080">,</font><font color="#000000"> Title</font><font color="#808080">,</font><font color="#000000"> Author</font><font color="#808080">,</font><font color="#000000"> TimeCreated         <br /></font><font color="#0000ff">FROM</font><font color="#000000"> Webs         <br /></font><font color="#0000ff">WHERE</font><font color="#000000"> </font><font color="#808080">Not</font><font color="#000000"> ParentWebId </font><font color="#808080">IS</font><font color="#000000"> </font><font color="#808080">NULL</font></font> </div>
</p></div>
<p>Cette requête va nous donner, pour tous les Sites, la taille occupée, la date de création, les propriétaires, et les tailles occupées par les données et par la corbeille.</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Courier New"><font size="2"></font><font color="#0000ff">SELECT</font><font color="#000000"> Sites</font><font color="#808080">.</font><font color="#000000">Id</font><font color="#808080">,</font><font color="#000000"> Sites</font><font color="#808080">.</font><font color="#000000">TimeCreated</font><font color="#808080">,</font><font color="#000000"> Sites</font><font color="#808080">.</font><font color="#000000">DiskUsed</font><font color="#808080">,</font><font color="#000000"> Sites</font><font color="#808080">.</font><font color="#000000">SecondStageDiskUsed</font><font color="#808080">,</font><font color="#000000">  <br />       UserInfo</font><font color="#808080">.</font><font color="#000000">tp_Login </font><font color="#0000ff">AS</font><font color="#000000"> Principal</font><font color="#808080">,</font><font color="#000000"> UserInfo_1</font><font color="#808080">.</font><font color="#000000">tp_Login </font><font color="#0000ff">AS</font><font color="#000000"> Secondaire         <br /></font><font color="#0000ff">FROM</font><font color="#000000"> Sites </font><font color="#808080">INNER</font><font color="#000000"> </font><font color="#808080">JOIN         <br /></font><font color="#000000">     UserInfo </font><font color="#0000ff">ON</font><font color="#000000"> Sites</font><font color="#808080">.</font><font color="#000000">OwnerID </font><font color="#808080">=</font><font color="#000000"> UserInfo</font><font color="#808080">.</font><font color="#000000">tp_ID </font><font color="#808080">INNER</font><font color="#000000"> </font><font color="#808080">JOIN         <br /></font><font color="#000000">     UserInfo </font><font color="#0000ff">AS</font><font color="#000000"> UserInfo_1 </font><font color="#0000ff">ON</font><font color="#000000"> Sites</font><font color="#808080">.</font><font color="#000000">SecondaryContactID </font><font color="#808080">=</font><font color="#000000"> UserInfo_1</font><font color="#808080">.</font><font color="#000000">tp_ID</font></font> </div>
</p></div>
<p>Plus intéressant, la liste de tous les utilisateurs de tous les webs</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Courier New"><font size="2"></font><font color="#0000ff">SELECT</font><font color="#000000"> Webs</font><font color="#808080">.</font><font color="#000000">FullUrl</font><font color="#808080">,</font><font color="#000000"> Webs</font><font color="#808080">.</font><font color="#000000">Title</font><font color="#808080">,</font><font color="#000000"> UserInfo</font><font color="#808080">.</font><font color="#000000">tp_SiteAdmin</font><font color="#808080">,</font><font color="#000000"> UserInfo</font><font color="#808080">.</font><font color="#000000">tp_Title</font><font color="#808080">,</font><font color="#000000"> UserInfo</font><font color="#808080">.</font><font color="#000000">tp_Email         <br /></font><font color="#0000ff">FROM</font><font color="#000000"> UserInfo </font><font color="#808080">INNER</font><font color="#000000"> </font><font color="#808080">JOIN</font><font color="#000000"> Webs  <br /></font><font color="#0000ff">ON</font><font color="#000000"> UserInfo</font><font color="#808080">.</font><font color="#000000">tp_SiteID </font><font color="#808080">=</font><font color="#000000"> Webs</font><font color="#808080">.</font><font color="#000000">SiteId</font></font> </div>
</p></div>
<p>Et le nombre d&rsquo;utilisateurs par web</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Courier New"><font size="2"></font><font color="#0000ff">SELECT</font><font color="#000000"> Webs</font><font color="#808080">.</font><font color="#000000">FullUrl</font><font color="#808080">,</font><font color="#000000"> Webs</font><font color="#808080">.</font><font color="#000000">Title</font><font color="#808080">,</font><font color="#000000"> </font><font color="#ff00ff">COUNT</font><font color="#808080">(</font><font color="#000000">UserInfo</font><font color="#808080">.</font><font color="#000000">tp_ID</font><font color="#808080">)</font><font color="#000000"> </font><font color="#0000ff">AS</font><font color="#000000"> nbUtilisateurs         <br /></font><font color="#0000ff">FROM</font><font color="#000000"> UserInfo </font><font color="#808080">INNER</font><font color="#000000"> </font><font color="#808080">JOIN         <br /></font><font color="#000000">     Webs </font><font color="#0000ff">ON</font><font color="#000000"> UserInfo</font><font color="#808080">.</font><font color="#000000">tp_SiteID </font><font color="#808080">=</font><font color="#000000"> Webs</font><font color="#808080">.</font><font color="#000000">SiteId         <br /></font><font color="#0000ff">GROUP</font><font color="#000000"> </font><font color="#0000ff">BY</font><font color="#000000"> Webs</font><font color="#808080">.</font><font color="#000000">FullUrl</font><font color="#808080">,</font><font color="#000000"> Webs</font><font color="#808080">.</font><font color="#000000">Title</font></font> </div>
</p></div>
<p>&#8230;ainsi que le nombre d&rsquo;utilisateurs actifs</p>
</p>
</p>
<div style="border-right: #000000 1px solid; border-top: #000000 1px solid; margin-left: 10pt; border-left: #000000 1px solid; margin-right: 2pt; border-bottom: #000000 1px solid">
<div style="overflow: scroll; white-space: nowrap; background-color: #dcdcdc"><font face=" Courier New"><font size="2"></font><font color="#0000ff">SELECT</font><font color="#000000"> Webs</font><font color="#808080">.</font><font color="#000000">FullUrl</font><font color="#808080">,</font><font color="#000000"> Webs</font><font color="#808080">.</font><font color="#000000">Title</font><font color="#808080">,</font><font color="#000000"> </font><font color="#ff00ff">COUNT</font><font color="#808080">(</font><font color="#000000">UserInfo</font><font color="#808080">.</font><font color="#000000">tp_ID</font><font color="#808080">)</font><font color="#000000"> </font><font color="#0000ff">AS</font><font color="#000000"> nbUtilisateurs         <br /></font><font color="#0000ff">FROM</font><font color="#000000"> UserInfo </font><font color="#808080">INNER</font><font color="#000000"> </font><font color="#808080">JOIN         <br /></font><font color="#000000">     Webs </font><font color="#0000ff">ON</font><font color="#000000"> UserInfo</font><font color="#808080">.</font><font color="#000000">tp_SiteID </font><font color="#808080">=</font><font color="#000000"> Webs</font><font color="#808080">.</font><font color="#000000">SiteId         <br /></font><font color="#0000ff">WHERE</font><font color="#000000"> UserInfo</font><font color="#808080">.</font><font color="#000000">tp_IsActive </font><font color="#808080">=</font><font color="#000000"> 1         <br /></font><font color="#0000ff">GROUP</font><font color="#000000"> </font><font color="#0000ff">BY</font><font color="#000000"> Webs</font><font color="#808080">.</font><font color="#000000">FullUrl</font><font color="#808080">,</font><font color="#000000"> Webs</font><font color="#808080">.</font><font color="#000000">Title</font></font> </div>
</p></div>
<p>voila, pour une première approche de la bête, si j&rsquo;arrive a garder intacte ma belle motivation (et que ca intéresse quelqu&rsquo;un&#8230;), j&rsquo;essayerai de passer brièvement sur toutes les tables intéressantes (de mon point de vue)</p>
<p> </p>
<p>Pour conclure, je ne saurais pas assez le répéter, pas d&rsquo;insert, pas d&rsquo;updates !!!</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[SharePoint]Ca y&#8217;est, SharePoint Designer est disponible gratuitement</title>
		<link>https://blog.developpez.com/philippe/p7435/sharepoint/sharepoint_ca_y_est_sharepoint_designer</link>
		<comments>https://blog.developpez.com/philippe/p7435/sharepoint/sharepoint_ca_y_est_sharepoint_designer#comments</comments>
		<pubDate>Thu, 02 Apr 2009 18:31:00 +0000</pubDate>
		<dc:creator><![CDATA[Philippe Vialatte]]></dc:creator>
				<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Je l&#8217;avais déjà mentionné dans un précédent post, mais SharePoint Designer est désormais gratuit&#8230; Vous le trouverez a cette adresse : http://www.microsoft.com/downloads/details.aspx?displaylang=en&#38;FamilyID=baa3ad86-bfc1-4bd4-9812-d9e710d44f42]]></description>
				<content:encoded><![CDATA[<p>Je l&rsquo;avais déjà mentionné <a href="http://blog.developpez.com/philippe/p7410/sharepoint/info-ou-intox-sharepoint-sharepoint-desi/">dans un précédent post</a>, mais SharePoint Designer est désormais gratuit&#8230; </p>
<p><img title="image" style="border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; border-left: 0px; margin-right: auto; border-bottom: 0px" alt="image" src="http://philippe.developpez.com/images/spdgratuit.jpg" border="0" /> </p>
<p>Vous le trouverez a cette adresse : <a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=baa3ad86-bfc1-4bd4-9812-d9e710d44f42">http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=baa3ad86-bfc1-4bd4-9812-d9e710d44f42</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
