2009-06-17 21 views
0

En cours d'exécution de cette requête sur le même serveur que l'application Web, SPQuery.ExpandRecurrence doit fonctionner. Cependant, avec ce qui suit, je reçois seulement 3 éléments dans la collection de la liste retournée par rapport aux 3 éléments et les ré-occurrences, qui tombent tous dans le mois en cours.Comment obtenir des éléments récurrents de la liste de calendriers SharePoint?

J'ai vérifié avec Stramit Caml Viewer que la requête fonctionne et renvoie les mêmes 3 éléments.

S'il vous plaît dites-moi, il me manque quelque chose de flagrant?

static SPListItemCollection GetSourceColl(SPList list) 
    { 
     SPQuery query = new SPQuery(); 
     query.ExpandRecurrence = true; 
     query.CalendarDate = new DateTime(DateTime.Now.Year,DateTime.Now.Month, 1); 

     System.Text.StringBuilder oSb = new System.Text.StringBuilder(); 

     oSb.Append("  <Query xmlns=\"http://schemas.microsoft.com/sharepoint/soap/\">"); 
     oSb.Append("   <Where>"); 
     oSb.Append("    <And>"); 
     oSb.Append("     <DateRangesOverlap>"); 
     oSb.Append("      <FieldRef Name=\"EventDate\" />"); 
     oSb.Append("      <FieldRef Name=\"EndDate\" />"); 
     oSb.Append("      <FieldRef Name=\"RecurrenceID\" />"); 
     oSb.Append("      <Value Type=\"DateTime\">"); 
     oSb.Append("        <Month />"); 
     oSb.Append("      </Value>"); 
     oSb.Append("     </DateRangesOverlap>"); 
     oSb.Append("     <And>"); 
     oSb.Append("      <And>"); 
     oSb.Append("        <Eq>"); 
     oSb.Append("         <FieldRef Name=\"Status\" />"); 
     oSb.Append("         <Value Type=\"Text\">Finalized</Value>"); 
     oSb.Append("        </Eq>"); 
     oSb.Append("        <Leq>"); 
     oSb.Append("         <FieldRef Name=\"DistributionStartDate\" />"); 
     oSb.Append("         <Value Type=\"DateTime\">"); 
     oSb.Append("          <Today />"); 
     oSb.Append("         </Value>"); 
     oSb.Append("        </Leq>"); 
     oSb.Append("      </And>"); 
     oSb.Append("      <Neq>"); 
     oSb.Append("        <FieldRef Name=\"Distribution\" />"); 
     oSb.Append("        <Value Type=\"Text\">Intranet</Value>"); 
     oSb.Append("      </Neq>"); 
     oSb.Append("     </And>"); 
     oSb.Append("    </And>"); 
     oSb.Append("   </Where>"); 
     oSb.Append(" </Query>"); 
     query.Query = oSb.ToString(); 

     return list.GetItems(query); 
    } 

Répondre

2

Je ne suis pas familier avec l'interrogation d'éléments de calendrier, mais j'ai rencontré des problèmes lors de l'utilisation des balises <Query> pour la propriété SPQuery.Query. Est-ce que ça fonctionne correctement si vous supprimez ces deux lignes:

oSb.Append("<Query xmlns=\"http://schemas.microsoft.com/sharepoint/soap/\">"); 
... 
oSb.Append("</Query>"); 
+0

incroyable, qui était tout ce qui était nécessaire, il travaille maintenant . Merci beaucoup! – Marc

0

Hey quelle vue de liste utilisez-vous?

Étant donné que vous ne spécifiez pas la vue à partir de laquelle vous récupérez les éléments, il récupère les résultats de la requête à partir de la vue par défaut.

Est-il possible que votre vue par défaut ne soit pas une vue du calendrier? Parce que je pense que ExpandRecurrence fonctionne uniquement pour les vues de calendrier et pas d'autres vues.

1

Il est bonne idée de passer ViewName lien à votre requête personnalisée, comme indiqué ci-dessous

private SPListItemCollection GetSourceColl(SPList list, string viewName) 
{ 
    SPQuery query = new SPQuery(); 
    query.ExpandRecurrence = true; 
    query.CalendarDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1); 
    System.Text.StringBuilder oSb = new System.Text.StringBuilder(); 
    oSb.Append("<Query xmlns=\"http://schemas.microsoft.com/sharepoint/soap/\">"); 
    oSb.Append("   <Where>"); oSb.Append("    <And>"); 
    oSb.Append("     <DateRangesOverlap>"); 
    oSb.Append("      <FieldRef Name=\"EventDate\" />"); 
    oSb.Append("      <FieldRef Name=\"EndDate\" />"); 
    oSb.Append("      <FieldRef Name=\"RecurrenceID\" />"); 
    oSb.Append("      <Value Type=\"DateTime\">"); 
    oSb.Append("        <Month />"); 
    oSb.Append("      </Value>"); 
    oSb.Append("     </DateRangesOverlap>"); 
    oSb.Append("     <And>"); 
    oSb.Append("      <And>"); 
    oSb.Append("        <Eq>"); 
    oSb.Append("         <FieldRef Name=\"Status\" />"); 
    oSb.Append("         <Value Type=\"Text\">Finalized</Value>"); 
    oSb.Append("        </Eq>"); 
    oSb.Append("        <Leq>"); 
    oSb.Append("         <FieldRef Name=\"DistributionStartDate\" />"); 
    oSb.Append("         <Value Type=\"DateTime\">"); 
    oSb.Append("          <Today />"); 
    oSb.Append("         </Value>"); 
    oSb.Append("        </Leq>"); 
    oSb.Append("      </And>"); 
    oSb.Append("      <Neq>"); 
    oSb.Append("        <FieldRef Name=\"Distribution\" />"); 
    oSb.Append("        <Value Type=\"Text\">Intranet</Value>"); 
    oSb.Append("      </Neq>"); 
    oSb.Append("     </And>"); 
    oSb.Append("    </And>"); 
    oSb.Append("   </Where>"); 
    oSb.Append(" </Query>"); 
    query.Query = oSb.ToString(); 
    SPListItemCollection itemColl = null; 
    if (string.IsNullOrEmpty(viewName)) 
    { 
     itemColl = list.GetItems(query); 
    } 
    else 
    { 
     itemColl = list.GetItems(query, viewName); 
    } 
    return itemColl; 
}