2009-06-17 40 views
0

我在与Web应用程序相同的服务器上运行此查询,因此SPQuery.ExpandRecurrence应该可以工作。但是,以下我只收到3件物品,而3件物品和再次出现物都在本月内。我如何获得反复出现的SharePoint日历列表项

我用Stramit Caml Viewer验证过该查询是否有效,并返回相同的3个项目。

请告诉我我错过了一些明显的东西?

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

回答

2

我不熟悉查询日历项目,但是我对使用SPQuery.Query属性的<Query>标签有问题。如果您删除这两条线路是否正常工作:

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

最好的,这是需要所有的,现在的工作。非常感谢! – Marc 2009-06-18 16:08:38

0

嘿你在用什么列表视图?

由于您未指定从中检索项目的视图,因此它将从默认视图中选取查询结果。

任何机会你的默认视图是日历视图以外的任何东西吗? 因为我认为ExpandRecurrence只适用于日历视图而不是任何其他视图。

1

这是好主意,视图名领带传递给您的自定义查询如下图所示

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; 
} 
相关问题