Outlook-Mails in Access archivieren III

Wenn Sie ein Abonnement des Magazins 'Access im Unternehmen' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.

Outlook-Mails in Access archivieren III

Die Archivierungsdatenbank für Outlook-Mails kann nun schon Mails importieren und bietet eine Suchfunktion für die importierten Mails an. Außerdem können Sie die gefundenen E-Mails mit Outlook öffnen und darin wiederherstellen. Nun wollen wir die Lösung noch so erweitern, dass Sie beispielsweise mehrere Ordner in Outlook auswählen können, deren E-Mails importiert werden sollen. Außerdem soll der Import gleich beim Start der Anwendung gelingen.

Die neue Version des Formulars sieht nun wie in Bild 1 aus. Das Formular enthält im Gegensatz zur vorherigen Version nun eine Liste mit mehreren Verzeichnissen, deren Detaildaten Sie durch Anklicken der Einträge im unteren Bereich anzeigen können.

Neue Version des Formulars zum Einlesen der E-Mails

Bild 1: Neue Version des Formulars zum Einlesen der E-Mails

Oben finden Sie außerdem zwei Schaltflächen, mit denen Sie eine neue Konfiguration hinzufügen oder eine bestehende löschen können.

Der untere Bereich enthält die Detaildaten, die bereits die Version aus dem vorherigen Teil der Beitragsreihe angeboten hat. Diese Daten stammen aus der Tabelle tblOptionen. Unten finden Sie drei Schaltflächen:

  • Import starten: Startet den Import für alle angelegten Konfigurationen.
  • Alle importierten Mails und Dateien löschen: Löscht alle in der Tabelle tblMailItems und der verknüpften Tabelle tblAnlagen enthaltenen Daten sowie die Daten in den beiden Unterformularen MSG und Anlagen.
  • Mailmarkierungen entfernen: Beim Importieren der Mails erhält jede importierte Mail den Wert saved für die Eigenschaft BillingInformationen. Wenn Sie die Mails nochmals einlesen möchten, müssen Sie diese Eigenschaft wieder leeren.

Formular erstellen

Das Formular frmMailImport besteht nun zusätzlich noch aus einem Unterformular namens sfmMailImport. Dieses ist wie in Bild 2 aufgebaut und verwendet die Tabelle tblOptionen als Datenherkunft.

Das Unterformular sfmMailImport in der Entwurfsansicht

Bild 2: Das Unterformular sfmMailImport in der Entwurfsansicht

Das Hauptformular nimmt dieses Unterformular auf und verwendet zusätzlich die in Bild 3 zu erkennenden Steuerelemente. Besondere Bedeutung kommt natürlich dem Listenfeld lstVerzeichnisse zu. Es verwendet ebenfalls eine Datensatzherkunft auf Basis der Tabelle tblOptionen, allerdings hier in Form einer Abfrage, welche nur die beiden Felder OptionID und Verzeichnis berücksichtigt:

Das Formular frmMailImport in der Entwurfsansicht

Bild 3: Das Formular frmMailImport in der Entwurfsansicht

SELECT OptionID, Verzeichnis FROM tblOptionen;

Damit nur das Verzeichnis im Listenfeld erscheint, stellen Sie die Eigenschaft Spaltenanzahl auf den Wert 2 und die Eigenschaft Spaltenbreiten auf den Wert 0cm ein. Wenn der Benutzer auf einen der Einträge klickt, sollen dessen Details im unteren Bereich des Formulars eingeblendet werden.

Dies erreichen Sie mithilfe zweier Prozeduren. Die erste ist die Ereignisprozedur, die durch das Ereignis Nach Aktualisierung des Listenfeldes ausgelöst wird (s. Listing 1).

Private Sub lstVerzeichnisse_AfterUpdate()
     VerzeichnisAktualisieren
End Sub

Listing 1: Diese Prozedur wird nach der Auswahl eines Eintrags im Listenfeld ausgelöst.

Diese ruft eine weitere Prozedur namens VerzeichnisAktualisieren auf, die Sie in Listing 2 finden. Die Prozedur prüft, ob aktuell ein Eintrag im Listenfeld markiert ist (was beispielsweise nicht der Fall ist, wenn es leer ist und der Benutzer dennoch hineinklickt) und verschiebt den Datensatzzeiger im Unterformular auf den Datensatz, dessen OptionID dem aktuell im Listenfeld ausgewählten Eintrag entspricht.

Private Sub VerzeichnisAktualisieren()
     If Not IsNull(Me!lstVerzeichnisse) Then
         Me!sfmMailimport.Form.Recordset.FindFirst "OptionID = " & Me!lstVerzeichnisse
     End If
End Sub

Listing 2: Aktualisierung der Detaildaten zu einem Listenfeldeintrag

Beim Laden des Formulars soll das Listenfeld gleich den ersten Datensatz markieren, damit der Benutzer erkennen kann, zu welchem Listeneintrag die Daten aus dem Unterformular gehören. Dies erledigen wir mit der Ereignisprozedur, die durch das Ereignis Beim Laden ausgelöst wird und nur eine einzige Anweisung enthält:

Private Sub Form_Load()
     Me!lstVerzeichnisse = Me!lstVerzeichnisse.ItemData(0)
End Sub

Anlegen einer neuen Konfiguration

Ein Klick auf die Schaltfläche cmdNeu im oberen Bereich des Formulars soll einen neuen Datensatz in der Tabelle anlegen, der gleichzeitig im Listenfeld und im Unterformular erscheint. Dazu fragen wir das Outlook-Verzeichnis, für welches die Konfiguration bestimmt sein soll, gleich beim Anklicken der Neu-Schaltfläche ab. Die Prozedur cmdNeu_Click aus Listing 3, die durch das Anklicken ausgelöst wird, ermittelt zunächst den Titel des aktuell geöffneten Access-Fensters. Dies ist nötig, da beim nachfolgenden Aufrufen des Outlook-Dialogs zum Auswählen eines Outlook-Ordners gelegentlich das geöffnete Outlook-Fenster stehen bleibt und das aufrufende Access-Fenster verdeckt ist. Um das Access-Fenster anschließend wieder in den Vordergrund zu holen, benötigen wir den Fenstertitel. Diesen erhalten wir mithilfe der Funktion GetActiveWindowTitle, die Sie im Modul mdlAPI finden.

Private Sub cmdNeu_Click()
     Dim strVerzeichnis As String
     Dim db As DAO.Database
     Dim lngOptionID As Long
     Dim strFenster As String
     strFenster = GetActiveWindowTitle
     strVerzeichnis = VerzeichnisWaehlen
     If Len(strVerzeichnis) > 0 Then
         Set db = CurrentDb
         db.Execute "INSERT INTO tblOptionen(Verzeichnis) VALUES('" & strVerzeichnis & "')"
         lngOptionID = db.OpenRecordset("SELECT @@IDENTITY").Fields(0)
         Me!lstVerzeichnisse.Requery
         Me!sfmMailimport.Form.Requery
         Me!lstVerzeichnisse = lngOptionID
         VerzeichnisAktualisieren
         AppActivate strFenster
     End If
End Sub

Listing 3: Prozedur zum Anlegen einer neuen Konfiguration

Die Funktion VerzeichnisWaehlen haben Sie ja bereits in den vorhergehenden Teilen dieser Beitragsreihe kennen gelernt – es öffnet den Outlook-Dialog zum Auswählen eines Ordners (s. Bild 4). Danach prüft die Prozedur, ob der Benutzer einen Ordner ausgewählt hat. In diesem Fall erzeugt er eine Referenz auf das aktuelle Database-Objekt und führt eine INSERT INTO-Abfrage aus, welche einen neuen Datensatz in die Tabelle tblOptionen einfügt und dabei gleich das Verzeichnis in das entsprechende Feld einträgt. Die Abfrage SELECT @@IDENTITY ermittelt den Wert des Primärschlüsselfeldes des neu hinzugefügten Datensatzes, das Ergebnis landet in der Variablen lngOptionID.

Auswählen des Mail-Ordners

Bild 4: Auswählen des Mail-Ordners

Da nun ein neuer Datensatz vorliegt, müssen die Datenherkunft des Unterformulars sowie die Datensatzherkunft des Listenfeldes aktualisiert werden, was die Prozedur jeweils mit der Requery-Methode erledigt. Danach stellt die Prozedur das Listenfeld auf den neu hinzugefügten Eintrag ein und ruft die bereits weiter oben vorgestellte Prozedur VerzeichnisAktualisieren auf, die den aktuell im Listenfeld markierten Eintrag im Unterformular anzeigt.

Schließlich aktiviert die Prozedur AppActivate das Fenster mit dem weiter oben in der Variablen strFenster gespeicherten Titel der Access-Anwendung.

Eine Konfiguration löschen

Ein Klick auf die Schaltfläche cmdLoeschen im oberen Bereich des Formulars soll den aktuell markierten Eintrag im Listenfeld aus der Tabelle tblOptionen löschen und die übrigen Steuerelemente aktualisieren, sodass der gelöschte Datensatz nirgends mehr auftaucht.

Die durch die Schaltfläche ausgelöste Prozedur sieht wie in Listing 4 aus und prüft zunächst, ob überhaupt ein Eintrag im Listenfeld markiert ist. Ist dies der Fall, fragt die Prozedur den Benutzer per Meldungsfenster, ob die Konfiguration mit dem angegebenen Verzeichnis tatsächlich gelöscht werden soll.

Private Sub cmdLoeschen_Click()
     Dim db As DAO.Database
     If Not IsNull(Me!lstVerzeichnisse) Then
         If MsgBox("Verzeichnis '" & Me!lstVerzeichnisse.Column(1) & "' wirklich aus der Liste entfernen?", _
                 vbYesNo) = vbYes Then
             Set db = CurrentDb
             db.Execute "DELETE FROM tblOptionen WHERE OptionID = " & Me!lstVerzeichnisse, dbFailOnError
             Me!lstVerzeichnisse.Requery
             Me!sfmMailimport.Form.Requery
             Me!lstVerzeichnisse = Me!lstVerzeichnisse.ItemData(0)
             VerzeichnisAktualisieren

Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.

Bitte geben Sie die Zahlenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Aktuell im Blog
Onlinebanking mit Access

Es ist geschafft: Endlich ist das Buch Onlinebanking mit Access fertiggeschrieben. Das war... [mehr]

Direktzugriff auf Tabellen und Felder

Die IntelliSense-Erweiterung für Tabellen und Felder hat mir soviel Spaß gemacht, dass ich gleich... [mehr]

IntelliSense für Tabellen und Felder

Wenn Sie mit dem VBA-Editor arbeiten und dort gelegentlich SQL-Anweisungen eingeben, müssen Sie... [mehr]

Download Access und SQL Server

Erfahren Sie, welche Schritte zum Download des aktuellen Stands des Buchs "Access und SQL Server"... [mehr]

Bilder in Access 2013

Wer die Bibliothek mdlOGL0710 von Sascha Trowitzsch oder ein ähnliches Modul aus meinen... [mehr]

Dynamische Ribbons

Immer wieder fragen Leser, wie man Ribbon-Elemente wie etwa Schaltflächen in Abhängigkeit... [mehr]

Die Blogmaschine

Einen kleinen Blog zusätzlich zum Shop zu betreiben ist eine tolle Sache. Hier lassen sich... [mehr]

Wegwerfadressen für die Newsletteranmeldung

Die Verwendung von Wegwerf-Adressen für die Nutzung aller möglichen Online-Dienste nimmt... [mehr]

Access und Facebook

Facebook und Access - das ist eine der wenigen Kombinationen, die ich noch nicht in die Mangel... [mehr]

Access und SQL Server - das Projekt

Mein neues Buch Access und SQL Server (gemeinsam mit Bernd Jungbluth) geht in die Endphase. Wer... [mehr]