SharePoint serendipity is the effect by which one accidentally discovers something fortunate, especially while looking for something else entirely. In this case, it is the occassional musings, observations, and Ouija board readings about the phabulously

ProcessBatchData and New Event Items

ProcessBatchData and New Event Items

  • Comments 1
  • Likes

I was recently asked to help provide some code that addressed a couple of concerns:  1) how to use the ProcessBatchData method to add new items to a list and 2) how to create the Xml that ProcessBatchData uses to create different types of events, namely all day events and recurring events.  In this post I'm simply going to share the code I wrote, along with a few caveats and things to think about when you're doing this. 

  1. Another part of the scenario (which was from a SharePoint 2007 site that is moving to SharePoint 2010) was having the deletion of an item in one list be used as a key for deleting a number of items in a different list.  While that is easy enough to code, I would suggest in SharePoint 2010 it would be better to set up lookup between the lists that enforces referential integrity.  That allows you to do cascading deletes so when an item in one list is deleted, all the related records in the other list will be deleted for you automatically.
  2. ProcessBatchData is not a panacea for deletes anyways.  It operates more efficiently because it doesn't actually delete items, it just moves them to the recycle bin.
  3. In the code sample below I demonstrate using ProcessBatchData to add one regular, one all day, and one recurring event.  HOWEVER, you need to take the recurring event with a grain of salt because the recurrence pattern XML is only valid for the particular scenario I created.  To get different recurrence patterns (or any other Xml representation of the data), I HIGHLY recommend you use the Lists web service to retrieve items from a calendar list.  The recurrence pattern Xml will be included in the Xml that's returned.

So with those caveats in mind, here's the sample code (crossing fingers that my blogging editor here doesn't completely screw up the formatting).  I wrote and tested this against a SharePoint 2010 server but I'm guessing it will probably work against a SharePoint 2007 server as well.

        protected void AddBtn_Click(object sender, EventArgs e)
            //sample code that uses ProcessBatchData to add several new items
                //get a reference to the list
                SPList theList = SPContext.Current.Web.GetList("/Lists/Events");
                //create the XML that will be used to add the items
                System.Text.StringBuilder addXml = new System.Text.StringBuilder(4096);
                //create the root node of the add Xml instructions
                addXml.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><Batch>");
                //loop through once for each type of event - regular, all day,
                //and recurring
                for (int i = 0; i < 3; i++)
                    //create the commands that indicate we are creating a new item
                    //that needs to be saved
                    addXml.Append("<Method ID=\"A" + i.ToString() + "\"><SetList Scope=\"Request\">" +
                        theList.ID.ToString() + "</SetList>"  +
                        "<SetVar Name=\"ID\">New</SetVar>" +
                        "<SetVar Name=\"Cmd\">Save</SetVar>");
                    //add values for each of the fields in the event
                    addXml.Append("<SetVar Name=\"urn:schemas-microsoft-com:office:office#Title\">Event " + i.ToString() + "</SetVar>");
                    addXml.Append("<SetVar Name=\"urn:schemas-microsoft-com:office:office#Location\">At the Park</SetVar>");
                    //Event Date - ENCODE YOUR DATES or all your fields may show up empty
                    addXml.Append("<SetVar Name=\"urn:schemas-microsoft-com:office:office#EventDate\">" +
                        SPUtility.CreateISO8601DateTimeFromSystemDateTime(new DateTime(2010,
                            5, 26, 10, 0,0, DateTimeKind.Local)) + "</SetVar>");
                    //End Date - ENCODE YOUR DATES or all your fields may show up empty
                    addXml.Append("<SetVar Name=\"urn:schemas-microsoft-com:office:office#EndDate\">" +
                        SPUtility.CreateISO8601DateTimeFromSystemDateTime(new DateTime(2010,
                        5, 26, 11, 0, 0, DateTimeKind.Local)) + "</SetVar>");
                    addXml.Append("<SetVar Name=\"urn:schemas-microsoft-com:office:office#Description\">This is a new event</SetVar>");
                    //if this is the second item, make it an all day event
                    if (i == 1)
                        addXml.Append("<SetVar Name=\"urn:schemas-microsoft-com:office:office#fAllDayEvent\">1</SetVar>");
                        addXml.Append("<SetVar Name=\"urn:schemas-microsoft-com:office:office#Duration\">86340</SetVar>");
                    //if this is the third item, make it a recurring event
                    if (i == 2)
                        //set the flag indicating we are using a recurrence pattern
                        addXml.Append("<SetVar Name=\"urn:schemas-microsoft-com:office:office#fRecurrence\">1</SetVar>");
                        addXml.Append("<SetVar Name=\"urn:schemas-microsoft-com:office:office#EventType\">1</SetVar>");
                        //this recurrence pattern is for every 1 week on Monday and Wednesday
                        //it is going to recur for 10 instances
                        //NOTE: YOU MUST ENCODE THE DATA!
                        //for other recurrence patterns suggest you create them in a list
                        //and use the Lists web service to retrieve the item and examine
                        //the RecurrenceData field
                        addXml.Append("<SetVar Name=\"urn:schemas-microsoft-com:office:office#RecurrenceData\">" +
                        System.Web.HttpUtility.HtmlEncode("<recurrence><rule>" +
                            "<firstDayOfWeek>su</firstDayOfWeek><repeat><weekly mo=\"TRUE\" " +
                            "we=\"TRUE\" weekFrequency=\"1\" /></repeat><repeatInstances>10" +
                            "</repeatInstances></rule></recurrence>") + "</SetVar>");
                    //complete the method for this transaction
                //add the closing tag to the add Xml instructions
                //run the code to add the items
            catch (Exception ex)
                //add appropriate error handling and reporting here
                Debug.WriteLine("Error: " + ex.Message);


Your comment has been posted.   Close
Thank you, your comment requires moderation so it may take a while to appear.   Close
Leave a Comment