{"id":55000624,"date":"2023-04-01T00:00:00","date_gmt":"2023-04-01T00:00:00","guid":{"rendered":"http:\/\/access-basics.de\/624"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Formulare_basics_Beispiel_Buecherverwaltung","status":"publish","type":"post","link":"https:\/\/access-basics.de\/index.php\/Formulare_basics_Beispiel_Buecherverwaltung.html","title":{"rendered":"Formulare [basics]: Beispiel B&uuml;cherverwaltung"},"content":{"rendered":"<p class='introduction'>F&uuml;r die neue Artikelreihe <b>Formulare [basics] <\/b>wollen wir zuvor eine passende Beispieldatenbank erstellen. Mit dieser wollen wir B&uuml;cher verwalten. Dieser Artikel zeigt, welche Tabellen wir in einer B&uuml;cherverwaltung ben&ouml;tigen und welche Daten diese Tabellen aufnehmen. Wir zeigen, wie Du die Tabellen erstellst und wie diese Tabellen miteinander verkn&uuml;pft sind. Wichtig ist, dass wir alle Verkn&uuml;pfungstypen abdecken, damit wir Beispiele f&uuml;r die Darstellungsarten f&uuml;r die verschiedenen Konstellationen haben &#8211; und wir wollen auch alle Felddatentypen vorhalten, um alle m&ouml;glichen Such- und Filterm&ouml;glichkeiten programmieren zu k&ouml;nnen.<\/p>\n<h2>Beispieldatenbank<\/h2>\n<p>Die Beispiele dieses Artikels findest Du in der Datenbank <b>FormulareBasics_BeispielBuecherverwaltung.accdb<\/b>.<\/p>\n<h2>Tabellen einer B&uuml;cherverwaltung<\/h2>\n<p>F&uuml;r eine B&uuml;cherverwaltung ben&ouml;tigt man in der Regel folgende Tabellen:<\/p>\n<ul>\n<li><b>B&uuml;cher<\/b>: Diese Tabelle enth&auml;lt alle Informationen zu den B&uuml;chern wie Titel, Autor, ISBN-Nummer, Verlag, Erscheinungsjahr, Genre, Anzahl der Seiten, Erscheinungsland und so weiter.<\/li>\n<li><b>Ausleihe<\/b>: Diese Tabelle enth&auml;lt Informationen dar&uuml;ber, wer das Buch ausgeliehen hat, wann es ausgeliehen wurde und wann es zur&uuml;ckgegeben werden soll. Zus&auml;tzlich k&ouml;nnen noch Spalten f&uuml;r die Ausleihdauer und eventuelle Strafen hinzugef&uuml;gt werden.<\/li>\n<li><b>Leser<\/b>: Diese Tabelle enth&auml;lt Informationen &uuml;ber die Kunden, die die B&uuml;cher ausleihen. Dazu geh&ouml;ren Name, Adresse, Telefonnummer und E-Mail-Adresse.<\/li>\n<li><b>Autoren<\/b>: Diese Tabelle enth&auml;lt Informationen &uuml;ber die Autoren, die die B&uuml;cher geschrieben haben. Dazu geh&ouml;ren Name, Geburtsdatum, Nationalit&auml;t, Bibliographie und gegebenenfalls weitere Informationen.<\/li>\n<li><b>Verlage<\/b>: Diese Tabelle enth&auml;lt Informationen &uuml;ber die Verlage, bei denen die B&uuml;cher ver&ouml;ffentlicht wurden. Dazu geh&ouml;ren Name, Adresse, Telefonnummer, E-Mail-Adresse und weitere Informationen.<\/li>\n<li><b>Kategorien<\/b>: Diese Tabelle enth&auml;lt Informationen &uuml;ber die Kategorien, in die die B&uuml;cher eingeteilt werden k&ouml;nnen. Dazu geh&ouml;ren Name, Beschreibung und eventuell weitere Informationen (zum Beispiel Sachbuch, Belletristik et cetera).<\/li>\n<li><b>Genre<\/b>: Genre des Buchs, also beispielsweise Krimi, Horror, Liebe, &#8230;<\/li>\n<li><b>L&auml;nder<\/b>: L&auml;nder f&uuml;r verschiedene Elemente wie Nationalit&auml;t von Autoren oder Erscheinungsland von B&uuml;chern.<\/li>\n<li>Daneben gibt es noch Verkn&uuml;pfungstabellen, die daf&uuml;r sorgen, dass ein oder mehrere Datens&auml;tze der einen Tabelle mit einem oder mehreren Datens&auml;tzen der anderen Tabelle verkn&uuml;pft werden k&ouml;nnen. Diese verkn&uuml;pfen beispielsweise die Tabellen mit den B&uuml;chern und den Autoren und die mit den B&uuml;chern und Genres. Au&szlig;erdem ist prinzipiell auch die Tabelle mit den Ausleihen eine solche Verkn&uuml;pfungstabelle, wenn auch mit weiteren Daten als nur den reinen Verkn&uuml;pfungsdaten. Mehr dazu weiter unten!<\/li>\n<\/ul>\n<p>Damit haben wir gen&uuml;gend Material, mit denen wir die Formulare dieser Artikelreihe best&uuml;cken k&ouml;nnen. Wir haben Tabellen, die nicht &uuml;ber Fremdschl&uuml;sselfelder mit anderen Tabellen verkn&uuml;pft sind und die wir in einem einfachen Formular abbilden k&ouml;nnen, das nur an diese Tabelle gebunden ist. Wir haben 1:n-Beziehungen dabei, wo Daten &uuml;ber ein Nachschlagefeld ausgew&auml;hlt werden (Lookupbeziehung, B&uuml;cher und Genre) und wir haben 1:n-Beziehungen, wo wir die Daten &uuml;ber ein Unterformular zu denen im Hauptformular zuordnen k&ouml;nnen (beispielsweise Verlage und B&uuml;cher).<\/p>\n<p>Und wir haben eine m:n-Beziehung zwischen den beiden Tabellen mit den B&uuml;chern und Kategorien, damit wir jedem Buch eine oder mehrere Kategorien zuweisen k&ouml;nnen, das Gleiche k&ouml;nnen wir noch mit Autoren und B&uuml;chern erledigen.<\/p>\n<h2>Reihenfolge beim Erstellen des Datenmodells<\/h2>\n<p>Wenn wir ein Datenmodell erstellen, starten wir am einfachsten mit den Tabellen, die keine Fremdschl&uuml;sselfelder zur Verkn&uuml;pfung mit den Daten anderer Tabellen enthalten. Erst danach legen wir die Tabellen an, die &uuml;ber Fremdschl&uuml;sselfelder mit den zuerst angelegten Tabellen verkn&uuml;pft sind. Der Hintergrund ist, dass wir dann die Fremdschl&uuml;sselfelder direkt mit dem Nachschlage-Assistenten hinzuf&uuml;gen k&ouml;nnen und nicht mit der Erstellung zweiter Tabellen gleichzeitig besch&auml;ftigt sind.<\/p>\n<p>Am Besten beginnt man mit den sogenannten Lookup-Tabellen, die meist lediglich ein Prim&auml;rschl&uuml;sselfeld sowie eine Bezeichnung enthalten. In diesem Fall finden wir mit der Tabelle <b>tblLaender <\/b>ein passendes Exemplar.<\/p>\n<h2>Die Tabelle tblLaender<\/h2>\n<p>Die Tabelle <b>tblLaender <\/b>enth&auml;lt drei Felder: Das Prim&auml;rschl&uuml;sselfeld <b>LandID<\/b>, das Feld mit der Bezeichnung des Landes namens <b>Land<\/b> sowie ein Feld namens Nationalit&auml;t. F&uuml;r das Prim&auml;rschl&uuml;sselfeld legen wir den Datentyp <b>Autowert <\/b>fest. F&uuml;r das Feld <b>Land <\/b>definieren wir einen eindeutigen Index, damit jedes Land nur einmal eingegeben werden kann (siehe Bild 1).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_624_003.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_624_003.png\" alt=\"Tabelle zum Speichern der L&auml;nder\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 1: Tabelle zum Speichern der L&auml;nder<\/p>\n<p>Diese Tabelle dient sp&auml;ter als Nachschlagetabelle gleich f&uuml;r zwei weitere Tabellen. In der Tabelle <b>tblBuecher <\/b>wird es f&uuml;r die Auswahl des Erscheinungslands verwendet, in der Tabelle <b>tblAutoren <\/b>f&uuml;r die Nationalit&auml;t des jeweiligen Autors.<\/p>\n<h2>Die Tabelle tblKategorien<\/h2>\n<p>&Auml;hnlich aufgebaut wie die Tabelle <b>tblLaender<\/b> ist die Tabelle <b>tblKategorien<\/b>. Sie enth&auml;lt ebenfalls nur ein Prim&auml;rschl&uuml;sselfeld namens <b>KategorieID<\/b> sowie ein Feld zur Eingabe der jeweiligen Bezeichnung mit dem Datentyp <b>Kurzer Text<\/b>.<\/p>\n<p>Auch f&uuml;r dieses Feld legen wir einen eindeutigen Index fest, damit jede Kategorie nur einmal vorkommt (siehe Bild 2).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_624_004.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_624_004.png\" alt=\"Tabelle zum Speichern der Kategorien\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 2: Tabelle zum Speichern der Kategorien<\/p>\n<h2>Die Tabelle tblGenres<\/h2>\n<p>Und mit der Tabelle <b>tblGenres <\/b>erhalten wir die dritte Tabelle, die als Nachschlagetabelle dient (siehe Bild 3). Neben dem Prim&auml;rsch&uuml;sselfeld <b>GenreID <\/b>enth&auml;lt die Tabelle das mit einem eindeutigen Index versehene Feld <b>Genre<\/b>.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_624_004png.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_624_004png.png\" alt=\"Tabelle zum Speichern der Genres\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 3: Tabelle zum Speichern der Genres<\/p>\n<h2>Die Tabelle tblRollen<\/h2>\n<p>Mit dieser Tabelle wollen wir die verschiedenen Rollen festhalten, die Autoren eines Buchs einnehmen k&ouml;nnen &#8211; zum Beispiel Hauptautor, Co-Autor et cetera.<\/p>\n<h2>Die Tabelle tblLeser<\/h2>\n<p>Wir wollen in unserer B&uuml;cherverwaltung auch festhalten, wem wir ein Buch aus unserer Sammlung geliehen haben. Die entsprechende Tabelle hei&szlig;t <b>tblLeser<\/b> und sieht in der Entwurfsansicht wie in Bild 4 aus.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_624_002.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_624_002.png\" alt=\"Tabelle zum Speichern der Leser\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 4: Tabelle zum Speichern der Leser<\/p>\n<p>Diese Tabelle enth&auml;lt neben dem Prim&auml;rschl&uuml;sselfeld <b>LeserID <\/b>die Textfelder <b>Vorname<\/b>, <b>Nachname<\/b>, <b>Telefon <\/b>und <b>EMail <\/b>sowie ein Datumsfeld namens <b>Geburtsdatum<\/b>.<\/p>\n<h2>Die Tabelle tblVerlage<\/h2>\n<p>Danach folgt die Tabelle <b>tblVerlage<\/b>. Diese hat bereits ein Fremdschl&uuml;sselfeld, n&auml;mlich zur Auswahl des Landes des Verlags. Gleichzeitig wird sie &uuml;ber ihr Prim&auml;rschl&uuml;sselfeld mit dem Fremdschl&uuml;sselfeld einer noch zu erstellenden Tabelle namens tblBuecher verkn&uuml;pft. Die Tabelle enth&auml;lt die Felder <b>VerlagID<\/b>, <b>Verlag<\/b>, <b>Strasse<\/b>, <b>PLZ<\/b>, <b>Ort<\/b>, <b>LandID <\/b>und <b>EMail<\/b>. F&uuml;r das Feld <b>VerlagID <\/b>hinterlegen wir den Datentyp <b>Autowert <\/b>und legen es als Prim&auml;rschl&uuml;sselfeld der Tabelle fest. F&uuml;r das Feld <b>Verlag<\/b> definieren wir durch Einstellen der Eigenschaft <b>Indiziert <\/b>auf den Wert <b>Ja (Ohne Duplikate) <\/b>einen eindeutigen Index. Dadurch stellen wir sicher, dass kein Verlagsname doppelt eingetragen wird, was sp&auml;ter zu Duplikaten und Inkonsistenzen f&uuml;hren k&ouml;nnte. Die &uuml;brigen Felder definieren wir fast alle mit dem Datentyp <b>Kurzer Text<\/b>. Die Ausnahme ist das Feld <b>LandID<\/b>. F&uuml;r dieses w&auml;hlen wir den Datentyp <b>Nachschlage-Assistent <\/b>aus. Hier w&auml;hlen wir im ersten Schritt die Tabelle <b>tblLaender <\/b>aus. Im zweiten Schritt selektieren wir die Felder <b>LandID <\/b>und <b>Land <\/b>(siehe Bild 5). <\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_624_007.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_624_007.png\" alt=\"Hinzuf&uuml;gen der Felder f&uuml;r das Nachschlagefeld\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 5: Hinzuf&uuml;gen der Felder f&uuml;r das Nachschlagefeld<\/p>\n<p>Danach stellen wir noch eine aufsteigende Sortierung f&uuml;r das Feld <b>Land <\/b>ein und aktivieren im letzten Schritt die Eigenschaft <b>Datenintegrit&auml;t aktivieren<\/b>, damit referenzielle Integrit&auml;t f&uuml;r die Beziehung festgelegt wird. Anschlie&szlig;end sieht die Tabelle im Entwurf wie in Bild 6 aus. Hier haben wir die Registerseite <b>Nachschlagen<\/b> der Eigenschaften f&uuml;r das Feld <b>LandID <\/b>aktiviert, damit man erkennen kann, welche &Auml;nderungen durch das Anwenden des Nachschlage-Assistenten erfolgt sind. Hier wurden s&auml;mtliche f&uuml;r das Nachschlagefeld relevanten Daten definiert.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_624_006.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_624_006.png\" alt=\"Tabelle zum Speichern der Verlage\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 6: Tabelle zum Speichern der Verlage<\/p>\n<h2>Die Tabelle tblAutoren<\/h2>\n<p>Die Tabelle <b>tblAutoren <\/b>ist die zweite Tabelle, welche ein Nachschlagefeld zum Ausw&auml;hlen von Daten aus der Tabelle <b>tblLaender <\/b>enth&auml;lt. Daneben enth&auml;lt die Tabelle die Felder <b>AutorID <\/b>als Prim&auml;rschl&uuml;sselfeld, zwei Textfelder f&uuml;r <b>Vorname <\/b>und <b>Nachname <\/b>sowie ein Datumsfeld namens <b>Geburtsdatum<\/b>.<\/p>\n<p>Das Feld, welches wir mit der Tabelle <b>tblLaender <\/b>verkn&uuml;pfen wollen, hei&szlig;t nun allerdings nicht <b>LandID<\/b>, sondern <b>NationalitaetID <\/b>und wir wollen aus der Tabelle <b>tblLaender <\/b>nicht die Werte des Feldes <b>Land<\/b>, sondern <b>Nationalitaet <\/b>zur Auswahl anbieten. Deshalb f&uuml;gen wir im entsprechenden Schritt des Nachschlage-Assistenten auch das Feld <b>Nationalitaet <\/b>als zweites Feld neben <b>LandID <\/b>hinzu und nicht <b>Land<\/b> (siehe Bild 7).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_624_008.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_624_008.png\" alt=\"Nachschlage-Assistent, diesmal f&uuml;r die Nationalit&auml;t\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 7: Nachschlage-Assistent, diesmal f&uuml;r die Nationalit&auml;t<\/p>\n<p>Die Tabelle <b>tblAutoren<\/b> gestalten wir in der Entwurfsansicht wie in Bild 8.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_624_009.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_624_009.png\" alt=\"Tabelle zum Speichern der Autoren\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 8: Tabelle zum Speichern der Autoren<\/p>\n<h2>Die Tabelle tblBuecher<\/h2>\n<p>Eine der wichtigsten Tabellen ist die zum Speichern der B&uuml;cher und ihrer Informationen. Diese sieht in der Entwurfsansicht wie in Bild 9 aus.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_624_010.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_624_010.png\" alt=\"Tabelle zum Speichern der B&uuml;cher\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 9: Tabelle zum Speichern der B&uuml;cher<\/p>\n<p>Die Tabelle enth&auml;lt die &uuml;blichen Informationen &uuml;ber B&uuml;cher wie Titel, Erscheinungsjahr, ISBN, Seitenzahl und Inhaltsangabe.<\/p>\n<p>Zus&auml;tzlich enth&auml;lt die Tabelle Fremdschl&uuml;sselfelder zur Auswahl jeweils eines Datensatzes aus den Tabellen <b>tblVerlage<\/b>, <b>tblKategorien <\/b>und <b>tblGenres<\/b>.<\/p>\n<p>Mit dem Feld <b>Gelesen <\/b>kann der Betreiber der Datenbank angeben, ob er das Buch bereits gelesen hat.<\/p>\n<p>Schlie&szlig;lich haben wir mit dem Feld <b>Bilder <\/b>noch ein <b>Anlage<\/b>-Feld zum Speichern eines oder mehrerer Bilder zum Buch hinzugef&uuml;gt.<\/p>\n<h2>Die Verkn&uuml;pfungstabelle tblAutorenBuecher<\/h2>\n<p>Diese Tabelle ist nicht nur eine m:n-Tabelle, sondern sie verkn&uuml;pft gleich drei Tabellen miteinander. Neben den beiden Haupttabellen <b>tblBuecher <\/b>und <b>tblAutoren <\/b>soll sie auch noch eine Verkn&uuml;pfung zur Tabelle <b>tblRollen <\/b>hinzuf&uuml;gen.<\/p>\n<p>Warum legen wir nicht einfach f&uuml;r jedes Buch in einem Feld namens <b>AutorID <\/b>fest, welcher Autor es geschrieben hat Damit k&ouml;nnten wir zwar f&uuml;r jedes Buch einen Autor festlegen und umgekehrt auch f&uuml;r jeden Autor kein, ein oder mehrere B&uuml;cher. Aber wir haben dann nicht die M&ouml;glichkeit, auch einmal f&uuml;r ein Buch mehr als einen Autor festzulegen &#8211; und auch das kommt vor. Es gibt sogar B&uuml;cher, die aus einzelnen Beitr&auml;gen von jeweils einem oder mehreren Autoren bestehen. Also wollen wir erm&ouml;glichen, dass wir nicht nur f&uuml;r jeden Autor mehrere B&uuml;cher festlegen k&ouml;nnen, sondern auch f&uuml;r jedes Buch mehrere Autoren. Dazu ben&ouml;tigen wir eine Verkn&uuml;pfungstabelle, wie wir sie im Artikel <b>Tabellen [basics]: m:n-Beziehungen <\/b>(<b>www.access-basics.de\/574<\/b>) beschrieben haben.<\/p>\n<p>Wir wollen aber nicht nur die Datens&auml;tze der beiden Tabellen <b>tblBuecher <\/b>und <b>tblAutoren <\/b>miteinander kombinieren, sondern jeder diese Kombinationen auch noch jeweils eine Funktion zuweisen. Diese k&ouml;nnte man einfach in ein Textfeld namens Rolle eintragen. Da es aber nicht viele verschiedene Rollen in diesem Bereich gibt, werden sich die Eintr&auml;ge oft wiederholen und fr&uuml;her oder sp&auml;ter werden sich Schreibfehler oder alternative Bezeichnungen f&uuml;r die gleiche Rolle einschleichen, was ein Abfragen beispielsweise der Beteiligung von Autoren in bestimmten Rollen erschwert. Also gliedern wir dies lieber in eine Lookup-Tabelle namens <b>tblRollen <\/b>aus, die wir weiter oben bereits vorgestellt haben.<\/p>\n<p>Diese Tabelle definieren wir wie in Bild 10.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_624_011.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_624_011.png\" alt=\"Tabelle zum Speichern der Beziehung zwischen B&uuml;chern und Autoren und die Festlegung der jeweiligen Rolle des Autors\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 10: Tabelle zum Speichern der Beziehung zwischen B&uuml;chern und Autoren und die Festlegung der jeweiligen Rolle des Autors<\/p>\n<h2>Jetzt Autor\/Buch-Kombination soll einmalig sein<\/h2>\n<p>Zus&auml;tzlich wollen wir hier sicherstellen, dass jeder Autor nur einmal jedem Buch zugeordnet werden kann. Dazu legen wir einen zusammengesetzten eindeutigen Index f&uuml;r die beiden Felder <b>BuchID <\/b>und <b>AutorID <\/b>an (siehe Bild 11). Dazu nutzen wir den Dialog <b>Indizes: tblAutorenBuecher<\/b>. Wie Du diesen genau verwendest, erl&auml;utern wir im Artikel <b>Tabellen [basics]: Mit Indizes arbeiten <\/b>(<b>www.access-basics.de\/570<\/b>). Falls Du der Ansicht bist, dass es auch m&ouml;glich sein sollte, dass ein Autor in verschiedenen Rollen an einem Buch beteiligt ist, ist das auch kein Problem: Dann erweiterst Du den Index einfach noch auf das Feld <b>RolleID<\/b>. Damit kann dann jede Kombination aus Autor, Buch und Rolle einmal angelegt werden.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_624_014.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_624_014.png\" alt=\"Festlegen eines zusammengesetzten Indexes f&uuml;r die Tabelle tblAutorenBuecher\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 11: Festlegen eines zusammengesetzten Indexes f&uuml;r die Tabelle tblAutorenBuecher<\/p>\n<h2>Nachschlagefeld f&uuml;r den Autor<\/h2>\n<p>Um den Autor auszuw&auml;hlen, legen wir, wie weiter oben bereits f&uuml;r ein anderes Fremdschl&uuml;sselfeld beschrieben, ebenfalls ein Nachschlagefeld an. Dabei verwenden wir zun&auml;chst wieder den Nachschlage-Assistenten. Dieser bietet jedoch immer nur die M&ouml;glichkeit der Angabe eines einzigen Feldes zur Anzeige im Nachschlagefeld. Da die Tabelle <b>tblAutoren <\/b>mit <b>Vorname <\/b>und <b>Nachname <\/b>zwei Felder enth&auml;lt, die wir gern anzeigen w&uuml;rden, nehmen wir hier nachtr&auml;glich noch eine Anpassung vor. Dazu &ouml;ffnen wir die Tabelle <b>tblAutorenBuecher <\/b>in der Entwurfsansicht und markieren das Feld <b>AutorID<\/b>. Dann wechseln wir im Bereich <b>Feldeigenschaften <\/b>zur Registerseite <b>Nachschlagen<\/b>. Hier klicken wir in die Eigenschaft Datensatzherkunft und dann auf die Schaltfl&auml;che mit den drei Punkten (siehe Bild 12).<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_624_016.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_624_016.png\" alt=\"Bearbeiten der Datensatzherkunft eines Nachschlagefeldes\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 12: Bearbeiten der Datensatzherkunft eines Nachschlagefeldes<\/p>\n<p>Im nun erscheinenden Abfrageentwurf ersetzen wir in der zweiten Spalte das Feld <b>Nachname <\/b>durch den Ausdruck <b>Autor: [Nachname] &#038; &#8222;, &#8220; &#038; [Vorname] <\/b>(siehe Bild 13). Damit k&ouml;nnen wir nun die Autoren in dem angegebenen Format ausw&auml;hlen.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_624_017.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_624_017.png\" alt=\"&Auml;ndern des anzuzeigenden Feldes im Nachschlagefeld\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 13: &Auml;ndern des anzuzeigenden Feldes im Nachschlagefeld<\/p>\n<h2>Die Tabelle tblLeser<\/h2>\n<p>Wer eine umfangreiche Buchsammlung sein Eigen nennt, verleiht auch mal das eine oder andere Buch. Und wenn wir schon eine Datenbank zur Verwaltung der B&uuml;cher nutzen, wollen wir keinen Karteikasten zum Nachhalten der verliehenen B&uuml;cher verwenden. Also f&uuml;gen wir der Datenbank noch zwei weitere Tabellen hinzu. Die erste hei&szlig;t <b>tblLeser<\/b> und speichert die Daten zu den Menschen, denen wir ein oder mehrere B&uuml;cher verleihen. Der Entwurf dieser Tabelle kommt mit den Feldern aus Bild 14 daher.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_624_012.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_624_012.png\" alt=\"Tabelle zum Speichern der Daten von Lesern, die sich B&uuml;cher leihen\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 14: Tabelle zum Speichern der Daten von Lesern, die sich B&uuml;cher leihen<\/p>\n<h2>Die Tabelle tblAusleihen<\/h2>\n<p>Mit dieser Tabelle wollen wir speichern, welcher Leser sich wann welches Buch ausgeliehen hat. Die Tabelle entwerfen wir wie in Bild 15. Diese Tabelle ist wiederum eine Tabelle zum Herstellen einer m:n-Beziehung. Damit erstellen wir eine Beziehung zwischen einem Buch und einem Leser, der dieses Buch ausgeliehen hat.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_624_013.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_624_013.png\" alt=\"Tabelle zum Speichern der Zuordnung von Lesern zu entliehenen B&uuml;chern\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 15: Tabelle zum Speichern der Zuordnung von Lesern zu entliehenen B&uuml;chern<\/p>\n<p>Au&szlig;erdem legen wir zwei Datumsfelder an. Mit dem ersten namens <b>Ausleihdatum <\/b>k&ouml;nnen wir angeben, wann das Buch verliehen wurde und mit dem zweiten, wann es zur&uuml;ckgegeben wurde (<b>Rueckgabedatum<\/b>).<\/p>\n<h2>Vorbereitungen f&uuml;r die Nutzung der Tabellen in Formularen und Berichten<\/h2>\n<p>Wenn wir optimal vom Entwurf des Datenmodells profitieren m&ouml;chten, wenn wir darauf aufbauend Formulare und Berichte erstellen wollen, k&ouml;nnen wir mehrere Schritte durchf&uuml;hren.<\/p>\n<ul>\n<li>Den ersten haben wir bereits erledigt: Wir haben f&uuml;r die Fremdschl&uuml;sselfelder der Tabellen Nachschlagefelder eingerichtet. Damit sorgen wir daf&uuml;r, dass beim Hinzuf&uuml;gen solcher Felder in Formulare direkt Kombinationsfelder angelegt werden, welche die Eigenschaften der Nachschlagefelder &uuml;bernehmen.<\/li>\n<li>Der zweite ist das Vorbereiten der Bezeichnungsfelder. Wenn wir ein Feld aus der Feldliste eines der Datensatzquelle eines Formulars in den Formularentwurf ziehen, legt Access automatisch ein Bezeichnungsfeld f&uuml;r das jeweilige Steuerelement an. Dieses erh&auml;lt standardm&auml;&szlig;ig den Feldnamen als Beschriftung. In manchen F&auml;llen muss man hier noch nacharbeiten: Bei den Fremdschl&uuml;sselfeldern, die in der von uns gepflegten Notation den Namen des jeweiligen Elements im Singular plus <b>ID <\/b>erhalten, beispielsweise <b>AutorID<\/b>, w&uuml;nschen wir uns beispielsweise eine andere Beschriftung wie <b>Autor<\/b>. &Auml;hnliches gilt f&uuml;r Felder wie <b>EMail<\/b>, hier soll das Bezeichnungsfeld den Text <b>E-Mail <\/b>anzeigen. Felder, bei denen wir Sonderzeichen wie &auml;, &ouml; oder &uuml; durch ae, oe oder ue ersetzt haben, wollen wir mit der Beschriftung mit dem jeweiligen Sonderzeichen versehen.<\/li>\n<\/ul>\n<p>Um dies zu erledigen, gehen wir in den Entwurf der verschiedenen Tabellen und tragen die Bezeichnung, die wir in den Bezeichnungsfeldern sehen wollen, f&uuml;r die Eigenschaft <b>Beschriftung <\/b>der jeweiligen Felder ein &#8211; wie beispielsweise in Bild 16.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_624_018.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_624_018.png\" alt=\"Einstellen der Beschriftung als Vorbereitung f&uuml;r die &Uuml;bernahme von Feldern in Formulare\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 16: Einstellen der Beschriftung als Vorbereitung f&uuml;r die &Uuml;bernahme von Feldern in Formulare<\/p>\n<h2>Restriktionen und G&uuml;ltigkeitsregeln<\/h2>\n<p>Neben diesen eher oberfl&auml;chlichen Einstellungen k&ouml;nnen wir mit verschiedenen Eigenschaften das Verhalten bei der Eingabe in die verschiedenen Formulare steuern. Das erledigen wir beispielsweise mit den folgenden Eigenschaften:<\/p>\n<ul>\n<li><b>Standardwert<\/b>: Hiermit geben wir einen Wert vor, der beim Anlegen eines neuen Datensatzes vorbelegt werden soll.<\/li>\n<li><b>G&uuml;ltigkeitsregel <\/b>und <b>G&uuml;ltigkeitsmeldung<\/b>: Legt eine Regel fest, die bei Nichteinhaltung die Anzeige der angegebenen Meldung hervorruft &#8211; weitere Infos siehe <b>Tabellen [basics]: G&uuml;ltigkeitsregeln <\/b>(<b>www.access-basics.de\/583<\/b>).<\/li>\n<li><b>Eingabe erforderlich<\/b>: Legt fest, ob ein Feld gef&uuml;llt werden muss.<\/li>\n<li><b>Indiziert<\/b>: Hiermit legen wir prim&auml;r fest, ob das Feld indiziert werden soll, um es schnell sortier- und durchsuchbar zu machen. Au&szlig;erdem k&ouml;nnen wir hier angegeben, dass ein Feld jeden Wert nur einmal aufnehmen k&ouml;nnen soll. Dies ist zum Beispiel bei den Lookuptabellen wie <b>tblGenres, tblKategorien<\/b>, <b>tblLaender <\/b>oder <b>tblRollen <\/b>f&uuml;r die Felder mit dem anzuzeigenden Inhalt sinnvoll. Mehr dazu unter <b>Tabellen [basics]: Mit Indizes arbeiten <\/b>(<b>www.access-basics.de\/570<\/b>).<\/li>\n<\/ul>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Damit ist das Datenmodell in einer ersten Version, mit der wir uns an die Programmierung der Formulare begeben, komplett (siehe Bild 17). Hier siehst Du alle vorgestellten Tabellen sowie ihre Beziehungen.<\/p>\n<p class=\"image\"><a rel=\"lightbox\" href=\"..\/tl_files\/images\/pic_624_015.png\"><img decoding=\"async\" src=\"..\/tl_files\/images\/pic_624_015.png\" alt=\"Datenmodell der Anwendung\" width=\"325\" \/><\/a><\/p>\n<p class='imagetext'>Bild 17: Datenmodell der Anwendung<\/p>\n<p>In weiteren Artikeln schauen wir uns an, wie wir die unterschiedlichen Tabellen und ihre Beziehungen in Formularen abbilden k&ouml;nnen.<\/p>\n<p>Den Start machen wir mit der Abbildung einer einfachen Tabelle in <b>Formulare [basics]: Daten aus einer Tabelle <\/b>(<b>www.access-basics.de\/621<\/b>).<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>FormulareBasics_BeispielBuecherverwaltung.accdb<\/p>\n<p><a href=\"..\/Downloads\/Beispiele\/{3EFE811E-A0DC-4AD0-9848-BB50829BBB07}\/FormulareBasics_Beispieldatenbank.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>F&uuml;r die neue Artikelreihe <b>Formulare [basics] <\/b>wollen wir zuvor eine passende Beispieldatenbank erstellen. Mit dieser wollen wir B&uuml;cher verwalten. Dieser Artikel zeigt, welche Tabellen wir in einer B&uuml;cherverwaltung ben&ouml;tigen und welche Daten diese Tabellen aufnehmen. Wir zeigen, wie Du die Tabellen erstellst und wie diese Tabellen miteinander verkn&uuml;pft sind. Wichtig ist, dass wir alle Verkn&uuml;pfungstypen abdecken, damit wir Beispiele f&uuml;r die Darstellungsarten f&uuml;r die verschiedenen Konstellationen haben &#8211; und wir wollen auch alle Felddatentypen vorhalten, um alle m&ouml;glichen Such- und Filterm&ouml;glichkeiten programmieren zu k&ouml;nnen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022023,662023],"tags":[],"class_list":["post-55000624","post","type-post","status-publish","format-standard","hentry","category-66022023","category-662023"],"aioseo_notices":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v15.9.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Formulare [basics]: Beispiel B&uuml;cherverwaltung - Access [basics]<\/title>\n<link rel=\"canonical\" href=\"https:\/\/access-basics.de\/index.php\/Formulare_basics_Beispiel_Buecherverwaltung.html\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Formulare [basics]: Beispiel B&uuml;cherverwaltung - Access [basics]\" \/>\n<meta property=\"og:description\" content=\"F&uuml;r die neue Artikelreihe Formulare [basics] wollen wir zuvor eine passende Beispieldatenbank erstellen. Mit dieser wollen wir B&uuml;cher verwalten. Dieser Artikel zeigt, welche Tabellen wir in einer B&uuml;cherverwaltung ben&ouml;tigen und welche Daten diese Tabellen aufnehmen. Wir zeigen, wie Du die Tabellen erstellst und wie diese Tabellen miteinander verkn&uuml;pft sind. Wichtig ist, dass wir alle Verkn&uuml;pfungstypen abdecken, damit wir Beispiele f&uuml;r die Darstellungsarten f&uuml;r die verschiedenen Konstellationen haben - und wir wollen auch alle Felddatentypen vorhalten, um alle m&ouml;glichen Such- und Filterm&ouml;glichkeiten programmieren zu k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-basics.de\/index.php\/Formulare_basics_Beispiel_Buecherverwaltung.html\" \/>\n<meta property=\"og:site_name\" content=\"Access [basics]\" \/>\n<meta property=\"article:published_time\" content=\"2023-04-01T00:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"-0001-11-30T00:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/..\/tl_files\/images\/pic_624_003.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Gesch\u00e4tzte Lesezeit\">\n\t<meta name=\"twitter:data1\" content=\"15\u00a0Minuten\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/access-basics.de\/#website\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Access [basics]\",\"description\":\"DAS ACCESS-MAGAZIN F\\u00dcR ALLE, DIE VON 0 AUF 100 WOLLEN\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/access-basics.de\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Formulare_basics_Beispiel_Buecherverwaltung.html#primaryimage\",\"inLanguage\":\"de\",\"url\":\"..\/tl_files\/images\/pic_624_003.png\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Formulare_basics_Beispiel_Buecherverwaltung.html#webpage\",\"url\":\"https:\/\/access-basics.de\/index.php\/Formulare_basics_Beispiel_Buecherverwaltung.html\",\"name\":\"Formulare [basics]: Beispiel B&uuml;cherverwaltung - Access [basics]\",\"isPartOf\":{\"@id\":\"https:\/\/access-basics.de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Formulare_basics_Beispiel_Buecherverwaltung.html#primaryimage\"},\"datePublished\":\"2023-04-01T00:00:00+00:00\",\"dateModified\":\"-0001-11-30T00:00:00+00:00\",\"author\":{\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\"},\"breadcrumb\":{\"@id\":\"https:\/\/access-basics.de\/index.php\/Formulare_basics_Beispiel_Buecherverwaltung.html#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/access-basics.de\/index.php\/Formulare_basics_Beispiel_Buecherverwaltung.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Formulare_basics_Beispiel_Buecherverwaltung.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/\",\"url\":\"https:\/\/access-basics.de\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/access-basics.de\/index.php\/Formulare_basics_Beispiel_Buecherverwaltung.html\",\"url\":\"https:\/\/access-basics.de\/index.php\/Formulare_basics_Beispiel_Buecherverwaltung.html\",\"name\":\"Formulare [basics]: Beispiel B&uuml;cherverwaltung\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/access-basics.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/access-basics.de\/#personlogo\",\"inLanguage\":\"de\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","_links":{"self":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000624","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/comments?post=55000624"}],"version-history":[{"count":0,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/posts\/55000624\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/media?parent=55000624"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/categories?post=55000624"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-basics.de\/index.php\/data\/wp\/v2\/tags?post=55000624"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}