Notizen nach Kunde

In Heft 2/2016 haben wir gezeigt, wie Sie Notizen in einer Art Endlosformular anzeigen können – und zwar nicht mit konstanter Höhe, wie im Access-Endlosformular üblich, sondern mit einer an den Inhalt angepassten Höhe. Außerdem ließen sich damit Texte im Richtext-Format eingeben! Diesmal bauen wir eine Erweiterung, mit der Sie die Notizen einem Kunden zuordnen und diese wieder abrufen können. Außerdem fügen wir noch weitere praktische Funktionen hinzu, zum Beispiel zum direkten Bearbeiten der Notiz per Doppelklick.

Datenmodell erweitern

In der Lösung aus dem Beitrag HTML-Liste mit Access-Daten (www.access-im-unternehmen.de/1029) haben wir nur die Tabelle tblNotizen beziehungsweise tblNotizenRichtext verwendet, um die Notizen einzugeben (im vorliegenden Beitrag konzentrieren wir uns auf die Version mit Richtext). Nun wollen wir das Datenmodell so erweitern, dass es auch noch eine Kunden-Tabelle samt Anreden enthält. Der Tabelle tblNotizen_Richtext fügen wir nun ein Fremdschlüsselfeld namens KundeID hinzu, über das wir die Tabelle mit dem Primärschlüsselfeld KundeID der Tabelle tblKunden verknüpfen. Das Datenmodell soll danach wie in Bild 1 aussehen.

Angepasstes Datenmodell mit einer Beziehung zwischen Kunden und Notizen

Bild 1: Angepasstes Datenmodell mit einer Beziehung zwischen Kunden und Notizen

Den Entwurf der Tabelle tblNotizen_Richtext ändern wir dazu wie in Bild 2. Hier fügen wir das Fremdschlüsselfeld KundeID hinzu. Sie können die Beziehung über den Datentyp Nachschlagefeld herstellen, können im Anschluss aber die Eigenschaft Steuer-element anzeigen unter Nachschlagen auf Textfeld einstellen – das Feld KundeID wird nicht in Zusammenhang mit der Notiz angezeigt werden, somit brauchen wir über das Nachschlagefeld auch nicht die Vorbereitung für das Anlegen von Kombinationsfeldern mit den gleichen Eigenschaften vorzubereiten.

Tabelle tblNotizen mit Fremdschlüsselfeld

Bild 2: Tabelle tblNotizen mit Fremdschlüsselfeld

Kundenformular

Als Nächstes bauen wir ein Formular als kombinierte Kundenübersicht/Detailansicht. Dazu fügen wir dem neuen Formular namens frmKunden im oberen Bereich ein Listenfeld hinzu, das die folgende Abfrage als Datenherkunft verwendet:

SELECT tblKunden.KundeID, [Nachname] & ", " & [Vorname] AS Kunde FROM tblKunden ORDER BY [Nachname] & ", " & [Vorname];

Damit das Listenfeld nur den Nachnamen und den Vornamen des Kunden anzeigt und nicht den Primärschlüsselwert, stellen wir die Eigenschaft Spaltenanzahl auf 2 und Spaltenbreiten auf 0cm ein. Das Formular soll die Auswahl des Kunden über das Listenfeld ermöglichen und dann die Daten des Kunden als gebundene Steuer-elemente im Formular anzeigen. Dadurch benötigen wir die üblichen Formularelemente zur Navigation in den Datensätzen des Formulars nicht und stellen die Eigenschaften Datensatzmarkierer, Navigationsschaltflächen, Trennlinien und Bildlaufleisten auf Nein ein. Danach binden Sie das Formular an eine Abfrage auf Basis der tblKunden, die alle Felder der Tabelle enthält, die Datensätze aber zuerst nach dem Nachnamen und dann nach dem Vornamen sortiert (s. Bild 3).

Datenherkunft des Kunden-Formulars

Bild 3: Datenherkunft des Kunden-Formulars

Anschließend ziehen die relevanten Felder wie in Bild 4 aus der Feldliste in den Detailbereich des Formularentwurfs. Damit das Formular den jeweils im Listenfeld markierten Datensatz anzeigt, sind ein paar Zeilen Code notwendig. Da wir sowohl für das Listenfeld als auch für das Formular eine Datenherkunft beziehungsweise Datensatzherkunft verwenden, welche die gleichen Datensätze nach identischer Sortierung liefert, entspricht der im Formular angezeigte Datensatz automatisch dem zuerst angezeigten Datensatz im Listenfeld. Diesen wollen wir zur Verdeutlichung auch gleich noch markieren. Dazu hinterlegen Sie für das Ereignis Beim Laden des Formulars die folgende Ereignisprozedur:

Entwurf des Kunden-Formulars

Bild 4: Entwurf des Kunden-Formulars

Private Sub Form_Load()
     Me!lstKunden = Me!lstKunden.ItemData(0)
End Sub

Die einzige Anweisung dieser Prozedur markiert den ersten Eintrag des Listenfeldes. Danach fügen wir noch eine Prozedur hinzu, die durch das ändern der Auswahl der im Listenfeld angezeigten Einträge ausgelöst wird:

Private Sub lstKunden_AfterUpdate()
     Me.Recordset.FindFirst "KundeID = " & Me!lstKunden
End Sub

Dies stellt den Inhalt des Formulars auf den aktuell im Listenfeld markierten Eintrag ein.

Schließlich fügen Sie noch eine Schaltfläche namens cmdNotizenAnzeigen zum Formular hinzu. Bevor wir die Ereignisprozedur für die Beim Klicken-Eigenschaft dieser Schaltfläche definieren, wollen wir zunächst das Formular zur Anzeige der Notizen anpassen.

frmNotizen_Richtext anpassen

Bei der Anpassung dieses Formulars setzen wir auf dem Formular frmNotizenMitDetailFormular_Rechtext auf, das wir in dem oben angegebenen Beitrag erstellt haben. Wir benennen es der Einfachheit halber allerdings in frmNotizen_Richtext um.

Der HTML-Code für die Darstellung der Notizen in dem Webbrowser-Steuerelement aus Bild 5 befindet sich in der Prozedur DatenAnzeigen im Klassenmodul des Formulars. Hier füllen wir eine Recordset-Variable mit den anzuzeigenden Daten, derzeit mit der folgenden Abfrage:

Entwurf des Formulars zur Anzeige der Notizen zu einem Kunden

Bild 5: Entwurf des Formulars zur Anzeige der Notizen zu einem Kunden

Private Sub DatenAnzeigen()
     ...
     Set rst = db.OpenRecordset("SELECT * FROM  tblNotizen_Richtext", dbOpenDynaset)
     ...
End Sub

Diese Abfrage lädt aktuell alle Notizen und stellt diese zu einem HTML-Dokument zusammen, das dann im Webbrowser-Steuerelement angezeigt wird. Diese Abfrage müssen wir nun so modifizieren, dass nicht mehr alle Datensätze der Tabelle tblNotizen_Richtext, sondern nur noch die zu dem jeweiligen Kunden angezeigt werden, für den das Formular geöffnet wurde.

Die Anpassung der Zeile mit der Abfrage ist theoretisch leicht – wir müssen ja nur eine WHERE-Bedingung in der Form WHERE KundeID = hinzufügen. Dabei müssen wir allein dafür sorgen, dass die ID des jeweiligen Kunden vom aufrufenden Formular in das aufgerufene Formular gelangt und als Variable verfügbar ist. Das ist der ideale Anwendungsfall für den Parameter OpenArgs beim Aufrufen eines Formulars mit der Methode DoCmd.OpenForm. Die Prozedur cmdNotizenAnzeigen des Formulars frmKunden können wir also wie folgt füllen:

Private Sub cmdNotizenAnzeigen_Click()
     DoCmd.OpenForm "frmNotizen_Richtext", WindowMode:=acDialog, OpenArgs:=Me!KundeID
End Sub

Dies übergibt den aktuellen Wert des Feldes KundeID an das aufgerufene Formular und kann dort über die Eigenschaft OpenArgs abgerufen werden. Das heißt, dass wir die oben erwähnte Zeile zum Initialisieren des Recordsets wie folgt ändern müssen:

Private Sub DatenAnzeigen()
     ...
     Set rst = db.OpenRecordset("SELECT * FROM  tblNotizen_Richtext WHERE KundeID = "  & Me.OpenArgs, dbOpenDynaset)
     ...
End Sub

Erster Test des Notizformulars

Zeigen wir das Formular frmKunden nun an und klicken für einen beliebigen Kunden auf die Schaltfläche cmdNotizenAnzeigen, erscheint das Notiz-Formular wie in Bild 6. Natürlich sind noch für keinen Kunden Notizen vorhanden, denn wir haben ja noch keine angelegt. Die Anzeige des Notizen-Formulars für einen Kunden ohne Notizen sieht allerdings nicht so schön aus – da müssen wir später nachbessern.

Anzeigen der Notizen zu einem Kunden

Bild 6: Anzeigen der Notizen zu einem Kunden

Neue Notiz anlegen

Zunächst wollen wir aber einmal eine neue Notiz anlegen. Dies haben wir in der Lösung, auf der dieser Beitrag aufbaut, mit dem Formular frmNotizDetail_Richtext erledigt, das wir mit der folgenden Prozedur aufgerufen haben:

Private Sub cmdNeu_Click()
     DoCmd.OpenForm "frmNotizDetail_Richtext",  DataMode:=acFormAdd, WindowMode:=acDialog
     DatenAnzeigen
End Sub

Diese Prozedur zeigt das Formular frmNotizDetail_Richtext an. Nach der Eingabe wird die Routine DatenAnzeigen aufgerufen, welche die HTML-Liste mit den Notizen aktualisieren soll. Wenn wir uns jedoch die DoCmd.OpenForm-Methode ansehen, wird schnell klar, dass hier etwas fehlt: Der Primärschlüsselwert für den aktuellen Kunden wird hier nämlich übergeben. Dadurch können wir im aufgerufenen Formular natürlich auf keinen Fall eine Notiz im Kontext des gewünschten Kunden anlegen. Also ändern wir den Aufruf wie folgt:

DoCmd.OpenForm "frmNotizDetail_Richtext",  DataMode:=acFormAdd, WindowMode:=acDialog,  OpenArgs:=Me.OpenArgs

Wir geben also das vom ersten Formular weitergegebene öffnungsargument gleich noch an das nächste Formular weiter. Dort müssen wir es natürlich adäquat verarbeiten.

Kunde beim Anlegen einer neuen Notiz berücksichtigen

Die Tabelle tblNotizen_Richtext haben wir ja mit dem Feld KundeID ausgestattet, damit wir zu jeder Notiz speichern können, zu welchem Kunden diese gehört. Diesen Wert müssen wir beim Anlegen einer neuen Notiz natürlich auch füllen. Dazu ziehen wir zunächst das Feld KundeID aus der Feldliste in den Entwurf des Formulars (s. Bild 7). Sie können das Feld ruhig an beliebiger Stelle positionieren, denn wir benötigen es nur, um den Standardwert festzulegen – der Benutzer braucht dieses Feld später nicht zu sehen. Zu Testzwecken lassen wir es jedoch zunächst noch eingeblendet.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar