Rodrigo Romano – MVP SharePoint Server

Registros de um Especialista SharePoint :)

Posts Tagged ‘Desenvolvimento; Object Model;

Entendendo a funcionalidade de Eventos Recorrentes no SharePoint (RecurrenceData)

with 2 comments


Olá SharePointers,

Depois de ver muita confusão em fóruns e várias pessoas com dúvida sobre esse mesmo assunto, resolvi fazer um post para esclarecer como o SharePoint trata esses itens internamente.

Antes de mais nada, vamos entender como o SharePoint se comporta com eventos nos calendários.

Vamos entender como o SharePoint trata os eventos de data, observando 3 campos do item: fRecurrence, fAllDayEvent, EventType:

Tipo Descrição fRecurrence fAllDayEvent EventType
Evento Único Um evento criado com o checkbox “Dia todo” e “Recorrência” desmarcados. False False 0
Evento de um dia inteiro Um evento criado com o checkbox “dia todo” marcado. False True 0
Evento Recorrente Um evento criado com o checkbox “recorrência” marcado. Tem um ícone de recorrência na visualização de Todos os Eventos. Aparece como um único evento mestre, mas nas visões de calendários todas as instâncias são mostradas. True False 1
Evento de dia todo recorrente Igual o item acima, mas com o checkbox “dia todo” marcado. True True 1
Exceção da recorrência Criado com a edição de uma instância de um evento recorrente. Tem um ícone de recorrência “riscado”. True False 4
Exceção da recorrência de eventos de dia todo Igual acima, mas com um evento de dia todo. True True 4
Item deletado de uma recorrência Criado deletando uma instância de um evento recorrente. O título é alterado para começar com “Deletado: “ na view de Todos os Eventos e não aparece nas visualizações de calendário. True False 3
Otem deletado de uma recorrência de dia todo. Igual acima, mas para eventos de dia todo. True True 3

Quando criamos um item recorrente, alguns campos que são utilizados em eventos “normais” podem ter significados diferentes:

Campo Valor para evento único Valor para evento recorrente
EventDate Data e hora de ínicio Data e hora de início de quando o evento recorrente foi criado, que pode ser uma data anterior a primeira instância de um evento recorrente;
EndDate Data e hora de término Data e hora da última instância de um evento recorrente. Para eventos recorrentes sem data de término, esta é uma data calculada a vários anos no futuro.
Duration O tempo em segundos entre a data de início e término A duração em segundos de uma instância individual do evento recorrente.

Agora, como o SharePoint armazena a recorrência? Ele armazena vários itens na lista? Como fica a performance disso?

Felizmente, é armazenado 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:

Tipo de recorrência Valor do campo RecurrenceData
Diariamente, a cada um dia, sem data de término <recurrence><rule><firstDayOfWeek>su</firstDayOfWeek>

<repeat><daily dayFrequency=”1″ /></repeat>

<repeatForever>FALSE</repeatForever>

</rule></recurrence>

Semanalmente, toda segunda, terça e quarta, terminando em 31/05/2007 <recurrence><rule><firstDayOfWeek>su</firstDayOfWeek>

<repeat><weekly mo=”TRUE” tu=”TRUE” we=”TRUE” weekFrequency=”1″ /></repeat>

<windowEnd>2007-05-31T22:00:00Z</windowEnd>

</rule></recurrence>

Mensalmente, toda terceira quarta-feira a cada 2 meses, sem data de término <recurrence><rule><firstDayOfWeek>su</firstDayOfWeek>

<repeat><monthlyByDay we=”TRUE” weekdayOfMonth=”third” monthFrequency=”2″ /></repeat>

<repeatForever>FALSE</repeatForever>

</rule></recurrence>

Anualmente, todo dia 18 de maio, termina após 10 ocorrências. <recurrence><rule><firstDayOfWeek>su</firstDayOfWeek>

<repeat><yearly yearFrequency=”1″ month=”5″ day=”18″ /></repeat>

<repeatInstances>10</repeatInstances>

</rule></recurrence>

Agora, provavelmente vocês devem estar pensando o mesmo que pensei: “E AGORA?? Tenho que fazer um parse desse XML para entender a recorrência?”

Depois de um tempo, FELIZMENTE, descobri que não precisamos. Não era possível ter que fazer dessa maneira tão árdua.

O truque está no objeto SPQuery:

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

#FicaADica Pessoal Smiley piscando

Advertisements

Written by Rodrigo Romano

June 21, 2012 at 6:25 pm