Comment obtenir des éléments récurrents de la liste des calendriers SharePoint
-
06-07-2019 - |
Question
J'exécute cette requête sur le même serveur que l'application Web. SPQuery.ExpandRecurrence doit donc fonctionner. Cependant, avec les éléments suivants, je n’obtiens que 3 éléments dans la collection de liste renvoyée, par rapport aux 3 éléments et aux réapparitions, qui appartiennent tous au mois en cours.
J'ai vérifié avec Stramit Caml Viewer que la requête fonctionnait et renvoyait les 3 mêmes éléments.
S'il vous plaît, dites-moi qu'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);
}
La solution
Je ne suis pas habitué à interroger les éléments de l'agenda, mais j'ai eu des problèmes pour utiliser les balises <Query>
de la propriété SPQuery.Query. Cela fonctionne-t-il correctement si vous supprimez ces deux lignes:
oSb.Append("<Query xmlns=\"http://schemas.microsoft.com/sharepoint/soap/\">");
...
oSb.Append("</Query>");
Autres conseils
Il est judicieux de transmettre le lien ViewName à 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;
}
Hé quelle vue de liste utilisez-vous?
Puisque vous ne spécifiez pas la vue à partir de laquelle vous récupérez les éléments, les résultats de la requête sont extraits de la vue par défaut.
Votre vue par défaut est-elle autre chose qu'une vue d'agenda? Parce que je pense que ExpandRecurrence ne fonctionne que pour les vues de calendrier et pas pour les autres vues.