Individuelle Auswahl mit eigener Tabelle

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

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar