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.
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.
Bild 1: Angepasstes Datenmodell mit einer Beziehung zwischen Kunden und NotizenDen 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 Steuerelement 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üsselfeldKundenformular
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 Steuerelemente 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-FormularsAnschließ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-FormularsPrivate 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 KundenPrivate 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 KundenNeue 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
Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.