Platform SDK: Exchange 2000 Server |
[This is preliminary documentation and subject to change.]
The Web Store expands recurring appointments and meetings when the calendar folder is queried through Microsoft® ActiveX® Data Objects (ADO). The instances are expanded within the range specified by the query. For example, if you query a calendar folder for all entries in the month of November, the Web Store creates the November instances of all recurring appointments and meetings. Although appointments and meetings can be stored in any Exchange folder, the Web Store expands only recurring appointments and meetings stored in calendar folders.
To expand recurring appointments, query the calendar folder using a select statement. Use the WHERE clause of the SELECT statement to specify the range of dates that are expanded within each recurring appointment. First the dates must be adjusted from local time to coordinated universal time UTC (because Web Store dates are stored in UTC), then, converted to ISO format, and finally cast to the dateTime data type, as shown in the following query.
SELECT "DAV:href", "urn:schemas:calendar:dtend","urn:schemas:calendar:dtstart" FROM scope('shallow traversal of """ & CalendarURL & """') WHERE ("urn:schemas:calendar:dtstart" >= CAST("1999-10-25T16:00:00Z" as 'dateTime')) AND ("urn:schemas:calendar:dtend" <= CAST("1999-10-30T01:00:00Z" as 'dateTime'))
The following code example shows how to query a calendar for a specific user. It expands any recurring appointments and meetings from 8:00 am October 25 to 5:00 pm October 29. This example prints the subject, start time, and end time of each appointment and meeting found. The code example includes functions to convert time zones and ISO format; be sure to change the time zone constants to the appropriate values for your clients.
Dim CalendarURL As String Dim Rs As New ADODB.Recordset Dim Rec As New ADODB.Record Dim dtStart As Date Dim dtEnd As Date dtStart = #10/25/1999 8:00:00 AM# dtEnd = #10/29/1999 5:00:00 PM# CalendarURL = "file://./backofficestorage/" & DomainName & "/MBX/" & UserName & "/calendar/" 'Open the record set for the items in the calendar folder Rec.Open CalendarURL Set Rs.ActiveConnection = Rec.ActiveConnection Rs.Source = "SELECT ""DAV:href"", " & _ " ""urn:schemas:calendar:dtstart""," & _ " ""urn:schemas:calendar:dtend""," & _ " ""urn:schemas:calendar:duration""," & _ " ""urn:schemas:httpmail:subject"", " & _ " ""urn:schemas:calendar:instancetype""," & _ " ""urn:schemas:calendar:busystatus"" " & _ " FROM scope('shallow traversal of """ & CalendarURL & """')" & _ " WHERE (""urn:schemas:calendar:dtstart"" >= CAST(""" & GetISODate(TZ_ConvertDateCDO(dtStart)) & """ as 'dateTime')) AND " & _ "(""urn:schemas:calendar:dtend"" <= CAST(""" & GetISODate(TZ_ConvertDateCDO(dtEnd)) & """ as 'dateTime'))" 'Rs.Source = "SELECT ""DAV:href"", " & _ ' " ""urn:schemas:httpmail:subject"", " & _ ' " ""urn:schemas:calendar:dtstart"", " & _ ' " ""urn:schemas:calendar:dtend"" " & _ ' "FROM scope('shallow traversal of """ & CalendarURL & """') " & _ ' "WHERE (""urn:schemas:calendar:dtstart"" >= CAST(""1999-10-01T08:00:00Z"" as 'dateTime')) " & _ ' "AND (""urn:schemas:calendar:dtend"" <= CAST(""1999-11-01T08:00:00Z"" as 'dateTime'))" Rs.Open , , adOpenStatic, adLockOptimistic 'Enumerate the record set and print each item's subject, start time, and end time Rs.MoveFirst Do Until Rs.EOF Debug.Print "Subject: " & Rs.Fields(CdoHTTPMail.cdoSubject).Value Debug.Print "Start time: " & Rs.Fields(cdoDTStart) Debug.Print "End time: " & Rs.Fields(cdoDTEnd) Debug.Print "" Rs.MoveNext Loop Function GetISODate(dtDate As Date) GetISODate = Format(CStr(dtDate), "yyyy-mm-ddThh:mm:ssZ") End Function Function TZ_ConvertDateCDO(dtSrc As Date, _ Optional dstTzId As CdoTimeZoneId = cdoPacific, _ Optional srcTzId As CdoTimeZoneId = cdoPacific, _ Optional srcTz As String = "", _ Optional dstTz As String = "") As Date Dim obAppt As New CDO.Appointment Dim obConfig As New CDO.Configuration Dim bTz As Boolean obAppt.Configuration = obConfig bTz = ((srcTz <> "") Or (dstTz <> "")) If (Not bTz) Then obConfig.Fields(cdoTimeZoneIDURN) = srcTzId Else obConfig.Fields(cdoTimeZoneURN) = srcTz End If obConfig.Fields.Update obAppt.StartTime = dtSrc If (Not bTz) Then obConfig.Fields(cdoTimeZoneIDURN) = dstTzId Else obConfig.Fields(cdoTimeZoneURN) = dstTz End If obConfig.Fields.Update TZ_ConvertDateCDO = obAppt.StartTime End Function