Home > Artikel > Ausgabe 4/2018 > Datensätze markieren mit bedingter Formatierung

Datensätze markieren mit bedingter Formatierung

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Wenn Sie gern mit der Datenblattansicht arbeiten, ist Ihnen vermutlich schon aufgefallen, dass es keine Möglichkeit, mehrere Datensätze gleichzeitig zu markieren – außer, die Datensätze hängen zusammen. Mit der bedingten Formatierung und ein paar kleinen Tricks gelingt es uns allerdings doch, Datensätze etwa per Doppelklick zu selektieren und wieder abzuwählen. Dieser Artikel zeigt, wie es funktioniert.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1804_DatensaetzeMarkierenMitBedingterFormatierung.accdb.

Vorbereitung

Als Beispiel wollen wir ein Unterformular nutzen, dass die Daten der Tabelle tblKunden in der Datenblattansicht anzeigt. Im Hauptformular wollen wir dann Schaltflächen unterbringen, mit denen wir entweder alle Einträge des Unterformulars selektieren können oder die Selektierung komplett aufheben.

Dazu legen wir zunächst das Unterformular namens sfmKunden an. Dieses statten wir über die Eigenschaft Datenherkunft mit der Tabelle tblKunden als Datenquelle aus. Ziehen Sie dann alle Felder der Datenherkunft aus der Feldliste in den Detailbereich des Formularentwurfs. Außerdem stellen wir die Eigenschaft Standardansicht auf Datenblatt ein (siehe Bild 1). Schließen Sie das Formular dann, damit wir es im nächsten Schritt als Unterformular zum Hauptformular hinzufügen können.

Entwurf des Unterformulars

Bild 1: Entwurf des Unterformulars

Anschließend legen wir das Hauptformular namens frmKunden an und öffnen dieses in der Entwurfsansicht. Diesem fügen wir das Formular sfmKunden als Unterformular hinzu, indem wir es aus dem Navigationsbereich in den Detailbereich des Formularentwurfs ziehen. Außerdem stellen wir für das Hauptformular die Eigenschaften Datensatzmarkierer, Navigationsschaltflächen, Trennlinien und Bildlaufleisten auf den Wert Nein und Automatisch zentrieren auf Ja ein. Damit die Größe des Unterformulars beim Ändern der Größe des Hauptformulars automatisch angepasst wird, legen wir außerdem für die beiden Eigenschaften Horizontaler Anker und Vertikaler Anker noch den Wert Beide fest (siehe Bild 2).

Entwurf des Hauptformulars

Bild 2: Entwurf des Hauptformulars

Feld für das temporäre Speichern als markierter Datensatz hinzufügen

Nun haben wir zwar schon das Formular aufgebaut, aber wenn wir eine bedingte Formatierung definieren wollen, benötigen wir dazu bestimmte Bedingungen, die erfüllt sein müssen. Wie aber wollen wir eine Bedingung definieren, die besagt, dass ein Datensatz gerade markiert ist oder nicht?

Dazu benötigen wir ein eigenes Feld, dass wir entweder direkt der Tabelle hinzufügen oder einer weiteren Tabelle, die wir dann per 1:1-Beziehung mit der eigentlichen Tabelle verknüpfen. Da es sein kann, dass Sie diese Technik an Tabellen anwenden wollen, die aus einer Datenbank stammen, deren Entwurf Sie nicht ändern können, wählen wir die zweite Variante. Also legen wir zunächst eine neue Tabelle namens tblKundenMarkierungen an.

Diese erhält drei Felder. Das erste ist das Primärschlüsselfeld dieser Tabelle, das zweite ein Fremdschlüsselfeld, welches auf den Primärschlüssel des Feldes tblKunden verweist und das dritte das Ja/Nein-Feld, mit dem wir festlegen, ob der mit dem diesem Datensatz verknüpfte Datensatz der Tabelle tblKunden als ausgewählt gekennzeichnet werden soll.

Wichtig für die Herstellung einer 1:1-Beziehung zwischen den Tabellen tblKunden und tblKundenBeziehungen ist, dass beide an der Beziehung beteiligten Felder einen eindeutigen Index haben. Beim Primärschlüsselfeld KundeID der Tabelle tblKunden ist das per Definitionem der Fall, beim Fremdschlüsselfeld KundeID der Tabelle tblKundenMarkierungen müssen wir nachhelfen. Dazu stellen wir die Eigenschaft Indiziert für dieses Feld im Entwurf der Tabelle auf den Wert Ja (Ohne Duplikate) ein (siehe Bild 3).

Entwurf der Zusatztabelle tblKundenMarkierungen

Bild 3: Entwurf der Zusatztabelle tblKundenMarkierungen

Beziehung hinzufügen

Danach wollen wir die Beziehung zwischen den beiden Tabellen tblKunden und tblKundenMarkierungen hinzufügen. Dazu öffnen wir über den Ribbonbefehl Datenbanktools|Beziehungen|Beziehungen das Beziehungen-Fenster. Diesem fügen wir die Tabellen tblKunden und tblKundenMarkierungen hinzu, sofern diese noch nicht sichtbar sind.

Dann erstellen wir die Beziehung zwischen den beiden Tabellen. Dabei ist es wichtig, dass Sie vom Feld KundeID der Tabelle tblKunden ausgehend auf das gleichnamige Feld der Tabelle tblKundenMarkierungen ziehen – andersherum erhalten Sie beim Speichern der Beziehung eine Fehlermeldung, wenn Sie für die Beziehung referenzielle Integrität festgelegt haben.

Der Grund ist einfach: In diesem Fall müsste es für jeden Eintrag im Feld KundeID der Tabelle tblKunden nämlich einen passenden Eintrag im entsprechenden Feld der Tabelle tblKundenMarkierungen geben. Und das ist gerade dann nicht der Fall, wenn die Tabelle soeben erst angelegt wurde.

Also ziehen wir die Beziehung andersherum auf. Im nun erscheinenden Dialog Beziehungen bearbeiten erscheint dann im unteren Bereich auch gleich 1:1 als Beziehungstyp.

Hier aktivieren Sie noch die Option Mit referenzieller Integrität. Sie sollten auch noch die Option Löschweitergabe an verwandte Datensätze aktivieren, damit die Datensätze der Tabelle tblKundenMarkierungen, die mit einem zu löschenden Datensatz der Tabelle tblKunden in Beziehung stehen, auch direkt mit gelöscht werden (siehe Bild 4).

Beziehung zwischen den Tabellen tblKunden und tblKundenMarkierungen

Bild 4: Beziehung zwischen den Tabellen tblKunden und tblKundenMarkierungen

Abfrage zum Zusammenführen der Daten erstellen

Wenn wir wollen, dass das Feld Markiert der Tabelle tblKundenMarkierungen bei den noch zu definierenden bedingten Formatierungen im Unterformular berücksichtigt wird, müssen wir dieses über die Datenherkunft verfügbar machen. Dazu erstellen wir eine neue Abfrage namens qryKundenMarkierungen. Dieser fügen wir die beiden Tabellen tblKunden und tblKundenMarkierungen hinzu. Aus der Tabelle tblKunden übernehmen wir alle Felder, aus der Tabelle tblKundenMarkierungen fügen wir noch das Feld Markierung zum Entwurfsraster der Abfrage hinzu (siehe Bild 5).

Abfrage mit den beiden Tabellen tblKunden und tblKundenMarkierungen

Bild 5: Abfrage mit den beiden Tabellen tblKunden und tblKundenMarkierungen

Wenn wir nun in die Datenblattansicht der Abfrage wechseln, liefert diese allerdings keine Datensätze zurück (siehe Bild 6). Das ist auch kein Wunder, denn aktuell ist die Abfrage ja auch so definiert, dass Sie alle Datensätze zurückliefert, für dies es übereinstimmende Werte im Feld KundeID der beiden beteiligten Tabellen tblKunden und tblKundenMarkierungen gibt.

Die Abfrage qryKundenMarkierungen liefert keine Datensätze zurück.

Bild 6: Die Abfrage qryKundenMarkierungen liefert keine Datensätze zurück.

Diese kleine Nachlässigkeit wollen wir noch korrigieren. Dazu wechseln wir nochmals zum Entwurf der Abfrage und klicken doppelt auf den Beziehungspfeil zwischen den beiden Tabellen. Hier wählen wir nun die Option wie in Bild 7 aus. Dies sorgt dafür, dass alle Datensätze der Tabelle tblKunden im Abfrageergebnis erscheinen – selbst wenn die Tabelle tblKundenMarkierungen keinen einzigen Datensatz enthält.

Finetuning der Verknüpfungseigenschaften

Bild 7: Finetuning der Verknüpfungseigenschaften

Ein Wechsel zurück zur Datenblattansicht liefert dann auch alle Datensätze der Tabelle tblKunden zurück – inklusive des Feldes Markierung der Tabelle tblKundenMarkierung. Dieses zeigt den undefinierten Status für Kontrollkästchen an, da dieses Feld ja für diese Konstellation der verknüpften Tabellen noch gar keine Daten aufweist. Die Tabelle tblKundenMarkierungen ist zu diesem Zeitpunkt noch leer. Nun aktivieren wir aber einmal das Feld Markierung für einige Datensätze der Abfrage (siehe Bild 8).

Setzen des Feldes Markierung auf den Wert Ja

Bild 8: Setzen des Feldes Markierung auf den Wert Ja

Wenn wir danach die Tabelle tblKundenMarkierungen öffnen, finden wir für jeden der drei zuvor in der Abfrage qryKundenMarkierungen angehakten Datensätze einen neuen Eintrag vor (siehe Bild 9).

Neue Einträge in der Tabelle tblKundenMarkierungen

Bild 9: Neue Einträge in der Tabelle tblKundenMarkierungen

Datenherkunft des Unterformulars austauschen

Nun öffnen wir erneut das Unterformular sfmKunden in der Entwurfsansicht und tauschen in der Eigenschaft Datensatzquelle die Tabelle tblKunden gegen die soeben erstellte Abfrage qryKundenMarkierungen aus. Wenn wir das Unterformular dann speichern und schließen und das Hauptformular in der Formularansicht öffnen, ändert sich erst einmal nichts – das Unterformular zeigt die gleichen Datensätze wie zuvor an.

Wir haben aber nun über das Feld Markierung die Möglichkeit, den Markiert-Status mit den angezeigten Datensätzen zu speichern.

Bedingte Formatierung definieren

Da wir ja weiter oben bereits ein paar Datensätze mit dem Status Markiert versehen haben, wollen wir nun zunächst die bedingte Formatierung einstellen und so die Markierung auch sichtbar machen.

Dazu nehmen wir uns zunächst das Feld KundeID vor. Fügen Sie die Einfügemarke in der Formularansicht in dieses Feld ein. Wenn Sie den Ribbon-Tab Datenblatt markiert haben, finden Sie rechts den Befehl Formatierung|Bedingte Formatierung vor (siehe Bild 10). Leider wird dieser deaktiviert, sobald sie mehr als ein Feld markieren – Sie können also in dieser Ansicht immer nur die bedingte Formatierung für jeweils ein Feld festlegen.

Der Befehl Bedingte Formatierung im Ribbon

Bild 10: Der Befehl Bedingte Formatierung im Ribbon

Da wir gegen Fließbandarbeit sind, schauen wir uns nach Alternativen um, die wir auch schnell finden. Wir schließen das Hauptformular und öffnen das Unterformular sfmKunden in der Entwurfsansicht. Wenn wir hier zur Ribbon-Gruppe Format|Steuerelement­formatierung wechseln, finden wir ebenfalls den Eintrag Bedingte Formatierung vor. Markieren wir nun alle Textfelder des Formulars, bleibt diese Schaltfläche aktiviert – in der Entwurfsansicht können wir also auch für mehrere Steuer­elemente gleichzeitig die bedingte Formatierung definieren (siehe Bild 11).

Im Entwurf können auch mehrere Felder mit der bedingten Formatierung versehen werden.

Bild 11: Im Entwurf können auch mehrere Felder mit der bedingten Formatierung versehen werden.

Neue bedingte Formatierung hinzufügen

Klicken wir nun auf die Schaltfläche Bedingte Formatierung, erscheint der Dialog Manager für Regeln zur bedingten Formatierung aus Bild 12. Dieses zeigt im Kombinationsfeld im oberen Bereich auch gleich den Eintrag Mehrere statt eines bestimmten Steuerelements an.

Anlegen einer neuen Regel, hier für mehrere Steuer­elemente gleichzeitig

Bild 12: Anlegen einer neuen Regel, hier für mehrere Steuer­elemente gleichzeitig

In diesem Dialog klicken wir nun auf die Schaltfläche Neue Regel, was den Dialog Neue Formatierungsregel liefert. Hier behalten wir als Regeltyp Werte in aktuellem Datensatz prüfen oder einen Ausdruck verwenden bei. Das Kombinationsfeld mit dem voreingestellten Wert Feldwert ist stellen wir auf Ausdruck ist um, denn wir wollen ja nicht den Wert des aktuellen Feldes mit einem bestimmten Wert vergleichen, sondern den des Feldes Markierung. Als Ausdruck legen wir rechts daneben dann den folgenden Vergleich fest (siehe Bild 13):

Definition der neuen bedingten Formatierung

Bild 13: Definition der neuen bedingten Formatierung

[Markierung]=True

Schließlich wählen wir unten noch eine alternative Hintergrundfarbe, weiße Schriftfarbe und fette Schrift ein. Danach schließen wir den Dialog mit einem Klick auf die Schaltfläche OK. Sofern dies anstandslos quittiert und der Dialog geschlossen wird, ist zumindest der Ausdruck schon einmal gültig.

Zurück im Dialog aus Bild 14 sehen wir einen neuen Eintrag in der Liste der bedingten Formatierungen. Auch diesen Dialog können wir nun schließen. Danach schließen wir auch noch das Formular sfmKunden und speichern auf Nachfrage die Änderungen.

Die neue Definition einer bedingten Formatierung in der Übersicht

Bild 14: Die neue Definition einer bedingten Formatierung in der Übersicht

Nun folgt der erste Test der bedingten Formatierung. Wir öffnen das Formular frmKunden, in dem nun die ersten drei Einträge markiert sein sollten. Und das Ergebnis überzeugt – siehe Bild 15.

Das Formular frmKunden mit den formatierten Datensätzen

Bild 15: Das Formular frmKunden mit den formatierten Datensätzen

Auswählen per Doppelklick

Nun fehlt noch ein wenig VBA-Programmierung. Diese soll dafür sorgen, dass die Datensätze nach einem Doppelklick auf eines der Felder als ausgewählt oder abgewählt markiert werden. Das Ereignis, das wir dazu benötigen, heißt logischerweise Beim Doppelklicken. Für dieses hinterlegen wir zunächst für das Textfeld KundeID eine Ereignisprozedur. Zuvor wollen wir jedoch noch das Präfix für die Bezeichnung des Textfeldes anpassen, und zwar so, dass dieses nun txtKundeID heißt – danach können wir über das Eigenschaftsfenster des Textfeldes die Prozedur anlegen (siehe Bild 16).

Hinzufügen einer Ereignisprozedur

Bild 16: Hinzufügen einer Ereignisprozedur

Nun erstellen wir die folgende Ereignisprozedur. Diese geht gleich von der Möglichkeit aus, dass für diesen Datensatz der Tabelle tblKunden noch kein entsprechender Datensatz in der Tabelle tblKundenMarkierungen angelegt wurde – in diesem Fall hat das Feld Markierung der Datenherkunft den Wert Null, was wir mit der Funktion IsNull prüfen:

Private Sub txtKundeID_DblClick(Cancel As Integer)

If IsNull(Me!Markierung) Then

Me!Markierung = True

Else

Me!Markierung = Not Me!Markierung

End If

End Sub

Ist das der Fall, stellen wir den Wert des Feldes Markierung auf den Wert True ein. Anderenfalls gehen wir davon aus, dass dieses entweder den Wert True oder False enthält und stellen das Feld auf den jeweils anderen Wert ein (Me!Markierung = Not Me!Markierung).

Dabei stellen wir Folgendes fest: Wenn der Datensatz zuvor noch nicht markiert wurde, wird die Markierung direkt angezeigt. Wenn die Markierung allerdings bereits vorhanden ist und wir diese per Doppelklick wieder entfernen wollen, dann wird die Markierung nicht direkt aktualisiert. Das geschieht erst, nachdem wir mit F5 die Datenherkunft des Unterformulars aktualisieren.

Das ist natürlich nicht zufriedenstellend. Was uns auch nicht gefällt, ist die Anzeige des Bearbeiten-Symbols am Datensatzmarkierer des doppelt angeklickten Datensatzes (siehe Bild 17). Es ist logisch, dass dieses Symbol dort erscheint, denn wir haben den Datensatz durch Ändern des Wertes im Feld Markierung geändert und diese Änderung noch nicht gespeichert.

Die Änderung am Datensatz wird offensichtlich nicht gespeichert.

Bild 17: Die Änderung am Datensatz wird offensichtlich nicht gespeichert.

Also fügen wir zunächst eine Anweisung hinzu, die den Datensatz direkt nach der Änderung speichert:

Private Sub txtKundeID_DblClick(Cancel As Integer)

...

RunCommand acCmdSaveRecord

End Sub

Dies sorgt zumindest dafür, dass der Datensatz direkt nach dem Doppelklick gespeichert wird. Aber wie erreichen wir, dass die durch die bedingte Formatierung eingestellte Formatierung direkt nach dem Doppelklick erscheint? Ganz einfach: Dazu fügen wir an der gleichen Stelle auch noch die Anweisung Me.Refresh zur Ereignisprozedur txtKundeID_DoubleClick hinzu:

Private Sub txtKundeID_DblClick(Cancel As Integer)

...

RunCommand acCmdSaveRecord

Me.Refresh

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!