Ticketsystem, Teil IV

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).
  • Entwurf der Tabelle tblAktionsgruppen

    Bild 1: Entwurf der Tabelle tblAktionsgruppen

  • 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).
  • Entwurf der Tabelle tblAktionstypen

    Bild 2: Entwurf der Tabelle tblAktionstypen

  • Die Aktionstypen sind den Aktionsgruppen über die Verknüpfungstabelle tblAktionsgruppenAktionstypen zugeordnet (s. Bild 3).
  • Entwurf der Tabelle tblAktionsgruppenAktionstypen

    Bild 3: Entwurf der Tabelle tblAktionsgruppenAktionstypen

  • 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.
  • Beispieldatensätze der Tabellen tblAktionstypen, tblAktionsgruppen und tblAktionsgruppenAktionstypen

    Bild 4: Beispieldatensätze der Tabellen tblAktionstypen, tblAktionsgruppen und tblAktionsgruppenAktionstypen

  • 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.

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.

Entwurf der Tabelle tblAktionen

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.

Datenmodell der vorgestellten Tabellen

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).

Eingabe der Daten eines Aktionstyps

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.

Zusammenfassen der Aktiontypen zu einer Aktionsgruppe

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:

Entwurf des Formulars frmAktionstyp

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:

Entwurf des Formulars frmAktionsgruppe

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:

Entwurf des Unterformulars sfmAktionsgruppe

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).

Eigenschaften des Unterformular-Steuerelements sfmAktionsgruppe

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.

Einstellen der Beziehungseigenschaften

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.

Meldung beim Löschen verknüpfter Datensätze

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

Schreibe einen Kommentar