{"id":55001041,"date":"2016-06-01T00:00:00","date_gmt":"2020-05-22T18:59:38","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1041"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Ticketsystem_Teil_2","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_2\/","title":{"rendered":"Ticketsystem, Teil 2"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/ee55743db8e44909b0066b2160cc428d\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Im ersten Teil der Beitragsreihe haben wir uns darum gek&uuml;mmert, die E-Mails mit Kundenanfragen zu erfassen und diese in einem Formular in neue Tickets umzuwandeln. Au&szlig;erdem haben wir in diesem Zuge auch gleich die Kundendaten erfasst. Nun schauen wir uns an, wie wir die Tickets bearbeiten, Antworten an die Kunden senden und deren Antworten automatisch zum Ticket hinzuf&uuml;gen. Au&szlig;erdem stehen noch einige Feinheiten an, die uns die Arbeit mit den Tickets erleichtern sollen. Schlie&szlig;lich sollen die Tickets auf einfachste Weise von Outlook in unsere Anwendung gelangen.<\/b><\/p>\n<h2>Bin ich im richtigen Frontend<\/h2>\n<p>Bevor wir zu den eigentlichen Funktionen der Ticketverwaltung &uuml;bergehen, wollen wir noch eine Sache sicherstellen, die mir beim Vorbereiten der Anwendung f&uuml;r den zweiten Teil dieser Beitragsreihe kurz Kopfzerbrechen bereitet hat. In der vorherigen Ausgabe von Access im Unternehmen haben wir im Beitrag <b>Benutzerdefinierte Outlook-Eigenschaften <\/b>(<b>www.access-im-unternehmen.de\/1030<\/b>) erfahren, wie wir in Outlook benutzerdefinierte Eigenschaften speichern k&ouml;nnen.<\/p>\n<p>Genau genommen war das eine Vorarbeit f&uuml;r die Ticketverwaltung, denn wir wollen dort in Outlook speichern, in welche Datenbank die Kundenanfragen, die dort als E-Mail eingehen, gespeichert werden sollen. Dabei handelt es sich nat&uuml;rlich um unser Ticketsystem.<\/p>\n<p>Wenn wir dort den Pfad zur entsprechenden Datenbankdatei speichern, soll Outlook eingehende Kundenanfragen als E-Mails in dieser Datenbank speichern. Das gelingt genau so lange, bis die Datenbank nicht mehr am angegebenen Speicherort vorgebunden werden kann.<\/p>\n<p>Es kann aber auch der Fall eintreten, dass Sie &#8211; aus welchen Gr&uuml;nden auch immer &#8211; die Datenbank mit dem Ticketsystem nicht von einem Verzeichnis in ein anders verschieben, sondern es lediglich kopieren. Bei mir war dies der Fall, weil ich die Datenbank von dem Ordner, in dem die Daten f&uuml;r den ersten Teil der Beitragsreihe lagen, in den Ordner mit den Daten f&uuml;r den zweiten Teil kopiert habe. Dadurch lag die Zieldatenbank f&uuml;r die neu eingehenden Kundenanfragen zwar nun in einem neuen Verzeichnis, gleichzeitig aber auch noch im alten Verzeichnis!<\/p>\n<p>H&auml;tte ich die Datenbank einfach verschoben und somit aus dem alten Ordner entfernt, w&auml;re dies beim &ouml;ffnen von Outlook durch den dann ausgel&ouml;sten VBA-Code aufgefallen und ich h&auml;tte einfach den Pfad zum neuen Speicherort eingeben m&uuml;ssen.<\/p>\n<p>Nun habe ich aber flei&szlig;ig neue Kundenanfragen in den daf&uuml;r angelegten Outlook-Ordner kopiert, in der Hoffnung, diese w&uuml;rden so auch automatisch in der Access-Datenbank im Ordner f&uuml;r den zweiten der Beitragsreihe gespeichert. Dort geschah aber gar nichts &#8211; keine neuen Eintr&auml;ge!<\/p>\n<p>Damit Sie eine M&ouml;glichkeit haben, zu erkennen, dass etwas falsch l&auml;uft, f&uuml;gen wir also nun zun&auml;chst etwas Code zum Access-Ticketsystem hinzu, der pr&uuml;ft, ob die aktuell ge&ouml;ffnete Access-Datenbankdatei auch diejenige ist, die in Outlook f&uuml;r die entsprechende Eigenschaft hinterlegt ist.<\/p>\n<p>Dazu k&ouml;nnen wir auch von Access aus die im Beitrag <b>Benutzerdefinierte Outlook-Eigenschaften <\/b>formulierten VBA-Routinen nutzen &#8211; mit Ausnahme einer einzigen Routine, die wir noch anpassen m&uuml;ssen.<\/p>\n<p>Die Routinen <b>EigenschaftEinlesen<\/b>, <b>EigenschaftSetzen <\/b>und <b>OpenFilename <\/b>k&ouml;nnen Sie aus der Beispieldatenbank zu <b>Benutzerdefinierte Outlook-Eigenschaften <\/b>entnehmen und in das Ticketsystem einpflegen.<\/p>\n<p>Die weitere Routine <b>DatenbankpfadHolen <\/b>&uuml;berf&uuml;hren wir in eine parameterlose Routine namens <b>Datenbankpfad-InOutlookAktualisieren<\/b> (s. Listing 1). Diese deklariert zun&auml;chst einige Variablen und legt deren Werte fest, zum Beispiel f&uuml;r die Variablen <b>strElement <\/b>(Wert: <b>Ticketsystem<\/b>) und <b>strName <\/b>(<b>Datenbankpfad<\/b>).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>DatenbankpfadInOutlookAktualisieren()\r\n     <span style=\"color:blue;\">Dim <\/span>strDatenbankpfad<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bolVorhanden<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strElement<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strName<span style=\"color:blue;\"> As String<\/span>\r\n     strElement = \"Ticketsystem\"\r\n     strName = \"Datenbankpfad\"\r\n     strDatenbankpfad = EigenschaftEinlesen(strElement, strName)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strDatenbankpfad) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Dir(strDatenbankpfad)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             bolVorhanden = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> bolVorhanden<span style=\"color:blue;\"> Then<\/span>\r\n         strDatenbankpfad = CurrentDb.Name\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Der Datenbankpfad f&uuml;r die Ticketverwaltung in Outlook ist noch nicht gesetzt. Dies wird nun erledigt.\", _\r\n             vbOKOnly + vbExclamation\r\n         EigenschaftSetzen strElement, strName, strDatenbankpfad\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> (strDatenbankpfad = CurrentDb.Name)<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Der Datenbankpfad in Outlook ist nicht auf die aktuelle Datenbankdatei gesetzt, sondern auf:\" _\r\n                 & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> & strDatenbankpfad & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n                 & \"Er wird nun auf die aktuelle Datenbank eingestellt.\"\r\n             strDatenbankpfad = CurrentDb.Name\r\n             EigenschaftSetzen strElement, strName, strDatenbankpfad\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Aktualisieren des Datenbankpfades in Outlook<\/span><\/b><\/p>\n<p>Au&szlig;erdem haben wir den Code dieser Methode etwas angepasst. Sie soll nun nicht mehr pr&uuml;fen, ob die benutzerdefinierte Eigenschaft <b>Datenbankpfad <\/b>einen Wert enth&auml;lt und ob dieser dem Pfad einer vorhandenen Datenbankdatei entspricht, um gegebenenfalls den Benutzer aufzufordern, den passenden Pfad per <b>Datei &ouml;ffnen<\/b>-Dialog anzugeben.<\/p>\n<p>Das ist nicht n&ouml;tig, denn wir befinden uns ja gerade in der gew&uuml;nschten Datenbank-Datei. Also m&uuml;ssen wir nur noch pr&uuml;fen: Ist in der Eigenschaft <b>Datenbankpfad <\/b>&uuml;berhaupt ein Pfad gespeichert und entspricht dieser dem Datenbankpfad der aktuell ge&ouml;ffneten Datei Falls nicht, soll die Eigenschaft einfach auf die aktuelle Datenbank eingestellt werden.<\/p>\n<p>Die Routine liest &uuml;ber die Funktion <b>EigenschaftEinlesen <\/b>den aktuell in der Eigenschaft <b>Datenbankpfad <\/b>des <b>StorageItem<\/b>-Elements namens <b>Ticketsystem <\/b>gespeicherten Wert in die Variable <b>strDatenbankpfad <\/b>ein. Sie pr&uuml;ft, ob <b>strDatenbankpfad<\/b> &uuml;berhaupt einen Wert enth&auml;lt. Falls ja, pr&uuml;ft sie, ob der Wert einem g&uuml;ltigen Dateipfad entspricht. Falls ja, wird die Variable <b>bolVorhanden <\/b>auf <b>True <\/b>eingestellt. Ist <b>bolVorhanden<\/b> danach <b>False<\/b>, stellt die Prozedur den Wert der Variablen <b>strDatenbankpfad <\/b>auf den Pfad zur aktuellen Datenbankdatei ein und ruft dann die Funktion <b>EigenschaftSetzen <\/b>auf, um den Wert der Eigenschaft <b>Datenbankpfad <\/b>auf den Namen der aktuellen Datenbankdatei einzustellen &#8211; nicht ohne den Benutzer zuvor &uuml;ber diese Aktion zu informieren.<\/p>\n<p>War bereits ein Datenbankpfad gespeichert, vergleicht die Prozedur diesen mit dem Pfad zur aktuellen Datenbankdatei. Sind die beiden Zeichenketten nicht gleich, erscheint ebenfalls eine Meldung und der Pfad der aktuellen Datenbankdatei landet in der benutzerdefinierten Eigenschaft <b>Datenbankpfad <\/b>von Outlook.<\/p>\n<h2>Mails von Outlook halbautomatisch in die Datenbank einlesen<\/h2>\n<p>Bevor wir uns nun weiter um die Verarbeitung der Tickets in Access k&uuml;mmern, wollen wir noch eine M&ouml;glichkeit schaffen, neue Kundenanfragen, die im Ticketsystem verarbeitet werden sollen, dort hinein zu kopieren.<\/p>\n<p>Dies soll auf der Outlook-Seite ganz einfach geschehen: Der Benutzer soll die infrage kommenden Mails von Kunden einfach per Drag and Drop in einen Ordner namens <b>Ticketsystem <\/b>ziehen (s. Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_03\/pic_1041_001.png\" alt=\"Verschieben einer Anfrage in den Ordner Ticketsystem\" width=\"700\" height=\"287,9032\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Verschieben einer Anfrage in den Ordner Ticketsystem<\/span><\/b><\/p>\n<p>Wenn die E-Mails dann im Zielordner gelandet sind, sollen sie vor allem mit dem Zusatz <b>[Ticket xxx] <\/b>ausgestattet sein. Damit k&ouml;nnen wir zwei Dinge erkennen: Erstens, dass der Mechanismus, der durch das Hineinziehen einer Mail in diesen Ordner ausgel&ouml;st werden soll, funktioniert hat.<\/p>\n<p>Zweitens soll der Platzhalter <b>xxx <\/b>den Wert des Prim&auml;rschl&uuml;sselfeldes enthalten, unter dem die Mail als neuer Datensatz in der Tabelle <b>tblMailItems <\/b>angelegt wurde (s. Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_03\/pic_1041_002.png\" alt=\"In den Ordner Ticketsystem verschobene Anfragen\" width=\"700\" height=\"322,8448\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: In den Ordner Ticketsystem verschobene Anfragen<\/span><\/b><\/p>\n<h2>Mechanismus zum &uuml;bertragen der Kundenanfragen in Outlook<\/h2>\n<p>Damit kommen wir zu dem Mechanismus selbst. Dieser soll ausgel&ouml;st werden, wenn wir eine E-Mail in den Ordner <b>Ticketsystem <\/b>von Outlook ziehen.<\/p>\n<p>Diesen initialisieren wir in einer Prozedur namens <b>Application_Startup_Ticketverwaltung <\/b>(s. Listing 2). Diese wird nicht automatisch mit Outlook gestartet. Allerdings l&ouml;st Outlook beim Start automatisch eine Prozedur aus, die wir <b>Application_Startup <\/b>nennen und die sich in der Klasse <b>ThisOutlookSession <\/b>des VBA-Projekts von Outlook befindet.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Application_Startup_Ticketverwaltung()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>objFolder<span style=\"color:blue;\"> As <\/span>Outlook.Folder\r\n     <span style=\"color:blue;\">Dim <\/span>objFolderArchiv<span style=\"color:blue;\"> As <\/span>clsFolderArchiv\r\n     <span style=\"color:blue;\">Dim <\/span>strTicketsystemDatenbank<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> Application_Startup_Err\r\n     strTicketsystemDatenbank = DatenbankpfadHolen(\"Ticketsystem\", \"Datenbankpfad\")\r\n     <span style=\"color:blue;\">Set<\/span> db = DBEngine.OpenDatabase(strTicketsystemDatenbank, , <span style=\"color:blue;\">True<\/span>)\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblOptionen\", dbOpenDynaset)\r\n     <span style=\"color:blue;\">Set<\/span> colFolders = <span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         <span style=\"color:blue;\">Set<\/span> objFolderArchiv = <span style=\"color:blue;\">New<\/span> clsFolderArchiv\r\n         <span style=\"color:blue;\">With<\/span> objFolderArchiv\r\n             <span style=\"color:blue;\">Set<\/span> objFolder = GetFolderByPath(rst!Verzeichnis)\r\n             <span style=\"color:blue;\">If <\/span>objFolder Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n                 <span style=\"color:blue;\">MsgBox<\/span> \"Der in der Export-Datenbank ''\" & strTicketsystemDatenbank & \"'' angegebene Outlook-Ordner ''\" _\r\n                     & rst!Verzeichnis & \"'' ist nicht in Outlook vorhanden. W&auml;hlen Sie diesen nun erneut aus.\"\r\n                 <span style=\"color:blue;\">Set<\/span> objFolder = Outlook.GetNamespace(\"MAPI\").PickFolder\r\n                 db.Execute \"UPDATE tblOptionen SET Verzeichnis = ''\" & objFolder.FolderPath & \"''\", dbFailOnError\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">Set<\/span> .Folder = objFolder\r\n             .AnlagenSpeichern = rst!AnlagenSpeichern\r\n             <span style=\"color:blue;\">Set<\/span> .Database = db\r\n             .NeuEinlesen = rst!NeuEinlesen\r\n             .Groesse = Nz(rst!Groesse)\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         colFolders.Add objFolderArchiv\r\n         <span style=\"color:blue;\">If <\/span>rst!Rekursiv<span style=\"color:blue;\"> Then<\/span>\r\n             UnterordnerInstanzieren objFolder, db, Nz(rst!Groesse), rst!NeuEinlesen, rst!AnlagenSpeichern, colFolders\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Starten des Mechanismus zum automatischen &uuml;bertragen von E-Mails, die in einen bestimmten Ordner verschoben werden<\/span><\/b><\/p>\n<p>Sollten Sie diese noch nicht verwenden, tragen Sie nur den Aufruf der Prozedur <b>Application_Startup_Ticketverwaltung <\/b>dort ein. Anderenfalls f&uuml;gen Sie diesen Aufruf einfach an die bereits vorhandenen Anweisungen an:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Application_Startup()\r\n     ...\r\n     Application_Startup_Ticketverwaltung\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur <b>Application_Startup_Ticketverwaltung <\/b>deklariert Variablen zum Speichern von Verweisen auf die Ticketsystem-Datenbank und ein Recordset f&uuml;r den Zugriff auf die Optionentabelle, ein <b>Folder<\/b>-Objekt f&uuml;r den Zugriff auf den Ziel-Ordner in Outlook sowie eine Variable zum Speichern von Objekten des Typs <b>clsFolderArchiv<\/b>.<\/p>\n<p>Da wir hier innerhalb des Outlook-VBA-Projekts auf Elemente der DAO-Bibliothek zugreifen, f&uuml;gen wir dem VBA-Projekt noch einen Verweis auf diese Objektbibliothek hinzu &#8211; plus einen Verweis auf die Access-Bibliothek, falls wir mal eine Funktion wie <b>Nz() <\/b>oder <b>DLookup() <\/b>ben&ouml;tigen (s. Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_03\/pic_1041_003.png\" alt=\"Verweis auf die DAO-Bibliothek, zus&auml;tzlich auch noch auf die Access-Bibliothek\" width=\"424,6255\" height=\"334,748\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Verweis auf die DAO-Bibliothek, zus&auml;tzlich auch noch auf die Access-Bibliothek<\/span><\/b><\/p>\n<p>Die Prozedur verwendet dann zun&auml;chst die Funktion <b>DatenbankpfadHolen<\/b>, die wir bereits im Beitrag <b>Benutzerdefinierte Outlook-Eigenschaften <\/b>beschrieben haben. Diese Funktion liefert den Pfad zur Datenbank <b>Ticketsyste.accdb <\/b>zur&uuml;ck, der in der daf&uuml;r angelegten benutzerdefinierten Eigenschaft gespeichert ist. Diese Vorgehensweise verwenden wir, damit wir diesen Pfad nicht fest im Code verdrahten m&uuml;ssen &#8211; etwa in Form einer Konstanten -, sondern ihn auch einmal dynamisch &auml;ndern k&ouml;nnen, wenn sich der Speicherort des Ticketsystems &auml;ndert. Dann &ouml;ffnen wir mit der <b>OpenDatabase<\/b>-Methode die soeben ermittelte Datenbankdatei und speichern einen Verweis darauf in der <b>Database<\/b>-Variablen <b>db<\/b>.<\/p>\n<p>Als N&auml;chstes greifen wir &uuml;ber die <b>OpenRecordset<\/b>-Methode auf die Tabelle <b>tblOptionen <\/b>dieser Datenbank zu und speichern den Verweis darauf in der <b>Recordset<\/b>-Variablen <b>rst<\/b>.<\/p>\n<p>Die Prozedur k&ouml;nnte auch mehrere Ordner als Zielordner definieren, daher verwenden wir eine Collection, um f&uuml;r jeden Zielordner ein Objekt der Klasse <b>clsFolderArchiv <\/b>zu speichern. Diese deklarieren wir wir folgt im Kopf des Moduls <b>ThisOutlookSession<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>colFolders<span style=\"color:blue;\"> As <\/span>Collection<\/pre>\n<p><!--30percent--><\/p>\n<p>Da wir wie gesagt auch mehrere Ordner nutzen k&ouml;nnten, durchlaufen wir die Datens&auml;tze der Tabelle <b>tblOptionen <\/b>in einer <b>Do While<\/b>-Schleife. Im ersten Schritt erstellen wir eine neue Instanz der Klasse <b>clsFolderArchiv<\/b>.<\/p>\n<p>Dieser weisen wir einige Informationen zu, die wir dem aktuellen Datensatz der Tabelle <b>tblOptionen <\/b>entnehmen. Der erste ist der Zielordner. Den Pfad zu diesem Ordner, in unserer Beispielkonstellation <b>\\\\Outlook\\Posteingang\\Ticketsystem<\/b>, lesen wir aus dem Feld <b>Verzeichnis <\/b>ein.<\/p>\n<p>Dann verwenden wir die Hilfsfunktion <b>GetFolderByPath<\/b>, um ein <b>Folder<\/b>-Objekt zu diesem Verzeichnis zu ermitteln und das Ergebnis in der Variablen <b>objFolder <\/b>zu speichern.<\/p>\n<p>Die Funktion <b>GetFolderByPath <\/b>erwartet den Pfad als String. Sie durchl&auml;uft alle Ordner, auch rekursiv, bis sie den entsprechenden Outlook-Folder gefunden hat. Dieser landet dann in der Variablen <b>objFolder<\/b>.<\/p>\n<p>Diese Funktion haben wir, neben einigen anderen Funktionen f&uuml;r den Zugriff auf die Outlook-Objekte, schon in mehreren Ausgaben genutzt. In der n&auml;chsten Ausgabe finden Sie im Beitrag <b>Outlook-Ordner im Griff <\/b>(<b>www.access-im-unternehmen.de\/1043<\/b>) eine Erl&auml;uterung dieser Funktion sowie einige weiterf&uuml;hrende Informationen zu Outlook-Ordnern.<\/p>\n<p>Es kann sein, dass die Funktion <b>GetFolderByPath <\/b>kein Ergebnis zur&uuml;ckliefert. Das ist genau dann der Fall, wenn es kein <b>Folder<\/b>-Objekt mit dem angegebenen Pfad gibt.<\/p>\n<p>Deshalb pr&uuml;fen wir mit der folgenden <b>If&#8230;Then<\/b>-Bedingung, ob <b>objFolder <\/b>den Wert <b>Nothing <\/b>liefert, also dass es leer ist. Ist das der Fall, folgt eine entsprechende Meldung und die <b>PickFolder<\/b>-Methode zeigt einen Dialog an, mit dem der Benutzer den gew&uuml;nschten Zielordner ausw&auml;hlen kann (s. Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_03\/pic_1041_004.png\" alt=\"Ausw&auml;hlen eines neuen Zielordners f&uuml;r die Kundenanfragen\" width=\"499,5594\" height=\"417,7107\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Ausw&auml;hlen eines neuen Zielordners f&uuml;r die Kundenanfragen<\/span><\/b><\/p>\n<p>Der auf diese Weise der Variablen <b>objFolder <\/b>zugewiesene Outlook-Folder liefert mit der Eigenschaft <b>FolderPath <\/b>seine Pfadangabe, die wir mit der n&auml;chsten Anweisung per <b>UPDATE<\/b>-Abfrage in der Tabelle <b>tblOptionen <\/b>speichern.<\/p>\n<p>Nun k&ouml;nnen wir die Eigenschaft <b>Folder <\/b>der Klasse <b>clsFolderArchiv <\/b>auf dieses Objekt einstellen. Auf wesentlich einfachere Weise f&uuml;llen wir nun die Eigenschaften <b>AnlagenSpeichern<\/b>, <b>NeuEinlesen <\/b>und <b>Groesse<\/b>, denen wir einfach die Werte der entsprechenden Felder des Recordsets <b>rst <\/b>zuweisen &#8211; und die Eigenschaft <b>Database <\/b>erh&auml;lt einen Verweis auf das Objekt <b>db<\/b>, also die aktuelle referenzierte Datenbank.<\/p>\n<p>Das so gef&uuml;llte Objekt <b>objFolderArchiv <\/b>f&uuml;gen wir dann per <b>Add<\/b>-Methode zum <b>Collection<\/b>-Objekt <b>colFolders <\/b>hinzu, damit es nach Beenden der Prozedur und somit dem Verfallen der G&uuml;ltigkeit der Objektvariablen nicht in den ewigen Jagdgr&uuml;nden landet. Auf die gleiche Weise werden, sollten auch Unterordner dieses Ordners als Ziel f&uuml;r das Verschieben von Kundenanfragen infrage kommen, auch noch alle Ordner unterhalb des angegebenen Ordners referenziert und in der Collection <b>colFolders <\/b>gespeichert &#8211; und nat&uuml;rlich deren Unterordner und so weiter. Daf&uuml;r muss jedoch das Feld <b>Rekursiv <\/b>der Tabelle <b>tblOptionen <\/b>den Wert <b>True <\/b>aufweisen.<\/p>\n<p>Die Klasse <b>clsFolderArchiv <\/b>haben wir weitgehend aus der gleichnamigen Klasse des Beitrags <b>Outlook-Mails nach Empfang archivieren <\/b>(<b>www.access-im-unternehmen.de\/1007<\/b>) &uuml;bernommen. Es gibt ein paar kleinere Unterschiede.<\/p>\n<p>So verf&uuml;gt unsere Tabelle <b>tblMailItems<\/b> in der Ticketsystem-Datenbank &uuml;ber ein eindeutiges Feld namens <b>EntryID<\/b>, sodass eine E-Mail nur einmalig in der Tabelle gespeichert werden kann und eine Fehlermeldung angezeigt wird, wenn der Benutzer die gleiche Mail zwei Mal in einen der Outlook-Ordner der Ticketverwaltung zieht.<\/p>\n<p>Die &uuml;brigen Vorg&auml;nge sind mit den in diesem Beitrag beschriebenen Abl&auml;ufen identisch: Beim Hineinziehen einer E-Mail in einen Outlook-Ordner, den wir mit einem Objekt der Klasse <b>clsFolderArchiv <\/b>referenziert haben, l&ouml;st dies ein Ereignis aus, das den Inhalt der E-Mail in die Tabelle <b>tblMailItems <\/b>der Zieldatenbank schreibt.<\/p>\n<h2>Funktionsweise des Formulars frmOffeneMails<\/h2>\n<p>Das Formular <b>frmOffeneMails <\/b>soll alle Mails anzeigen, die in den entsprechenden Outlook-Ordner gezogen und so automatisch in der Tabelle <b>tblMailItems <\/b>gespeichert wurden (s. Bild 5). Dazu nutzt das Formular das Listenfeld <b>lstOffeneMails<\/b> links oben.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_03\/pic_1041_006.png\" alt=\"Das Formular frmOffeneMails in der Entwurfsansicht\" width=\"649,4275\" height=\"378,4879\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Das Formular frmOffeneMails in der Entwurfsansicht<\/span><\/b><\/p>\n<p>Die Datensatzherkunft des Listenfeldes sieht wie in Bild 6 aus. Sie verwendet die Tabelle <b>tblMailItems <\/b>und die Tabelle <b>tblTickets <\/b>als Datenquelle. Die Tabelle <b>tblTickets <\/b>ist &uuml;ber das Fremdschl&uuml;sselfeld <b>MailItemID <\/b>mit der Tabelle <b>tblTickets <\/b>verkn&uuml;pft.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_03\/pic_1041_005.png\" alt=\"Datensatzherkunft f&uuml;r das Listenfeld lstOffeneMails\" width=\"649,4275\" height=\"352,0332\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Datensatzherkunft f&uuml;r das Listenfeld lstOffeneMails<\/span><\/b><\/p>\n<p>Ohne weitere Ma&szlig;nahmen w&uuml;rde die Abfrage also alle Datens&auml;tze der beiden Tabellen liefern, f&uuml;r die eine Verkn&uuml;pfung vorliegt. Wir wollen aber ja gerade die Datens&auml;tze der Tabelle <b>tblMailItems <\/b>anzeigen, die noch nicht in Form eines Tickets in die Datenbank aufgenommen wurden. Also f&uuml;hren wir zwei Schritte durch: Als Erstes klicken Sie doppelt auf den Beziehungspfeil, sodass sich die Verkn&uuml;pfungseigenschaften &ouml;ffnen. Hier w&auml;hlen Sie die Option <b>Beinhaltet ALLE Datens&auml;tze aus &#8220;tblMailItems&#8220; und nur die Datens&auml;tze aus &#8220;tblTickets&#8220;, bei denen die Inhalte der verkn&uuml;pften Felder beider Tabellen gleich sind. <\/b>aus.<\/p>\n<p>Damit zeigt die Abfrage nun auch solche Datens&auml;tze der Tabelle <b>tblMail-Items <\/b>an, die noch nicht mit einem Datensatz der Tabelle <b>tblTickets <\/b>verkn&uuml;pft sind. Wir wollen aber ausschlie&szlig;lich die Datens&auml;tze, die noch nicht mit dieser Tabelle verkn&uuml;pft sind, liefern.<\/p>\n<p>Das ist ohne viel Aufwand umzusetzen: Wir m&uuml;ssen einfach nur ein Kriterium festlegen, das nur diejenigen Datens&auml;tze zul&auml;sst, f&uuml;r die das Feld <b>TicketID <\/b>den Wert <b>Null <\/b>enth&auml;lt.<\/p>\n<p>Das Listenfeld soll das Feld <b>MailItemID <\/b>als gebundene Spalte verwenden und die Felder <b>Absender <\/b>und <b>Betreff <\/b>anzeigen, also ziehen wir diese neben <b>TicketID <\/b>in das Entwurfsraster der Abfrage.<\/p>\n<p>Damit das Listenfeld die Felder so anzeigt, stellen wir die Eigenschaft <b>Spaltenanzahl <\/b>auf <b>3 <\/b>und <b>Spaltenbreiten <\/b>auf <b>0;5cm <\/b>ein. So wird die gebundene Spalte mit dem Feld <b>MailItemID <\/b>ausgeblendet, das Feld <b>Absender <\/b>nimmt f&uuml;nf Zentimeter ein und das Feld <b>Betreff <\/b>den Rest der Breite des Listenfeldes. Das Feld <b>TicketID <\/b>wird gar nicht ber&uuml;cksichtigt, Sie k&ouml;nnten es daher im Abfrageentwurf auch durch Entfernen des Hakens in der Zeile <b>Anzeigen <\/b>aus dem Ergebnis entfernen.<\/p>\n<h2>Datenherkunft des Formulars<\/h2>\n<p>Das Formular <b>frmOffeneMails <\/b>selbst enth&auml;lt einige Steuer-elemente, die an Felder der Tabelle <b>tblMailItems <\/b>gebunden sind. Daher stellen wir f&uuml;r die Eigenschaft <b>Datenherkunft <\/b>des Formulars nat&uuml;rlich den Wert <b>tblMailItems <\/b>ein.<\/p>\n<h2>&ouml;ffnen des Formulars<\/h2>\n<p>Das Formular <b>frmOffeneMails <\/b>soll nat&uuml;rlich nur ge&ouml;ffnet werden, wenn es neue Mails in der Tabelle <b>tblMailItem <\/b>gibt, die noch keinem Ticket zugeordnet wurden. Dies muss etwa beim Starten der Anwendung gepr&uuml;ft werden &#8211; zum Beispiel in einer Prozedur, die durch das automatisch beim Start ausgef&uuml;hrte Makro namens <b>AutoExec <\/b>aufgerufen wird &#8211; oder durch ein als Startformular angegebenes Formular. Da meine Beispieldatenbanken ohnehin immer ein Startformular mit der Angabe des Beitrags und der Ausgabe haben, zu welcher die Beispieldatenbank geh&ouml;rt, nutzen wir diese M&ouml;glichkeit.<\/p>\n<p>Das Formular <b>frmIntro <\/b>erh&auml;lt also in der Prozedur, die durch das Anklicken des <b>OK<\/b>-Symbols unten rechts ausgel&ouml;st wird, folgende Anweisungen (s. Bild 7):<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_03\/pic_1041_007.png\" alt=\"Startformular der Anwendung\" width=\"424,6255\" height=\"211,7343\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Startformular der Anwendung<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdGo_Click()\r\n     DoCmd.Close acForm, Me.Name\r\n     Start\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Interessant ist die letzte Anweisung, welche die Prozedur <b>Start <\/b>aufruft. Diese sieht wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Start()\r\n     <span style=\"color:blue;\">If <\/span>DCount(\"MailItemID\", \"qryOffeneMails\") &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         DoCmd.OpenForm \"frmOffeneMails\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Sie pr&uuml;ft also, ob die Abfrage <b>qryOffeneMails <\/b>mehr als <b>0 <\/b>Datens&auml;tze zur&uuml;ckliefert, und &ouml;ffnet nur in diesem Fall das Formular <b>frmOffeneMails<\/b>. Den Aufbau dieser Abfrage haben Sie ja weiter oben bereits kennen gelernt.<\/p>\n<h2>Beim Laden des Formulars<\/h2>\n<p>Beim Laden des Formulars sollen einige Steuerelemente initialisiert werden. Zum Beispiel soll das Listenfeld <b>lstOffeneMails <\/b>direkt den ersten Datensatz markieren. Und das Formular selbst soll nat&uuml;rlich die Daten zu diesem ersten Datensatz anzeigen.<\/p>\n<p>Schlie&szlig;lich soll auch das Kombinationsfeld <b>cboKundeID<\/b>, das zur Auswahl des passenden Kunden zu diesem Ticket dient, den ersten Eintrag anzeigen. Welcher das ist, kl&auml;ren wir gleich im Anschluss.<\/p>\n<p>Damit die Steuerelemente initialisiert werden, f&uuml;gen wir der Ereignisprozedur, die durch das Ereignis <b>Beim Laden <\/b>des Formulars ausgel&ouml;st wird, den Aufruf der Prozedur <b>SteuerelementeInitialisieren <\/b>hinzu:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     SteuerelementeInitialisieren\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese Prozedur sieht dann wie folgt aus und landet ebenfalls im Klassenmodul zum Formular <b>frmOffeneMails<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SteuerelementeInitialisieren()\r\n     Me!lstOffeneMails = Me!lstOffeneMails.ItemData(0)\r\n     Me.Recordset.FindFirst \"MailItemID = \" _\r\n         & Me!lstOffeneMails\r\n     Me!cboKundeID = Me!cboKundeID.ItemData(0)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die erste Anweisung stellt den Wert des Listenfeldes <b>lstOffeneMails <\/b>auf den Wert des ersten Eintrags ein, der mit der Eigenschaft <b>ItemData(0)<\/b> ermittelt wird.<\/p>\n<p>Die zweite ruft die Methode <b>FindFirst <\/b>des <b>Recordset<\/b>-Objekts des Formulars auf und &uuml;bergibt ihr als Kriterium einen Ausdruck wie <b>MailItemID = xxx<\/b>, wobei <b>xxx <\/b>f&uuml;r den Wert der gebundenen Spalte des Listenfeldes <b>lstOffene-Mails <\/b>dient.<\/p>\n<h2>Neues Ticket anlegen<\/h2>\n<p>Zum Anlegen eines neuen Tickets w&auml;hlt der Benutzer zun&auml;chst die gew&uuml;nschte E-Mail aus dem Listenfeld <b>lstOffeneMails <\/b>aus, sofern er nicht die beim &ouml;ffnen des Formulars ausgew&auml;hlte erste E-Mail der Liste bearbeiten m&ouml;chte. Dies l&ouml;st das Ereignis <b>Nach Aktualisierung <\/b>des Listenfeldes und somit die folgende Ereignisprozedur aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>lstOffeneMails_AfterUpdate()\r\n     Me.Recordset.FindFirst \"MailItemID = \" _\r\n         & Me!lstOffeneMails\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies sorgt daf&uuml;r, dass die Daten des ausgew&auml;hlten Eintrags auch in den Steuerelementen des Formulars abgebildet werden.<\/p>\n<p>Nun wird der Benutzer Teile des Inhalts der E-Mail in das Feld <b>Inhalt <\/b>&uuml;bertragen, indem er diese markiert. Das automatische Kopieren erledigt die im Beitrag <b>Markierung automatisch kopieren <\/b>(<b>www.access-im-unternehmen.de\/1027<\/b>) beschriebene Technik.<\/p>\n<p>Daf&uuml;r sorgen die beiden Ereignisprozeduren aus Listing 3. &auml;hnliche Prozeduren liegen auch f&uuml;r das Textfeld <b>txtHTMLBody <\/b>vor, damit Sie auch diese Inhalte einfach in das Textfeld <b>txtInhalt <\/b>&uuml;berf&uuml;hren k&ouml;nnen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtBody_KeyUp(KeyCode<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span>Shift = 1 And KeyCode = 16 And Me!txtBody.SelLength &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strTemp = <span style=\"color:blue;\">Mid<\/span>(Me!txtBody, Me!txtBody.SelStart + 1, Me!txtBody.SelLength)\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Me!txtInhalt) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             Me!txtInhalt = Me!txtInhalt & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         Me!txtInhalt = Me!txtInhalt & strTemp\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>txtBody_MouseUp(Button<span style=\"color:blue;\"> As Integer<\/span>, Shift<span style=\"color:blue;\"> As Integer<\/span>, X<span style=\"color:blue;\"> As Single<\/span>, Y<span style=\"color:blue;\"> As Single<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     strTemp = <span style=\"color:blue;\">Mid<\/span>(Me!txtBody, Me!txtBody.SelStart + 1, Me!txtBody.SelLength)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Me!txtInhalt) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         Me!txtInhalt = Me!txtInhalt & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Me!txtInhalt = Me!txtInhalt & strTemp\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Prozeduren, die f&uuml;r ein automatisches &uuml;bertragen markierter Inhalte des Textfeldes txtBody in das Textfeld txtInhalt sorgen<\/span><\/b><\/p>\n<h2>Kunde an der E-Mail-Adresse erkennen<\/h2>\n<p>Eine weitere wichtige Eigenschaft f&uuml;r das Anlegen eines neuen Tickets ist die Zuordnung zu einem Kunden aus der Tabelle <b>tblKunden<\/b>.<\/p>\n<p>Wenn Sie beginnen, das Ticketsystem zu nutzen, befinden sich aber erst einmal keine Datens&auml;tze in der Tabelle <b>tblKunden<\/b>. Also werden Sie die ersten Kunden erst einmal anlegen m&uuml;ssen, bevor irgendwann eine Anfrage eines Kunden kommt, der bereits in der Tabelle <b>tblKunden <\/b>gespeichert ist.<\/p>\n<p>Um einen neuen Kundendatensatz anzulegen, gibt es kein offensichtliches Steuerelement im Formular <b>frmOffeneMails<\/b>. Das ist allerdings Absicht, denn dazu haben wir einen Eintrag im Kombinationsfeld <b>cboKundeID <\/b>mit dem Text <b><Neuer Kunde> <\/b>angelegt (s. Bild 8).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2016_03\/pic_1041_008.png\" alt=\"Das Formular frmOffeneMails mit dem Eintrag zum Anlegen neuer Kunden\" width=\"700\" height=\"262,6898\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Das Formular frmOffeneMails mit dem Eintrag zum Anlegen neuer Kunden<\/span><\/b><\/p>\n<p>Damit das Kombinationsfeld nicht nur diesen, sondern auch noch den Eintrag <b><Ausw&auml;hlen> <\/b>und die bereits vorhandenen Kundennamen anzeigt, weisen wir diesem eine besondere Datenherkunft zu.<\/p>\n<p>Dabei handelt es sich um eine <b>UNION<\/b>-Abfrage, die wie folgt aussieht:<\/p>\n<pre>SELECT 0 AS KundeID, ''&lt;Ausw&auml;hlen&gt;'' AS Kunde FROM tblKunden \r\nUNION SELECT -1 AS KundeID, ''&lt;Neuer Kunde&gt;'' AS Kunde \r\nFROM tblKunden UNION SELECT tblKunden.KundeID, [Nachname] & \", \" & \r\n[Vorname] AS Kunde FROM tblKunden ORDER BY Kunde;<\/pre>\n<p>Die <b>UNION<\/b>-Abfrage f&uuml;gt also drei einzelne Abfragen zu einer einzigen zusammen. Die erste steuert lediglich den informativen Eintrag <b><Ausw&auml;hlen> <\/b>bei. Da in einer <b>UNION<\/b>-Abfrage alle Eintr&auml;ge gleich aufgebaut sein m&uuml;ssen, was Feldanzahl und Felddatentypen angeht, legen wir f&uuml;r diesen Eintrag f&uuml;r das Feld <b>KundeID <\/b>den Wert <b>0 <\/b>fest.<\/p>\n<p>Der zweite Teil der <b>UNION<\/b>-Abfrage liefert den Text <b><Neuer Kunde> <\/b>mit dem Wert <b>-1 <\/b>f&uuml;r das Feld <b>KundeID<\/b>.<\/p>\n<p>Schlie&szlig;lich folgt der dritte Teil, der Daten aus der Tabelle <b>tblKunden <\/b>beisteuert &#8211; und zwar jeweils den Wert des Feldes <b>KundeID <\/b>sowie ein neues berechnetes Feld namens Kunde, das aus dem Feld <b>Nachname<\/b>, einem Komma und dem Feld <b>Vorname<\/b> des Kunden zusammengesetzt ist &#8211; also etwa in der Form <b>Minhorst, Andr&eacute;<\/b>.<\/p>\n<p>Wenn der Benutzer einen neuen Eintrag f&uuml;r dieses Kombinationsfeld ausw&auml;hlt, l&ouml;st er damit das Ereignis <b>Nach Aktualisierung <\/b>aus. Daf&uuml;r hinterlegen wir die Prozedur aus Listing 4. Diese pr&uuml;ft lediglich, ob das Kombinationsfeld den Wert <b>-1 <\/b>aufweist.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboKundeID_AfterUpdate()\r\n     <span style=\"color:blue;\">Dim <\/span>lngKundeID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">If <\/span>Me!cboKundeID = -1<span style=\"color:blue;\"> Then<\/span>\r\n         DoCmd.OpenForm \"frmKundeDetail\", DataMode:=acFormAdd, WindowMode:=acDialog, _\r\n             OpenArgs:=Me!Absender\r\n         <span style=\"color:blue;\">If <\/span>IstFormularGeoeffnet(\"frmKundeDetail\")<span style=\"color:blue;\"> Then<\/span>\r\n             lngKundeID = Forms!frmKundeDetail!KundeID\r\n             DoCmd.Close acForm, \"frmKundeDetail\"\r\n             Me!cboKundeID.Requery\r\n             Me!cboKundeID = lngKundeID\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Die Ereignisprozedur Nach Aktualisierung des Kombinationsfeldes cboKundeID<\/span><\/b><\/p>\n<p>Ist dies der Fall, soll ein neuer Kunde angelegt werden &#8211; und dazu verwenden wir das Formular <b>frmKundeDetail<\/b>, das wir im ersten Teil der Beitragreihe namens <b>Ticketsystem mit Access, Teil 1 <\/b>(<b>www.access-im-unternehmen.de\/1033<\/b>) bereits vorgestellt haben. Dazu &ouml;ffnen wir das Formular mit der Methode <b>DoCmd.OpenForm <\/b>und stellen den Datenmodus auf <b>acFormAdd <\/b>ein.<\/p>\n<p>Au&szlig;erdem soll das Formular als modaler Dialog ge&ouml;ffnet werden, weshalb wir f&uuml;r den Parameter <b>WindowMode <\/b>den Wert <b>acDialog <\/b>&uuml;bergeben. Schlie&szlig;lich soll die E-Mail-Adresse f&uuml;r diesen Kunden bereits aufgrund der mit der E-Mail gelieferten Absenderadresse vorbelegt werden. Daher &uuml;bergeben wir diesen Wert mit dem Parameter <b>OpenArgs<\/b>.<\/p>\n<p>Der Code der aufrufenden Prozedur <b>cboKundeID_After-Update <\/b>wird erst fortgesetzt, wenn das Formular geschlossen oder ausgeblendet wird.<\/p>\n<p>Die Prozedur pr&uuml;ft dann, ob das Formular noch ge&ouml;ffnet ist, und liest den Prim&auml;rschl&uuml;sselwert des neu angelegten Kundendatensatzes in die Variable <b>lngKundeID <\/b>ein. Dann schlie&szlig;t sie das Formular <b>frmKundeDetails<\/b>.<\/p>\n<p>Damit der neue Kunde gleich im Kombinationsfeld <b>cbo-KundeID <\/b>erscheint, aktualisiert die Prozedur seine Datensatzherkunft mit der <b>Requery<\/b>-Methode. Das Kombinationsfeld soll den neu zur Tabelle <b>tblKunden <\/b>hinzugef&uuml;gten Datensatz direkt ausw&auml;hlen, was wir durch einfache Zuweisung des Prim&auml;rschl&uuml;sselwertes aus <b>lngKundeID <\/b>erledigen.<\/p>\n<h2>Ticket anlegen<\/h2>\n<p>Sobald der Benutzer nun noch eine Bezeichnung f&uuml;r das Ticket eingegeben hat, kann er mit einem Klick auf die Schaltfl&auml;che <b>Anlegen <\/b>einen neuen Ticket-Datensatz in der Tabelle <b>tblTickets <\/b>anlegen. Dies l&ouml;st die Prozedur aus Listing 5 aus. Die Prozedur pr&uuml;ft, ob das Kombinationsfeld <b>cboKundeID <\/b>einen Wert gr&ouml;&szlig;er als <b>0 <\/b>enth&auml;lt, also nicht etwa der Eintrag <b><Ausw&auml;hlen> <\/b>oder <b><Neuer Kunde><\/b> ausgew&auml;hlt ist. Au&szlig;erdem pr&uuml;ft sie, ob der Benutzer die Felder <b>txtBezeichnung <\/b>und <b>txtInhalt <\/b>ausgef&uuml;llt hat. Falls eines von beiden Feldern leer ist, erscheinen entsprechende Meldungen und der Speichervorgang wird abgebrochen.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAnlegen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">If <\/span>Me!cboKundeID &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Nz(Me!txtBezeichnung)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Bitte geben Sie eine Bezeichnung ein.\"\r\n             Me!txtBezeichnung.SetFocus\r\n             <span style=\"color:blue;\">Exit Sub<\/span>\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Nz(Me!txtInhalt)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                 <span style=\"color:blue;\">MsgBox<\/span> \"Bitte geben Sie einen Inhalt ein.\"\r\n                 Me!txtInhalt.SetFocus\r\n                 <span style=\"color:blue;\">Exit Sub<\/span>\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 db.Execute \"INSERT INTO tblTickets(KundeID, Ticketbezeichnung, Ticketinhalt, AngelegtAm, &quot; _\r\n                     &quot; MailItemID) VALUES(\" & Me!cboKundeID & \", ''\" & Me!txtBezeichnung & \"'', ''\" & Me!txtInhalt _\r\n                     & \"'', \"  & ISODatum(Now) & \", \" & Me!MailitemID & \")\", dbFailOnError\r\n                 Me!lstOffeneMails.Requery\r\n                 <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> (Me!lstOffeneMails.ListCount = 0)<span style=\"color:blue;\"> Then<\/span>\r\n                     SteuerelementeInitialisieren\r\n                     cmdLeeren_Click\r\n                 <span style=\"color:blue;\">Else<\/span>\r\n                     <span style=\"color:blue;\">MsgBox<\/span> \"Es sind keine weiteren offenen Kundenanfragen vorhanden. Das Formular wird geschlossen.\"\r\n                     DoCmd.Close acForm, Me.Name\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Es wurde noch kein Kunde ausgew&auml;hlt\/angelegt.\"\r\n         Me!cboKundeID.SetFocus\r\n         Me!cboKundeID.Dropdown\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Ereignisprozedur zum Anlegen eines neuen Datensatzes in der Tabelle tblTickets<\/span><\/b><\/p>\n<p>Anderenfalls f&uuml;hrt die Prozedur mit der <b>Execute<\/b>-Methode des <b>Database<\/b>-Objekts <b>db <\/b>eine <b>INSERT INTO<\/b>-Aktionsabfrage aus, die einen neuen Datensatz in der Tabelle <b>tblTickets <\/b>anlegt und dabei die drei Felder <b>KundeID<\/b>, <b>Ticketbezeichnnung <\/b>und <b>Ticketinhalt <\/b>f&uuml;llt. Au&szlig;erdem kommen noch die Zeit des Anlegevorgangs sowie der Prim&auml;rschl&uuml;sselwert des Datensatzes der Tabelle <b>tblMail-Items <\/b>hinzu.<\/p>\n<p>Anschlie&szlig;end aktualisiert die Prozedur das Listenfeld <b>lst-OffeneMails<\/b>. Sollte die Anzahl der im Listenfeld enthaltenen Eintr&auml;ge nicht <b>0 <\/b>betragen, aktualisiert die Prozedur die Anzeige der Steuerelemente mit der Prozedur <b>SteuerelementeInitialisieren <\/b>und ruft die Routine <b>cmdLeeren_Click <\/b>auf, also die Ereignisprozedur, die normalerweise durch das Bet&auml;tigen <b>cmdLeeren <\/b>ausgel&ouml;st wird. Wenn die Anzahl der Listenfeldeintr&auml;ge hingegen <b>0 <\/b>lautet, gibt eine Meldung bekannt, dass keine weiteren Kundenanfragen vorliegen, die noch nicht mit einem Ticket verkn&uuml;pft sind, und die Prozedur schlie&szlig;t das Formular.<\/p>\n<p>Sollte das Kombinationsfeld bei der Pr&uuml;fung zu Beginn der Prozedur keinen Wert gr&ouml;&szlig;er <b>0 <\/b>enthalten haben, erscheint eine Meldung, dass noch kein Kunde ausgew&auml;hlt wurde.<\/p>\n<p>Die Prozedur klappt dann das Kombinationsfeld <b>cbo-Kunde-ID <\/b>auf, damit der Benutzer direkt sieht, welche Information noch fehlt.<\/p>\n<h2>Ticket leeren<\/h2>\n<p>Wenn der Benutzer die beiden Steuerelemente <b>txtBezeichnung <\/b>und <b>txtInhalt <\/b>leeren m&ouml;chte, kann er das bequem mit der Schaltfl&auml;che <b>cmdLeeren <\/b>erledigen. Diese setzt beide Textfelder auf den Wert <b>Null<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdLeeren_Click()\r\n     Me!txtBezeichnung = Null\r\n     Me!txtInhalt = Null\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Automatische Kundenerkennung per E-Mail-Adresse<\/h2>\n<p>Irgendwann kommt ein Ticketsystem zu dem Punkt, wo eine Kundenanfrage von einem Kunden eintrifft, der bereits in der Ticketsystem-Datenbank gespeichet ist. In diesem Fall w&auml;re es nat&uuml;rlich sinnvoll, wenn das System dies automatisch erkennt und den entsprechenden Kunden direkt im Kombinationsfeld <b>cboKundeID <\/b>vorschl&auml;gt. Genau dies realisieren wir in der Ereignisprozedur, die durch das Ereignis <b>Beim Anzeigen <\/b>des Formulars ausgel&ouml;st wird (s. Listing 6).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     <span style=\"color:blue;\">Dim <\/span>lngEMailAdresseID<span style=\"color:blue;\"> As Long<\/span>\r\n     lngEMailAdresseID = Nz(DLookup(\"EMailAdresseID\", \"tblEMailAdressen\", _\r\n         \"EMailAdresse = ''\" & Me!Absender & \"''\"), 0)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> lngEMailAdresseID = 0<span style=\"color:blue;\"> Then<\/span>\r\n         Me!cboKundeID = DLookup(\"KundeID\", \"tblEMailAdressen\", \"EMailAdresseID = \" & lngEMailAdresseID)\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!cboKundeID = 0\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Beim Anzeigen einer neuen E-Mail wird gleich gepr&uuml;ft, ob ein passender Kunde vorliegt<\/span><\/b><\/p>\n<p>Die Prozedur deklariert eine Variable namens <b>lngEMailAdresseID<\/b>, die per <b>DLookup<\/b>-Anweisung mit dem Prim&auml;rschl&uuml;sselwert eines Datensatzes der Tabelle <b>tblEMailAdressen <\/b>gef&uuml;llt wird, deren Feld <b>EMailAdresse <\/b>den Wert des Feldes <b>Absender <\/b>der Datenherkunft des Formulars <b>frmOffeneMails <\/b>enth&auml;lt.<\/p>\n<p>Sollte die Tabelle <b>tblEMailAdressen <\/b>einen passenden Datensatz enthalten, steuert die Prozedur den ersten Teil ihrer <b>If&#8230;Then<\/b>-Bedingung an und ermittelt dort den Prim&auml;rschl&uuml;sselwert der Tabelle <b>tblKunden<\/b>, mit dem der E-Mail-Adresse-Datensatz der Tabelle <b>tblEMailAdressen <\/b>verkn&uuml;pft ist, und stellt das Kombinationsfeld <b>cboKundeID <\/b>auf diesen Eintrag ein.<\/p>\n<p>Trifft also beispielsweise eine E-Mail mit der Absenderadresse <b>andre@minhorst.com <\/b>ein und es gibt bereits einen Datensatz in der Kundentabelle, der mit einem Datensatz der Tabelle <b>tblEMailAdressen <\/b>mit genau dieser Adresse verkn&uuml;pft ist, dann wird dieser Kundendatensatz per Kombinationsfeld vorgeschlagen.<\/p>\n<h2>Tickets bearbeiten<\/h2>\n<p>Damit haben wir das Formular <b>frmOffeneMails <\/b>vollst&auml;ndig beschrieben und k&ouml;nnen uns den Tickets selbst und ihrer Bearbeitung zuwenden. <\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Der Teil, in dem wir uns um die Abarbeitung der Tickets k&uuml;mmern, folgt in der n&auml;chsten Ausgabe von Access im Unternehmen. Hier werden wir uns um folgende Features k&uuml;mmern:<\/p>\n<ul>\n<li>Ein weiteres Formular, das dem Benutzer die Abarbeitung der Tickets erleichtern soll. Es erm&ouml;glicht das Erstellen von E-Mail-Antworten auf die Anfragen, zeigt den bisherigen Verlauf der Kommunikation an und l&auml;sst den Benutzer auf einfache Weise Notizen zum aktuellen Ticket erfassen.<\/li>\n<li>Versand der Antworten auf die Kundenanfrage  per Outlook. Dabei wird als Betreff unter anderem der Prim&auml;rschl&uuml;sselwert des Tickets angegeben, damit die Antworten eindeutig zuzuordnen sind. Dem Kunden wird in dieser Mail mitgeteilt, ausschlie&szlig;lich diesen Betreff weiterzuverwenden, damit die Antworten leicht identifiziert werden k&ouml;nnen.<\/li>\n<li>F&uuml;r die Identifizierung der Antworten des Kunden bauen wir in Outlook einen weiteren Automatismus ein, der eingehende E-Mails direkt beim Eingang untersucht. Findet dieser Automatismus einen Betreff, der auf eine Reaktion des Kunden auf unsere Antwort hindeutet, soll diese Mail direkt in das Ticketsystem eingepflegt werden.<\/li>\n<li>Im Ticketsytem wollen wir nat&uuml;rlich auch noch auf spezielle Weise darauf aufmerksam machen, wenn zwischenzeitlich Antworten der Kunden auf unsere E-Mails eingegangen sind, damit wir eine weitere Antwort liefern oder gegebenenfalls auch das Ticket schlie&szlig;en k&ouml;nnen.<\/li>\n<li>Textbausteine: Viele Leseranfragen lassen sich auf einfache Weise beantworten, denn sie enthalten immer wiederkehrende Fragen, auf die es Standardantworten gibt. Diese Antworten wollen wir m&ouml;glichst einfach geben k&ouml;nnen &#8211; am besten per einfachem Mausklick.<\/li>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Ticketsystem_II.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{E4643EFD-C58D-4102-8D7B-DF25CB8BFD6A}\/aiu_1041.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im ersten Teil der Beitragsreihe haben wir uns darum gek&uuml;mmert, die E-Mails mit Kundenanfragen zu erfassen und diese in einem Formular in neue Tickets umzuwandeln. Au&szlig;erdem haben wir in diesem Zuge auch gleich die Kundendaten erfasst. Nun schauen wir uns an, wie wir die Tickets bearbeiten, Antworten an die Kunden senden und deren Antworten automatisch zum Ticket hinzuf&uuml;gen. Au&szlig;erdem stehen noch einige Feinheiten an, die uns die Arbeit mit den Tickets erleichtern sollen. Schlie&szlig;lich sollen die Tickets auf einfachste Weise von Outlook in unsere Anwendung gelangen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662016,66032016,44000027],"tags":[],"class_list":["post-55001041","post","type-post","status-publish","format-standard","hentry","category-662016","category-66032016","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Ticketsystem, Teil 2 - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_2\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ticketsystem, Teil 2\" \/>\n<meta property=\"og:description\" content=\"Im ersten Teil der Beitragsreihe haben wir uns darum gek&uuml;mmert, die E-Mails mit Kundenanfragen zu erfassen und diese in einem Formular in neue Tickets umzuwandeln. Au&szlig;erdem haben wir in diesem Zuge auch gleich die Kundendaten erfasst. Nun schauen wir uns an, wie wir die Tickets bearbeiten, Antworten an die Kunden senden und deren Antworten automatisch zum Ticket hinzuf&uuml;gen. Au&szlig;erdem stehen noch einige Feinheiten an, die uns die Arbeit mit den Tickets erleichtern sollen. Schlie&szlig;lich sollen die Tickets auf einfachste Weise von Outlook in unsere Anwendung gelangen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_2\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T18:59:38+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/ee55743db8e44909b0066b2160cc428d\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"26\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_2\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_2\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Ticketsystem, Teil 2\",\"datePublished\":\"2020-05-22T18:59:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_2\\\/\"},\"wordCount\":4390,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_2\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/ee55743db8e44909b0066b2160cc428d\",\"articleSection\":[\"2016\",\"3\\\/2016\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_2\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_2\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_2\\\/\",\"name\":\"Ticketsystem, Teil 2 - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_2\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_2\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/ee55743db8e44909b0066b2160cc428d\",\"datePublished\":\"2020-05-22T18:59:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_2\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_2\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_2\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/ee55743db8e44909b0066b2160cc428d\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/ee55743db8e44909b0066b2160cc428d\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_2\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ticketsystem, Teil 2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Ticketsystem, Teil 2 - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_2\/","og_locale":"de_DE","og_type":"article","og_title":"Ticketsystem, Teil 2","og_description":"Im ersten Teil der Beitragsreihe haben wir uns darum gek&uuml;mmert, die E-Mails mit Kundenanfragen zu erfassen und diese in einem Formular in neue Tickets umzuwandeln. Au&szlig;erdem haben wir in diesem Zuge auch gleich die Kundendaten erfasst. Nun schauen wir uns an, wie wir die Tickets bearbeiten, Antworten an die Kunden senden und deren Antworten automatisch zum Ticket hinzuf&uuml;gen. Au&szlig;erdem stehen noch einige Feinheiten an, die uns die Arbeit mit den Tickets erleichtern sollen. Schlie&szlig;lich sollen die Tickets auf einfachste Weise von Outlook in unsere Anwendung gelangen.","og_url":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_2\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T18:59:38+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/ee55743db8e44909b0066b2160cc428d","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"26\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_2\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_2\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Ticketsystem, Teil 2","datePublished":"2020-05-22T18:59:38+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_2\/"},"wordCount":4390,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_2\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/ee55743db8e44909b0066b2160cc428d","articleSection":["2016","3\/2016","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_2\/","url":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_2\/","name":"Ticketsystem, Teil 2 - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_2\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_2\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/ee55743db8e44909b0066b2160cc428d","datePublished":"2020-05-22T18:59:38+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_2\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_2\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_2\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/ee55743db8e44909b0066b2160cc428d","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/ee55743db8e44909b0066b2160cc428d"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Ticketsystem, Teil 2"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001041","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001041"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001041\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001041"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001041"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001041"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}