Platform SDK: Exchange Server

Formatting Schedule Data

Schedule data is moved to the user's mailbox as an attachment to a new mail message. The user opens the message and imports the data by double-clicking the attachment. You must install Microsoft Schedule+ to import the data.

In the primary file, the schedule data appears to be another message in the message section. In the following example, the third message (in bold) is the schedule message, which is placed in the Inbox.

MAILMESSAGE,PROFS:SANFRAN(HOWARDS)
Folder,Sender,To,Cc,Bcc,Subject,Send-Date,Received-Date,Priority,Unread,Unsent,Body
,Bill Lee,Howard Snyder,,,"End of Month Report",19950321093421,,-1,,,#SALESPO1.SEC(54)
Phoenix Project,Pat Parkes,Howard Snyder,,,Back Office Review,,,,,,#SALESPO1.SEC(161)
,Howard Snyder,Howard Snyder,,,Schedule+,19951005022543,,1,TRUE,,#SALESPO1.SEC(356)

In the secondary file, set the body of the message to a length of 0. The Migration Wizard automatically adds instructions for importing the schedule file in English, German, French, or Japanese, depending on the language of your Microsoft Exchange Server.

Type,Length,Encoding,Islast,Name,Position,Format
Body,0,,FALSE,,,
Schedule,298,,True,HOWARDS.SC2,-1,
SCHEDULE+2 EXPORT VERSION 103
...

The first line in the schedule file must be a header line as follows:

SCHEDULE+2 EXPORT VERSION 103

Each line thereafter has schedule properties and values. The following table describes the differences between the schedule file format and the standard migration file format.

Property Description
Object Starts with line that describes type of data (for example: "Projects"), followed by a colon. Next line has open brace ({). Each line thereafter has a property, followed by a colon and the value. Last line of table has close brace (}). Comparable to a header line and row of data in the migration file format.
Object containing an object An object can contain another object. Within open and close braces of an object, another set of braces can designate another object. For example, recurring appointments can contain exception objects to describe modified or deleted single appointments in the recurring appointment schedule.
Separator Schedule file format uses a colon instead of a comma to separate schedule property names from values. A colon must be followed by a space.
Space A space after a colon and before a value are ignored. You can use spaces to make the file more readable.
Line continuation character Schedule file format uses a backslash (\), followed by a carriage return and line feed, to indicate that the line continues. Lines cannot exceed 80 characters. You can use two line continuation characters to make a line break in appointment or task descriptions.
Quotation mark Schedule file format encloses all strings and binary data in quotation marks. Quotation marks inside these values are represented by a backslash followed by a quotation mark (\").
Date/Time Date = mm-dd-yyyy. Time = hh:mm, 24-hour format. You can join date and time with a space: mm-dd-yyyy hh:mm. For example, 9:00 AM on New Years Day = 01-01-1996 09:00. All times and dates are imported in the time zone of user.

Tip  To see examples of the schedule file format, create examples in Schedule+ and export the calendar.

The following Schedule+ objects can be created in the schedule file format.

Property Description
Projects Table of all projects.
Contacts Table of contacts.
SingleAppointments Appointments that occur only once.
SingleEvents Events that occur only once.
SingleTasks Tasks that occur only once.
RecurringAppointments Recurring appointments.
RecurringEvents Recurring events.
RecurringTasks Recurring tasks.

Each type of property can occur multiple times within the file. If objects of the same type are kept together, import performance is improved.

SCHEDULE+2 EXPORT VERSION 103
Projects:
{
    data
}
Projects:
{
    data
}
Contacts:
{
    data
}
RecurringAppointments:
{
    data
}
RecurringEvents:
{
    data
}
RecurringTasks:
{
    data
}
SingleAppointments:
{
    data
}
SingleEvents:
{
    data
}
SingleTasks:
{
    data
}

Schedule+ Projects

The following examples illustrate the projects format:

Projects:     
{
    Priority:     16945
    Text:     "Colossus Project"
}
Projects:     
{
    Priority:     16689
    Text:     "Region 6 Spring Sales Drive"
}

The following table describes the properties of projects.

Property Description
Priority Urgency of project.
Text Description of project.

For more information on priorities, see the Priority Property topic later in this section.

Schedule+ Contacts

Schedule+ contacts are separate from Microsoft Exchange Client PAB entries. There is no link between them. Depending on the configuration of your source system, contacts can be imported into Schedule+ if contact entries are created in the schedule migration file.

You can also create contacts from PAB entries in the source system. Users can delete contacts created this way, but they cannot add information from PAB entries to the contacts list.

The following example illustrates the contact format:

Contacts:     
{
    LastName:     "Lee"
    Department:     "MIS"
    AddressBusiness:     "12 Main St"
    CountryBusiness:     "USA"
    PhoneBusiness:     "415 555-9839"
    CityBusiness:     "San Francisco"
    Office:     "16/2102"
    Company:     "Ferguson & Bardell"
    Assistant:     "Sarah"
    ZipCodeBusiness:     "94105"
    CurrentPhone1:     4
    FirstName:     "William"
    StateBusiness:     "CA"
    JobTitle:     "Team Manager"
}

The following table describes the properties of contacts.

Property Description
AddressBusiness Business address.
AddressHome Home address.
Assistant Assistant of the contact.
CityBusiness City for the business address.
CityHome City for the home address.
Company Company.
CountryBusiness Country for the business address.
CountryHome Country for the home address.
Department Department.
FirstName First name.
JobTitle Job title.
LastName Last name.
Notes Miscellaneous information.
Office Office location.
PhoneAssistant Phone number of the contact's assistant.
PhoneBusiness Business phone number.
PhoneBusiness2 Second business phone number.
PhoneFax Fax phone number.
PhoneHome Home phone number.
PhoneHome2 Second home phone number.
PhoneMobile Mobile phone number.
PhonePager Pager phone number.
Spouse Name of the contact's spouse.
StateBusiness State/province of business address.
StateHome State/province of home address.
User1 User-defined string for contact information that doesn't fit any other field.
User2 User-defined string for contact information that doesn't fit any other field.
User3 User-defined string for contact information that doesn't fit any other field.
User4 User-defined string for contact information that doesn't fit any other field.
ZipCodeBusiness Business address postal code.
ZipCodeHome Home address postal code.

Schedule+ SingleAppointments

If attendees are invited to a migrated appointment, put their names into the Notes or Text property of the appointment. To make it easier for the user to send mail to the attendees or to add the attendees to the attendees list, use a semicolon to separate the names. The user can then copy the list of names into the To line of a message or to the attendees list and resolve them against the Address Book.

Schedule+ appointments can list outside attendees. Their unique MAPI identifier is stored with the appointment and is used to verify responses to meeting requests. Without an attendee's MAPI identifier, the display name cannot be added to the attendees list.

The following example illustrates the SingleAppointment format:

SingleAppointments:     
{
    Ring:     T
    AlarmAmount:     15
    Text:     "Attend training class."
    AlarmTypeUnit:     0
    AlarmAmountOriginal:     15
    BusyType:     0
    Start:     3-5-1996 15:00
    End:     3-5-1996 17:00
}
SingleAppointments:     
{
    Where:     "Rona's office"
    Text:     "Meet with Rona about shifting contacts to new employees.\
\
Rona Rumalski"
    Ring:     T
    AlarmAmount:     15
    Start:     3-5-1996 09:00
    BusyType:     1
    End:     3-5-1996 10:30
    AlarmTypeUnit:     0
}

The following table describes the properties of SingleAppointments.

Property Values Description
AlarmAmount Integer Amount of time before meeting date to issue alarm.
AlarmTypeUnit 0 = Minute

1 = Hour

2 = Day

3 = Week

4 = Month

Type of unit for AlarmAmount.
BeforeEnd T or F

Default = F

Alarm is set relative to end rather than to start of SingleAppointment.
BusyType 0 = Tentative

1 = Busy

If SingleAppointment should appear busy or tentative.
End Required. mm-dd-yyyy hh:mm End date and time for SingleAppointment.
IsRecurringInstance T or F

Default = F

If SingleAppointment is instance of recurring series.
Notes   Miscellaneous information. Text appears in Notes property page for appointment.
Ring T or F

Default = T

If alarm was set for SingleAppointment.
Start Required. mm-dd-yyyy hh:mm Start date and time for SingleAppointment.
Text   Description for SingleAppointment. Text appears on calendar.
Where Location for appointment.

Schedule+ SingleEvents

Events are different from appointments in the following ways:

The following example illustrates the SingleEvents format:

SingleEvents:     
{
    Ring:     T
    AlarmAmount:     2
    Text:     "River City 10 mile hike and camp. (Weather permitting.)\
Call Josh at 555-1232 to make sure it is happening."
    AlarmTypeUnit:     2
    AlarmAmount:     2
    StartDate:     3-2-1996
    EndDate:     3-3-1996
}

The following table describes the properties of SingleEvents:

Property Values Description
AlarmAmount Integer Amount of time before midnight to issue alarm.
AlarmTypeUnit 0 = Minute

1 = Hour

2 = Day

3 = Week

4 = Month

Type of unit for AlarmAmount.
BusyType 0 = Tentative

1 = Busy

If event should appear busy or tentative.
EndDate Required. mm-dd-yyyy End date for event.
IsRecurringInstance T or F

Default = F

Indicates if event is instance of recurring series.
Notes   Miscellaneous information.
Ring T or F

Default = T

If alarm was set to ring for event.
StartDate Required. mm-dd-yyyy hh:mm Start date for event.
Text String Text (description) for event.

Schedule+ SingleTasks

Schedule+ relates tasks to projects by using the ProjectID number. Without a ProjectID number, tasks are imported without being related to a project.

The following example illustrates the SingleTask format:

SingleTasks:     
{
    Priority:     16672
    Text:     "Update summer catalog."
    AmountActualEffort:     0
    AmountEstimatedEffort:     1
    IsTaskAutoDone:     T
    StartDate:     3-6-1996
    AmountStartWork:     4
    TypeUnitStartWork:     2
    EndDate:     3-10-1996
    TypeUnitEstimatedEffort:     2
    TypeUnitActualEffort:     2
}

The following table describes the properties of SingleTasks.

Property Values Description
AmountActualEffort Number Amount of time of actual effort, in units set by TypeUnitActualEffort.
TypeUnitActualEffort 0 = Minute

1 = Hour

2 = Day

3 = Week

4 = Month

Type of unit for measuring actual effort for task.
AmountEstimatedEffort Number Amount of estimated time effort, in units set by TypeUnitEstimatedEffort.
TypeUnitEstimatedEffort 0 = Minute

1 = Hour

2 = Day

3 = Week

4 = Month

Type of unit for measuring estimated effort for task.
AmountStartWork Number Amount of time before end date to start work on item, in units set by TypeUnitStartWork.
TypeUnitStartWork 0 = Minute

1 = Hour

2 = Day

3 = Week

4 = Month

Type of unit for amount of time before end date to start work.
Billing String Billing information.
CompletedDate mm-dd-yyyy Date task was completed.
StartDate mm-dd-yyyy Date task starts.
EndDate mm-dd-yyyy Date task ends.
IsTaskAutoDone T or F If task should appear as automatically completed on end date.
Mileage String Mileage associated with task.
PercentCompleted Number Percentage of task completed.
Priority See the following explanation. Priority of task.

Priority Property

Schedule+ prioritizes tasks by using numbers (1 through 9) and/or letters (A through Z). For example, "A1," " 3," and "B" are valid priorities. The migration file format converts this priority to a decimal.

The following table illustrates how priorities are converted to decimal versions. The ASCII value of the letter or number is converted to a hexadecimal, the number 20 is prefixed or appended as a space and place holder, and this number is converted to a decimal.


Priority
Convert to
Hexadecimal
Prefix or
Append 20
Convert to
Decimal
1 31 2031 8241
2 32 2032 8242
3 33 2033 8243
4 34 2034 8244
5 35 2035 8245
6 36 2036 8246
7 37 2037 8247
8 38 2038 8248
9 39 2039 8249
A 41 4120 16672
B 42 4220 16928
C 43 4320 17184
D 44 4420 17440
E 45 4520 17696
F 46 4620 17952
G 47 4720 18208
H 48 4820 18464
I 49 4920 18720
J 4A 4A20 18976
K 4B 4B20 19232
L 4C 4C20 19488
M 4D 4D20 19744
N 4E 4E20 20000
O 4F 4F20 20256
P 50 5020 20512
Q 51 5120 20768
R 52 5220 21024
S 53 5320 21280
T 54 5420 21536
U 55 5520 21792
V 56 5620 22048
W 57 5720 22304
X 58 5820 22560
Y 59 5920 22816
Z 5A 5A20 23072

For a number priority of 3, for example, use the hexadecimal 33 and prefix 20. The value 2033 converts to decimal 8243. For a letter priority of C, for example, take the hexadecimal 43, and append 20. The value 4320 converts to 17184.

If your existing system prioritizes by requiring both letters and numbers (for example: A1, B3, or Z9), use this procedure. Convert both to hexadecimal, concatenate (link together) the values of the letter and number, and then convert that value to decimal. For a priority of A3, for example, use the hexadecimal of A (41) and concatenate it with the hexadecimal of 3 (33). The value 4133 converts to 16691.

Schedule+ Recurring Appointments, Events, and Tasks

The following examples illustrate the format for recurring appointments, events, and tasks:

RecurringEvents:     
{
    Text:     "Yearly tax audit. Start preparations early."
    Ring:     T
    AlarmAmount:     21
    AlarmTypeUnit:     2
    StartDate:     3-4-1996
    EndDate:     3-4-1996
    RecurringType:     7
    YearInterval:     1
    DayOfMonthMask:     8
    MonthOfYearMask:     4
}
RecurringAppointments:     
{
    Text:     "SATR meeting.\
\
Big Sale."
    Ring:     T
    AlarmAmount:     15
    DayOfWeekStart:     0
    StartRecurringTime:     12:00
    YearInterval:     1
    WeekInterval:     1
    BusyType:     0
    RecurringType:     51
    StartRecurringDate:     2-26-1996
    DayOfWeekMask:     32
    EndRecurringDate:     3-4-2000
    DayOfMonthMask:     8
    EndRecurringTime:     13:00
    MonthOfYearMask:     4
    AlarmTypeUnit:     0
}
RecurringTasks:     
{
    Text:     "Check online mailbox for new mail."
    Priority:     8243
    TypeUnitActualEffort:     2
    AmountEstimatedEffort:     1
    TypeUnitEstimatedEffort:     2
    Billing:     "Billed at higher rate"
    BeforeEndOriginal:     F
    AmountStartWork:     0
    StartRecurringDate:     3-2-1996
    RecurringType:     64
    WeekInterval:     1
    DayOfWeekMask:     16
    DayOfWeekStart:     0
    DayInterval:     1
    EndRecurringDate:     8-10-1996
    TypeUnitStartWork:     2
    Ring:     T
    AlarmAmount:     0
    AlarmTypeUnit:     2
    BeforeEnd:     F
    Exceptions:     
    {
        InstanceDate:     3-3-1996
        StartDate: 3-3-1996
        EndDate:     3-4-1996
        Deleted:     F
        Text: "Check online mailbox for new mail. Check for new rates."
        Priority:     8241
        TypeUnitActualEffort:     2
        AmountEstimatedEffort:     1
        TypeUnitEstimatedEffort:     2
        BeforeEndOriginal:     F
        AmountStartWork:     0
        TypeUnitStartWork:     2
        Ring:     T
        AlarmAmount:     5
        AlarmTypeUnit:     2
        BeforeEnd:     F
    }
}

The following table describes the properties shared by recurring appointments, events, and tasks.

Property Values Description
DayInterval 1 through 999 Number of days between instances. Used only if RecurringType is 64.
DayOfMonthMask 1st day of month = bit 0

31st day of month = bit 30

Bit field indicating which days of the month are valid for recurrence pattern. Used only if RecurringType is 7 or 12.
DayOfWeekMask Sunday = bit 0

Saturday = bit 6

Bit field indicating which days of the week are valid for recurrence pattern. Used only if RecurringType is 48, 51, or 56.
DayOfWeekStart 0 through 6

Sunday = 0

Start of week preference. Used only if RecurringType is 48. For recalculating biweekly meetings.
EndRecurringDate mm-dd-yyyy End date for recurrence pattern.
EndRecurringTime Required. hh:mm End time for a recurring item.
Exceptions See Exceptions Property topic later in this section. Exceptions to a recurring item.
FirstRecurringAlarmDate Today's date in mm-dd-yyyy format. First recurring item with alarm. Recalculated during import into Schedule+.
MonthInterval 1 through 99 Interval between months for recurrence pattern. Used only if RecurringType is 12 or 56.
MonthOfYearMask January = bit 0

December = bit 11

Bit field indicating which months of year are valid for recurrence pattern. Used only if RecurringType is 7 or 51.
RecurringType Required.

7 = Yearly on specific day

12 = Monthly on specific day

48 = Weekly

51 = Yearly on a pattern

56 = Monthly on a pattern

64 = Daily

Type of recurrence pattern.
StartRecurringDate Required.

mm-dd-yyyy

Start date for recurrence pattern.
StartRecurringTime Required.

hh:mm

Start time for recurring item.
WeekInterval Positive integer Interval between weeks for recurrence pattern. Used only if RecurringType is 48, 51, or 56.
YearInterval Positive integer Interval between years for recurrence pattern. Used only if RecurringType is 7.

The following table describes additional values required for the RecurringType property.

RecurringType Required values
7 = Yearly on specific day DayOfMonthMask, MonthOfYearMask, YearInterval
12 = Monthly on specific day DayOfMonthMask, MonthInterval
48 = Weekly DayOfWeekMask, DayOfWeekStart, WeekInterval
51 = Yearly on a pattern DayOfWeekMask, MonthOfYearMask, WeekInterval
56 = Monthly on a pattern DayOfWeekMask, MonthInterval, WeekInterval
64 = Daily DayInterval

Exceptions Property

Exceptions are deleted or modified properties of a recurring appointment or task. To delete, only two properties are required: Deleted and InstanceDate. To modify, the appointment or task must be redefined as a single appointment or task, and you must redefine the StartDate and EndDate, even if only the Location property is modified.

Property Values Description
Deleted T or F If instance was marked "deleted." If FALSE, instance has been modified.
InstanceDate mm-dd-yyyy Date that original instance would have occurred.