Home > Artikel > Ausgabe 3/2017 > Individuelle Auswahl mit eigener Tabelle

Individuelle Auswahl mit eigener Tabelle

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

In den beiden Artikeln Datensätze individuell auswählen (Ausgabe 10/2012) und Selektion im Datenblatt (aktuelle Ausgabe) nutzen wir ein zusätzliches Feld in der betroffenen Tabelle, um Datensätze individuell auswählen zu können. Die Methode ist sehr praktisch, kommt jedoch an ihre Grenzen, wenn Sie keinen Zugriff auf die betroffene Tabelle haben. Das kann passieren, wenn sich diese in einem Backend befindet, dessen Daten Sie nicht ändern können, weil Sie keinen Zugriff haben oder keine Berechtigung. Ein weiterer wichtiger Grund, die Selektionsdaten in einer eigenen Tabelle zu speichern, sind Mehrbenutzeranwendungen. Da bietet es sich an, die Daten bezüglich der Ansicht im Frontend zu speichern.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1703_IndividuelleAuswahl.accdb. Wir setzen auf der im Artikel Selektion im Datenblatt beschriebene Lösung auf. Dabei entfernen wir einfach das Feld Selektiert aus der Tabelle tblKunden und fügen dieses dann über eine zusätzliche Tabelle wieder hinzu. Die übrigen Schritte werden in diesem Artikel erläutert.

Tabelle hinzufügen

Wir gehen also nun davon aus, dass die Tabelle tblKunden sich in einer Backend-Datenbank befindet, deren Entwurf wir nicht ändern können. Daher entfernen wir das Feld Selektiert aus dieser Tabelle und speichern die Tabelle.

Die Tabelle, in der wir die Selektionsdaten speichern wollen, soll den Namen tblKundenSelektion erhalten und zwei Felder enthalten. Das erste heißt KundeID und wird als Zahlenfeld mit einem eindeutigen Index versehen. Das zweite Feld ist das Feld, das wir aus der ursprünglichen Tabelle entnommen haben – es heißt dementsprechend Selektiert (siehe Bild 1).

Die Tabelle mit dem Selektionsfeld

Bild 1: Die Tabelle mit dem Selektionsfeld

Damit wir das Feld Selektiert sauber mit der Tabelle tblKunden verbinden können, müssen wir eine 1:1-Beziehung zwischen den beiden Tabellen anlegen. Das bedeutet, dass es für jeden Datensatz der Tabelle tblKunden nur maximal einen Datensatz in der Tabelle tblKundenSelektion geben darf, dessen Wert im Feld KundeID mit dem Feld KundeID in tblKunden übereinstimmt.

Dazu stellen wir die Verbindung zwischen den beiden Tabellen her, und zwar im Beziehungen-Fenster von Access. Diesem fügen Sie die beiden Tabellen tblKunden und tblKundenSelektion hinzu. Anschließend ziehen Sie den Beziehungspfeil vom Feld KundeID der Tabelle tblKunden auf das gleichnamige Feld der Tabelle tblKundenSelektion und legen Sie für die Beziehung Referenzielle Integrität und Löschweitergabe fest (siehe Bild 2). Versuchen Sie dies andersherum, erhalten Sie beim Versuch, referenzielle Integrität festzulegen eine Fehlermeldung. Hier geht es um die Richtung, in der die Beziehung angelegt wird: Access prüft im letzteren Fall, der einen Fehler auslöst, ob die Tabelle tblKunden Datensätze mit Werten im Feld KundeID enthält, die nicht in der Tabelle tblKunden­Selektion enthalten sind. Und das ist zu diesem Zeitpunkt definitiv der Fall, da wir die Tabelle tblKundenSelektion ja soeben erst angelegt haben.

Herstellen der Beziehung zwischen den beiden Tabellen

Bild 2: Herstellen der Beziehung zwischen den beiden Tabellen

In der Abbildung erkennen Sie auch, dass Access keine 1:n-Beziehung angelegt hat, wie dies üblicherweise der Fall ist, sondern eine 1:1-Beziehung. Woran erkennt Access dies? Ganz einfach: Wir haben auf beiden Seiten Felder, für die ein eindeutiger Index festgelegt ist. Und wenn keines der Felder einen Wert mehr als einmal enthalten kann, dann kann man zwischen diesen Feldern auch keine 1:n-Beziehung anlegen.

Sie können nun testweise einen Datensatz in der Tabelle tblKundenSelektion anlegen, der in der Tabelle KundeID einen Wert enthält, der auch in der Tabelle tblKunden vorkommt. Wenn Sie im Feld KundeID der Tabelle tblKundenSelektion einen Wert anlegen, der nicht im Feld KundeID der Tabelle tblKunden vorkommt, löst dies einen Fehler aus.

Und wozu benötigen wir die Löschtweitergabe? Diese sorgt dafür, dass wenn ein Datensatz in der Tabelle tblKunden gelöscht wird, auch ein eventuell mit diesem Datenstaz der Tabelle tblKunden verknüpfter Datensatz der Tabelle tblKundenSelektion gelöscht wird. Auf diese Weise verhindern wir, dass die Tabelle Karteileichen speichert.

Anpassung der zugreifenden Instanzen

Nun haben wir zwar das Feld Selektiert aus der Tabelle tblKunden in die Tabelle tblKundenSelektion ausgelagert und eine Beziehung zwischen den beiden Tabellen hergestellt – dies hilft uns aber nicht weiter, wenn wir nun über das Formular auf das Feld Selektiert zugreifen wollen. Ganz im Gegenteil: Wenn wir das Formular frmHauptformularErweitert der Beispieldatenbank öffnen, erhalten wir den Fehler aus Bild 3. Dieser tritt auf, wenn wir in der Ereignisprozedur Form_Load versuchen, das Feld Selektiert in allen Datensätzen der Tabelle tblKunden auf False (0) einzustellen. Das Formular wird dann zwar geöffnet und zeigt auch seine Daten im Unterformular an, aber der Versuch, einen der Datensätze zu selektieren, führt dann wieder zu einem Laufzeitfehler.

Fehler beim Versuch, auf das Feld Selektiert zuzugreifen

Bild 3: Fehler beim Versuch, auf das Feld Selektiert zuzugreifen

Abfrage zum Zusammenführen der Tabellen

Also müssen wir wohl den Code anpassen – so, dass die Tabelle tblKundenSelektiert auch berücksichtigt wird. Dies erledigen wir, indem wir zunächst eine Abfrage namens qryKundenSelektiert anlegen, welche die beiden Tabellen zusammenführt und die Felder auswählt, die zuvor in der Tabelle tblKunden enthalten waren – also die Felder KundeID, Vorname, Nachname aus der Tabelle tblKunden und zusätzlich das Feld Selektiert aus der Tabelle tblKundenSelektion. Die Abfrage sieht im Entwurf wie in Bild 4 aus.

Diese Abfrage führt die Felder der beiden Tabellen zusammen.

Bild 4: Diese Abfrage führt die Felder der beiden Tabellen zusammen.

Wenn wir in die Datenblattansicht dieser Abfrage wechseln, können wir schon einmal ihre Funktion prüfen. Hier erwartet uns allerdings bestenfalls ein einziger Datensatz – und das auch nur, wenn Sie wie oben beschrieben testweise einen Wert in das Feld KundeID der Tabelle tblKundenSelektion eingegeben haben (siehe Bild 5). Wie kommt das? Nun: Wir haben in der Tabelle einfach die Standardbeziehung zwischen den beiden Tabellen beibehalten. Das ist jedoch eine Restriktion der anzuzeigenden Daten, denn eine Abfrage liefert bei der Standardbeziehung nur die Datensätze zweier verknüpfter Tabellen, für die in beiden Tabellen Datensätze vorliegen. Das ist jedoch hier nicht der Fall beziehungsweise nur für solche Datensätze, die wir explizit in der Tabelle tblKunden­Selektion angelegt haben. Aber keine Sorge: Wir können die Beziehungseigenschaften noch so ändern, dass die Abfrage alle Datensätze der Tabelle tblKunden liefert und nur die Datensätze der Tabelle tblKundenSelektion, die bereits angelegt wurden. Um diese Eigenschaft zu ändern, wechseln Sie zurück in den Entwurfsmodus und klicken doppelt auf den Beziehungspfeil zwischen den beiden Tabellen.

Die Abfrage liefert nur einen einzigen Datensatz.

Bild 5: Die Abfrage liefert nur einen einzigen Datensatz.

Es erscheint der Dialog aus Bild 6, in dem Sie die zweite Option auswählen: Beinhaltet ALLE Datensätze aus 'tblKunden' und nur die Datensätze aus 'tblKundenSelektion', bei denen die Inhalte der verknüpften Felder beider Tabellen gleich sind.

Festlegen der korrekten Verknüpfungseigenschaften

Bild 6: Festlegen der korrekten Verknüpfungseigenschaften

Der nächste Wechsel zur Datenblattansicht liefert dann auch die Ansicht aus Bild 7. Hier erkennen Sie schon, dass die Kontrollkästchen für das Feld Selektiert anklickbar sind. Bei den unteren Einträgen zeigen diese zwar noch einen undefinierten Zustand an, aber dies liegt daran, dass es schlicht noch keine verknüpften Datensätze mit dem entsprechenden Feld­inhalt gibt.

Zusammengeführte Tabellen

Bild 7: Zusammengeführte Tabellen

Dementsprechend liefert eine DLookup-Abfrage des Wertes des Feldes Selektiert für einen der Datensätze der Abfrage, in denen Selektiert noch nicht eingestellt wurde, den Wert Null zurück:

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!