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