Items Collection Events
Like the Folders collection object, the Items collection object gives you a great deal of control over what happens in folders and with the items contained within folders. You can use the Items collection events to respond to message created, changed, and deleted events. The Items collection does not have a timer event like the Exchange Event Service does, although you can readily construct a timer-based COM Add-in with a Visual Basic Timer control or Windows API calls. Unlike the Exchange 5.5 Event Service or Exchange 2000 event sinks, Items collection events do not provide server-based scalability and process isolation. Exchange 2000 offers the additional benefit of supporting both synchronous and asynchronous events for event sinks.
The following table compares the Exchange 5.5 Event Service, the Exchange 2000 event sinks, and a Visual Basic COM Add-in that uses Items collection object events.
| Feature | Exchange 5.5 Event Service | Exchange 2000 Event Sink | COM Add-In | 
|---|---|---|---|
Development language 
 | 
VBScript 
 | 
Visual Basic or Visual C++ 
 | 
Visual Basic, Visual C++, or any other development tool for an ActiveX DLL 
 | 
Object binding 
 | 
Late-bound 
 | 
Early-bound 
 | 
Early-bound with proper declaration of variables 
 | 
Variable types 
 | 
Variant only 
 | 
All supported types 
 | 
All supported types 
 | 
Scalability 
 | 
Yes 
 | 
Yes 
 | 
Limited 
 | 
Process location 
 | 
Server 
 | 
Server 
 | 
Client 
 | 
Error Logging 
 | 
Windows NT Event Service 
 | 
Windows NT Event Service 
 | 
Error log on client must be created by developer 
 | 
ItemAdd
The ItemAdd event occurs when an item is added to an Items collection object, either through user action or program code. The following example creates an Items collection object for an Exchange public folder named Customers that contains Contact items. When a new customer is added to the Customers folder, a message is sent to a distribution list for the correct regional sales team. This example requires another event procedure in order to instantiate the collection object for the Customers folder. So that you can better understand the code, each of these event procedures is listed below. See Chapter 11 for a complete listing of the OpenMAPIFolder function.
'Place these declarations in the general section of Class module
Public WithEvents colCustomersItems As Outlook.Items
'Instantiate collection object in objOutlook Startup event
 
Private Sub objOutlook_Startup()
    Dim strFolderPath As String
    StrFolderPath = "Public Folders\All Public Folders\" _
        & "Contact Management\Customers"
    Set colCustomersItems = OpenMAPIFolder(strFolderPath).Items
End Sub
'This event procedure sends a message to a DL
Private Sub colCustomersItems_ItemAdd(ByVal Item As Object)
Dim objContactItem As Outlook.ContactItem
Dim objMsgItem As Outlook.MailItem
Set objContactItem = Item
If objContactItem.MessageClass = "IPM.Contact.Customer" Then
    Select Case objContactItem.BusinessAddressState
        Case "CA", "NV", "WA", "OR", "AZ", "NM", "ID"
        strDL = "Sales Team West"
        Case "IL", "OH", "NE", "MN", "IA", "IN", "WI"
        strDL = "Sales Team Midwest"
        Case "ME", "NH", "NY", "NJ", "MD", "PA", "RI", "CT", "MA"
        strDL = "Sales Team East"
        Case Else
        strDL = "Sales Team National"
    End Select
    Set objMsgItem = objOutlook.CreateItem(olMailItem)
    objMsgItem.Subject = "New Customer - " & _
    objContactItem.CompanyName
    objMsgItem.Save
    objMsgItem.Attachments.Add objContactItem, olByValue
    'Must use trusted COM Add-in to prevent OM guard prompts
    objMsgItem.To = strDL
    objMsgItem.Send
End If
ItemChange
The ItemChange event occurs when an item in an Items collection object is changed, either by user action or program code. Continuing the example of the Customers folder described earlier, the following code writes a record to a SQL Server 7 database when an item changes in the Customers public folder. The StrClean function in the following procedure removes single quotes that could cause an error when the SQL statement executes:
Private Sub colCustomersItems_ItemChange(ByVal Item As Object)
    Dim objCont As Outlook.ContactItem
    Dim strSQL As String
    Const strSep = "','"
    Dim conDB As New ADODB.Connection
    Set objCont = Item
    If objCont.MessageClass <> "IPM.Contact.Customer" Then
        Exit Sub
    End If
    On Error GoTo AddContact_Error
    conDB.Open "Nwind", "sa", ""
    strSQL = "Insert Customers Values ('"
    strSQL = strSQL & StrClean(objCont.Account & strSep
    strSQL = strSQL & StrClean(objCont.CompanyName) & strSep
    strSQL = strSQL & StrClean(objCont.FullName) & strSep
    strSQL = strSQL & StrClean(objCont.JobTitle) & strSep
    strSQL = strSQL & StrClean(objCont.BusinessAddress) & strSep
    strSQL = strSQL & StrClean(objCont.BusinessAddressCity) & strSep
    strSQL = strSQL & StrClean(objCont.BusinessAddressState) & strSep
    strSQL = strSQL & StrClean(objCont.BusinessAddressPostalCode) & strSep
    strSQL = strSQL & StrClean(objCont.BusinessAddressCountry) & strSep
    strSQL = strSQL & StrClean(objCont.BusinessTelephoneNumber) & strSep
    strSQL = strSQL & StrClean(objCont.BusinessFaxNumber) & "')"
    conDB.Execute strSQL
    conDB.Close
    AddContact_Exit:
    Exit Sub
    AddContact_Error:
    Utility.ErrorTrap 'Writes error to event log or file
    Resume AddContact_Exit
End Sub
ItemRemove
The ItemRemove event occurs when an item is removed from a specified Items collection object, either through user action or programmatically. The following example expands on the FolderRemove example described earlier to show how to undelete an item programmatically. This example undeletes a custom form with a message class of IPM.Post.ContactSettings if a user deletes the item from the Settings subfolder of the Inbox.
'Place these declarations in the general section of ThisOutlookSession
Public WithEvents colDeletedItems As Outlook.Items
Public WithEvents colSettingsItems As Outlook.Items
Public blnDeleteItem As Boolean
Private Sub Application_Startup()
    Set objNS = Application.GetNameSpace("MAPI")
    Set colSettingsItems = _
      objNS.GetDefaultFolder(olFolderInbox).Folders("Settings")
    Set colDeletedItems = objNS.GetDefaultFolder(olFolderDeletedItems).Items
End Sub
Private Sub colSettingsItems_ItemRemove()
    blnDeleteItem = True
End Sub
Private Sub colDeletedItems_ItemAdd(ByVal Item As Object)
    If blnDeleteItem and Item.MessageClass = "IPM.Post.ContactSettings" Then
        Set objDestFolder = _
           objNS.GetDefaultFolder(olFolderInbox).Folders("Settings")
        Item.Move objDestFolder
    End If
    blnDeleteItem = False
End Sub
No comments:
Post a Comment