English 中文(简体)
将Sharepoint日历中的重复事件通过Web服务展开?
原标题:
  • 时间:2008-12-17 21:46:39
  •  标签:

通过通过列表.aspx公开的Web服务,可以从Sharepoint的日历中获取事件列表(包括已扩展的循环事件)吗? Shìfǒu kěyǐ tōngguò Lists.aspx gōngkāi de Wǎngzhàn fúwù, cóng Sharepoint de rìlì zhōng huòqǔ shìjiàn lièbiǎo (bāokuò yǐ kuòzhǎn de lúnjí shìjiàn) ma?

如果您使用C#或VB,那么显然是可以做到的,如这里所述,使用以下代码片段:

SPQuery query = new SPQuery();
query.ExpandRecurrence = true;
query.Query = "<Where><DateRangesOverlap><FieldRef Name="EventDate" /><FieldRef Name="EndDate" /><FieldRef Name="RecurrenceID" /><Value Type="DateTime"><Month /></Value></DateRangesOverlap></Where>";

我正在尝试使用cURL通过普通的XML做同样的事情,使用如下查询:

<GetListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/">
<listName>{my guid goes here}</listName>
<query>
    <Query xmlns="">
    <Where>
    <DateRangesOverlap>
      <FieldRef Name="EventDate" />
      <FieldRef Name="EndDate" />
      <FieldRef Name="RecurrenceID" />
      <Value Type="DateTime"><Month/></Value>
   </DateRangesOverlap>
    </Where>
    </Query>
</query>
<queryOptions>
    <QueryOptions>
    <ExpandRecurrence>TRUE</ExpandRecurrence>
    </QueryOptions>
</queryOptions>

这种方法有点有效——它可以获取所有列表项,但是重复的项目没有展开。关键似乎是ExpandRecurrence属性。令人惊讶的是,Google似乎没有太多相关的信息,除了一些博客文章。在搜寻网络的过程中,我读到了一些评论,指出ExpandRecurrence属性不起作用,但也有人说它可以正常工作,而我读过的所有内容都没有给我留下明确的印象。

有人尝试过使用纯XML而不使用C#或VB使其正常工作吗?

最佳回答

不可能。您需要使用SP对象模型,例如SPQuery对象。但这意味着您必须直接在SharePoint服务器上运行该代码,而不是从客户端调用。

请查看我发布的这篇帖子:http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/3c399768-c492-4d7e-8f6e-fa304ed03131

问题回答

最终成功地使此正常工作,并在SharePoint日历上返回所有的重复事件。以下是Web Service查询的XML:

<GetListItems xmlns= http://schemas.microsoft.com/sharepoint/soap/ >
<listName>{your GUID goes here}</listName>
<query>
 <Query>
  <Where>
   <DateRangesOverlap>
    <FieldRef Name="EventDate" />
    <FieldRef Name="EndDate" />
    <FieldRef Name="RecurrenceID" />
    <Value Type= DateTime ><Year/></Value>
   </DateRangesOverlap>
  </Where>
 </Query>
</query>
<queryOptions>
 <QueryOptions>
  <ExpandRecurrence>TRUE</ExpandRecurrence>
 </QueryOptions>
</queryOptions>
</GetListItems>

关键不仅是将 ExpandRecurrence 选项设置为 true - 您还必须在 DateRangeOverlap 中包括值到 Year。

我认为我曾经遇到过类似的问题,它只返回列表中的项目,而不是实际扩展重复出现的项目(即标记为每个星期一发生的项目仅显示为单个记录,而不是多个记录)。

显然,版本12.0.0.6421(2007 SP1)并不会通过Web服务API扩展项目,即使您让它这样做。当我们应用了最新的累积更新(2011年8月)时,它会按我们的期望工作(即每个星期一返回多个预定条目)。

这是我应用了CUs后成功的代码:

    Query for ndQuery:
--------------------
<Where>
<DateRangesOverlap>
<FieldRef Name=""EventDate"" /><FieldRef Name=""EndDate"" /><FieldRef Name=""RecurrenceID"" />
<Value Type=""DateTime""><Month/></Value>
</DateRangesOverlap>
</Where>>
<OrderBy><FieldRef Name= ID  /></OrderBy>

query options for ndQueryOptions:
-----------------------------------------------
<IncludeMandatoryColumns>FALSE</IncludeMandatoryColumns>
<DateInUtc>TRUE</DateInUtc>
<ViewAttributes Scope="Recursive" />
<RecurrencePatternXMLVersion>v3</RecurrencePatternXMLVersion>
<ExpandRecurrence>True</ExpandRecurrence>
<CalendarDate>2011-10-16T00:00:00Z</CalendarDate>
<RecurrenceOrderBy>TRUE</RecurrenceOrderBy>
<ViewAttributes Scope="RecursiveAll"/>

Web service call:
------------------------
XmlNode results = wsList.GetListItems("Events", String.Empty, ndQuery, ndViewFields, String.Empty, ndQueryOptions, "F43559AF-C643-4FF3-AAA3-77471A2D1979");

我追踪此问题的方法是使用类似于TcpTrace(https://www.pocketsoap.com)的工具查看发送的XML数据包。然后,只需确保手工创建的XML数据包看起来相同即可。我希望当你看到XML数据包时,差异应该很明显。然后您可以使用答案更新此问题。

是的,您可以在SharePoint日历中拆分重复事件,并可以在列表中下载特定时间段的内容。

我已经为此创建了一个定制的dll。

将此翻译为中文:https://github.com/shafeequealipt/Share-Point-Recurrance-event-splitter https://github.com/shafeequealipt/Share-Point-Recurrance-event-splitter





相关问题
热门标签