{"id":55001076,"date":"2017-04-01T00:00:00","date_gmt":"2020-05-14T13:41:32","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1076"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Ticketsystem_Teil_IV","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_IV\/","title":{"rendered":"Ticketsystem, Teil IV"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/a03aa826e7774037bfa21e9400ea921f\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>In der vorherigen Folge dieser Beitragsreihe haben wir begonnen, das &uuml;bersichtsformular f&uuml;r die angelegten Tickets zu entwickeln und ein Detailformular zu erstellen, mit welchem der Ablauf eines Tickets eingesehen werden kann &#8211; und das auch zur Abarbeitung der Tickets dienen soll. Im vorliegenden Teil wollen wir diese Formulare und die daf&uuml;r notwendigen Tabellen weiterentwickeln und die L&ouml;sung endlich einsatzbereit machen.<\/b><\/p>\n<p>Das Ergebnis der Vor&uuml;berlegungen f&uuml;r den Aufbau des Formulars zur detaillierten Anzeige eines Tickets mit den damit verbundenen Aktionen war auch eine Erweiterung des Datenmodells.<\/p>\n<p>Dabei steht im Vordergrund, wie wir mit einem Ticket umgehen wollen. Im vorherigen Teil haben wir schon angerissen, dass wir als Reaktionen auf ein Ticket eine Gruppe von Aktionen vorsehen, wobei die Aktionen selbst auf bestimmten Aktionstypen basieren und f&uuml;r jeden Fall verschiedene Kombinationen von Aktionstypen in einer Tabelle namens <b>tblAktionsgruppen <\/b>zusammengefasst werden.<\/p>\n<p>Noch nicht klar war im vorherigen Teil der Beitragsreihe, welche Felder wir in den verschiedenen Tabellen speichern und wie wir mit diesen arbeiten. Grunds&auml;tzlich soll der Ablauf so aussehen:<\/p>\n<ul>\n<li>Wir erhalten ein Ticket.<\/li>\n<li>Wir ermitteln die Gruppe von Aktionen, die als Reaktion auf das Ticket durchgef&uuml;hrt werden sollen. Die Gruppe ist in der Tabelle <b>tblAktionsgruppen <\/b>gespeichert und enth&auml;lt den Namen der Aktionsgruppe (s. Bild 1).<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1076_001.png\" alt=\"Entwurf der Tabelle tblAktionsgruppen\" width=\"599,593\" height=\"348,2783\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Entwurf der Tabelle tblAktionsgruppen<\/span><\/b><\/p>\n<li>Die Tabelle <b>tblAktionsgruppen <\/b>soll mit einem oder mehreren Eintr&auml;gen einer Tabelle namens <b>tblAktionstypen <\/b>verkn&uuml;pft sein, die neben der Bezeichnung des Aktionstyps noch einen Betreff und einen Inhalt sowie einen Empf&auml;nger f&uuml;r die zu erstellende E-Mail oder Aufgabe enth&auml;lt (s. Bild 2).<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1076_002.png\" alt=\"Entwurf der Tabelle tblAktionstypen\" width=\"599,593\" height=\"191,6225\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Entwurf der Tabelle tblAktionstypen<\/span><\/b><\/p>\n<li>Die Aktionstypen sind den Aktionsgruppen &uuml;ber die Verkn&uuml;pfungstabelle <b>tblAktionsgruppenAktionstypen<\/b> zugeordnet (s. Bild 3).<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1076_003.png\" alt=\"Entwurf der Tabelle tblAktionsgruppenAktionstypen\" width=\"599,593\" height=\"376,759\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Entwurf der Tabelle tblAktionsgruppenAktionstypen<\/span><\/b><\/p>\n<li>Die Daten dieser drei Tabellen sehen etwa wie in Bild 4 aus, wobei eine Gruppe zwei Aktionstypen enth&auml;lt und eine weitere nur einen Aktionstyp.<\/li>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1076_004.png\" alt=\"Beispieldatens&auml;tze der Tabellen tblAktionstypen, tblAktionsgruppen und tblAktionsgruppenAktionstypen\" width=\"700\" height=\"456,7977\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Beispieldatens&auml;tze der Tabellen tblAktionstypen, tblAktionsgruppen und tblAktionsgruppenAktionstypen<\/span><\/b><\/p>\n<li>Diese Tabellen sind allerdings nur die Grundlage der eigentlichen Bearbeitung des Tickets. Wenn man eine der Aktionsgruppen ausw&auml;hlt, soll n&auml;mlich f&uuml;r jeden zugeordneten Aktionstyp eine Mail mit den Daten der drei Felder <b>Betreff<\/b>, <b>Inhalt <\/b>und <b>Empfaenger <\/b>erstellt und ein Eintrag zur Tabelle <b>tblAktionen <\/b>hinzugef&uuml;gt werden. Dabei werden gegebenenfalls noch Platzhalter mit kundenspezifischen Daten gef&uuml;llt.<\/li>\n<li>Au&szlig;erdem soll ein Feld namens <b>Aktionsdatum<\/b> in der Tabelle <b>tblAktionen <\/b>gef&uuml;llt werden, in die der Versand der E-Mail oder das Datum der Erledigung der Aufgabe eingetragen wird.<\/li>\n<li>Erst wenn alle Aktionen zu einem Ticket ein Aktionsdatum enthalten, wird dieses als erledigt markiert.<\/li>\n<\/ul>\n<p>Beim Erstellen der E-Mails sollen noch die Daten des jeweiligen Kunden herangezogen und in die Platzhalter der Texte f&uuml;r <b>Betreff, Inhalt <\/b>und <b>Empfaenger <\/b>eingetragen werden. Dann werden die E-Mails angezeigt, damit der Benutzer diese gegebenenfalls noch anpassen kann.Manchmal m&ouml;chte man vielleicht den Text &auml;ndern, den Kunden nicht siezen, sondern duzen oder auch eine Anlage zur E-Mail hinzuf&uuml;gen. Wichtig ist hier, dass erst der tats&auml;chliche Text der E-Mail nach dem Absenden in der Tabelle <b>tblAktionen <\/b>gespeichert wird.<\/p>\n<p>Die Tabelle <b>tblAktionen<\/b> ist wie in Bild 5 aufgebaut.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1076_005.png\" alt=\"Entwurf der Tabelle tblAktionen\" width=\"599,593\" height=\"235,5543\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Entwurf der Tabelle tblAktionen<\/span><\/b><\/p>\n<p>Einen &uuml;berblick &uuml;ber die neu hinzugekommenen Tabellen und ihre Verbindung zur Tabelle <b>tblTickets <\/b>finden Sie in Bild 6. Hier k&ouml;nnen Sie auch gut erkennen, dass die Tabelle <b>tblAktionsgruppenAktionstypen <\/b>als Verkn&uuml;pfungstabelle zur Herstellung einer m:n-Beziehung zwischen den Tabellen <b>tblAktionsgruppen <\/b>und <b>tblAktionstypen <\/b>dient.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1076_009.png\" alt=\"Datenmodell der vorgestellten Tabellen\" width=\"700\" height=\"189,4366\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Datenmodell der vorgestellten Tabellen<\/span><\/b><\/p>\n<h2>Aktionstyp-Sonderfall Kundenantwort<\/h2>\n<p>Den Aktionstyp wollen wir mit jeder Aktion speichern, um schnell erkennen zu k&ouml;nnen, um welchen Aktionstyp es sich handelt. Nun kann es auch sein, dass der Kunde auf eine Mail erneut antwortet. Solche Aktionen sollen auch in der Tabelle <b>tblAktionen <\/b>gespeichert werden. Nur: Welchem Aktionstyp ordnen wir dies zu Wir legen dazu einen einzigen Aktionstyp an, der sich von den &uuml;brigen Aktionstypen unterscheidet. Sein Wert im Feld <b>Aktionstyp <\/b>lautet schlicht <b>Kundenantwort<\/b>, die &uuml;brigen Felder bleiben leer.<\/p>\n<h2>Bearbeiten von Aktionstypen und Aktionsgruppen<\/h2>\n<p>Damit der Benutzer die Aktionstypen und Aktionsgruppen anlegen und bearbeiten kann, legen wir einige Formulare an. Das erste hei&szlig;t <b>frmAktionstyp<\/b> und liefert die Detailansicht eines Aktionstyps zur Bearbeitung (s. Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1076_007.png\" alt=\"Eingabe der Daten eines Aktionstyps\" width=\"499,6607\" height=\"286,2463\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Eingabe der Daten eines Aktionstyps<\/span><\/b><\/p>\n<p>Das Formular <b>frmAktionsgruppen<\/b> zeigt jeweils eine Gruppe und die dazugeh&ouml;rigen Aktionstypen in einem Unterformular an. &uuml;ber dieses Formular kann man den Namen der Aktionsgruppe festlegen sowie die einzelnen Aktionstypen hinzuf&uuml;gen (s. Bild 8). Mit einem Doppelklick auf eine der Eintr&auml;ge der zugeordneten Aktionstypen wird dieser im Formular <b>frmAktionstyp <\/b>angezeigt. Die Aktionstypen k&ouml;nnen durch einfache Auswahl aus dem Kombinationsfeld zur Aktionsgruppe hinzugef&uuml;gt werden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1076_008.png\" alt=\"Zusammenfassen der Aktiontypen zu einer Aktionsgruppe\" width=\"499,6607\" height=\"252,371\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Zusammenfassen der Aktiontypen zu einer Aktionsgruppe<\/span><\/b><\/p>\n<h2>Erstellen des Formulars frmAktionstyp<\/h2>\n<p>Das Formular <b>frmAktionstyp<\/b> sieht im Entwurf wie in Bild 9 aus und verwendet die folgende Abfrage als Datenherkunft:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1076_006.png\" alt=\"Entwurf des Formulars frmAktionstyp\" width=\"424,7115\" height=\"325,1422\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Entwurf des Formulars frmAktionstyp<\/span><\/b><\/p>\n<pre>SELECT AktionstypID, Aktionstyp, Betreff, Inhalt, Empfaenger \r\nFROM tblAktionstypen \r\nWHERE <span style=\"color:blue;\">Not<\/span> Aktionstyp=\"Kundenantwort\"\r\nORDER BY Aktionstyp;<\/pre>\n<p>Das entspricht der Tabelle <b>tblAktionstypen<\/b>, die Abfrage f&uuml;gt jedoch noch eine Sortierung nach dem Inhalt des Feldes <b>Aktionstyp <\/b>hinzu. Au&szlig;erdem soll der Eintrag mit dem Wert <b>Kundenantwort <\/b>im Feld <b>Aktionstyp <\/b>ausgeschlossen werden, da dieser nicht durch den Benutzer bearbeitet werden darf.<\/p>\n<p>Ein Bl&auml;ttern in den Datens&auml;tzen ist nicht vorgesehen, daher stellen wir die Eigenschaften <b>Navigationsschaltfl&auml;chen<\/b>, <b>Datensatzmarkierer<\/b>, <b>Trennlinien <\/b>und <b>Bildlaufleisten <\/b>auf <b>Nein <\/b>ein. Oben im Formular finden Sie ein Kombinationsfeld namens <b>cboAuswahl<\/b>, welches die folgende Abfrage als Datensatzherkunft nutzt:<\/p>\n<pre>SELECT AktionstypID, Aktionstyp \r\nFROM tblAktionstypen \r\nWHERE <span style=\"color:blue;\">Not<\/span> Aktionstyp=\"Kundenantwort\"\r\nORDER BY Aktionstyp;<\/pre>\n<p>Damit das erste Feld mit dem Prim&auml;rschl&uuml;sselfeld ausgeblendet und nur als gebundene Spalte genutzt wird, stellen wir die Eigenschaft <b>Spaltenanzahl <\/b>auf <b>2 <\/b>und <b>Spaltenbreiten <\/b>auf <b>0cm <\/b>ein. Auch hier schlie&szlig;en wir den Eintrag <b>Kundenantwort <\/b>f&uuml;r das Feld <b>Aktionstyp <\/b>aus.<\/p>\n<p>Au&szlig;erdem soll das Kombinationsfeld beim &ouml;ffnen des Formulars immer gleich den Wert der Datensatzherkunft anzeigen, der auch im Formular angezeigt wird. Deshalb hinterlegen wir f&uuml;r das Ereignis <b>Beim Laden<\/b> des Formulars die folgende Ereignisprozedur:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     Me!cboAuswahl = Me!AktionstypID\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Nach dem Ausw&auml;hlen eines der Eintr&auml;ge des Kombinationsfeldes soll der entsprechende Eintrag auch im Formular angezeigt werden. Dazu f&uuml;gen wir eine weitere Ereignisprozedur hinzu, die diesmal durch das Ereignis <b>Nach Aktualisierung <\/b>des Kombinationsfeldes ausgel&ouml;st wird:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboAuswahl_AfterUpdate()\r\n     Me.Recordset.FindFirst \"AktionstypID = \" & Me!cboAuswahl\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Aktionstyp l&ouml;schen<\/h2>\n<p>Unten im Formular befinden sich zwei Schaltfl&auml;chen namens <b>cmdLoeschen <\/b>und <b>cmdNeu<\/b>. Mit der Schaltfl&auml;che <b>cmdLoeschen <\/b>k&ouml;nnen Sie logischerweise den aktuellen Eintrag l&ouml;schen. Die entsprechende Ereignisprozedur finden Sie in Listing 1. Vor dem L&ouml;schen fragt die Prozedur per Meldungsfenster ab, ob der Datensatz tats&auml;chlich gel&ouml;scht werden soll.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdLoeschen_Click()\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">MsgBox<\/span>(\"Datensatz wirklich l&ouml;schen\", vbYesNo, \"Datensatz l&ouml;schen\") = vbYes<span style=\"color:blue;\"> Then<\/span>\r\n         On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n         DoCmd.SetWarnings <span style=\"color:blue;\">False<\/span>\r\n         RunCommand acCmdDeleteRecord\r\n         DoCmd.SetWarnings <span style=\"color:blue;\">True<\/span>\r\n         Select Case Err.Number\r\n             <span style=\"color:blue;\">Case <\/span>3200\r\n                 <span style=\"color:blue;\">MsgBox<\/span> \"Der Eintrag kann nicht gel&ouml;scht werden, da er bereits mit einer Aktionsgruppe verkn&uuml;pft ist.\"\r\n             <span style=\"color:blue;\">Case <\/span>0\r\n                 Me!cboAuswahl.Requery\r\n                 Me.Recordset.MoveFirst\r\n                 Me!cboAuswahl = Me!AktionstypID\r\n             <span style=\"color:blue;\">Case Else<\/span>\r\n                 <span style=\"color:blue;\">MsgBox<\/span> \"Fehler \" & Err.Number & <span style=\"color:blue;\">vbCrLf<\/span> & Err.Description\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n         <span style=\"color:blue;\">On Error GoTo<\/span> 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 1: Ereignisprozedur zum L&ouml;schen eines Aktionstyps &uuml;ber die Schaltfl&auml;che cmdLoeschen<\/span><\/b><\/p>\n<p>Falls ja, erfolgt dies per <b>RunCommand accmdDeleteRecord<\/b>. F&uuml;r diese Anweisung haben wir die Fehlerbehandlung deaktiviert, da es sein kann, dass der aktuell angezeigte Aktionstyp bereits &uuml;ber die Tabelle <b>tblAktionsgruppenAktionstypen <\/b>mit einer der Aktionsgruppen verkn&uuml;pft ist. Wegen der referenziellen Integrit&auml;t f&uuml;r die Verkn&uuml;pfung zwischen diesen beiden Tabellen l&ouml;st der Versuch, einen verkn&uuml;pften Datensatz zu l&ouml;schen, den Fehler mit der Nummer <b>3200 <\/b>aus. Diesen fangen wir ab und geben in diesem Fall eine entsprechende Meldung aus.<\/p>\n<p>Au&szlig;erdem haben wir hier die Anzahl von Warnungen deaktiviert, die je nach Einstellung angezeigt werden k&ouml;nnen. Sollte beim L&ouml;schen kein Fehler auftreten, aktualisiert die Prozedur die Datensatzherkunft des Kombinationsfeldes, springt zum ersten Datensatz des Formulars und stellt auch das Kombinationsfeld auf diesen Datensatz ein.<\/p>\n<h2>Neuen Aktionstyp anlegen<\/h2>\n<p>Die Schaltfl&auml;che <b>cmdNeu <\/b>l&ouml;st die folgende Ereignisprozedur aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNeu_Click()\r\n     DoCmd.GoToRecord Record:=acNewRec\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit wird der Datensatzzeiger auf einen neuen Datensatz verschoben.<\/p>\n<h2>Kombinationsfeld aktualisieren<\/h2>\n<p>Wenn der Benutzer den aktuell angezeigten Datensatz auf eine andere Weise als durch Auswahl &uuml;ber das Kombinationsfeld <b>cboAuswahl <\/b>festlegt, also beispielsweise durch Neuanlegen eines Datensatzes, muss das Kombinationfeld nat&uuml;rlich aktualisiert werden. Dies erledigt die folgende Prozedur, die durch das Ereignis <b>Nach Aktualisierung <\/b>des Formulars augel&ouml;st wird:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_AfterUpdate()\r\n     Me!cboAuswahl.Requery\r\n     Me!cboAuswahl = Me!AktionstypID\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Einen m&ouml;glichen Fehler haben wir noch au&szlig;er Acht gelassen: Es kann geschehen, dass der Benutzer beim Anlegen eines neuen Aktionstyps einen Wert f&uuml;r das eindeutig indizierte Feld <b>Aktionstyp <\/b>eingibt, der bereits in einem anderen Datensatz vorhanden ist. In diesem Fall l&ouml;st dies den Fehler <b>3022 <\/b>aus, allerdings k&ouml;nnen Sie diesen nur im Ereignis <b>Bei Fehler <\/b>des Formulars abfangen. Die daf&uuml;r ben&ouml;tigte Ereignisprozedur haben wir in Listing 2 abgebildet. Wir pr&uuml;fen dort in einer <b>Select Case<\/b>-Bedingung den Wert des Parameters <b>DataErr <\/b>mit der Fehlernummer. Im Falle des Wertes <b>3022 <\/b>kann es sich nur um das Feld <b>Aktionstyp <\/b>handeln, da wir nur daf&uuml;r einen eindeutigen Index festgelegt haben. Es erscheint eine entsprechende Meldung und der Fokus wird auf dieses Feld verschoben.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Error(DataErr<span style=\"color:blue;\"> As Integer<\/span>, Response<span style=\"color:blue;\"> As Integer<\/span>)\r\n     Select Case DataErr\r\n         <span style=\"color:blue;\">Case <\/span>3022\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Es ist bereits ein Aktionstyp mit der Bezeichnung ''\" & Me.Aktionstyp & \"'' vorhanden.\"\r\n             Me!Aktionstyp.SetFocus\r\n             Response = acDataErrContinue\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Fehler \" & DataErr & <span style=\"color:blue;\">vbCrLf<\/span> & AccessError(DataErr)\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Diese Prozedur wird beispielsweise ausgel&ouml;st, wenn der Benutzer einen bereits vorhandenen Aktionstyp eingibt.<\/span><\/b><\/p>\n<h2>Erstellen des Formulars frmAktionsgruppe<\/h2>\n<p>Das Formular <b>frmAktionsgruppen <\/b>enth&auml;lt genau wie das Formular <b>frmAktionstyp <\/b>ein Kombinationsfeld zur Auswahl des aktuellen Datensatzes (s. Bild 10). Die Datenquellen f&uuml;r das Formular sowie das Kombinationsfeld sollen wieder nach dem gleichen Feld sortiert sein. Die Abfrage f&uuml;r die Datenherkunft des Formulars lautet:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1076_010.png\" alt=\"Entwurf des Formulars frmAktionsgruppe\" width=\"424,7115\" height=\"291,7734\" \/><\/p>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Entwurf des Formulars frmAktionsgruppe<\/span><\/b><\/p>\n<pre>SELECT AktionsgruppeID, Aktionsgruppe \r\nFROM tblAktionsgruppen \r\nORDER BY Aktionsgruppe;<\/pre>\n<p>Das Kombinationsfeld verwendet die gleiche Datenherkunft, da die Tabelle <b>tblAktionsgruppen <\/b>ja ohnehin nur das Prim&auml;rschl&uuml;sselfeld sowie das anzuzeigende Feld <b>Aktionsgruppe <\/b>enth&auml;lt.<\/p>\n<p>Das Unterformular <b>sfmAktionsgruppe <\/b>verwendet die Tabelle <b>tblAktionsgruppenAktionstypen <\/b>als Datenherkunft. Es zeigt jedoch nur das Nachschlagefeld <b>AktionstypID<\/b> dieser Tabelle an. Seine Eigenschaft <b>Standardansicht <\/b>haben wir auf <b>Datenblatt <\/b>eingestellt (s. Bild 11). Die Datensatzherkunft des Nachschlagefeldes &auml;ndern wir auf folgende SQL-Abfrage, damit der Eintrag <b>Kundenantwort<\/b> nicht zur Auswahl angeboten wird:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1076_011.png\" alt=\"Entwurf des Unterformulars sfmAktionsgruppe\" width=\"424,7115\" height=\"332,7827\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Entwurf des Unterformulars sfmAktionsgruppe<\/span><\/b><\/p>\n<pre>SELECT AktionstypID, Aktionstyp \r\nFROM tblAktionstypen \r\nWHERE <span style=\"color:blue;\">Not<\/span> Aktionstyp=\"Kundenantwort\";<\/pre>\n<p>Wenn Sie das Unterformular erstellt haben und dieses aus dem Navigationsbereich in den Detailbereich des Hauptformulars ziehen, das bereits mit der Tabelle <b>tblAktionsgruppen <\/b>verkn&uuml;pft ist, sollten die beiden Eigenschaften <b>Verkn&uuml;pfen von <\/b>und <b>Verkn&uuml;pfen nach <\/b>automatisch mit dem Wert <b>AktionsgruppeID <\/b>gef&uuml;llt worden sein (s. Bild 12).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1076_012.png\" alt=\"Eigenschaften des Unterformular-Steuerelements sfmAktionsgruppe\" width=\"424,7115\" height=\"230,8689\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Eigenschaften des Unterformular-Steuerelements sfmAktionsgruppe<\/span><\/b><\/p>\n<h2>Aktionsgruppe ausw&auml;hlen<\/h2>\n<p>Nach der Auswahl eines der Eintr&auml;ge des Kombinationsfeldes <b>cboAuswahl <\/b>wird diese Ereignisprozedur ausgel&ouml;st und zeigt den gew&auml;hlten Datensatz an:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboAuswahl_AfterUpdate()\r\n     Me.Recordset.FindFirst \"AktionsgruppeID = \"  & Me!cboAuswahl\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>L&ouml;schen einer Aktionsgruppe<\/h2>\n<p>Wenn der Benutzer eine Aktionsgruppe l&ouml;schen will, kann er das mit der folgenden Ereignisprozedur erledigen, die durch einen Klick auf die Schaltfl&auml;che <b>cmdLoeschen <\/b>ausgel&ouml;st wird:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdLoeschen_Click()\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">MsgBox<\/span>(\"Eintrag wirklich l&ouml;schen\", vbYesNo,  \"Eintrag l&ouml;schen\") = vbYes<span style=\"color:blue;\"> Then<\/span>\r\n         DoCmd.SetWarnings <span style=\"color:blue;\">False<\/span>\r\n         RunCommand acCmdDeleteRecord\r\n         DoCmd.SetWarnings <span style=\"color:blue;\">True<\/span>\r\n         Me.Recordset.MoveFirst\r\n         Me!cboAuswahl.Requery\r\n         Me!cboAuswahl = Me!AktionsgruppeID\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Auch hier tritt allerdings ein Fehler auf, wenn Sie einen Datensatz l&ouml;schen, der bereits von der Verkn&uuml;pfungstabelle <b>tblAktionsgruppenAktionstypen <\/b>referenziert wird. In diesem Fall wollen wir dies allerdings nicht verhindern, sondern im Gegenteil die referenzierten Eintr&auml;ge der Tabelle <b>tblAktionsgruppenAktionstypen <\/b>ebenfalls l&ouml;schen. Dazu nehmen wir eine kleine &auml;nderung an den Beziehungseigenschaften zwischen den beiden Tabellen vor, und zwar im Beziehungen-Fenster (s. Bild 13). Hier aktivieren wir die Option <b>L&ouml;schweitergabe an verwandte Datens&auml;tze<\/b>. Dadurch werden die verkn&uuml;pften Datens&auml;tze der Tabelle <b>tblAktionsgruppenAktionstypen <\/b>automatisch mitgel&ouml;scht.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1076_013.png\" alt=\"Einstellen der Beziehungseigenschaften\" width=\"499,6607\" height=\"404,6612\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Einstellen der Beziehungseigenschaften<\/span><\/b><\/p>\n<p>Damit beim L&ouml;schen nicht die lange Meldung aus Bild 14 erscheint, deaktivieren wir vor dem L&ouml;schen mit <b>DoCmd.SetWarnings False <\/b>die Warnhinweise. Damit verhindern wir auch, dass noch der Fehler mit der Nummer <b>2501 <\/b>folgt, wenn der Benutzer dann verunsichert auf <b>Nein <\/b>klickt. Au&szlig;erdem soll das Formular nach dem L&ouml;schen eines Datensatzes den ersten enthaltenen Datensatz anzeigen und das Kombinationsfeld <b>cboAuswahl <\/b>ebenfalls auf diesen Eintrag einstellen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1076_014.png\" alt=\"Meldung beim L&ouml;schen verkn&uuml;pfter Datens&auml;tze\" width=\"700\" height=\"81,44232\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 14: Meldung beim L&ouml;schen verkn&uuml;pfter Datens&auml;tze<\/span><\/b><\/p>\n<h2>Neue Aktionsgruppe anlegen<\/h2>\n<p>Genau wie beim Formular <b>frmAktionstypen <\/b>legen Sie mit der Methode <b>GoToRecord <\/b>des <b>DoCmd<\/b>-Objekts &uuml;ber die Schaltfl&auml;che <b>cmdNeu <\/b>einen neuen Datensatz an:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdNeu_Click()\r\n     DoCmd.GoToRecord Record:=acNewRec\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Nach der Aktualisierung soll immer auch das Kombinationsfeld aktualisiert werden. <\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_AfterUpdate()\r\n     Me!cboAuswahl = Me!AktionsgruppeID\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Schlie&szlig;lich soll auch dieses Formular beim Laden direkt den aktuellen Datensatz im Kombinationsfeld <b>cboAuswahl <\/b>anzeigen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     Me!cboAuswahl = Me!cboAuswahl.ItemData(0)\r\n<span style=\"color:blue;\">End Sub<\/span> <\/pre>\n<h2>&ouml;ffnen eines Aktionstyps per Doppelklick<\/h2>\n<p>Wenn der Benutzer doppelt auf einen der Eintr&auml;ge des Unterformulars <b>sfmAktionsgruppe <\/b>klickt, soll das Formular <b>frmAktionstyp <\/b>ge&ouml;ffnet werden und den angeklickten Datensatz anzeigen.<\/p>\n<p>Dazu f&uuml;gen wir f&uuml;r das Steuerelement <b>AktionstypID <\/b>im Unterformular die folgende Ereignisprozedur hinzu:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>AktionstypID_DblClick(Cancel<span style=\"color:blue;\"> As Integer<\/span>)\r\n     DoCmd.OpenForm \"frmAktionstyp\",  WhereCondition:=\"AktionstypID = \" & Me!AktionstypID\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die auf diese Weise angelegten Aktionsgruppen und Aktionstypen nutzen wir nun, um Aktionen zu Tickets hinzuzuf&uuml;gen.<\/p>\n<h2>Tickets und Details<\/h2>\n<p>Nun kommen wir zur&uuml;ck zum Formular <b>frmTicket<\/b>, das wir bereits im vorherigen Teil dieser Beitragsreihe vorgestellt haben (<b>Ticketsystem, Teil III<\/b>, <b>www.access-im-unternehmen.de\/1075<\/b>). Dieses hat dort zun&auml;chst die Detaildaten jeweils eines Datensatzes der Tabelle <b>tblTickets <\/b>angezeigt.<\/p>\n<p>Nun erweitern wir dieses Formular so, dass es in einem Unterformular auch die einzelnen Aktionen anzeigt, die in Zusammenhang mit der Bearbeitung eines Tickets durchgef&uuml;hrt werden. Au&szlig;erdem soll dieses Formular auch dazu dienen, die notwendigen Eintr&auml;ge zur Liste der Aktionen hinzuzuf&uuml;gen. Beides sehen Sie in der Formularansicht in Bild 15.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1076_015.png\" alt=\"Erweitertes Formular zur Anzeige der Ticketdetails\" width=\"700\" height=\"359,8\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 15: Erweitertes Formular zur Anzeige der Ticketdetails<\/span><\/b><\/p>\n<p>Mit dem dortigen Kombinationsfeld <b>Neue Aktion <\/b>w&auml;hlt der Benutzer einen Eintrag der Tabelle <b>tblAktionsgruppen <\/b>aus, deren Bezeichnungen im Kombinationsfeld angezeigt werden. Die damit &uuml;ber die Tabelle <b>tblAktionsgruppenAktionstypen <\/b>verkn&uuml;pften Eintr&auml;ge der Tabelle <b>tblAktionstypen <\/b>werden dann herangezogen, um auf Basis der Aktionstypen tats&auml;chliche Aktionen zu erzeugen und in der Tabelle <b>tblAktionen <\/b>zu speichern.<\/p>\n<p>Gleichzeitig sollen dabei auch die resultierenden E-Mails erstellt, mit den Standardtexten f&uuml;r den jeweiligen Aktionstyp gef&uuml;llt und ge&ouml;ffnet werden (s. Bild 16). Der Benutzer kann die Inhalte der E-Mails dann noch bearbeiten und diese dann versenden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1076_016.png\" alt=\"E-Mail auf Basis eines Aktionstyps\" width=\"549,6265\" height=\"592,27\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 16: E-Mail auf Basis eines Aktionstyps<\/span><\/b><\/p>\n<p>Nach dem Versenden liest das Formular noch die gegebenenfalls ge&auml;nderten Inhalte von Betreff und Body der E-Mail ein und schreibt diese in die Tabelle <b>tblAktionen<\/b>.<\/p>\n<p>Deren Datens&auml;tze landen dann schlie&szlig;lich im Unterformular des Formulars <b>frmTickets <\/b>und k&ouml;nnen dort eingesehen und gegebenenfalls per Doppelklick in der Detailansicht ge&ouml;ffnet werden.<\/p>\n<h2>Formular frmTickets erweitern<\/h2>\n<p>Um das Formular <b>frmTickets <\/b>auf den Stand aus der Abbildung zu bringen, fehlen im Wesentlichen zwei Steuerelemente. Das erste ist das Kombinationsfeld <b>cboNeueAktion<\/b>, mit dem der Benutzer die Gruppe der neu hinzuzuf&uuml;genden Aktionen ausw&auml;hlt (Entwurfsansicht s. Bild 17).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1076_017.png\" alt=\"Das Formular frmTickets in der Entwurfsansicht\" width=\"499,6607\" height=\"527,0145\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 17: Das Formular frmTickets in der Entwurfsansicht<\/span><\/b><\/p>\n<p>Die Datensatzherkunft des Kombinationsfeldes sieht so aus:<\/p>\n<pre>SELECT 0, \"&lt;Ausw&auml;hlen&gt;\" AS Aktionsgruppe \r\nFROM tblAktionsgruppen \r\nUNION \r\nSELECT AktionsgruppeID, Aktionsgruppe \r\nFROM tblAktionsgruppen\r\nORDER BY Aktionsgruppe;<\/pre>\n<p>Wie Sie sehen, verwenden wir hier eine UNION-Abfrage. Diese sorgt daf&uuml;r, dass das Kombinationsfeld als Inhalt immer den Eintrag <b><Ausw&auml;hlen> <\/b>anzeigt und die &uuml;brigen Eintr&auml;ge erst beim Aufklappen des Kombinationsfeldes anzeigt (s. Bild 18).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1076_018.png\" alt=\"Aufgeklapptes Auswahlfeld f&uuml;r die neuen Aktionen\" width=\"599,593\" height=\"216,6112\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 18: Aufgeklapptes Auswahlfeld f&uuml;r die neuen Aktionen<\/span><\/b><\/p>\n<p>Damit dieser Eintrag angezeigt wird, legen Sie die folgende Ereignisprozedur f&uuml;r das Ereignis <b>Beim Laden <\/b>an:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     Me!cboNeueAktion =  Me!cboNeueAktion.ItemData(0)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Interessant wird es, wenn Sie einen der Eintr&auml;ge des Kombinationsfeldes ausgew&auml;hlt haben. Dies l&ouml;st dann n&auml;mlich die Prozedur aus Listing 3 aus.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboNeueAktion_AfterUpdate()\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>objSendMail<span style=\"color:blue;\"> As <\/span>clsSendMail\r\n     <span style=\"color:blue;\">Dim <\/span>strAn<span style=\"color:blue;\"> As String<\/span>, strBetreff<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strInhalt<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strMailVon<span style=\"color:blue;\"> As String<\/span>, strMailAn<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngAktionID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>rstKunde<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>strSupportID<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT tblAktionstypen.*, tblAktionsgruppenAktionstypen.AktionsgruppeID  FROM tblAktionstypen INNER JOIN tblAktionsgruppenAktionstypen ON tblAktionstypen.AktionstypID =  tblAktionsgruppenAktionstypen.AktionstypID WHERE tblAktionsgruppenAktionstypen.AktionsgruppeID = \"  & Me!cboNeueAktion, dbOpenDynaset)\r\n     <span style=\"color:blue;\">Set<\/span> rstKunde = db.OpenRecordset(\"SELECT tblKunden.*, tblAnreden.Anrede FROM tblKunden INNER JOIN tblAnreden ON  tblKunden.AnredeID = tblAnreden.AnredeID WHERE KundeID = \" & Me!KundeID, dbOpenDynaset)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         db.Execute \"INSERT INTO tblAktionen(TicketID, AktionstypID, Aktionsdatum) VALUES(\" & Me!TicketID & \", \"  & rst!AktionstypID & \", \" & ISODatum(Now) & \")\", dbOpenDynaset\r\n         lngAktionID = db.OpenRecordset(\"SELECT @@IDENTITY\").Fields(0)\r\n         strSupportID = \"[amv\" & Me.TicketID & \"_\" & lngAktionID & \"]\"\r\n         strAn = PlatzhalterErsetzen(rstKunde, rst!Empfaenger)\r\n         strBetreff = PlatzhalterErsetzen(rstKunde, rst!Betreff)\r\n         strBetreff = <span style=\"color:blue;\">Replace<\/span>(strBetreff, \"[TicketID]\", strSupportID)\r\n         strInhalt = PlatzhalterErsetzen(rstKunde, rst!Inhalt)\r\n         strInhalt = <span style=\"color:blue;\">Replace<\/span>(strInhalt, \"[TicketID]\", strSupportID)\r\n         strInhalt = <span style=\"color:blue;\">Replace<\/span>(strInhalt, \"[Ticketinhalt]\", Me!Ticketinhalt)\r\n         <span style=\"color:blue;\">Set<\/span> objSendMail = <span style=\"color:blue;\">New<\/span> clsSendMail\r\n         <span style=\"color:blue;\">With<\/span> objSendMail\r\n             .EMailAn = strAn\r\n             .Betreff = strBetreff\r\n             .Inhalt = strInhalt\r\n             .MailSchicken\r\n             strBetreff = .Betreff\r\n             strInhalt = .Inhalt\r\n             strMailAn = .EMailAn\r\n             strMailVon = .EMailVon\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         db.Execute \"UPDATE tblAktionen SET Betreff = ''\" & strBetreff & \"'', Inhalt = ''\" & strInhalt & \"''  WHERE AktionID = \" & lngAktionID, dbFailOnError\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     Me!sfmAktionen.Form.Requery\r\n     Me!cboNeueAktion = Me!cboNeueAktion.ItemData(0)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Ereignisprozedur zum Hinzuf&uuml;gen der Aktionen einer Aktionsgruppe zu einem Ticket<\/span><\/b><\/p>\n<p>Die Prozedur erstellt zun&auml;chst ein Recordset auf Basis der Tabellen <b>tblAktionstypen <\/b>und <b>tblAktionsgruppenAktionstypen<\/b>, f&uuml;r die der Wert des Feldes <b>AktionsgruppeID <\/b>der Tabelle <b>tblAktionsgruppenAktionstypen <\/b>mit dem Wert des im Kombinationsfeld <b>cboNeueAktion <\/b>ausgew&auml;hlten Eintrags &uuml;bereinstimmt.<\/p>\n<p>Ein zweites Recordset soll die Daten des Datensatzes der Tabelle <b>tblKunden <\/b>f&uuml;r den Kunden enthalten, der das Ticket er&ouml;ffnet hat. Dieses liefert neben allen Feldern der Tabelle <b>tblKunden <\/b>auch noch die Tabelle <b>tblAnreden<\/b>, der wir das Feld <b>Anrede <\/b>entnehmen &#8211; wozu, erl&auml;utern wir sp&auml;ter. Hier verwenden wir als Parameter das Feld <b>KundeID <\/b>und gleichen dies mit dem gleichnamigen Feld der Datenherkunft des Formulars <b>frmTickets <\/b>ab.<\/p>\n<p>Anschlie&szlig;end durchl&auml;uft die Prozedur alle Datens&auml;tze des Recordsets <b>rst <\/b>mit den Aktionsgruppen\/Aktionstypen, das ja durchaus mehrere Aktionstypen f&uuml;r die ausgew&auml;hlte Aktionsgruppe enthalten kann.<\/p>\n<p>Die erste Anweisung innerhalb der entsprechenden <b>Do While<\/b>-Schleife tr&auml;gt per <b>INSERT INTO<\/b>-Anweisung einen neuen Datensatz in die Tabelle <b>tblAktionen <\/b>ein. Dabei werden zun&auml;chst einmal die Felder <b>Ticket-ID<\/b>, <b>AktionstypID <\/b>und <b>Aktionsdatum <\/b>gef&uuml;llt &#8211; der Rest folgt sp&auml;ter. Der Wert f&uuml;r das Feld <b>TicketID <\/b>kommt aus dem gleichnamigen Feld der Datenherkunft des Formulars <b>frmTicket<\/b>, der Aktionstyp stammt aus dem Recordset <b>rst <\/b>und das Datum ermitteln wir mit der Funktion <b>Now <\/b>und wandeln es mit der Hilfsfunktion <b>ISODatum <\/b>in ein SQL-f&auml;higes Datum um.<\/p>\n<p>Warum aber tragen wir zun&auml;chst nur einige Daten in den neuen Datensatz der Tabelle <b>tblAktionen <\/b>ein Der Hauptgrund ist, dass wir dem Betreff der E-Mail eine eindeutige Ticket-ID zuweisen wollen, damit der Kunde auf diese antworten kann und wir die Antwort direkt der Aktion zuordnen k&ouml;nnen.<\/p>\n<p>Und warum tragen wir nicht direkt alle Informationen zu dieser Aktion in die Tabelle <b>tblAktionen <\/b>ein Weil wir nun erst einmal die E-Mail erstellen, dem Benutzer anzeigen und diesem die M&ouml;glichkeit geben, noch &auml;nderungen am Betreff vorzunehmen. Erst danach sollen der endg&uuml;ltige Betreff und Inhalt in der Tabelle <b>tblAktionen <\/b>gespeichert werden.<\/p>\n<p>Zwischendurch stellen wir uns die Frage, ob es ausreicht, wenn wir bei einer Antwort per E-Mail nur den Betreff und den Inhalt der Mail in der Tabelle <b>tblAktionen <\/b>speichern oder ob wir die komplette E-Mail inklusive eventuell hinzugef&uuml;gter Anh&auml;nge noch speichern beziehungsweise referenzieren m&uuml;ssen. Wir entscheiden uns der Einfachheit halber daf&uuml;r, die E-Mails nicht noch separat zu speichern. Eine solche Funktion k&ouml;nnten wir immer noch nachtr&auml;glich hinzuf&uuml;gen.<\/p>\n<p>Weiter im Code: Dort stellen wir nun eine Support-ID zusammen, welche wir dem Betreff der E-Mail voranstellen. Diese soll in eckige Klammern eingefasst sein und mit <b>amv <\/b>(f&uuml;r <b>Andr&eacute; Minhorst Verlag<\/b>) beginnen &#8211; ersetzen Sie hier einfach ein K&uuml;rzel Ihrer Wahl. Au&szlig;erdem sollen die <b>TicketID <\/b>und die ID der Aktion enthalten sein:<\/p>\n<pre>strSupportID = \"[amv\" & Me.TicketID & \"_\" & lngAktionID & \"]\"<\/pre>\n<p>Die Support-ID lautet dann beispielsweise <b>[amv123_456]<\/b>.<\/p>\n<h2>Flexibler Empf&auml;nger<\/h2>\n<p>Die n&auml;chste Zeile verwendet eine Hilfsfunktion namens <b>PlatzhalterErsetzen<\/b>, um den Inhalt des Feldes <b>Empfaenger <\/b>der Tabelle <b>tblAktionstypen <\/b>zu ersetzen. Aber warum sollten wir einen Platzhalter im Feld Empfaenger unterbringen &#8211; geh&ouml;rt hier nicht ohnehin immer die E-Mail-Adresse des Kunden hin<\/p>\n<p>Nein: Es gibt ja auch Aktionsgruppen, die mehrere Aktionstypen zusammenfassen. So kann beispielsweise die Beanstandung einer E-Mail durch den Kunden nach sich ziehen, dass der Kunde eine Antwort-Mail erh&auml;lt mit dem Hinweis, dass eine neue Rechnung erstellt und versendet wird. Gleichzeitig aber soll auch eine Mail an die Buchhaltung versendet werden, damit diese einen Auftrag zum Erstellen einer neuen Rechnung erh&auml;lt. Deshalb enthalten die Vorlagen auch wahlweise den Eintrag <b>[Email] <\/b>oder eine feste Adresse wie <b>buchhaltung@minhorst.com <\/b>(s. Bild 19).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1076_019.png\" alt=\"Tabelle tblAktionstypen mit festen und variablen E-Mail-Adressen\" width=\"700\" height=\"350,7626\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 19: Tabelle tblAktionstypen mit festen und variablen E-Mail-Adressen<\/span><\/b><\/p>\n<h2>Platzhalter ersetzen<\/h2>\n<p>Die Funktion <b>PlatzhalterErsetzen <\/b>sieht wie in Listing 4 aus und erwartet zwei Parameter:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>PlatzhalterErsetzen(rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset, strAlt<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>fld<span style=\"color:blue;\"> As <\/span>DAO.Field\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     strTemp = strAlt\r\n     For Each fld In rst.Fields\r\n         strTemp = <span style=\"color:blue;\">Replace<\/span>(strTemp, \"[\" & fld.Name & \"]\", fld.Value)\r\n     <span style=\"color:blue;\">Next<\/span> fld\r\n     PlatzhalterErsetzen = strTemp\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Die Funktion PlatzhalterErsetzen<\/span><\/b><\/p>\n<ul>\n<li>einen Verweis auf ein Recordset, aus dem die zu ersetzenden Inhalte ausgelesen werden sollen und <\/li>\n<li>die Zeichenkette, welche die zu ersetzenden Platzhalter enth&auml;lt.<\/li>\n<\/ul>\n<p>Die Prozedur <b>cmdNeueAktion_AfterUpdate <\/b>&uuml;bergibt der Funktion das Recordset <b>rstKunde <\/b>mit den Kundendaten sowie zun&auml;chst die Zeichenkette aus dem Feld <b>Empfaenger <\/b>aus dem Recordset basierend auf der Tabelle <b>tblAktionstypen<\/b>.<\/p>\n<p>Die Funktion durchl&auml;uft nun alle Felder des &uuml;bergebenen Recordsets und pr&uuml;ft, ob die Zeichenkette mit den Platzhaltern eine Zeichenfolge enth&auml;lt, die dem in eckige Klammern eingefassten Feldnamen eines der Felder des Recordsets entspricht.<\/p>\n<p>Falls ja, wird dieser Platzhalter dann durch den tats&auml;chlichen Wert des Feldes f&uuml;r den aktuellen Datensatz des Recordsets ersetzt &#8211; in diesem Fall durch den Inhalt des Feldes <b>EMail<\/b>.<\/p>\n<p>Die n&auml;chste Anweisung ruft wieder die Funktion <b>PlatzhalterErsetzen<\/b> auf. Diesmal soll der Betreff der E-Mail-Vorlage aus der Tabelle <b>tblAktionstypen <\/b>dahingehend untersucht werden, ob er Platzhalter f&uuml;r Werte des Recordsets <b>rstKunden <\/b>enth&auml;lt. Das Ergebnis landet in der Variablen <b>strBetreff<\/b>. Hier sollte es auf jeden Fall einen Platzhalter namens <b>[TicketID] <\/b>geben, der dann durch die in <b>strSupportID <\/b>gespeicherte Zeichenkette ersetzt wird.<\/p>\n<p>Auf die gleiche Art und Weise untersucht die Prozedur auch noch den Text aus dem Feld <b>Inhalt <\/b>der Tabelle <b>tblAktionstypen <\/b>auf Platzhalter und speichert das Resultat mit ersetzten Platzhaltern in der Variablen <b>strInhalt<\/b>.<\/p>\n<p>Auch dieses Feld wird noch auf weitere, spezifische Platzhalter untersucht, und zwar auf den bereits zuvor erw&auml;hnten Platzhalter <b>[TicketID] <\/b>sowie einen weiteren Platzhalter namens <b>[Ticketinhalt]<\/b>.<\/p>\n<p>Wenn der Ticketinhalt beispielsweise Informationen dar&uuml;ber enth&auml;lt, warum eine Rechnung fehlerhaft ist, sollte dieses Feld in einer Mail an die Buchhaltung zwecks Neuausstellung einer Rechnung eingef&uuml;gt werden. Im Detailformular des entsprechenden Aktionstyps sieht das etwa wie in Bild 20 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1076_020.png\" alt=\"Mailinhalt einer Mail mit dem Platzhalter [Ticketinhalt]\" width=\"424,7115\" height=\"443,2541\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 20: Mailinhalt einer Mail mit dem Platzhalter [Ticketinhalt]<\/span><\/b><\/p>\n<p>Nun folgt der entscheidende Schritt, n&auml;mlich das Zusammenstellen und Senden der E-Mail. F&uuml;r das Zusammenstellen verwenden wir eine angepasste Variante einer Klasse namens <b>clsSendMail <\/b>(s. <b>Outlook-Mails senden und speichern<\/b>, <b>http:\/\/www.access-im-unternehmen.de\/836<\/b>).<\/p>\n<p>Diese instanzieren wir zun&auml;chst und speichern die Instanz in der Variablen <b>objSendMail<\/b>. Dieser weisen wir dann einige Informationen zu, zum Beispiel die Empf&auml;nger-Adresse, den Betreff und den Inhalt zu. Dann rufen wir die Methode <b>MailSchicken <\/b>der Klasse <b>clsSendMail <\/b>auf, die wie in Listing 5 aussieht.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>MailSchicken()\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;\">Set<\/span> objOutlook = <span style=\"color:blue;\">New<\/span> Outlook.Application\r\n     <span style=\"color:blue;\">Set<\/span> objGesendeteElemente = objOutlook.GetNamespace(\"MAPI\").GetDefaultFolder(olFolderSentMail)\r\n     <span style=\"color:blue;\">Set<\/span> m_MailItems = objGesendeteElemente.Items\r\n     DoCmd.Hourglass <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objMail = objOutlook.CreateItem(olMailItem)\r\n     <span style=\"color:blue;\">With<\/span> objMail\r\n         .Body = m_Inhalt\r\n         .Subject = m_Betreff\r\n         .To = m_EmailAn\r\n         .BodyFormat = olFormatPlain\r\n         .Display <span style=\"color:blue;\">True<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     DoCmd.Hourglass <span style=\"color:blue;\">False<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Die Methode MailSchicken der Klasse clsSendMail<\/span><\/b><\/p>\n<p>Die Methode erstellt eine Outlook-Instanz, was die betroffene E-Mail &ouml;ffnet und zur Bearbeitung\/Kontrolle freigibt. Die folgenden beiden Anweisungen sind Vorbereitungen darauf, dass Sie gegebenenfalls auf die Mail zugreifen wollen, sobald diese tats&auml;chlich versendet und im Ordner <b>Gesendete Objekte <\/b>gelandet ist &#8211; entsprechende Anweisungen k&ouml;nnten Sie dann in der Ereignisprozedur <b>m_MailItems_ItemAdded <\/b>der Klasse <b>clsSendMail <\/b>unterbringen.<\/p>\n<p>Danach erstellt die Prozedur eine neue Mail, weist den Eigenschaften <b>Subject<\/b>, <b>Body <\/b>und <b>To <\/b>die an die Klasse &uuml;bergebenen Daten zu und ruft die Methode <b>Display <\/b>auf, um die Mail anzuzeigen. Dabei verwendet sie den Parameter <b>True<\/b>, damit der aufrufende Code erst fortgesetzt wird, wenn der Benutzer die Mail abgeschickt hat.<\/p>\n<p>Wenn der Benutzer auf Senden geklickt hat, l&ouml;st dies zun&auml;chst das Ereignis <b>objMail_Send<\/b> aus, das wir ebenfalls in der Klasse <b>clsSendMail <\/b>implementiert haben (s. Listing 6).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objMail_Send(Cancel<span style=\"color:blue;\"> As Boolean<\/span>)\r\n     <span style=\"color:blue;\">With<\/span> objMail\r\n         m_Betreff = .Subject\r\n         m_Inhalt = .Body\r\n         m_EmailAn = .To\r\n         m_EmailVon = .SenderEmailAddress\r\n         .UserProperties.Add \"MailItemID\", olNumber\r\n         .UserProperties.Item(\"MailItemID\").Value = m_ID\r\n         .SaveAs CurrentProject.Path & \"\\Msg\\\" & m_ID & \".msg\"\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Diese Ereignisprozedur wird beim Senden der E-Mail ausgel&ouml;st.<\/span><\/b><\/p>\n<p>Hier weisen wir nun die gegebenenfalls ge&auml;nderten Werte der drei Eigenschaften <b>Subject<\/b>, <b>Body <\/b>und <b>To <\/b>den lokalen Variablen der Klasse <b>clsSendMail <\/b>zu und legen f&uuml;r die E-Mail eine neue <b>UserProperty <\/b>namens <b>MailItemID <\/b>an, die wir dann mit dem Wert der Variablen <b>m_ID <\/b>f&uuml;llen. Auch dies ist eine vorbereitende Ma&szlig;nahme, falls Sie sp&auml;ter einmal versendete E-Mails aufgrund eines speziellen Merkmals identifizieren m&ouml;chten &#8211; in diesem Fall &uuml;bergeben Sie der Klasse <b>clsSendMail <\/b>noch einen Wert f&uuml;r die Eigenschaft <b>ID<\/b>.<\/p>\n<p>Damit wird nun auch die Methode <b>Mail-Schicken <\/b>beendet und die aufrufende Prozedur <b>cboNeueAktion_AfterUpdate <\/b>l&auml;uft weiter. Da die Eigenschaften <b>Betreff<\/b>, <b>Inhalt <\/b>und <b>EMailAn <\/b>der Klasse <b>clsSendMail <\/b>mit den aktualisierten Werten gef&uuml;llt sind, k&ouml;nnen wir diese auslesen und in entsprechende Variablen eintragen. Diese nutzen wir dann in der folgenden <b>UPDATE<\/b>-Abfrage, um diese in den bereits angelegten Datensatz der Tabelle <b>tblAktionen <\/b>einzutragen.<\/p>\n<p>Die Tabelle <b>tblAktionen<\/b> sieht danach etwa wie in Bild 21 aus. Auf diese Weise durchl&auml;uft die Methode alle zur Aktionsgruppe geh&ouml;renden Datens&auml;tze der Tabelle <b>tblAktionstypen <\/b>und erstellt entsprechende E-Mails. Schlie&szlig;lich aktualisiert sie das Unterformular <b>sfmAktionen<\/b>, damit die neu hinzugef&uuml;gten Aktionen dort angezeigt werden und stellt das Kombinationsfeld <b>cboNeueAktion <\/b>wieder auf den Eintrag <b><Ausw&auml;hlen> <\/b>ein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1076_021.png\" alt=\"Einige gespeicherte Aktionen\" width=\"700\" height=\"201,4535\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 21: Einige gespeicherte Aktionen<\/span><\/b><\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Mit dem vorliegenden Teil der Beitragsreihe haben Sie erfahren, wie Sie die f&uuml;r die Bearbeitung von Tickets notwendigen Aktionen in entsprechenden Tabellen speichern und diese in eigenen Formularen bearbeiten.<\/p>\n<p>Auf Basis dieser Daten k&ouml;nnen Sie Aktionsgruppen definieren, mit denen Sie auf eine Kundenanfrage reagieren k&ouml;nnen.<\/p>\n<p>Diese enthalten in der Regel den Versand von E-Mails an den Kunden oder auch an andere Personen, die bestimmte Aufgaben durchf&uuml;hren sollen. Die Auswahl einer diese Aktionsgruppen sorgt f&uuml;r das Versenden der Mails und verwendet daf&uuml;r Standardvorlagen, die noch durch den Benutzer ge&auml;ndert werden k&ouml;nnen.<\/p>\n<p>Es fehlt nun noch die M&ouml;glichkeit, die Antwort der Kunden in E-Mail-Form automatisiert in die Ticketverwaltung auf zunehmen. Darum k&uuml;mmern wir uns im n&auml;chsten und letzten Teil der Beitragsreihe.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Ticketsystem.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/4C4226FC-4C76-41E4-BC7A-384621FA3181\/aiu_1076.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In der vorherigen Folge dieser Beitragsreihe haben wir begonnen, das &Uuml;bersichtsformular f&uuml;r die angelegten Tickets zu entwickeln und ein Detailformular zu erstellen, mit welchem der Ablauf eines Tickets eingesehen werden kann &#8211; und das auch zur Abarbeitung der Tickets dienen soll. Im vorliegenden Teil wollen wir diese Formulare und die daf&uuml;r notwendigen Tabellen weiterentwickeln und die L&ouml;sung endlich einsatzbereit machen.<\/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":[66022017,662017,44000027],"tags":[],"class_list":["post-55001076","post","type-post","status-publish","format-standard","hentry","category-66022017","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 IV - 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_IV\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ticketsystem, Teil IV\" \/>\n<meta property=\"og:description\" content=\"In der vorherigen Folge dieser Beitragsreihe haben wir begonnen, das &Uuml;bersichtsformular f&uuml;r die angelegten Tickets zu entwickeln und ein Detailformular zu erstellen, mit welchem der Ablauf eines Tickets eingesehen werden kann - und das auch zur Abarbeitung der Tickets dienen soll. Im vorliegenden Teil wollen wir diese Formulare und die daf&uuml;r notwendigen Tabellen weiterentwickeln und die L&ouml;sung endlich einsatzbereit machen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_IV\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-14T13:41:32+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/a03aa826e7774037bfa21e9400ea921f\" \/>\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=\"24\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_IV\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_IV\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Ticketsystem, Teil IV\",\"datePublished\":\"2020-05-14T13:41:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_IV\\\/\"},\"wordCount\":4076,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_IV\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/a03aa826e7774037bfa21e9400ea921f\",\"articleSection\":[\"2\\\/2017\",\"2017\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_IV\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_IV\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_IV\\\/\",\"name\":\"Ticketsystem, Teil IV - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_IV\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_IV\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/a03aa826e7774037bfa21e9400ea921f\",\"datePublished\":\"2020-05-14T13:41:32+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_IV\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_IV\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_IV\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/a03aa826e7774037bfa21e9400ea921f\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/a03aa826e7774037bfa21e9400ea921f\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ticketsystem_Teil_IV\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ticketsystem, Teil IV\"}]},{\"@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 IV - 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_IV\/","og_locale":"de_DE","og_type":"article","og_title":"Ticketsystem, Teil IV","og_description":"In der vorherigen Folge dieser Beitragsreihe haben wir begonnen, das &Uuml;bersichtsformular f&uuml;r die angelegten Tickets zu entwickeln und ein Detailformular zu erstellen, mit welchem der Ablauf eines Tickets eingesehen werden kann - und das auch zur Abarbeitung der Tickets dienen soll. Im vorliegenden Teil wollen wir diese Formulare und die daf&uuml;r notwendigen Tabellen weiterentwickeln und die L&ouml;sung endlich einsatzbereit machen.","og_url":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_IV\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-14T13:41:32+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/a03aa826e7774037bfa21e9400ea921f","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"24\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_IV\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_IV\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Ticketsystem, Teil IV","datePublished":"2020-05-14T13:41:32+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_IV\/"},"wordCount":4076,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_IV\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/a03aa826e7774037bfa21e9400ea921f","articleSection":["2\/2017","2017","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_IV\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_IV\/","url":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_IV\/","name":"Ticketsystem, Teil IV - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_IV\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_IV\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/a03aa826e7774037bfa21e9400ea921f","datePublished":"2020-05-14T13:41:32+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_IV\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_IV\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_IV\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/a03aa826e7774037bfa21e9400ea921f","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/a03aa826e7774037bfa21e9400ea921f"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Ticketsystem_Teil_IV\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Ticketsystem, Teil IV"}]},{"@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\/55001076","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=55001076"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001076\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001076"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001076"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001076"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}