Ticketsystem, Teil IV

Wenn Sie ein Abonnement des Magazins 'Access im Unternehmen' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.

Ticketsystem, Teil IV

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 von 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 foglende Abfrage als Datenherkunft:

Entwurf des Formular frmAktionstyp

Bild 9: Entwurf des Formular 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:

Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.

Bitte geben Sie die Zeichenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Ich habe die Datenschutzbestimmungen zur Kenntnis genommen.