2009-03-09 6 views
1

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(); 
           } 

Répondre

2

Enfin je l'ai fait ce qui suit, je ne sais pas ce qui a fonctionné finalement, je l'ai changé la façon dont je demande les listes et j'ai inclus RowLimit:

DataTable dt = null; DataView dv = null;

SPSiteDataQuery qry = new SPSiteDataQuery(); 

    qry.Query = "<Where><Eq><FieldRef Name='"; 
    qry.Query += campo + "'/><Value Type='Boolean'>1</Value></Eq>"; 
    qry.Query += "</Where><OrderBy><FieldRef Name='Modified' Ascending='false' /></OrderBy>"; 
    qry.Webs = "<Webs Scope='Recursive'/>"; 
    qry.Lists = "<Lists ServerTemplate='850' Hidden='FALSE' MaxListsLimit='50'/>"; 
    qry.RowLimit = 3; 

    qry.ViewFields = "<FieldRef Name='Title'/><FieldRef Name='Modified'/><FieldRef Name='FileRef'/>"; 

    using (SPSite site = new SPSite(CurrentSite.ID, GetSystemToken(CurrentSite))) 
    { 
     using (SPWeb web = site.OpenWeb(webUrl)) 
     { 
      dt = web.GetSiteData(qry); 

      dv = dt.DefaultView; 

     } 
    } 

    return dv; 
+0

Heureux que vous ayez des choses en marche! Oh, et merci de poster le code de travail. –

1

Vous parlez de fixer la portée des toiles à récursif, mais dans votre code d'exemple (mal formaté), vous laissez la propriété Webs vide, ce qui signifie que la requête de données du site ne fera que la recherche sur le site Web spécifié.

Ce détail spécifique (omis) de votre code est très important, parce que faire la moindre erreur d'orthographe dans la spécification InnerXml silencieusement revenir le comportement de retour à la valeur par défaut, ce qui signifie que le sera recherché Web en cours. Un piège typique serait d'obtenir la capitalisation erronée dans les deux Web ou Scope.

Pour mémoire, la bonne façon de spécifier c'est

qry.Webs = "<Webs Scope='Recursive' />"; 

Comme une vérification rapide, vous pouvez essayer de définir la portée de SiteCollection, voir si cela fonctionne.

[Éditer] D'accord, maintenant votre propriété Webs apparaît, ça semble bien :-). Avez-vous essayé de définir l'attribut Nullable = 'TRUE' dans le fieldref du champ Campo? Si le champ n'est pas présent (ou corrompu ou autre) dans l'un des sous-sites, cela peut aider. [/ Modifier]

+0

Désolé, mais c'est l'éditeur qui a masqué la partie qui semblait mal formatée. J'ai essayé SiteCollection aussi. – netadictos

+0

Merci pour votre aide, j'ai fait quelque chose de différent à la fin, ne me demandez pas ce qui a exactement fait ce travail. – netadictos

Questions connexes