In den vorherigen Teilen dieser Beitragsreihe haben wir den Aufbau einiger Funktionen eines Ticketsystems beschrieben. Es fehlt noch der letzte Feinschliff: Wir wollen die erneuten Antworten von Kunden auf unsere als Antwort versendeten E-Mails automatisch in die Ticketverwaltung aufnehmen. Wie dies gelingt und wie Sie etwa nach Tickets filtern können oder per Ticketsystem erstellte E-Mails in Outlook einzusehen sind, zeigen wir in dieser letzten Folge der Beitragsreihe.
In diesem letzten Teil kümmern wir uns um drei noch offene Aufgaben:
- Zu den einzelnen per Neue Aktion hinzugefügten Aktio-nen soll es möglich sein, die entsprechenden -E-Mails in Outlook anzuzeigen.
- Die Antworten des Benutzers sollen erkannt werden. Dazu soll der Benutzer die Markierung im Betreff (etwa [Ticketx] mit x für die Nummer des Tickets) in der Antwort beibehalten. Solche E-Mails sollen dann ebenfalls in den Ticketverwaltungs-Ordner von Outlook verschoben werden, wo sie dann direkt dem jeweiligen Ticket zugeordnet werden.
- Außerdem wollen wir das Formular frmTickets noch so anpassen, dass Sie nach Tickets filtern können – nach verschiedenen Kriterien wie dem Kunden, der Bezeichnung, dem Inhalt, dem Datum oder auch dem Status.
E-Mails zu den Aktionen einsehen
Im Formular frmTicket werden in einem Unterformular alle Aktionen angezeigt, die im Zusammenhang mit dem Ticket durchgeführt wurden. In der Tabelle tblAktionen, deren Datensätze in diesem Unterformular angezeigt werden, befindet sich bereits ein Feld namens MailItemID.
Dieses wird allerdings beim Verwenden einer Mail, die mit dieser Aktion zusammenhängt, noch nicht gefüllt. Dies müssten wir als Erstes bewerkstelligen, danach könnten wir dann ein Steuer-element hinzufügen, mit dem wir die entsprechende E-Mail öffnen können. Das wäre der einfache Weg, wenn man nur das Öffnen der E-Mail betrachtet – mit der EntryID könnte man dies einfach über die Methode GetItemFromID des Namespace-Objekts erledigen.
Allerdings ist es relativ kompliziert, per VBA an die Entry-ID der soeben versendeten E-Mail zu gelangen. Dazu deklarieren wir im Klassenmodul des Formulars frmTicket zunächst eine Variable, mit der wir später den Ordner mit den gesendeten Objekten referenzieren wollen, und zwar mit dem Schlüsselwort WithEvents:
Public WithEvents objFolderItems As Outlook.Items
Diese Variable füllen wir in der Prozedur, die durch das Anstoßen einer neuen Aktion ausgelöst wird. Damit stellen wir sicher, dass die Variable mit hoher Wahrscheinlichkeit auch noch nach dem Senden und damit beim Verschieben der E-Mail in den Ordner der gesendeten Elemente mit einem Verweis auf diesen Ordner gefüllt ist:
Private Sub cboNeueAktion_AfterUpdate() ... Set objFolderItems = GetMAPI.GetDefaultFolder(olFolderSentMail).Items ... End Sub
Warum der ganze Aufwand Weil wir irgendwie an die soeben versendete E-Mail herankommen müssen. Und das können wir, indem wir das Ereignis nutzen, das beim Verschieben einer E-Mail in den Ordner Gesendete Elemente ausgelöst wird.
Dazu legen wir dafür ein Ereignis an, indem wir im linken Kombinationsfeld des Codefensters des Klassenmoduls des Formulars den Eintrag objFolderItems Auswählen, wodurch im rechten Kombinationsfeld automatisch der Eintrag ItemAdd erscheint – und gleichzeitig wird die Ereignisprozedur mit der Signatur objFolder-Items_ItemAdd im Code hinterlegt.
Diese haben wir wie in Listing 1 gefüllt. Dort ermitteln wir zunächst das mit dem Parameter Item ermittelte Element und weisen es einer Objektvariablen des Typs MailItem zu, damit wir seine Eigenschaften per IntelliSense nutzen können.
Private Sub objFolderItems_ItemAdd(ByVal Item As Object) Dim db As DAO.Database Dim objMailItem As Outlook.MailItem Dim lngMailItemID As Long Set db = CurrentDb Set objMailItem = Item With objMailItem db.Execute "INSERT INTO tblMailItems(EntryID) VALUES('" & objMailItem.EntryID & "')", dbFailOnError lngMailItemID = db.OpenRecordset("SELECT @@IDENTITY").Fields(0) db.Execute "UPDATE tblAktionen SET MailItemID = " & lngMailItemID & " WHERE AktionID = " _ & lngNeuesteAktionID, dbFailOnError End With End Sub
Listing 1: Speichern der EntryID einer frisch verschickten E-Mail
Dann führen wir eine INSERT INTO-Abfrage aus, mit der wir der Tabelle tblMailItems einen neuen Eintrag zuweisen. Dabei tragen wir nur den Wert der Eigenschaft EntryID des MailItem-Objekts in das Feld EntryID ein.
Den Primärschlüsselwert des neu angelegten Datensatzes ermitteln wir danach mit der Abfrage SELECT @@IDENTITY und tragen diesen dann für den Datensatz der Tabelle tblAktionen ein, in dessen Kontext die E-Mail verschickt wurde. Den dabei verwendeten Wert für das Feld AktionID haben wir dabei in einer modulweit deklarierten Variablen namens lngNeuesteAktion zwischengespeichert:
Dim lngNeuesteAktionID As Long
Diesen Wert weisen wir der Variablen in der Prozedur cboNeueAktion zu, nachdem wir den entsprechenden Eintrag zur Tabelle tblAktionen hinzugefügt haben.
Mehr Informationen dazu wollen wir dem Datensatz der Tabelle tblMailItems gar nicht hinzufügen – wir wollen nur die EntryID vorhalten, um gleich schnell per Mausklick unsere Antwort im E-Mail-Format öffnen zu können.
Wo wollen wir diesen Mausklick im Formular frmTicket platzieren Am einfachsten wäre eine Schaltfläche, mit der wir den aktuellen Eintrag im Unterformular mit den Aktionen auslesen und die entsprechende E-Mail öffnen können. Diesen fügen wir wie in Bild 1 gezeigt ein.
Bild 1: Anlegen der Prozedur, die beim Start von Outlook ausgelöst wird
Diese Schaltfläche soll die Ereignisprozedur aus Listing 2 auslösen. Diese prüft zunächst, ob aktuell ein Eintrag im Unterformular sfmAktionen markiert ist, dessen Feld MailItemID einen Wert enthält. Ist das der Fall, ermitteln wir den Wert des Feldes EntryID zu dem Datensatz der Tabelle tblMailItems, dessen Feld MailItemID dem gleichnamigen Feld des aktuell markierten Datensatzes im Unterformular entspricht.
Private Sub cmdEMailAnzeigen_Click() Dim strEntryID As String Dim objMailitem As Outlook.MailItem If Not IsNull(Me!sfmAktionen.Form!MailitemID) Then strEntryID = DLookup("EntryID", "tblMailItems", "MailItemID = " & Me!sfmAktionen.Form!MailitemID) Set objMailitem = GetMAPI.GetItemFromID(strEntryID) objMailitem.Display Else MsgBox "Zu dieser Aktion ist keine E-Mail verfügbar." End If End Sub