SharePoint recurrence data schema

by Justin July 16, 2010 06:45

I have been hunting high and low for some definition of the schema used to populate the RecurrenceData field of an event in a SharePoint calendar. It seems to be one of life’s great mysteries…

Today, I finally stumbled across an msdn blog post that explains how to export SharePoint calendar events to iCal format files. I’m sure that this is the only post in the entire Internet (except for mine now of course…) that contains some really useful nuggets about what you need to set on your SPListItem when creating an event through code. I’ve included a link to the article at the end of this post, but just in case I’ve also copied a bit of it here…

<Updated> I've just added a section about deleting individual events from a recurring series. This took a bit of figuring out! </Updated>

Distinguishing between calendar item types

Calendar items in SharePoint fall into several categories. Single events are those which don’t repeat and only appear once on the calendar, while recurring events may show up any number of times depending on the recurrence pattern selected by a user. Either type of event may have a defined start and end time, or it may be an all-day event which lasts from midnight to 11:59 PM.

Furthermore, individual instances of a recurring event may be deleted or edited, creating a new event which takes its place. The event created by a deleted instance instructs the calendar not to render that day’s instance of the recurring event.

Calendar events can be distinguished by looking at the fRecurrence, fAllDayEvent, and EventType field values:

Type Description fRecurrence fAllDayEvent EventType
Single event

An event created with the All Day Event and Recurrence checkboxes unselected.

False False 0
All-day event

An event created with the All Day Event checkbox selected.

False True 0
Recurring event

An event created with the Recurrence checkbox selected. Has a recurrence icon in the All Events view. Appears as a single master event on the All Events view, but as recurring instances on the Current Events and Calendar views.

True False 1
Recurring all-day event

Same as above, but with the All Day Event checkbox selected at creation time.

True True 1
Recurrence exception

Created by editing an instance of a recurring event. Has a strikethrough recurrence icon in the All Events view.

True False 4
All-day recurrence exception

Same as above, but created by editing an instance of an all-day recurring event.

True True 4
Deleted instance of a recurring event

Created by deleting a instance of a recurring event. Title is prefixed with “Deleted:” in the All Events view, and is hidden in the Current Events and Calendar views.

True False 3
Deleted instance of an all-day recurring event

Same as above, but created by deleting an instance of an all-day recurring event.

True True 3

Understanding recurring events

Recurring events have a number of subtleties not found in single events. Most importantly, one recurring event item expands into any number of recurring event instances when it is rendered in the calendar view. Recurring events also make use of fields left empty in single events.

Certain fields are interpreted differently depending on whether the item in question is a recurring event or a single event:

Field

Value for single event

Value for recurring event

EventDate

Start date and time

Start date and time set for the recurring event when it was created, which may be an earlier date than the first instance of the recurring event.

EndDate

End date and time

End date and time for the last instance of the recurring event. For recurring events with no end date, this is a computed date several years in the future.

Duration The time in seconds between EventDate and EndDate.

The duration in seconds of an individual instance of the recurring event.

Recurrence patterns and expanding events

Recurring events store the pattern used to display instances of the recurring event as XML in the RecurrenceData field. While this data is best used in a read-only fashion, the following are examples of the patterns you may encounter:

Recurrence type RecurrenceData field value

Daily every 1 days, no end date

 

<recurrence><rule>

<firstDayOfWeek>su</firstDayOfWeek>

<repeat><daily dayFrequency="1" /></repeat>

<repeatForever>FALSE</repeatForever>

</rule></recurrence>

Weekly every Monday, Tuesday, and Wednesday, end by 5/31/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>

Monthly the third Wednesday of every 2 months, no end date

<recurrence><rule>

<firstDayOfWeek>su</firstDayOfWeek>

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

<repeatForever>FALSE</repeatForever>

</rule></recurrence>

Yearly every May 18, end after 10 instances

<recurrence><rule>

<firstDayOfWeek>su</firstDayOfWeek>

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

<repeatInstances>10</repeatInstances>

</rule></recurrence>

Deleting individual events from a recurring series

In order to delete an individual event from a recurring series, you actually need to create a new event and set a few properties on it to link it up to a specific instance from the 'owning' series. You will need to set the following properties (You need all of them!):

  • MasterSeriesItemID
    • Set this to the ID of the owning calendar list item
  • UID
    • Set this to the UID of the ownding calendar list item. If you haven't populated this column in your owning list item, you'll be having all sorts of problems already...
  • EventType
    • Set this to 3 to mark it as a deleted record
  • fRecurrence
    • Set this to 1
  • fAllDayEvent
    • Set this to the fAllDayEvent property of the owner calendar list item
  • EventDate
    • Set this to the date of the event instance you want to delete
  • EndDate
    • Set this to the date of the event instance you want to delete
  • RecurrenceID
    • Set this to the date of the event instance you want to delete. (Yep, this is the one that caught me out...has to be set to a datetime and NOT an ID)
  • Title
    • Set this to the title of the owner calendar event, but prefixed with Deleted:

When you have done this, you should now see an additional event in the All Events view of the calendar with a title of "Deleted: Name of your event" and the date of the specific instance. In the Calendar view, the specific instance should be invisible. This means that if you want to undo your deleted instance, you simply delete the extra list item that you have created and it will reappear!

 

 

 

Tags:

Development | SharePoint | Everything

Day 1 of the SharePoint 2010 Evolution Conference

by Justin April 25, 2010 21:44

I turned up nice and early at the Queen Elizabeth II Conference Centre to settle in and partake of the lovely breakfasts that they provide. I promptly managed to drop jam on my jeans…not the best of starts, but I managed to clear it off with a bit of water and no-one seemed to notice so I think I got away with it…

The first day started with the key note, hosted by Steve Smith, Eric Shupps, Spencer Harbar and Brett Lonsdale, summarising the ‘Evolution’ of SharePoint since it’s roots in Tahoe, through SharePoint 2003 (which is when I was first introduced) and then SharePoint 2007, and then hinting at what is to come. All very well but where’s the new stuff, I hear you cry. Rather than go through every session I attended I’m just going to pick out the highlights, if you want my insights on each of the sessions, follow me on Twitterand look at what I tagged with #spevo.

The first session I attended was Eric Shupps’“Introduction to SharePoint 2010 development”, not a session I was planning to go to (I'm not going to dwell on the effects the Icelandic eruption had on the conference (read this postby Eric for a real good insight!), lots of people couldn’t make it, lots of people stepped in and many people presented far more sessions than they were intending to, shame the other guys couldn’t make it but there’s always next year!). As it was, Eric really did lay the foundations for the rest of the conference, many of the things he showed us really became a recurring theme throughout, such as:

  • Visual Studio F5 deployment
  • Sandbox solutions
  • SharePoint deployment configurations
  • Client object model
  • Native linq for SharePoint

Chris O’Briendid a really good session on application lifecycle management, which was all about how to upgrade your solution beyond its initial 1.0.0.0 release. Before getting into the upgrade process, he started off listing a few of the new development ‘features’ offered by Visual Studio 2010 and SharePoint 2010.

  • Ability to import a SP2010 wsp into VS2010, which will ‘disassemble’ the wsp into component features for content types, columns etc
    • Advantages
      • Generates features for everything
      • Quick way to get at the xml for specific columns and content types
      • Granular, you can select which pieces from the wsp you wish to import
    • Disadvantages
      • All content types are generated, including system ones
      • Cannot handle bcs external content types, code workflows, SP2007 wsp’s
      • Web part properties are saved as binary, so are difficult to manipulate
  • Event receivers on specific lists
  • Property bag objects
  • Web template definitions
  • Custom action for adding javascript to a page
  • Upgradeable feature framework

The upgradeable feature framework essentially defined the rest of his session. The mechanism hangs off the version property that was always present in the feature xml but never did anything, now its extremely important (if you didn’t have a version specified in your xml, version 0.0.0.0 was implied). You now have some new xml that can be added to a feature where you can specify what upgrade actions to take and what version range to apply your upgrade actions to. Through the xml you can add columns to existing content types, deploy new items through adding pointers to new elements.xml files, repoint files to new locations. There is also a featureupgrading event that you can attach code to, to do just about anything else. See this msdn articlefor further information on upgrading features.

Eric was back for another session on customising the visual studio 2010 sharepoint deployment process. This was of interest to me as the 2007 process is somewhat ‘clunky’! The key points I picked out of this was how easy and consistent the whole deployment process is, its simply F5 and that’s it. Visual Studio packages all your features into wsps, retracts them if they are installed, deploys, activates and attaches the debugger all in one hit. Microsoft have made the whole process fully extensible, so you can do whatever you want through code. You can use the Microsoft.VisualStudio.SharePoint.Commands api to create custom solution commands to add into visual studio through vsix project types.

The other highlight of the day for me was SharePint. Had a great time catching up with some friends I hadn’t seen for a while. Didn’t stay too late, as its a long way for me to get home and an early start to get back again in the morning. Overall a great first day, and I was looking forward to day 2…

Tags:

Response.End terminating page events within a sharepoint page

by Justin April 09, 2010 11:50

I had a need to be able to present the user of a website with a prompt to open/save a pdf that had been dynamically generated based on inputs from the user during the completion of a form.

I wasn't able to navigate away from the page where this option to download the pdf was presented to the user as i needed to remain within the context of the particular section within the form. Therefore the easiest way to provide the open/save option was through modifying the Page.Response as follows:

Page.Response.ContentType = "application/pdf";

Page.Response.AddHeader(

"content-disposition", "attachment;filename=" + this.FormControl.FormDefinition.Name + ".pdf");

Page.Response.Buffer =

true;

Page.Response.Clear();

Page.Response.OutputStream.Write(PdfBuffer, 0, PdfBuffer.Length);

Page.Response.OutputStream.Flush();

Page.Response.Flush();

This worked fine, the user would click on a download button, the open/save box would pop up and the pdf would be streamed exactly as I wanted it. However, when they closed the open/save box and returned to the page with the download button on, none of the buttons on the page would work anymore, the page was effectively 'dead'. The confusing part, was that if I used exactly same html, code etc on a page outside of SharePoint I didn't have any problems at all. This was specifically related to pages hosted within SharePoint.

After digging around I found a comment buried down within a thread (http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/107b2c17-07fe-4a15-ad81-dcb31e1e9c84/#b5295204-c20a-4910-ab4b-d870ac09f687) where the following solution was proposed, and it works a treat:

In the page where your 'download' button resides, add the following code where you create the button control:

downloadButton.OnClientClick = "this.form.onsubmit = function() {return true;}";

If using a LinkButton instead of a Button add the following instead:

exportButton .OnClientClick = "document.getElementsByTagName(\'form\')[0].onsubmit = function() {return true;}";

And everything then continues to work when you return to your page. The reason appears to be based on the fact that Sharepoint updates some kind of timestamp hash on the form before it is actually submitted to the server. This is done in order to prevent the form from being submit more than once if the user clicks before the Postback is completed, which is a good thing - except when trying to do what we are trying to do here.

Tags: ,

Development | SharePoint | Everything

Wil Wheaton Week (Geek Cred. +3)

by Justin September 02, 2009 12:33

P1030255

Somehow this week the planets have aligned in such a way that my week has centred around Wil Wheaton, raising my Geek Credibility by at least plus 3.

Not only have I just finished reading Just A Geek by Wil Wheaton but I finally got around to watching Stand By Me (which was a 99p deal of the week rental from iTunes). The book is a fantastic read as not only does it give a personal insight into the frustrations and anxieties that he faced as a successful teenage actor from Stand By Me through Star Trek : TNG and beyond but it also acts as an interesting account of his rise from awkward, gangly youth to the ‘grown-up’ Geek that I follow on Twitter and Blog.

Another interesting point is that Wil is the same age as me, something I never realised when watching TNG, and reading his book I feel that I can relate to him in a number of ways (minus the ‘successful’ and ‘actor’ ones of course…). I too aspire to one day become a writer (he has obviously already achieved this, I have some way to go!!!) and the focus he puts on his family is something I believe in very strongly.

So I get +1 for reading the book and +1 for watching the film (if you haven’t seen it, I really recommend it. So many things that happen, phrases they say and general experiences bring back so many memories of my own childhood…).

The final +1 I get is for the awesome T-Shirt that I am wearing in the photo. If you haven’t heard of http://shirt.woot.com, go there and have a look. Its a custom T-Shirt website that allows people to submit their own designs for T-Shirts and the top 20 most popular can be ordered (they deliver to the UK and are very reasonably priced). I was the VERY LAST person to order Wil Wheaton’s ‘How we roll’ T-Shirt design and if you go to this link you’ll see proof that I was the person that made this T-Shirt go out of print as I ordered the last one!! I ordered it using an id that matches my Twitter account and my XBox Live Gamer tag.

So, how Geeky is THAT!?

Tags:

Everything | General

Improved CAML IntelliSense

by Justin July 16, 2009 10:46

Don’t know why I missed this but its an essential add-in for Visual Studio 2005/2008. This guy has taken the core SharePoint schema files and extended them to add all that information from the SDK that is notoriously difficult to find. He’s done this by getting as much information as possible and sticking it in xs:annotation elements, and replacing as many xs:string types with enumerated types as possible so that we get the possible valid values.

A couple of examples that will make you go and download this straightaway:

  • When selecting a true/false type, he pops up an annotation that lets you know what type of true/false value you need, either TRUE, True, true etc etc
  • When you are creating a ListInstance and start typing the TemplateType, not only does it give you an enumeration of the various integer values that you can enter but it pops up an annotation describing what each one is

I honestly think that if you are doing SharePoint development this could easily save you a couple of hours a week!

Here’s a link to his post that describes it in more detail and where you can download the files : CAML.Net IntelliSense

Tags:

SharePoint | Everything

Powered by BlogEngine.NET 1.4.5.13
Theme by Mads Kristensen | Modified by Mooglegiant