Outlookobjekte mit Kategorien einlesen

Outlook bietet die Möglichkeit, Objekte wie Termine, E-Mails oder Kontakte mit Kategorien zu versehen. Wenn Sie solche Objekte in eine Access-Datenbank einlesen möchten, möchten Sie möglicherweise auch auf diese Kategorien zugreifen, um die Objekte in der Datenbank entsprechend verarbeiten zu können. Dieser Beitrag zeigt, wie Sie die in Ihrer Access-Datenbank gepflegten Kategorien unter Outlook bereitstellen, wie Sie in Outlook mit Kategorien arbeiten und wie Sie diese beim Import von Outlook-Objekten gleich mit einlesen.

Ein Teil dieses Beitrags bezieht sich auf Objekte, die erst mit Outlook 2007 eingeführt wurden. Dabei handelt es sich um die Auflistung Categories und das Objekt Category. Damit werden in Outlook die Kategorien verwaltet, die Sie sowohl über die Benutzeroberfläche als auch per VBA anlegen können. Damit wird die Verwendung von Kategorien um einiges einfacher gegenüber älteren Outlook-Versionen, wo diese Informationen in der Registry gespeichert wurden (sollte dies für Sie interessant sein: HKEY_CURRENT_USER\\Software\\Microsoft\\Office\\11.0\\Outlook\\Categories). Für diesen Beitrag bedeutet dies, dass Besitzer älterer Outlook-Versionen die Kategorien in Outlook manuell anlegen müssen, während Sie unter Outlook 2007 und 2010 die gegebenenfalls in einer Access-Datenbank vorliegenden Kategorien direkt nach Outlook übertragen können. Die übrigen Techniken, insbesondere das Einlesen von Outlook-Objekten und ihrer Kategorien, sind für die neueren Outlook-Versionen identisch (getestet ab Outlook 2003). Daher starten wir auch mit der Beschreibung dieser Techniken.

Kategorien-Vielfalt

Die erste wichtige Information ist, dass Sie für jedes Outlook-Objekt eine oder mehrere Kategorien speichern können, und zwar in Form einer Semikola-separierten Liste (s. Abb. 1). Dementsprechend sollten Sie in der Zielanwendung eine Datenstruktur bereithalten, die solche Daten verwalten kann – in diesem Fall eine m:n-Beziehung zwischen der Zieltabelle, also tblMails, tblKontakte oder tblTermine und der Tabelle zum Speichern der Kategorien. Diese nennen wir in der Beispieldatenbank tblOutlookkategorien. Die Tabelle zum Herstellen der Beziehung etwa zwischen der Tabelle tblTermine und der Tabelle tblOutlookkategorien heißt tblTermineOutlookkategorien. Das Datenmodell der Beispieldatenbank sieht wie in Abb. 2 aus.

pic001.png

Abb. 1: Kategorien eines Outlook-Termins unter Outlook 2003

pic002.png

Abb. 2: Datenmodell zum Speichern von Terminen und Outlook-Kategorien

Für das Feld Outlookkategorien der Tabelle tblOutlookkategorien legen Sie einen eindeutigen Index fest, damit jede Kategorie nur einmal angelegt wird. Die Tabelle tblTermineOutlookkategorien erhält einen zusammengesetzten, eindeutigen Index für die beiden Fremdschlüsselfelder TerminID und OutlookkategorieID, damit jeder Termin nur einmal einer Outlook-Kategorie zugeordnet werden kann.

Kategorien von Outlook einlesen

Zu Beginn möchten Sie vielleicht zunächst einmal alle bestehenden Outlook-Kategorien in die Tabelle tblKategorien einlesen. Dies erledigt die Prozedur aus Listing 1, allerdings nur für Access 2007 und jünger – ältere Outlook-Versionen bieten schlicht und einfach keine Categories-Auflistung, aus der sich diese Daten einfach auslesen lassen. Stattdessen liegen die Informationen dort in der Registry.

Listing 1: Einlesen der Outlook-Kategorien in eine Access-Tabelle

Public Function KategorienEinlesen() As String
    Dim db As DAO.Database
    Dim objOutlook As Outlook.Application
    Dim objCategory As Outlook.Category
    Dim objCategories As Outlook.Categories
    Dim strKategorien As String
    Set db = CurrentDb
    Set objOutlook = CreateObject("Outlook.Application")
    Set objCategories = objOutlook.GetNamespace("MAPI").Categories
    For Each objCategory In objCategories
        On Error Resume Next
        db.Execute "INSERT INTO tblOutlookkategorien(Outlookkategorie) VALUES(''" _
            & Replace(objCategory.Name, "''", "''''") & "'')", dbFailOnError
        On Error GoTo 0
        strKategorien = strKategorien & objCategory.Name & ";"
    Next objCategory
    KategorienEinlesen = strKategorien
End Function

Die Prozedur erstellt ein Outlook-Objekt beziehungsweise referenziert eine bereits geöffnete Instanz und speichert den Verweis in der Variablen objOutlook. Den Zugriff auf die einzelnen Kategorien liefert eine Auflistung namens Categories, die Sie als Element des MAPI-Namespaces referenzieren. Die darin enthaltenen Elemente heißen Category und werden in der folgenden For Each-Schleife durchlaufen. Innerhalb der Schleife trägt die Prozedur alle Kategorien in das Feld Outlookkategorie Tabelle tblOutlookkategorien ein. Da für dieses Feld ein eindeutiger Index festgelegt ist, löst das Anlegen eines bereits vorhandenen Eintrags einen Fehler aus. Kein Problem: Der Fehler wird einfach abgefangen und der fehlgeschlagene schreibende Zugriff auf die Tabelle schlicht ignoriert.

Damit durch eventuell enthaltene Hochkommata () kein Fehler durch eine ungültige INSERT INTO-Anweisung ausgelöst wird, werden einzelne Hochkommata per Replace-Anweisung verdoppelt. Die Funktion kann außerdem noch einen Rückgabewert liefern, der eine semikola-separierte Liste aller Kategorien liefert.

Termine einlesen

Das Einlesen der eigentlichen Termine übernimmt die Prozedur aus Listing 2.

Listing 2: Einlesen der Termine in einem bestimmten Datumsbereich

Public Sub TermineEinlesen(datStart As Date, datende As Date)
    Dim objOutlook As Outlook.Application
    Dim objNamespace As Outlook.NameSpace
    Dim objFolder As Outlook.Folder
    Dim objItems As Outlook.Items
    Dim objAppointment As Outlook.AppointmentItem
    Dim strFilter As String
    Set objOutlook = New Outlook.Application
    Set objNamespace = objOutlook.GetNamespace("MAPI")
    Set objFolder = objNamespace.GetDefaultFolder(olFolderCalendar)
    Set objItems = objFolder.Items
    objItems.Sort "[Start]", False
    objItems.IncludeRecurrences = True
    strFilter = Datumsfilter(datStart, datende)
    Set objAppointment = objItems.Find(strFilter)
    While objAppointment Is Nothing
        With objAppointment
            TerminLoeschen .EntryID
        End With
        Set objAppointment = objItems.FindNext
    Wend
    Set objAppointment = objItems.Find(strFilter)
    While TypeName(objAppointment) <> "Nothing"
        With objAppointment
            TerminSpeichern .Subject, .Body, .Start, .End, .EntryID, .Categories
        End With
        Set objAppointment = objItems.FindNext
    Wend
End Sub

Die Prozedur erstellt ebenfalls ein Outlook-Objekt und einen MAPI-Namespace. Diesmal erfolgt der Zugriff auf den Ordner mit den Appointment-Elementen, der über die Funktion GetDefaultFolder(olFolderCalendar) referenziert wird. Dieser Ordner liefert eine Auflistung namens Items. Um alle Serientermine mit abzudecken, stellen Sie zunächst die Sortierung der enthaltenen Elemente auf das Feld Start ein und setzen dann die Eigenschaft IncludeRecurrences auf True. Die Funktion Datumsfilter liefert einen auf dem Start- und dem Enddatum basierenden Filterausdruck:

Public Function Datumsfilter(datStart As Date, datende As Date) As String
    Dim strStart As String
    Dim strEnde As String
    strStart = Format(datStart, "ddddd hh:nn")
    strEnde = Format(datende, "ddddd hh:nn")
    Datumsfilter = "[Start] <= " & Chr(34) & strEnde & Chr(34) & " AND [End] > " & Chr(34) & strStart & Chr(34)
End Function

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

Workplace

Jahresabonnement TestzugangOder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar