J'ai un site Web dans Sharepoint 2007. Je veux faire une requête où le champ "home" des pages Web est égal à 1 dans un SPWeb spécifique et (c'est la partie importante) ses sous-SPwebs. Je peux faire ce travail avec le site en question et non avec les sous-sites. C'est-à-dire: il n'est pas récursif mais je l'indique dans la clause "webs scope = 'recursive'".Obtenir toutes les pages Web d'un SPWeb et de sous-sites Web qui ont un champ avec une valeur dans Sharepoint?
J'inclus également la liste que je veux utiliser, c'est-à-dire les pages (pas les documents, les gabarits ou quoi que ce soit) c'est pour ça que je cherche le "850" basetemplate (celui pour les pages).
Le code que je utilise est ce (j'ai essayé avec d'autres méthodes avec la même requête et le résultat est le même):
string campo="home"; SPSiteDataQuery qry = new SPSiteDataQuery(); qry.Query = "<Where><Eq><FieldRef Name='"; qry.Query += campo + "'/><Value
Type='Boolean'>1</Value></Eq>";
qry.Query += "</Where><OrderBy><FieldRef
Nom = 'Modifié' Ascendant = 'faux'> /> ";
qry.Webs = "<Webs Scope='Recursive'/>";
qry.ViewFields = "<FieldRef Name='Title'/><FieldRef
Name = 'modifié' /> ";
//this gives me system privileges using (SPSite site = new SPSite(CurrentSite.ID,
GetSystemToken (CurrentSite))) {
using (SPWeb web = site.OpenWeb("/News/")) { StringBuilder sb = new StringBuilder(); sb.Append("<Lists>"); foreach (SPList list in web.Lists) { if (list.BaseTemplate.ToString() ==
"850") {
sb.Append("<List ID=\"" +
list.ID.ToString() + "\" /> ") ;
} } sb.Append("</Lists>"); qry.Lists = sb.ToString(); dt = web.GetSiteData(qry); ..................
Donc, la seule solution que j'ai trouvé pour faire une boucle après le code précédent par les Webs mais je ne pense pas que ce soit une façon très optimisée:
foreach (SPWeb w2 in web.Webs)
{
sb = new StringBuilder();
sb.Append("<Lists>");
foreach (SPList list in w2.Lists)
{
if (list.BaseTemplate.ToString()
== "850")
{
sb.Append("<List ID=\""
+ list.ID.ToString() + "\"/>");
}
}
sb.Append("</Lists>");
qry.Lists = sb.ToString();
DataTable dttmp = w2.GetSiteData(qry);
if (dttmp != null
&& dttmp.Rows.Count > 0)
{
dt.Merge(dttmp);
}
w2.Dispose();
}
Heureux que vous ayez des choses en marche! Oh, et merci de poster le code de travail. –