Ticketsystem, Teil VI

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.

Anlegen der Prozedur, die beim Start von Outlook ausgelöst wird

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

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