Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.
In der vorherigen Folge dieser Beitragsreihe haben wir begonnen, das übersichtsformular fü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ür notwendigen Tabellen weiterentwickeln und die Lösung endlich einsatzbereit machen.
Das Ergebnis der Vorüberlegungen für den Aufbau des Formulars zur detaillierten Anzeige eines Tickets mit den damit verbundenen Aktionen war auch eine Erweiterung des Datenmodells.
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ür jeden Fall verschiedene Kombinationen von Aktionstypen in einer Tabelle namens tblAktionsgruppen zusammengefasst werden.
Noch nicht klar war im vorherigen Teil der Beitragsreihe, welche Felder wir in den verschiedenen Tabellen speichern und wie wir mit diesen arbeiten. Grundsätzlich soll der Ablauf so aussehen:
- Wir erhalten ein Ticket.
- Wir ermitteln die Gruppe von Aktionen, die als Reaktion auf das Ticket durchgeführt werden sollen. Die Gruppe ist in der Tabelle tblAktionsgruppen gespeichert und enthält den Namen der Aktionsgruppe (s. Bild 1).
- Die Tabelle tblAktionsgruppen soll mit einem oder mehreren Einträgen einer Tabelle namens tblAktionstypen verknüpft sein, die neben der Bezeichnung des Aktionstyps noch einen Betreff und einen Inhalt sowie einen Empfänger für die zu erstellende E-Mail oder Aufgabe enthält (s. Bild 2).
- Die Aktionstypen sind den Aktionsgruppen über die Verknüpfungstabelle tblAktionsgruppenAktionstypen zugeordnet (s. Bild 3).
- Die Daten dieser drei Tabellen sehen etwa wie in Bild 4 aus, wobei eine Gruppe zwei Aktionstypen enthält und eine weitere nur einen Aktionstyp.
- Diese Tabellen sind allerdings nur die Grundlage der eigentlichen Bearbeitung des Tickets. Wenn man eine der Aktionsgruppen auswählt, soll nämlich für jeden zugeordneten Aktionstyp eine Mail mit den Daten der drei Felder Betreff, Inhalt und Empfaenger erstellt und ein Eintrag zur Tabelle tblAktionen hinzugefügt werden. Dabei werden gegebenenfalls noch Platzhalter mit kundenspezifischen Daten gefüllt.
- Außerdem soll ein Feld namens Aktionsdatum in der Tabelle tblAktionen gefüllt werden, in die der Versand der E-Mail oder das Datum der Erledigung der Aufgabe eingetragen wird.
- Erst wenn alle Aktionen zu einem Ticket ein Aktionsdatum enthalten, wird dieses als erledigt markiert.
Bild 1: Entwurf der Tabelle tblAktionsgruppen
Bild 2: Entwurf der Tabelle tblAktionstypen
Bild 3: Entwurf der Tabelle tblAktionsgruppenAktionstypen
Bild 4: Beispieldatensätze der Tabellen tblAktionstypen, tblAktionsgruppen und tblAktionsgruppenAktionstypen
Beim Erstellen der E-Mails sollen noch die Daten des jeweiligen Kunden herangezogen und in die Platzhalter der Texte für Betreff, Inhalt und Empfaenger eingetragen werden. Dann werden die E-Mails angezeigt, damit der Benutzer diese gegebenenfalls noch anpassen kann.Manchmal möchte man vielleicht den Text ändern, den Kunden nicht siezen, sondern duzen oder auch eine Anlage zur E-Mail hinzufügen. Wichtig ist hier, dass erst der tatsächliche Text der E-Mail nach dem Absenden in der Tabelle tblAktionen gespeichert wird.
Die Tabelle tblAktionen ist wie in Bild 5 aufgebaut.
Bild 5: Entwurf der Tabelle tblAktionen
Einen überblick über die neu hinzugekommenen Tabellen und ihre Verbindung zur Tabelle tblTickets finden Sie in Bild 6. Hier können Sie auch gut erkennen, dass die Tabelle tblAktionsgruppenAktionstypen als Verknüpfungstabelle zur Herstellung einer m:n-Beziehung zwischen den Tabellen tblAktionsgruppen und tblAktionstypen dient.
Bild 6: Datenmodell der vorgestellten Tabellen
Aktionstyp-Sonderfall Kundenantwort
Den Aktionstyp wollen wir mit jeder Aktion speichern, um schnell erkennen zu kö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 tblAktionen gespeichert werden. Nur: Welchem Aktionstyp ordnen wir dies zu Wir legen dazu einen einzigen Aktionstyp an, der sich von den übrigen Aktionstypen unterscheidet. Sein Wert im Feld Aktionstyp lautet schlicht Kundenantwort, die übrigen Felder bleiben leer.
Bearbeiten von Aktionstypen und Aktionsgruppen
Damit der Benutzer die Aktionstypen und Aktionsgruppen anlegen und bearbeiten kann, legen wir einige Formulare an. Das erste heißt frmAktionstyp und liefert die Detailansicht eines Aktionstyps zur Bearbeitung (s. Bild 7).
Bild 7: Eingabe der Daten eines Aktionstyps
Das Formular frmAktionsgruppen zeigt jeweils eine Gruppe und die dazugehörigen Aktionstypen in einem Unterformular an. über dieses Formular kann man den Namen der Aktionsgruppe festlegen sowie die einzelnen Aktionstypen hinzufügen (s. Bild 8). Mit einem Doppelklick auf eine der Einträge der zugeordneten Aktionstypen wird dieser im Formular frmAktionstyp angezeigt. Die Aktionstypen können durch einfache Auswahl aus dem Kombinationsfeld zur Aktionsgruppe hinzugefügt werden.
Bild 8: Zusammenfassen der Aktiontypen zu einer Aktionsgruppe
Erstellen des Formulars frmAktionstyp
Das Formular frmAktionstyp sieht im Entwurf wie in Bild 9 aus und verwendet die folgende Abfrage als Datenherkunft:
Bild 9: Entwurf des Formulars frmAktionstyp
SELECT AktionstypID, Aktionstyp, Betreff, Inhalt, Empfaenger
FROM tblAktionstypen
WHERE Not Aktionstyp="Kundenantwort"
ORDER BY Aktionstyp;
Das entspricht der Tabelle tblAktionstypen, die Abfrage fügt jedoch noch eine Sortierung nach dem Inhalt des Feldes Aktionstyp hinzu. Außerdem soll der Eintrag mit dem Wert Kundenantwort im Feld Aktionstyp ausgeschlossen werden, da dieser nicht durch den Benutzer bearbeitet werden darf.
Ein Blättern in den Datensätzen ist nicht vorgesehen, daher stellen wir die Eigenschaften Navigationsschaltflächen, Datensatzmarkierer, Trennlinien und Bildlaufleisten auf Nein ein. Oben im Formular finden Sie ein Kombinationsfeld namens cboAuswahl, welches die folgende Abfrage als Datensatzherkunft nutzt:
SELECT AktionstypID, Aktionstyp
FROM tblAktionstypen
WHERE Not Aktionstyp="Kundenantwort"
ORDER BY Aktionstyp;
Damit das erste Feld mit dem Primärschlüsselfeld ausgeblendet und nur als gebundene Spalte genutzt wird, stellen wir die Eigenschaft Spaltenanzahl auf 2 und Spaltenbreiten auf 0cm ein. Auch hier schließen wir den Eintrag Kundenantwort für das Feld Aktionstyp aus.
Außerdem soll das Kombinationsfeld beim öffnen des Formulars immer gleich den Wert der Datensatzherkunft anzeigen, der auch im Formular angezeigt wird. Deshalb hinterlegen wir für das Ereignis Beim Laden des Formulars die folgende Ereignisprozedur:
Private Sub Form_Load() Me!cboAuswahl = Me!AktionstypID End Sub
Nach dem Auswählen eines der Einträge des Kombinationsfeldes soll der entsprechende Eintrag auch im Formular angezeigt werden. Dazu fügen wir eine weitere Ereignisprozedur hinzu, die diesmal durch das Ereignis Nach Aktualisierung des Kombinationsfeldes ausgelöst wird:
Private Sub cboAuswahl_AfterUpdate() Me.Recordset.FindFirst "AktionstypID = " & Me!cboAuswahl End Sub
Aktionstyp löschen
Unten im Formular befinden sich zwei Schaltflächen namens cmdLoeschen und cmdNeu. Mit der Schaltfläche cmdLoeschen können Sie logischerweise den aktuellen Eintrag löschen. Die entsprechende Ereignisprozedur finden Sie in Listing 1. Vor dem Löschen fragt die Prozedur per Meldungsfenster ab, ob der Datensatz tatsächlich gelöscht werden soll.
Private Sub cmdLoeschen_Click() If MsgBox("Datensatz wirklich löschen", vbYesNo, "Datensatz löschen") = vbYes Then On Error Resume Next DoCmd.SetWarnings False RunCommand acCmdDeleteRecord DoCmd.SetWarnings True Select Case Err.Number Case 3200 MsgBox "Der Eintrag kann nicht gelöscht werden, da er bereits mit einer Aktionsgruppe verknüpft ist." Case 0 Me!cboAuswahl.Requery Me.Recordset.MoveFirst Me!cboAuswahl = Me!AktionstypID Case Else MsgBox "Fehler " & Err.Number & vbCrLf & Err.Description End Select On Error GoTo 0 End If End Sub
Listing 1: Ereignisprozedur zum Löschen eines Aktionstyps über die Schaltfläche cmdLoeschen
Falls ja, erfolgt dies per RunCommand accmdDeleteRecord. Für diese Anweisung haben wir die Fehlerbehandlung deaktiviert, da es sein kann, dass der aktuell angezeigte Aktionstyp bereits über die Tabelle tblAktionsgruppenAktionstypen mit einer der Aktionsgruppen verknüpft ist. Wegen der referenziellen Integrität für die Verknüpfung zwischen diesen beiden Tabellen löst der Versuch, einen verknüpften Datensatz zu löschen, den Fehler mit der Nummer 3200 aus. Diesen fangen wir ab und geben in diesem Fall eine entsprechende Meldung aus.
Außerdem haben wir hier die Anzahl von Warnungen deaktiviert, die je nach Einstellung angezeigt werden können. Sollte beim Lö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.
Neuen Aktionstyp anlegen
Die Schaltfläche cmdNeu löst die folgende Ereignisprozedur aus:
Private Sub cmdNeu_Click() DoCmd.GoToRecord Record:=acNewRec End Sub
Damit wird der Datensatzzeiger auf einen neuen Datensatz verschoben.
Kombinationsfeld aktualisieren
Wenn der Benutzer den aktuell angezeigten Datensatz auf eine andere Weise als durch Auswahl über das Kombinationsfeld cboAuswahl festlegt, also beispielsweise durch Neuanlegen eines Datensatzes, muss das Kombinationfeld natürlich aktualisiert werden. Dies erledigt die folgende Prozedur, die durch das Ereignis Nach Aktualisierung des Formulars augelöst wird:
Private Sub Form_AfterUpdate() Me!cboAuswahl.Requery Me!cboAuswahl = Me!AktionstypID End Sub
Einen möglichen Fehler haben wir noch außer Acht gelassen: Es kann geschehen, dass der Benutzer beim Anlegen eines neuen Aktionstyps einen Wert für das eindeutig indizierte Feld Aktionstyp eingibt, der bereits in einem anderen Datensatz vorhanden ist. In diesem Fall löst dies den Fehler 3022 aus, allerdings können Sie diesen nur im Ereignis Bei Fehler des Formulars abfangen. Die dafür benötigte Ereignisprozedur haben wir in Listing 2 abgebildet. Wir prüfen dort in einer Select Case-Bedingung den Wert des Parameters DataErr mit der Fehlernummer. Im Falle des Wertes 3022 kann es sich nur um das Feld Aktionstyp handeln, da wir nur dafür einen eindeutigen Index festgelegt haben. Es erscheint eine entsprechende Meldung und der Fokus wird auf dieses Feld verschoben.
Private Sub Form_Error(DataErr As Integer, Response As Integer) Select Case DataErr Case 3022 MsgBox "Es ist bereits ein Aktionstyp mit der Bezeichnung ''" & Me.Aktionstyp & "'' vorhanden." Me!Aktionstyp.SetFocus Response = acDataErrContinue Case Else MsgBox "Fehler " & DataErr & vbCrLf & AccessError(DataErr) End Select End Sub
Listing 2: Diese Prozedur wird beispielsweise ausgelöst, wenn der Benutzer einen bereits vorhandenen Aktionstyp eingibt.
Erstellen des Formulars frmAktionsgruppe
Das Formular frmAktionsgruppen enthält genau wie das Formular frmAktionstyp ein Kombinationsfeld zur Auswahl des aktuellen Datensatzes (s. Bild 10). Die Datenquellen für das Formular sowie das Kombinationsfeld sollen wieder nach dem gleichen Feld sortiert sein. Die Abfrage für die Datenherkunft des Formulars lautet:
Bild 10: Entwurf des Formulars frmAktionsgruppe
SELECT AktionsgruppeID, Aktionsgruppe FROM tblAktionsgruppen ORDER BY Aktionsgruppe;
Das Kombinationsfeld verwendet die gleiche Datenherkunft, da die Tabelle tblAktionsgruppen ja ohnehin nur das Primärschlüsselfeld sowie das anzuzeigende Feld Aktionsgruppe enthält.
Das Unterformular sfmAktionsgruppe verwendet die Tabelle tblAktionsgruppenAktionstypen als Datenherkunft. Es zeigt jedoch nur das Nachschlagefeld AktionstypID dieser Tabelle an. Seine Eigenschaft Standardansicht haben wir auf Datenblatt eingestellt (s. Bild 11). Die Datensatzherkunft des Nachschlagefeldes ändern wir auf folgende SQL-Abfrage, damit der Eintrag Kundenantwort nicht zur Auswahl angeboten wird:
Bild 11: Entwurf des Unterformulars sfmAktionsgruppe
SELECT AktionstypID, Aktionstyp
FROM tblAktionstypen
WHERE Not Aktionstyp="Kundenantwort";
Wenn Sie das Unterformular erstellt haben und dieses aus dem Navigationsbereich in den Detailbereich des Hauptformulars ziehen, das bereits mit der Tabelle tblAktionsgruppen verknüpft ist, sollten die beiden Eigenschaften Verknüpfen von und Verknüpfen nach automatisch mit dem Wert AktionsgruppeID gefüllt worden sein (s. Bild 12).
Bild 12: Eigenschaften des Unterformular-Steuerelements sfmAktionsgruppe
Aktionsgruppe auswählen
Nach der Auswahl eines der Einträge des Kombinationsfeldes cboAuswahl wird diese Ereignisprozedur ausgelöst und zeigt den gewählten Datensatz an:
Private Sub cboAuswahl_AfterUpdate() Me.Recordset.FindFirst "AktionsgruppeID = " & Me!cboAuswahl End Sub
Löschen einer Aktionsgruppe
Wenn der Benutzer eine Aktionsgruppe löschen will, kann er das mit der folgenden Ereignisprozedur erledigen, die durch einen Klick auf die Schaltfläche cmdLoeschen ausgelöst wird:
Private Sub cmdLoeschen_Click() If MsgBox("Eintrag wirklich löschen", vbYesNo, "Eintrag löschen") = vbYes Then DoCmd.SetWarnings False RunCommand acCmdDeleteRecord DoCmd.SetWarnings True Me.Recordset.MoveFirst Me!cboAuswahl.Requery Me!cboAuswahl = Me!AktionsgruppeID End If End Sub
Auch hier tritt allerdings ein Fehler auf, wenn Sie einen Datensatz löschen, der bereits von der Verknüpfungstabelle tblAktionsgruppenAktionstypen referenziert wird. In diesem Fall wollen wir dies allerdings nicht verhindern, sondern im Gegenteil die referenzierten Einträge der Tabelle tblAktionsgruppenAktionstypen ebenfalls löschen. Dazu nehmen wir eine kleine änderung an den Beziehungseigenschaften zwischen den beiden Tabellen vor, und zwar im Beziehungen-Fenster (s. Bild 13). Hier aktivieren wir die Option Löschweitergabe an verwandte Datensätze. Dadurch werden die verknüpften Datensätze der Tabelle tblAktionsgruppenAktionstypen automatisch mitgelöscht.
Bild 13: Einstellen der Beziehungseigenschaften
Damit beim Löschen nicht die lange Meldung aus Bild 14 erscheint, deaktivieren wir vor dem Löschen mit DoCmd.SetWarnings False die Warnhinweise. Damit verhindern wir auch, dass noch der Fehler mit der Nummer 2501 folgt, wenn der Benutzer dann verunsichert auf Nein klickt. Außerdem soll das Formular nach dem Löschen eines Datensatzes den ersten enthaltenen Datensatz anzeigen und das Kombinationsfeld cboAuswahl ebenfalls auf diesen Eintrag einstellen.
Bild 14: Meldung beim Löschen verknüpfter Datensätze
Neue Aktionsgruppe anlegen
Genau wie beim Formular frmAktionstypen legen Sie mit der Methode GoToRecord des DoCmd-Objekts über die Schaltfläche cmdNeu einen neuen Datensatz an:
Private Sub cmdNeu_Click() DoCmd.GoToRecord Record:=acNewRec End Sub
Nach der Aktualisierung soll immer auch das Kombinationsfeld aktualisiert werden.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
Testzugang
eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel
diesen und alle anderen Artikel mit dem Jahresabo