Adressverwaltung mit Outlook-Schnittstelle, Teil 2

André Minhorst, Duisburg

In Ausgabe 4/2003 von Access im Unternehmen haben Sie die Adressverwaltung mit Outlook-Schnittstelle kennen gelernt. Im vorliegenden Beitrag erfahren Sie, wie Sie der Adressverwaltung neben dem Import von Outlook-Adressen einen entsprechenden Export hinzufügen, wie die einzelnen Elemente der Menüleiste genau funktionieren und wie die Berichte zur Ausgabe von Adressenlisten und Stammblättern zu den einzelnen Einträgen der Adressdatenbank aussehen.

Hinweis

Auf der beiliegenden Heft-CD finden Sie die Beispieldatenbanken zu der vorliegenden Musterlösung unter den Dateinamen Adress97.mdb (Access 97) und Adress00.mdb (Access 2000 und Access XP).

Nachdem Sie im ersten Teil dieser Beitragsreihe erfahren haben, wie der Import von Outlook-Kontakten in eine Access-Datenbank funktioniert, lernen Sie nun den umgekehrten Weg kennen.

Hinweis

Die nachfolgend beschriebenen und auch in den Musterlösungen enthaltenen Prozeduren und Funktionen ändern durch den Export von Adressdaten nach Outlook gegebenenfalls bereits vorhandene Daten. Sichern Sie deshalb unbedingt die Datei Outlook.pst, bevor Sie die Beispieldatenbanken ausprobieren. Um sicherzugehen, testen Sie die Funktionalität nicht auf Produktivsystemen.

Beschreibung des Exports

Die Aufgabe beim Import bestand im Wesentlichen darin, eventuell vorhandene Unternehmensdaten herauszufiltern, in die relational verknüpfte Tabelle tblUnternehmen zu schreiben und im Feld UnternehmenID der Tabelle tblAdressen einen entsprechenden Wert für die Verknüpfung zum Unternehmensdatensatz anzulegen.

Beim Transport der Adressdaten in die andere Richtung gibt es zwei Besonderheiten: Erstens werden die mühselig aufgesplitteten Unternehmensdaten wieder direkt in die einzelnen Kontaktdatensätze geschrieben.

Die zweite Besonderheit ist, dass es in Outlook durchaus mehrere Ordner zur Speicherung von Kontakten geben kann. Dementsprechend ist vorher festzulegen, in welchem Ordner die zu exportierenden Kontakte gespeichert werden sollen.

Ein ähnliches Problem wie beim Import in die Datenbank ergibt sich auch beim Export, nämlich die überprüfung eventuell vorhandener Daten.

Da Outlook mit der EntryID einen eindeutigen Schlüssel für jegliche Objekte enthält, wird dieser beim Import in die Datenbank in der Tabelle tblAdressen gespeichert.

Beim Exportieren von Daten aus der Datenbank nach Outlook sollen zwei überprüfungen vorgenommen werden: Erstens nach der EntryID und zweitens nach der Kombination aus Vor- und Nachname des Kontakts. Wie auch beim Import sollen für den Fall des Vorhandenseins des Kontaktes drei Möglichkeiten vorgesehen werden:

Abb. 1: Formular für den Export von Adressdaten nach Outlook

  • überschreiben des vorhandenen Datensatzes
  • Verwerfen des Exports für den aktuellen Datensatz
  • Synchronisation beziehungsweise Vergleich der beiden Datensätze
  • Eine weitere offene Frage ist, ob nur der Zielordner von Outlook nach Duplikaten durchsucht werden soll oder alle Ordner. Der letztere Fall zieht die Frage nach sich, ob bei einem Duplikat eines Kontaktes in einem anderen Ordner als dem Zielordner dieser gelöscht und der neue Kontakt im Zielordner angelegt werden oder ob der neue Kontakt den bestehenden Kontakt im ursprünglichen Ordner ersetzen soll.

    Da vermutlich der Großteil der Outlookanwender ohnehin nur einen Kontaktordner verwendet, soll diesen Fragen im vorliegenden Fall aus dem Weg gegangen werden, indem nur der Zielordner untersucht wird.

    Formular zur Steuerung des Exports

    Das Formular aus Abb. 1 enthält die notwendigen Steuerelemente, um die Einstellungen für den Export vorzunehmen und den Export einzuleiten.

    Im oberen Bereich kann der Benutzer den Ordner festlegen, in dem die zu exportierenden Kontakte gespeichert werden sollen. Der zweite Bereich dient der Auswahl der zu exportierenden Adressen. Das Listenfeld ist für eine Mehrfachauswahl ausgelegt.

    Im dritten Bereich finden Sie die bereits vom Import bekannten drei Möglichkeiten, wie die Anwendung im Falle bereits vorhandener Kontakte reagieren soll. Mit einem Mausklick auf die Schaltfläche Exportieren wird der Export gestartet. Sofern dies nicht zu schnell geht, können Sie das Voranschreiten des Exports auf dem Fortschrittsbalken ablesen.

    Funktion desFormulars

    Die Auswahl des Zielordners sowie der zu exportierenden Kontakte beinhaltet keine Besonderheiten und soll daher an diese Stelle nicht weiter beschrieben werden.

    Private Function AdressenExportieren()
        Dim appOutlook As Object
        Dim olNamespace As Object
        Dim olOrdner As Object
        Dim Eintrag As Variant
        Dim ExportEntryID As String
        Dim i As Integer
        Dim AdressID As Integer
        Dim Breitenintervall As Single
        On Error GoTo AdressenExportieren_Err
        If Me.lstAdressen.ItemsSelected.Count = 0 Then
            MsgBox "Sie haben keine Kontakte ausgewählt.", vbOKOnly + vbExclamation, _
            "Fehlende Eingabe"
            Exit Function
        End If
        Set appOutlook = GetObject(, "Outlook.Application")
        On Error GoTo 0
        Set olNamespace = appOutlook.GetNamespace("MAPI")
        Set olOrdner = olNamespace.GetFolderFromID(Me.txtEntryID)
        i = 0
        Breitenintervall = Me!recLaenge.Width / Me!lstAdressen.ItemsSelected.Count
        For Each Eintrag In Me!lstAdressen.ItemsSelected
            AdressID = Me!lstAdressen.Column(6)
            i = i + 1
            Me!recFortschrittsbalken.Width = i * Breitenintervall
            If Me!lstAdressen.ItemData(Eintrag) = "" Then
                ExportEntryID = KontaktVorhandenName(Me!lstAdressen.Column(1), _
                    Me!lstAdressen.Column(2), olOrdner)
                If Not ExportEntryID = "" Then
                    If Me!ogrExport = 1 Then
                        AdresseExportieren AdressID, olOrdner, ExportEntryID, olNamespace
                    Else
                        If Me.ogrExport = 3 Then
                            If Synchronisieren(AdressID, ExportEntryID) = True Then
                                AdresseExportieren AdressID, olOrdner, ExportEntryID, _
                                    olNamespace
                            End If
                        End If
                    End If
                Else
                    AdresseExportieren AdressID, olOrdner
                End If
            Else
                ExportEntryID = KontaktVorhandenEntryID(Me!lstAdressen.Column(0), _
                    olNamespace, olOrdner)
                If ExportEntryID = "" Then
                    ExportEntryID = KontaktVorhandenName(Me!lstAdressen.Column(1), _
                        Me!lstAdressen.Column(2), olOrdner)

    Quellcode 1 (Teil 1)

    Auch die Anzeige des Fortschrittbalkens ist bereits aus dem ersten Teil dieser Beitragsreihe bekannt.

    Interessant ist die Funktion, die durch das Betätigen der Schaltfläche Exportieren aufgerufen wird (s. Quellcode 1).

    Die Funktion deklariert zunächst die benötigten Variablen und überprüft anschließend, ob der Anwender überhaupt mindestens einen Eintrag aus dem Listenfeld markiert hat. Falls nicht, gibt die Prozedur eine entsprechende Fehlermeldung aus.

                End If
                If Not ExportEntryID = "" Then
                    If Me!ogrExport = 1 Then
                        AdresseExportieren AdressID, olOrdner
                    Else
                        If Me.ogrExport = 3 Then
                            If Synchronisieren(AdressID, ExportEntryID) = True Then
                                AdresseExportieren AdressID, olOrdner
                            End If
                        End If
                    End If
                Else
                    AdresseExportieren AdressID, olOrdner
                End If
            End If
        Next Eintrag
        Me!cmdBeenden.Enabled = True
        Exit Function
    AdressenExportieren_Err:
        If Err.Number = 429 Then
            Set appOutlook = CreateObject("Outlook.Application")
            Resume Next
        End If
    End Function

    Quellcode 1 (Fortsetzung)

    Anderenfalls versucht die Funktion zunächst, auf eine bestehende Instanz von Outlook zu verweisen. Ist keine vorhanden, wird über die eigens für diesen Fall angelegte Fehlerbehandlung eine neue Instanz erzeugt.

    Die Variablen olNamespace und olFolder erhalten Verweise auf den Namespace MAPI beziehungsweise den im Formular ausgewählten Kontaktordner.

    Mit einer For Each-Schleife durchläuft die Funktion alle im Listenfeld markierten Einträge. Innerhalb der Schleife gibt es zwei Möglichkeiten: Entweder der Kontakteintrag hat bereits eine EntryID oder nicht. Falls nicht, durchsucht die Funktion den gewählten Kontaktordner in der Funktion KontaktVorhandenName nach einem Kontakt mit dem im Listenfeld angezeigten Vor- und Nachnamen.

    Ist eine EntryID für den Kontakt vorhanden, sucht die Funktion mit Hilfe der Funktion KontaktVorhandenEntryID nach dieser. Sollte dieser Kontakt nicht zuvor aus dieser Outlook.pst-Datei importiert worden sein, und die Funktion KontaktVorhandenEntryID findet keinen entsprechenden Kontakt, wird vorsichtshalber noch die Funktion KontaktVorhandenName verwendet, um nach eventuell vorhandenen Kontakten mit gleichem Vor- und Nachnamen zu suchen.

    Private Function KontaktVorhandenName(Nachname As String, Vorname As String, _
        olOrdner As Object) As String
        Dim olElement As Object
        Set olElement = olOrdner.Items.Find("[FirstName] = ''" & Vorname _
            & "'' AND [LastName] = ''" & Nachname & "''")
        If Not olElement Is Nothing Then
            KontaktVorhandenName = olElement.EntryID
        End If
    End Function

    Quellcode 2

    Private Function KontaktVorhandenEntryID(EntryID As String, olNamespace As Object, _
        olOrdner As Object) As String
        Dim olElement As Object
        Set olElement = olNamespace.GetItemFromID(EntryID)
        If olElement.Parent = olOrdner Then
            If Not olElement Is Nothing Then
                KontaktVorhandenEntryID = olElement.EntryID
            End If
        Else
            KontaktVorhandenEntryID = ""
        End If
    End Function

    Quellcode 3

    Der weitere Verlauf ist in beiden Teilen des If Then-Konstrukts gleich: Die Prozedur wertet die eingegebene Option bezüglich der Vorgehensweise bei vorhandenem Kontakt aus und verwendet die Funktion AdressenExportieren mit unterschiedlichen Parametern, um den Kontakt nach Outlook zu exportieren.

    Suchen von Kontakten nach Namen

    Wenn der zu exportierende Kontakt keinen Eintrag für das Feld EntryID hat, durchsucht die Funktion aus Quellcode 2 den Zielordner nach einem Kontakt mit dem gleichen Vor- und Nachnamen. Dabei werden als Parameter der Vor- und der Nachname sowie der Zielordner übergeben.

    Die Suche erfolgt über die Methode Find der Items-Auflistung des Zielordners. Die Syntax des Kriteriums entspricht der bei Access-Filtern verwendeten Syntax. Falls ein entsprechender Eintrag gefunden wird, gibt die Funktion dessen EntryID zurück.

    Suchen von Kontakten nach EntryID

    Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
    Hier geht es zur Bestellung des Jahresabonnements des Magazins Access im Unternehmen:
    Zur Bestellung ...
    Danach greifen Sie sofort auf alle rund 1.000 Artikel unseres Angebots zu - auch auf diesen hier!
    Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

    Schreibe einen Kommentar