A funcionalidade de eventos recorrentes, presente nas listas do tipo Calendário do SharePoint, pode ser muito interessante e útil. Para aprender como agendar um evento, veja esse link: http://office.microsoft.com/pt-br/sharepoint-server-help/agendar-eventos-e-etapas-com-um-calendario-HA101729898.aspx. Existem alguns truques que, se usados corretamente, podem facilitar e muito a vida de um desenvolvedor.
O primeiro passo é entender como o SharePoint se comporta com esses eventos, ao salvar um item de calendário, internamente. Para isso, o primeiro passo é observar alguns campos internos (fRecurrence, fAllDayEvent, EventType):
O quadro acima, mostra como o SharePoint se comporta durante o salvamento de um item na lista de calendário. Entretanto, alguns campos "default" podem ter comportamentos diferentes de acordo com o cenário de teste. Vejam:
A maior confusão está no armazenamento desses itens, a forma como é mostrado na visão de calendário sugere que ao criarmos um evento recorrente, são gerados vários itens, um para cada ocorrência da recorrência desejada. Entretanto, a engine do SharePoint armazena apenas 1 ITEM na lista. Todas as recorrências são apenas SOMBRAS ou projeções. Tudo isso é controlado pelo campo RecurrenceData.
Vejam alguns exemplos:
<repeat><daily dayFrequency=”1″ /></repeat>
<repeatForever>FALSE</repeatForever>
</rule></recurrence>
<repeat><weekly mo=”TRUE” tu=”TRUE” we=”TRUE” weekFrequency=”1″ /></repeat>
<windowEnd>2007-05-31T22:00:00Z</windowEnd>
<repeat><monthlyByDay we=”TRUE” weekdayOfMonth=”third” monthFrequency=”2″ /></repeat>
<repeat><yearly yearFrequency=”1″ month=”5″ day=”18″ /></repeat>
<repeatInstances>10</repeatInstances>
Para os desenvolvedores, todo o truque está no objeto SPQuery, utilizando a propriedade ExpandRecurrence que "explode" os itens, gerando uma sombra de vários itens com o mesmo ID do original.
using(SPSite site = new SPSite("http://localhost/"))using (SPWeb web = site.RootWeb){ SPList calendarList = web.Lists.TryGetList("Calendar"); if (calendarList != null) { SPQuery query = new SPQuery(); // Aqui que a mágica acontece query.ExpandRecurrence = true; query.Query = "<Where><Eq><FieldRef Name='EventDate' IncludeTimeValue='False'/><Value Type='DateTime'>"+SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now)+"</Value></Eq></Where>"; // Pesquisar apartir do começo do mês atual query.CalendarDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1); // Retorna todos os itens (incluindo as ocorrências de um // evento recorrente que aparecem na visão de calendário // do mês atual para frente // Exemplo: Se tem apenas 1 item na lista, com 10 ocorrências // nesse mês, o resultado serão 10 SPListItem com o mesmo ID de // item, mudando apenas as informações sobre a data para conter // uma única ocorrência SPListItemCollection calendarItems = calendarList.GetItems(query); foreach (SPListItem item in calendarItems) { Console.WriteLine(item["Title"] + ": começa " + item["EventDate"].ToString() + " e termina "+ item["EndDate"].ToString()); } }}
using
(SPSite site =
new
SPSite(
"http://localhost/"
))
(SPWeb web = site.RootWeb)
{
SPList calendarList = web.Lists.TryGetList(
"Calendar"
);
if
(calendarList !=
null
)
SPQuery query =
SPQuery();
// Aqui que a mágica acontece
query.ExpandRecurrence =
true
;
query.Query =
"<Where><Eq><FieldRef Name='EventDate' IncludeTimeValue='False'/><Value Type='DateTime'>"
+SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now)+
"</Value></Eq></Where>"
// Pesquisar apartir do começo do mês atual
query.CalendarDate =
DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
// Retorna todos os itens (incluindo as ocorrências de um
// evento recorrente que aparecem na visão de calendário
// do mês atual para frente
// Exemplo: Se tem apenas 1 item na lista, com 10 ocorrências
// nesse mês, o resultado serão 10 SPListItem com o mesmo ID de
// item, mudando apenas as informações sobre a data para conter
// uma única ocorrência
SPListItemCollection calendarItems = calendarList.GetItems(query);
foreach
(SPListItem item
in
calendarItems)
Console.WriteLine(item[
"Title"
] +
": começa "
+ item[
"EventDate"
].ToString() +
" e termina "
"EndDate"
].ToString());
}
Fernando Lugão Veltem edited Original. Comment: alterado titulo e tags, adicionado pt-br, isso foi necessário pois o artigo foi criado na área inglês no Technet Wiki