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:
Bild 1: Formular für den Export von Adressdaten nach Outlook
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 Bild 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.