Using Outlook.Items.Restrict()


Recently, I was working on an Outlook Visual Studio Tools for Office (VSTO) solution and encountered a problem with unexpected results with the Restrict() method. What I was doing was trying to locate all the appointments (meeting and recurrence) that occurred today. The Restrict command was returning items where the Start and End date properties that were from 2000, 2001, 2010, etc. I quickly deduced that it was also returning recurring items that were dated back to the first occurrence. Here is what my code looked like:

///
<summary>
/// EXTENSION METHOD
/// Get all the appointments between the given date times
/// </summary>

/// <param name="PobjItems"></param>
/// <param name="PobjStart"></param>
/// <param name="PobjEnd"></param>
/// <returns></returns>
public static List<Outlook.AppointmentItem> FindAppointments(this Outlook.Items PobjItems,
                                              DateTime PobjStart,
                                              DateTime PobjEnd)
{
   try
   {
      List<Outlook.AppointmentItem> LobjReturn = new List<Outlook.AppointmentItem>();
      string LstrCriteria = "[Start] >= \"" + PobjStart.ToString("g") + "\" AND [End] <= \"" + PobjEnd.ToString("g") + "\"";
      // we want to find the oldest first. This way we do
      // not get stuck on all day appointments that are conflicting
      // with the current value.
      PobjItems.Sort("[End]");
      PobjItems.IncludeRecurrences = true;
      PobjItems = PobjItems.Restrict(LstrCriteria);
      object LobjItem = PobjItems.GetFirst();
      // chcek the appointments or meetings against the
      // the rules and set Skype status
      Outlook.AppointmentItem LobjAppt = null;
      do
      {
         if (LobjItem is Outlook.MeetingItem)
         {
            LobjAppt = ((Outlook.MeetingItem)LobjItem).GetAssociatedAppointment(false);
         }
         else
         {
            LobjAppt = (Outlook.AppointmentItem)LobjItem;
         }
         // as long as we are not null
         if (LobjItem != null)
         {
            LobjReturn.Add(LobjAppt);
            LobjItem = PobjItems.GetNext();
         }
      }
      while (LobjItem != null);
      // done
      return LobjReturn;
   }
   catch (Exception PobjEx)
   {
      PobjEx.Log(false);
      return null;
   }
}

What I created is an extension item off the Outlook.Items object that allows me to easily restrict them to appointments found between two given dates. This is actually a very useful extension method. If it worked the way I expected it to. What I found out is that in order to get recurring items that occur today which have todays date in the Start and End date properties, you MUST sort the results by the [Start] date. You cannot sort by the [End] date as I had done. Almost exactly the same, here is the fixed function:

///
<summary>
/// EXTENSION METHOD
/// Get all the appointments between the given date times
/// </summary>

/// <param name="PobjItems"></param>
/// <param name="PobjStart"></param>
/// <param name="PobjEnd"></param>
/// <returns></returns>
public static List<Outlook.AppointmentItem> FindAppointments(this Outlook.Items PobjItems,
                                              DateTime PobjStart,
                                              DateTime PobjEnd)
{
   try
   {
      List<Outlook.AppointmentItem> LobjReturn = new List<Outlook.AppointmentItem>();
      string LstrCriteria = "[Start] >= \"" + PobjStart.ToString("g") + "\" AND [End] <= \"" + PobjEnd.ToString("g") + "\"";
      // FIX: we must use [Start] in the Sort to get the right recurrence 
      // for todays date...
      PobjItems.Sort("[Start]");
      PobjItems.IncludeRecurrences = true;
      PobjItems = PobjItems.Restrict(LstrCriteria);
      object LobjItem = PobjItems.GetFirst();
      // chcek the appointments or meetings against the
      // the rules and set Skype status
      Outlook.AppointmentItem LobjAppt = null;
      do
      {
         if (LobjItem is Outlook.MeetingItem)
         {
            LobjAppt = ((Outlook.MeetingItem)LobjItem).GetAssociatedAppointment(false);
         }
         else
         {
            LobjAppt = (Outlook.AppointmentItem)LobjItem;
         }
         // as long as we are not null
         if (LobjItem != null)
         {
            LobjReturn.Add(LobjAppt);
            LobjItem = PobjItems.GetNext();
         }
      }
      while (LobjItem != null);
      // done
      return LobjReturn;
   }
   catch (Exception PobjEx)
   {
      PobjEx.Log(false);
      return null;
   }
}

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s