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);
    }
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top