{"id":55001075,"date":"2017-02-01T00:00:00","date_gmt":"2020-05-14T13:41:26","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1075"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Ticketsystem_Teil_III","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_III\/","title":{"rendered":"Ticketsystem, Teil III"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/31ab028fef544f7bb453a918044c38e1\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>In unser Ticketsystem haben wir bereits Funktionen integriert, mit denen Sie die Kundenanfragen per Drag and Drop in der Datenbank speichern k&ouml;nnen. Au&szlig;erdem haben wir ein Formular hinzugef&uuml;gt, das alle offenen E-Mails anzeigt und eine einfache M&ouml;glichkeit enth&auml;lt, daraus Tickets zu generieren. Diese wollen wir nun im vorliegenden Teil der Beitragsreihe verarbeiten, und zwar in daf&uuml;r ausgelegten Formularen. Diese zeigen sowohl eine &uuml;bersicht aller Tickets &#8211; filterbar nach dem Status und anderen Eigenschaften &#8211; als auch den Verlauf eines einzelnen Tickets.<\/b><\/p>\n<h2>Ticket&uuml;bersicht<\/h2>\n<p>Im Formular <b>frmTickets <\/b>wollen wir eine &uuml;bersicht aller Tickets liefern, und zwar nach verschiedenen Kriterien. Die Tickets sollen nach dem Anlagedatum sortiert werden k&ouml;nnen oder nach dem Kunden. Au&szlig;erdem ben&ouml;tigen wir nat&uuml;rlich verschiedene Filter, etwa nach dem Kunden oder nach dem Status oder der Priorit&auml;t.Das Formular soll per Doppelklick auf einen der Eintr&auml;ge die M&ouml;glichkeit bieten, das Ticket in der Detailansicht zu &ouml;ffnen und alle bisher erfolgten Schritte darzustellen.<\/p>\n<p>Um keine eigene Programmierung etwa f&uuml;r die Sortierung vornehmen zu m&uuml;ssen, nutzen wir zur Anzeige der Tickets einfach ein Unterformular in der Datenblattansicht. Dieses bietet gen&uuml;gend M&ouml;glichkeiten zum Sortieren und Filtern der Eintr&auml;ge. Schnelle Filter wollen wir hinzuf&uuml;gen f&uuml;r den Status von Tickets sowie f&uuml;r die Priorit&auml;t. Au&szlig;erdem wollen wir eine Schaltfl&auml;che zum schnellen Aufheben der Sortierung und des Filters hinzuf&uuml;gen. Schlie&szlig;lich soll ein Ticket nat&uuml;rlich schnell per Doppelklick ge&ouml;ffnet werden k&ouml;nnen.<\/p>\n<h2>Zus&auml;tzliche Tabellen<\/h2>\n<p>Um den Status und die Priorit&auml;t eines Tickets erfassen zu k&ouml;nnen, wollen wir der Tabelle <b>tblTicktes <\/b>zwei neue Felder hinzuf&uuml;gen. Diese sollen als Fremdschl&uuml;sselfelder ausgelegt werden und zwei weitere neue Tabellen referenzieren.<\/p>\n<p>Die erste Tabelle hei&szlig;t <b>tblStatus <\/b>und soll die verschiedenen Statuswerte erfassen (Status ist &uuml;brigens tats&auml;chlich der Plural von Status, daher diese Tabellenbezeichnung). Sie finden den Entwurf dieser Tabelle in Bild 1. Neben dem Prim&auml;rschl&uuml;sselfeld <b>StatusID <\/b>enth&auml;lt die Tabelle noch das mit einem eindeutigen Index versehene Feld <b>Status<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1075_001.png\" alt=\"Entwurf der Tabelle tblStatus\" width=\"499,6607\" height=\"329,2817\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Entwurf der Tabelle tblStatus<\/span><\/b><\/p>\n<p>Die zweite neue Tabelle hei&szlig;t <b>tblPrioritaeten <\/b>und ist fast genauso aufgebaut wie die Tabelle <b>tblStatus<\/b>. Sie enth&auml;lt neben dem Prim&auml;rschl&uuml;sselfeld <b>PrioritaetID <\/b>ebenfalls ein weiteres Feld zum Erfassen der Bezeichnung der Inhalte, in diesem Fall namens <b>Prioritaet<\/b>. Auch dieses Feld haben wir mit einem eindeutigen Index versehen (s. Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1075_002.png\" alt=\"Entwurf der Tabelle tblPrioritaeten\" width=\"499,6607\" height=\"340,3486\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Entwurf der Tabelle tblPrioritaeten<\/span><\/b><\/p>\n<p>Die beiden Fremdschl&uuml;sselfelder der Tabelle <b>tblTickets <\/b>richten wir als Nachschlagefelder ein. Dazu w&auml;hlen Sie zun&auml;chst f&uuml;r das Feld <b>StatusID <\/b>den Datentyp <b>Nachschlage-Assistent <\/b>aus und starten somit den gleichnamigen Assistenten. W&auml;hlen Sie hier die Tabelle <b>tblPrioritaeten <\/b>aus, selektieren Sie die beiden Felder <b>StatusID <\/b>und <b>Status<\/b>, legen Sie keine aufsteigende Sortierung f&uuml;r irgendeines der Felder fest und aktivieren Sie die Option <b>Schl&uuml;sselspalte ausblenden<\/b>.<\/p>\n<p>Schlie&szlig;lich aktivieren Sie die referenzielle Integrit&auml;t durch Markieren der Option <b>Datenintegrit&auml;t aktivieren <\/b>(s. Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1075_003.png\" alt=\"Letzter Schritt beim Einrichten eines Nachschlagefeldes\" width=\"499,6607\" height=\"336,9141\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Letzter Schritt beim Einrichten eines Nachschlagefeldes<\/span><\/b><\/p>\n<p>Die Tabelle <b>tblTickets <\/b>sieht danach im Entwurf wie in Bild 4 aus, sodass wir Status und Priorit&auml;t bequem per Nachschlagefeld ausw&auml;hlen k&ouml;nnen. Die Einrichtung von Nachschlagefeldern hat au&szlig;erdem den praktischen Vorteil, dass Sie sp&auml;ter, wenn Sie die Felder dieser Tabelle in den Entwurf von Formularen ziehen, direkt Kombinationfelder f&uuml;r solche Felder erhalten.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1075_004.png\" alt=\"Entwurf der soeben erweiterten Tabelle tblTickets\" width=\"649,559\" height=\"428,2527\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Entwurf der soeben erweiterten Tabelle tblTickets<\/span><\/b><\/p>\n<h2>Unterformular sfmTickets einrichten<\/h2>\n<p>Genau davon profitieren wir gleich im n&auml;chsten Schritt. Wir erstellen ein neues Formular und speichern es unter dem Namen <b>sfmTickets <\/b>ab. Dieses soll das Unterformular eines weiteren Formulars namens <b>frmTickets <\/b>werden und die Tickets in der Datenblattansicht &uuml;bersichtlich anzeigen.<\/p>\n<p>Legen Sie als Datenherkunft des Formulars die Tabelle <b>tblTickets <\/b>fest. Ziehen Sie dann aus der Feldliste alle Felder der Tabelle in den Detailbereich des Formularentwurfs (s. Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1075_005.png\" alt=\"Entwurf des Unterformulars sfmTickets\" width=\"599,593\" height=\"446,5866\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Entwurf des Unterformulars sfmTickets<\/span><\/b><\/p>\n<p>Nun stellen Sie noch die Eigenschaft <b>Standardansicht <\/b>des <b>Formulars <\/b>auf Datenblatt ein und schlie&szlig;en das Formular.<\/p>\n<p>Nun legen Sie das Formular <b>frmTickets <\/b>an und ziehen das Unterformular <b>sfmTickets <\/b>in den Detailbereich des Entwurfs. Stellen Sie die Eigenschaften <b>Horizontaler Anker <\/b>und <b>Vertikaler Anker <\/b>jeweils auf den Wert <b>Beide <\/b>ein.<\/p>\n<p>F&uuml;r die optische Gestaltung des Hauptformulars legen Sie noch die Eigenschaften <b>Navigationsschaltfl&auml;chen<\/b>, <b>Datensatzmarkierer<\/b>, <b>Bildlaufleisten <\/b>und <b>Trennlinien <\/b>auf den Wert <b>Nein <\/b>fest.<\/p>\n<h2>Filter f&uuml;r die Ticket&uuml;bersicht steuern<\/h2>\n<p>Nun nutzen wir die beiden Klassen <b>clsFastFilter <\/b>und <b>clsFastFilterControl<\/b>, die wir im Beitrag <b>Schneller Filter <\/b>vorgestellt haben (<b>www.access-im-unternehmen.de\/1072<\/b>). Importieren Sie diese beiden Klassen in die aktuelle Datenbank.<\/p>\n<p>Nun statten Sie das Formular <b>frmTickets <\/b>mit einigen Steuerelementen aus, mit denen der Benutzer die Daten filtern kann. Sie ben&ouml;tigen zwei Schaltlf&auml;chen namens <b>cmdNachFeldFiltern <\/b>und <b>cmdNachInhaltFiltern<\/b>, ein Kontrollk&auml;stchen namens <b>chkFilterkriterienVer-knuep-fen <\/b>und eine Optionsgruppe mit dem Namen <b>ogrVerknuepfenMit<\/b> (s. Bild 6). F&uuml;r das Kontrollk&auml;stchen stellen Sie als Standardwert <b>False <\/b>ein, f&uuml;r die Optionsgruppe den Wert <b>1<\/b>. Au&szlig;erdem stellen Sie f&uuml;r die Optionsgruppe die Eigenschaft <b>Aktiviert <\/b>aus <b>Nein <\/b>ein. Schlie&szlig;lich stellen Sie noch die Eigenschaft <b>Enth&auml;lt Modul <\/b>des Unterformulars auf den Wert <b>Ja <\/b>ein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1075_006.png\" alt=\"Entwurf des Formulars frmTickets\" width=\"649,559\" height=\"343,7286\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Entwurf des Formulars frmTickets<\/span><\/b><\/p>\n<p>Nun f&uuml;gen wir den Code zum Initialisieren der Filterfunktionen hinzu. Das Klassenmodul des Formulars <b>frmTickets <\/b>sieht danach wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objFastFilter<span style=\"color:blue;\"> As <\/span>clsFastFilter\r\n<span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Set<\/span> objFastFilter = <span style=\"color:blue;\">New<\/span> clsFastFilter\r\n     <span style=\"color:blue;\">With<\/span> objFastFilter\r\n         <span style=\"color:blue;\">Set<\/span> .Subform = Me!sfmTickets.Form\r\n         <span style=\"color:blue;\">Set<\/span> .FastFilterButton = Me!cmdNachFeldFiltern\r\n         <span style=\"color:blue;\">Set<\/span> .FastFilterContainsButton =  Me!cmdNachInhaltFiltern\r\n         <span style=\"color:blue;\">Set<\/span> .CombineFilterCheckbox =  Me!chkFilterkriterienVerknuepfen\r\n         <span style=\"color:blue;\">Set<\/span> .ANDOrOROptiongroup = Me!ogrVerknuepfenMit\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Nach dem ersten Test, bei dem wir einen Teil des Feldes <b>Kunde <\/b>markieren und die Schaltlf&auml;che <b>cmdNachInhaltFiltern <\/b>anklicken, stellen wir allerdings fest, dass dies nicht reibungslos funktioniert.<\/p>\n<p>Der Hintergrund ist, dass das Kombinationsfeld <b>KundeID <\/b>eine Datensatzherkunft mit einem berechneten Feld verwendet:<\/p>\n<pre>SELECT KundeID, [Nachname] & \", \" & [Vorname] AS Kunde FROM tblKunden;<\/pre>\n<p>Dies wird durch die Klasse <b>clsFastFilterControl <\/b>nicht abgedeckt. Wir haben probiert, dies so anzupassen, dass auch berechnete Felder aufgel&ouml;st werden k&ouml;nnen, aber dies gelingt nicht, weil es keine M&ouml;glichkeit gibt, den berechneten Ausdruck &uuml;ber das Objektmodell zu ermitteln.  Dies zeigt im &uuml;brigen auch sehr sch&ouml;n, dass auch eine ausgefeilte L&ouml;sung nur selten alle m&ouml;glichen Konstellationen ber&uuml;cksichtigen kann &#8230;<\/p>\n<p>Also m&uuml;ssen wir uns einen kleinen Workaround einfallen lassen und die Klasse <b>clsFastFilterControl <\/b>etwas anpassen &#8211; und zwar so, dass wir in F&auml;llen wie dem hier vorliegenden selbst Hand anlegen k&ouml;nnen. In diesem Fall ist das Problem, dass wir den Namen des Feldes der Datensatzherkunft des Kombinationsfeldes ermitteln wollen, dessen Inhalt im Kombinationsfeld angezeigt wird. Dieser lautet aber schlicht <b>Kunde <\/b>und entspricht dem Alias-Namen des berechneten Feldes, das eigentlich den Ausdruck <b>[Nachname] &#038; &#8222;, &#8220; &#038; [Vorname] <\/b>enth&auml;lt.<\/p>\n<p><!--30percent--><\/p>\n<p>An diesen kommen wir aber programmatisch nicht heran (au&szlig;er, wir w&uuml;rden den SQL-Ausdruck auseinandernehmen &#8211; aber dieser kann ja auch beliebig komplex werden, also lassen wir gleich die Finger davon &#8230;). Deshalb tragen wir diesen Ausdruck einfach in die Eigenschaft <b>Marke <\/b>(englisch und unter VBA: <b>Tag<\/b>) des Kombinationsfeldes ein (s. Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1075_007.png\" alt=\"Eintragen des angezeigten Ausdrucks des Kombinationsfeldes in der Eigenschaft Marke\" width=\"649,559\" height=\"332,4372\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Eintragen des angezeigten Ausdrucks des Kombinationsfeldes in der Eigenschaft Marke<\/span><\/b><\/p>\n<p>Nun m&uuml;ssen wir nur noch den Code der Klasse <b>clsFastFilterControl <\/b>anpassen, damit diese, falls sich ein Wert in der Eigenschaft <b>Tag <\/b>befindet, diesen Wert statt des Feldnamens selbst verwendet. Genau genommen handelt es sich dabei um die Funktion <b>LookupSearchstring<\/b>, die wir um die <b>If&#8230;Then&#8230;Else<\/b>-Bedingung aus Listing 1 erweitern. Diese pr&uuml;ft schlicht, ob die <b>Tag<\/b>-Eigenschaft einen Wert enth&auml;lt, und tr&auml;gt diesen dann statt des Feldnamens in die Variable <b>strFieldCriteria <\/b>ein. Wenn wir dies nun ausprobieren, erhalten wir zum Beispiel nach Markierung des Buchstabens <b>M <\/b>den folgenden SQL-Ausdruck:<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>LookupSearchstring(cbo<span style=\"color:blue;\"> As <\/span>ComboBox, strValue<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     ...\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(cbo.Tag) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strFieldCriteria = rst.Fields(i).Name\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         strFieldCriteria = cbo.Tag\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     strSQL = strForeignKey & \" IN (SELECT \" & strBoundColumn & \" FROM \" _\r\n         & strBoundTable & \" WHERE \" & strFieldCriteria & \" LIKE ''\" & strValue & \"'')\"\r\n     LookupSearchstring = strSQL\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Anpassung der Funktion LookupSearchstring<\/span><\/b><\/p>\n<pre>KundeID IN (SELECT KundeID FROM tblKunden \r\nWHERE Nachname & \", \" & Vorname LIKE ''*M*'')<\/pre>\n<h2>Steuerelemente zum Bearbeiten der Tickets<\/h2>\n<p>Nachdem wir die Filterfunktionen oberhalb des Datenblatts angelegt haben, wollen wir die Schaltfl&auml;chen mit den Funktionen zum &ouml;ffnen oder L&ouml;schen von Tickets aus dem Datenblatt unter diesem anlegen.<\/p>\n<p>Die beiden Schaltfl&auml;chen wollen wir optisch etwas ansprechender gestalten und f&uuml;gen daher zwei neue Icons zur Datenbank hinzu. Dazu markieren Sie eine beliebige leere Stelle im Formularentwurf und w&auml;hlen dann den Ribbon-Eintrag <b>Entwurf|Steuerelemente|Bild einf&uuml;gen|Durchsuchen&#8230; <\/b>aus.<\/p>\n<p>F&uuml;gen Sie die Bilddateien hinzu, sofern Sie eine entsprechende Sammlung von Icons haben (anderenfalls lassen Sie die Icons einfach weg und arbeiten mit einer normalen Beschriftung).<\/p>\n<p>Wir haben zwei Icons namens <b>edit.png <\/b>und <b>delete.png <\/b>hinzugef&uuml;gt, die dann in der Eigenschaft <b>Bild <\/b>der Schaltfl&auml;chen als <b>edit <\/b>beziehungsweise <b>delete <\/b>angezeigt werden. Diese w&auml;hlen wir dort aus. Als Beschriftung f&uuml;gen Sie die Texte <b>Bearbeiten <\/b>und <b>L&ouml;schen<\/b>, als Namen die Werte <b>cmdBearbeiten <\/b>und <b>cmdLoeschen <\/b>hinzu (s. Bild 8).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1075_008.png\" alt=\"Schaltfl&auml;chen zum Bearbeiten und L&ouml;schen eines Tickets\" width=\"649,559\" height=\"383,549\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Schaltfl&auml;chen zum Bearbeiten und L&ouml;schen eines Tickets<\/span><\/b><\/p>\n<p>Damit die Texte auch neben dem Icons erscheinen, stellen Sie die Eigenschaft <b>Anordnung der Bildbeschriftung <\/b>auf <b>Allgemein <\/b>ein. Um den Hintergrund transparent zu gestalten, legen Sie den Wert <b>Transparent <\/b>f&uuml;r die Eigenschaft <b>Hintergrundart <\/b>fest.<\/p>\n<p>Da wir f&uuml;r das Unterformular-Steuerelement die Eigenschaft <b>Vertikaler Anker <\/b>auf <b>Beide <\/b>eingestellt haben, w&uuml;rden die Schaltfl&auml;chen, die aktuell noch oben verankert sind, beim Vergr&ouml;&szlig;ern der H&ouml;he des Formulars hinter dem Unterformular verschwinden. Stellen wir also die Eigenschaft <b>Vertikaler Anker <\/b>der beiden Schaltfl&auml;chen auf <b>Unten <\/b>ein, damit diese entsprechend nach unten verschoben werden.<\/p>\n<h2>L&ouml;schen eines Tickets<\/h2>\n<p>Die Schaltfl&auml;che <b>cmdLoeschen <\/b>soll das aktuell im Unterformular markierte Ticket l&ouml;schen. Dazu hinterlegen wir f&uuml;r die Ereigniseigenschaft <b>Beim Klicken <\/b>der Schaltfl&auml;che die folgende Prozedur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdLoeschen_Click()\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> IsNull(Me!sfmTickets.Form!TicketID)<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">MsgBox<\/span>(\"Ticket l&ouml;schen\", vbYesNo) = vbYes<span style=\"color:blue;\"> Then<\/span>\r\n             Me!sfmTickets.SetFocus\r\n             RunCommand acCmdDeleteRecord\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> \"Bitte markieren Sie zun&auml;chst den zu  l&ouml;schenden Eintrag.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur pr&uuml;ft zun&auml;chst, ob &uuml;berhaupt ein Datensatz im Unterformular markiert ist (<b>IsNull(Me!sfmTickets.Form!TicketID)<\/b>). Falls nicht, erscheint eine entsprechende Meldung. Anderenfalls l&ouml;scht die Prozedur dieses Ticket nach entsprechender R&uuml;ckfrage (s. Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1075_009.png\" alt=\"Ticket&uuml;bersicht in Aktion, hier beim L&ouml;schen eines Tickets\" width=\"649,559\" height=\"383,549\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Ticket&uuml;bersicht in Aktion, hier beim L&ouml;schen eines Tickets<\/span><\/b><\/p>\n<h2>Bearbeiten eines Tickets<\/h2>\n<p>Die zweite Schaltfl&auml;che namens <b>cmdBearbeiten <\/b>soll das Formular <b>frmTicket <\/b>mit den Detailinformationen des Tickets anzeigen. Dazu hinterlegen wir zun&auml;chst die folgende Ereignisprozedur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdBearbeiten_Click()\r\n     DoCmd.OpenForm \"frmTicket\", WhereCondition:= \"TicketID = \" & Me!sfmTickets.Form!TicketID\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese Prozedur &ouml;ffnet ein Formular namens <b>frmTicket <\/b>und &uuml;bergibt als Bedingung einen Ausdruck, der etwa so aussieht:<\/p>\n<pre>TicketID = 123<\/pre>\n<h2>Das Detailformular frmTicket<\/h2>\n<p>Bevor wir dieses Formular erstellen, m&uuml;ssen wir uns &uuml;berlegen, wie dieses aussehen soll und welche Aufgaben damit zu erledigen sind. Da die Aufgaben, die wir mit diesem Formular durchf&uuml;hren wollen, jedoch etwas komplexer sind, erstellen wir zun&auml;chst ein Basis-Formular mit den grundlegenden Funktionen. In diesem Fall soll das Formular an die Tabelle <b>tblTickets <\/b>gebunden werden und alle Felder dieser Tabelle anzeigen &#8211; mit Ausnahme von <b>MailItemID<\/b>, womit je der Eintrag der zugrunde liegenden E-Mail aus der Tabelle <b>tblMailItems <\/b>referenziert wird.<\/p>\n<p>Die Felder der Tabelle ordnen wir als Textfelder beziehungsweise Kombinationsfelder zun&auml;chst wie in Bild 10 an. Dabei soll das Feld <b>Ticketinhalt <\/b>beim Vergr&ouml;&szlig;ern des Formulars in die vertikale und horizontale Richtung ebenfalls in beiden Richtungen vergr&ouml;&szlig;ert werden, weshalb wir die Eigenschaften <b>Horizontaler Anker <\/b>und <b>Vertikaler Anker <\/b>beide auf den Wert <b>Beide <\/b>einstellen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1075_010.png\" alt=\"Erster Entwurf des Formulars zur Detailansicht eines Tickets\" width=\"549,6265\" height=\"317,9731\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Erster Entwurf des Formulars zur Detailansicht eines Tickets<\/span><\/b><\/p>\n<p>Die beiden dar&uuml;ber liegenden Felder sollen nur in die horizontale Richtung gestreckt werden, also erhalten diese nur f&uuml;r die Eigenschaft <b>Horizontaler Anker <\/b>den Wert <b>Beide<\/b>. Die darunter befindlichen Steuerelemente sollen nur nach unten verschoben werden, wenn das Formular nach unten vergr&ouml;&szlig;ert wird, also stellen wir die Eigenschaft <b>Vertikaler Anker <\/b>f&uuml;r diese Steuerelemente auf den Wert <b>Unten <\/b>ein.<\/p>\n<p>Die Schaltfl&auml;che <b>cmdOK <\/b>f&uuml;hrt die folgende Ereignisprozedur aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdOK_Click()\r\n     DoCmd.Close acForm, Me.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Anzeigen der zugrunde liegenden E-Mail<\/h2>\n<p>Die Anzeige der Ticketeigenschaften ist allerdings noch l&auml;ngst nicht alles, was dieses Formulars leisten soll. Da jedes Ticket auf Basis einer E-Mail eines Kunden erstellt wurde, wollen wir auch die M&ouml;glichkeit haben, die entsprechende E-Mail &ouml;ffnen zu k&ouml;nnen. Dazu f&uuml;gen wir dem Formular eine weitere Schaltfl&auml;che hinzu, und zwar links neben dem Steuerelement zur Anzeige des Feldes <b>Ticketinhalt <\/b>(s. Bild 11).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1075_011.png\" alt=\"Neue Schaltfl&auml;che zum &ouml;ffnen der Kunden-E-Mail\" width=\"424,7115\" height=\"236,1669\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Neue Schaltfl&auml;che zum &ouml;ffnen der Kunden-E-Mail<\/span><\/b><\/p>\n<p>Die Schaltfl&auml;che nennen wir <b>cmdAnfrageOeffnen<\/b>. Sie soll die in der Tabelle <b>tblMailItem <\/b>enthaltene und zum aktuellen Ticket geh&ouml;rende E-Mail im entsprechenden Outlook-Fenster anzeigen.<\/p>\n<p>Diese Schaltfl&auml;che l&ouml;st die folgende Ereignisprozedur aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAnfrageOeffnen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strEntryID<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objNamespace<span style=\"color:blue;\"> As <\/span>Outlook.NameSpace\r\n     <span style=\"color:blue;\">Dim <\/span>objMailItem<span style=\"color:blue;\"> As <\/span>Outlook.MailItem\r\n     strEntryID = DLookup(\"EntryID\", \"tblMailItems\",  \"MailitemID = \" & Me!MailitemID)\r\n     <span style=\"color:blue;\">Set<\/span> objNamespace = GetMAPI\r\n     <span style=\"color:blue;\">Set<\/span> objMailItem =  objNamespace.GetItemFromID(strEntryID)\r\n     objMailItem.Display\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur deklariert eine Variable zum Aufnehmen der <b>EntryID<\/b>, also des eindeutigen Identifizierers f&uuml;r die Outlook-E-Mail, eine Variable f&uuml;r das MAPI-Namespace-Objekt sowie eine Variable f&uuml;r die Mail selbst. Sie ermittelt zun&auml;chst die <b>EntryID<\/b> zu der Ausgangsmail zum angezeigten Ticket. Diese finden wir in der Tabelle <b>tblMailItems<\/b>, aus der wir den gesuchten Eintrag &uuml;ber den Prim&auml;rschl&uuml;sselwert ermitteln, der in unserem aktuellen Ticket-Datensatz im Fremdschl&uuml;sselfeld <b>MailItemID <\/b>gespeichert ist. Dabei unterst&uuml;tzt uns eine entsprechende <b>DLookup<\/b>-Funktion. Danach f&uuml;llen wir die Variable <b>objNamespace <\/b>&uuml;ber die Funktion <b>GetMAPI <\/b>und verwenden deren Funktion <b>GetItemFromID<\/b>, um mit der <b>EntryID <\/b>eine Referenz auf die gesuchte E-Mail zu erhalten. Diese speichern wir dann in der Objektvariablen <b>objMailItem<\/b>, deren Methode <b>Display <\/b>wir wiederum nutzen k&ouml;nnen, um diese E-Mail im Mailfenster von Outlook zu &ouml;ffnen (s. Bild 12). Dies zeigt die grundlegende Technik f&uuml;r einige der nachfolgend beschriebenen Schritte.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1075_012.png\" alt=\"Anzeige der E-Mail zum Ticket\" width=\"700\" height=\"468,3824\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Anzeige der E-Mail zum Ticket<\/span><\/b><\/p>\n<h2>Ticket erstellt &#8211; was nun<\/h2>\n<p>Wir haben also nun eine M&ouml;glichkeit, Tickets auf Basis von Kunden-E-Mails zu erstellen und k&ouml;nnen diese in einer &uuml;bersicht anzeigen. Au&szlig;erdem haben wir ein Formular erstellt, das die Details zu einem ausgew&auml;hlten Ticket anzeigt und die M&ouml;glichkeit bietet, die Ausgangsmail zu &ouml;ffnen.<\/p>\n<h2>Kategorisieren von Anfragen<\/h2>\n<p>Wie aber geht es nun weiter Was geschieht mit einem Ticket, nachdem es aufgenommen wurde Dazu gibt es je nach Anwendungsfall verschiedene M&ouml;glichkeiten. In meinem Fall kommen Anfragen von Kunden, <\/p>\n<ul>\n<li>die ein Heft eines Abonnements nicht erhalten haben, <\/li>\n<li>die ein Abonnement k&uuml;ndigen wollen,<\/li>\n<li>die auf eine Lieferung eines Buchs warten,<\/li>\n<li>die auf eine Rechnung warten,<\/li>\n<li>die eine falsche Rechnung erhalten haben, <\/li>\n<li>die sich nicht in ihr Kundenkonto einloggen k&ouml;nnen,<\/li>\n<li>die den Zugang zum Online-Archiv nicht finden,<\/li>\n<li>die eine Frage zu einem Artikel haben,<\/li>\n<li>die einen Fehler in einem Artikel gefunden haben<\/li>\n<\/ul>\n<p>und vieles mehr.<\/p>\n<h2>M&ouml;gliche Aktionen auf Kundenanfragen<\/h2>\n<p>Die Anfragen der Kunden laufen dann auf verschiedene durchzuf&uuml;hrende Aktionen hinaus:<\/p>\n<ul>\n<li>Im einfachsten Fall: schlichte Antwort an den Kunden, zum Beispiel bei einer fehlenden Rechnung, die ohnehin in den n&auml;chsten Tagen versendet wird, oder dem Hinweis, wo er die Zugangsdaten f&uuml;r das Online-Archiv findet.<\/li>\n<li>Komplizierterer Fall: Wenn nicht nur eine Mail an den Kunden, sondern auch noch eine Mail etwa an die Buchhaltung geschickt werden muss &#8211; beispielsweise, weil die Rechnungsadresse korrigiert werden muss oder auch, weil die Rechnung falsche Positionen enth&auml;lt.<\/li>\n<li>Kompliziertester Fall: Es ist noch eine weitere Aktion n&ouml;tig, also etwa das erneute Versenden eines Produkts an den Kunden, die Korrektur eines Artikels oder die Beantwortung einer technischen Frage zu einem Artikel.<\/li>\n<\/ul>\n<p>Wir wollen zun&auml;chst den ersten Fall technisch abbilden. Dazu ist eine Antwort an den Kunden erforderlich, die gegebenenfalls automatisch aus einer Vorlage formuliert werden kann, gegebenenfalls aber auch noch eine manuelle Erg&auml;nzung erfordert.<\/p>\n<h2>Speichern der Aktionstypen in der Tabelle tblAktionen<\/h2>\n<p>F&uuml;r jeden Schritt, also etwa f&uuml;r einen &#8222;einfachen Fall&#8220;, wollen wir einen Eintrag in einer Tabelle vornehmen, die mit dem Ticket aus der Tabelle <b>tblTickets <\/b>verkn&uuml;pft ist. In dieser Tabelle, die wir <b>tblAktionen <\/b>nennen werden, wollen wir den Typ der Aktion festlegen. Diese speichern wir wiederum in der Tabelle <b>tblAktionstypen<\/b>, deren Entwurf wie in Bild 13 aussieht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_01\/pic_1075_013.png\" alt=\"Tabelle zum Speichern der Aktionstypen\" width=\"424,7115\" height=\"352,1998\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Tabelle zum Speichern der Aktionstypen<\/span><\/b><\/p>\n<p>Nun stellt sich noch die Frage: Wollen wir etwa einen Fall wie das &auml;ndern einer Rechnung, was imgrunde zwei Aktionen anst&ouml;&szlig;t (eine Antwort an den Kunden und eine Mail an die Buchhaltung), in einer Aktion speichern, wof&uuml;r dann mindestens zwei individuelle Felder n&ouml;tig w&auml;ren, oder sollten wir dazu zwei Aktionen anlegen Letzteres ist vermutlich der flexiblere Weg, vor allem, wenn man davon ausgeht, dass eine Aktion auch einmal aus mehr als zwei Basisaktionen bestehen kann.<\/p>\n<p>Damit kommen wir dann auch gleich zur Gestaltung der Tabelle <b>tblAktionen<\/b>. Diese soll auf jeden Fall ein Fremdschl&uuml;sselfeld namens <b>TicketID <\/b>enthalten, mit dem wir den entsprechenden Datensatz der Tabelle <b>tblTickets <\/b>referenzieren k&ouml;nnen.<\/p>\n<p>Au&szlig;erdem wollen wir damit einen Eintrag der Tabelle <b>tblAktionstypen <\/b>ausw&auml;hlen k&ouml;nnen, wozu ein weiteres Fremdschl&uuml;sselfeld n&ouml;tig wird (namens <b>AktionstypID<\/b>). Die Tabelle <b>tblAktionstypen <\/b>sollte au&szlig;erdem zumindest zwei Felder enthalten, mit denen wir Vorlagen f&uuml;r den Betreff und den Inhalt zu versendender Mails an Kunden, Buchhaltung et cetera speichern k&ouml;nnen.<\/p>\n<p>Da wir ausschlie&szlig;lich &uuml;ber E-Mail kommunizieren wollen, geh&ouml;rt zu jeder Aktion keine oder eine E-Mail &#8211; zum Beispiel an den Kunden oder an die Buchhaltung. Dementsprechend kommt f&uuml;r jede Aktion wieder eine neue E-Mail zur Tabelle <b>tblMailItems <\/b>hinzu, die wir ebenfalls von der Tabelle <b>tblAktionen <\/b>aus referenzieren wollen. Das entsprechende Fremdschl&uuml;sselfeld hei&szlig;t <b>MailItemID<\/b>, genau wie in der Tabelle <b>tblTickets<\/b>.<\/p>\n<p>Au&szlig;erdem sollten wir ein Memofeld zum Eintragen eventuell ben&ouml;tigter Bemerkungen vorhalten. &uuml;blicherweise sollten die Aktionen weitgehend standardisiert sein, da zu einem Gro&szlig;teil immer wieder die gleichen Kundenanfragen eingehen.<\/p>\n<p>Daher wird das Memofeld selten zu bef&uuml;llen sein, da der Aktionstyp bereits einen Hinweis auf die erfolgte Aktion gibt. Dennoch kann es F&auml;lle geben, die sich nicht auf diese Weise bearbeiten lassen und die zus&auml;tzliche Bemerkungen erfordern.<\/p>\n<p>Schlie&szlig;lich ben&ouml;tigen wir noch ein Datum plus Uhrzeit, um die Ausf&uuml;hrung der Aktion zu dokumentieren &#8211; dies erledigen wir in einem Feld namens <b>Aktionsdatum<\/b>.<\/p>\n<p>Wenn allerdings etwa der Eingang einer Kundenmeldung &uuml;ber eine falsch ausgestellte Rechnung zwei Aktionen nach sich zieht, von denen die eine etwa den Aktionstyp &#8222;Neuausstellung Rechnung: Mail an Kunde&#8220; und die andere den Aktionstyp &#8222;Neuausstellung Rechnung: Mail an Buchhaltung&#8220; enth&auml;lt, dann brauchen wir noch eine einfache M&ouml;glichkeit, um diese beiden Aktionen in einem Rutsch in die Tabelle der Aktionen einzutragen und auszuf&uuml;hren. <\/p>\n<p>Und m&uuml;sste diese Tabelle dann per m:n-Beziehung mit der Tabelle <b>tblAktionstypen<\/b> verkn&uuml;pft sein, weil sich jeder der Aktionstypen theoretisch mit jeder Gruppe von Aktionen kombinieren lassen m&uuml;sste Der erste Gedanke sagt ja, aber wenn jeder Aktionstyp auch etwa eine eigene Mailvorlage mit Betreff und Inhalt vorh&auml;lt, werden die Datens&auml;tze der Tabelle <b>tblAktionstypen <\/b>dann nicht so individuell, dass diese kaum mehreren Aktionsgruppen zugeordnet werden k&ouml;nnen<\/p>\n<p>Wie auch immer: Es kann ja nicht schaden, hier eine m:n-Beziehung einzurichten statt einer 1:n-Beziehung zwischen den Tabellen <b>tblAktionstypen <\/b>und einer weiteren Tabelle zur Gruppierung von Aktionstypen, die wir &#8211; dieser Name kristallisiert sich nun heraus &#8211; <b>tblAktionsgruppen <\/b>nennen wollen.<\/p>\n<h2>Fortsetzung folgt &#8230;<\/h2>\n<p>&#8230; zwar erst in der n&auml;chsten Ausgabe, aber der Beitrag <b>Ticketsystem, Teil IV <\/b>steht Ihnen bereits mit Erscheinen der vorliegenden Ausgabe als Download zur Verf&uuml;gung: <b>www.access-im-unternehmen.de\/1076<\/b>.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Ticketsystem.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/628B1DBC-9257-47C8-B2D3-378C4F68B278\/aiu_1075.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In unserem Ticketsystem haben wir bereits Funktionen integriert, mit denen Sie die Kundenanfragen per Drag and Drop in der Datenbank speichern k&ouml;nnen. Au&szlig;erdem haben wir ein Formular hinzugef&uuml;gt, das alle offenen E-Mails anzeigt und eine einfache M&ouml;glichkeit enth&auml;lt, daraus Tickets zu generieren. Diese wollen wir nun im vorliegenden Teil der Beitragsreihe verarbeiten, und zwar in daf&uuml;r ausgelegten Formularen. Diese zeigen sowohl eine &Uuml;bersicht aller Tickets &#8211; filterbar nach dem Status und anderen Eigenschaften &#8211; als auch den Verlauf eines einzelnen Tickets.<\/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":[66012017,662017,44000027],"tags":[],"class_list":["post-55001075","post","type-post","status-publish","format-standard","hentry","category-66012017","category-662017","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 III - 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_III\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ticketsystem, Teil III\" \/>\n<meta property=\"og:description\" content=\"In unserem Ticketsystem haben wir bereits Funktionen integriert, mit denen Sie die Kundenanfragen per Drag and Drop in der Datenbank speichern k&ouml;nnen. Au&szlig;erdem haben wir ein Formular hinzugef&uuml;gt, das alle offenen E-Mails anzeigt und eine einfache M&ouml;glichkeit enth&auml;lt, daraus Tickets zu generieren. Diese wollen wir nun im vorliegenden Teil der Beitragsreihe verarbeiten, und zwar in daf&uuml;r ausgelegten Formularen. Diese zeigen sowohl eine &Uuml;bersicht aller Tickets - filterbar nach dem Status und anderen Eigenschaften - als auch den Verlauf eines einzelnen Tickets.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_III\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-14T13:41:26+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/31ab028fef544f7bb453a918044c38e1\" \/>\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=\"17\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_III\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_III\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Ticketsystem, Teil III\",\"datePublished\":\"2020-05-14T13:41:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_III\\\/\"},\"wordCount\":3257,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_III\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/31ab028fef544f7bb453a918044c38e1\",\"articleSection\":[\"1\\\/2017\",\"2017\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_III\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_III\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_III\\\/\",\"name\":\"Ticketsystem, Teil III - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_III\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_III\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/31ab028fef544f7bb453a918044c38e1\",\"datePublished\":\"2020-05-14T13:41:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_III\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_III\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_III\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/31ab028fef544f7bb453a918044c38e1\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/31ab028fef544f7bb453a918044c38e1\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_III\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ticketsystem, Teil III\"}]},{\"@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 III - 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_III\/","og_locale":"de_DE","og_type":"article","og_title":"Ticketsystem, Teil III","og_description":"In unserem Ticketsystem haben wir bereits Funktionen integriert, mit denen Sie die Kundenanfragen per Drag and Drop in der Datenbank speichern k&ouml;nnen. Au&szlig;erdem haben wir ein Formular hinzugef&uuml;gt, das alle offenen E-Mails anzeigt und eine einfache M&ouml;glichkeit enth&auml;lt, daraus Tickets zu generieren. Diese wollen wir nun im vorliegenden Teil der Beitragsreihe verarbeiten, und zwar in daf&uuml;r ausgelegten Formularen. Diese zeigen sowohl eine &Uuml;bersicht aller Tickets - filterbar nach dem Status und anderen Eigenschaften - als auch den Verlauf eines einzelnen Tickets.","og_url":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_III\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-14T13:41:26+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/31ab028fef544f7bb453a918044c38e1","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"17\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_III\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_III\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Ticketsystem, Teil III","datePublished":"2020-05-14T13:41:26+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_III\/"},"wordCount":3257,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_III\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/31ab028fef544f7bb453a918044c38e1","articleSection":["1\/2017","2017","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_III\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_III\/","url":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_III\/","name":"Ticketsystem, Teil III - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_III\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_III\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/31ab028fef544f7bb453a918044c38e1","datePublished":"2020-05-14T13:41:26+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_III\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_III\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_III\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/31ab028fef544f7bb453a918044c38e1","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/31ab028fef544f7bb453a918044c38e1"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_III\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Ticketsystem, Teil III"}]},{"@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\/55001075","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=55001075"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001075\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001075"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001075"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001075"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}