Robert Großkopf Aufbau einer Datenbank am Beispiel einer Adressdatenbank - Februar 2010 / Mai 2010 - Inhaltsverzeichnis Tabellenentwurf....................................................................................................................................2 Primärschlüssel.....................................................................................................................................3 Auslagerung von Daten in eine 2. Tabelle............................................................................................4 Beziehung zwischen den Tabellen........................................................................................................6 Das erste Formular...............................................................................................................................8 Der Formularassistent......................................................................................................................8 Weitere Formularbearbeitung........................................................................................................12 Bearbeitung von Beschriftungsfeldern......................................................................................13 Erstellung eines Listenfeldes....................................................................................................15 Nachträgliche Erstellung eines weiteren Listenfeldes..............................................................22 Erstellung eines Formulares mit Subformular....................................................................................26 Seite 1 von 31 Eine Adressverwaltung kann bereits mit einfachen Bordmitteln von Base recht schnell erstellt werden. Grundlage der Adressverwaltung ist eine Tabelle, in der in unterschiedlichen Spalten entsprechend Vorname, Nachname usw. eingetragen werden können. Im Gegensatz zu Tabellen aus einer Tabellenkalkulation muss aber bei so einer Tabelle von vornherein klar sein, welcher Art die Inhalte einer jeden Spalte sind. Vorname und Nachname sind immer Texte. Um so eine Tabelle zu erstellen wird in Base der Tabellenentwurf gestartet. Tabellenentwurf Wie oben bei dem Vornamen zu sehen schlägt Base, wie bei allen anderen Feldern, bereits vor, den Feldtyp „Text [VARCHAR]“ zu nehmen. Grundsätzlich hat diese Eigenschaft immer die Möglichkeit, wirklich alles in die Spalten einzugeben. Nur schließt sie gleichzeitig aus, dass besondere Möglichkeiten von Datumsfeldern, Zahlenfeldern oder gar Bildmaterial enthaltenden Feldern später genutzt werden können. So ist deswegen z.B. das Geburtsdatum (GebDat) natürlich mit der Feldtyp „Datum [DATE]“ versehen. Wenn aber z.B. das Feld für die Telefonnummer als „Zahl [NUMERIC]“ angelegt wird, dann ist es nicht mehr möglich, führende Nullen oder Schrägstriche o.ä. in diesem Feld unterzubringen. Im Unteren Bereich des Entwurfsfensters befinden sich weitere Einstellungen zu den Felder: Ist Seite 2 von 31 „Eingabe erforderlich“ auf „Ja“ gesetzt, so ist eine Speicherung des Datensatzes nur möglich, wenn im obigen Beispiel ein Vorname eingegeben wurde. Die maximale Länge des Namens ist auf 50 Zeichen festgelegt (Standardvorschlag, kann bei Bedarf erweitert werden). Ein Standardwert für den Inhalt ist nicht festgelegt, da natürlich nicht einmal annähern jede Person „Otto“ o.ä. heißt. Das Format-Beispiel lässt ein „@“ in hellgrau erscheinen. Das „@“ steht für Texteingabe jeglicher Art. Bei Zahlen kann hier z.B. die Angabe als Währungsfeld in € gewählt werden. Dies hat aber nur etwas mit der späteren Darstellung, nicht mit der Speicherung in der Datenbank zu tun. Primärschlüssel Meist scheitert der erste Versuch der Eingabe in eine Tabelle daran, dass ein für die spätere Datenverwaltung unabdingbares Feld vergessen wurde: der Primärschlüssel. Dieses Feld ist, wie der Name andeute, das zuerst vorhandene, Grundlegende und einzigartige Feld einer jeden Tabelle. Anhand dieses Feldes werden die Daten später zum Suchen innerhalb der Datenbank indiziert. Deshalb darf ein Primärschlüsselfeld auch keine doppelten Werte haben. Prinzipiell ist jede Feldart für den Zusatz „Primärschlüssel“ geeignet. Wenn allerdings z.B. der Vorname zum Primärschlüssel erklärt würde, könnten 2 Personen mit gleichem Vornamen in der Datenbank nicht verwaltet werden. Mehr Ähnlichkeit mit Primärschlüsseln haben da schon Felder wie z.B. das der Postleitzahl oder das einer Bankleitzahl. Am einfachsten und unkompliziertesten ist es hingegen, einfach ein zusätzliches Zahlenfeld festzulegen, das zudem noch automatisch hochgezählt wird. Das Feld bekommt den Feldtyp „Integer [INTEGER]“ und wird mit der Eigenschaft Auto-Wert versehen. Der Name für das Feld ist wieder beliebig zu wählen. Häufig wird dafür aber das Kürzel „ID“ verwandt – in Anlehnung an „Identifikationsfeld“. Seite 3 von 31 Ist die Tabelle mit Primärschlüssel erstellt, so ist die Datenbank vom Prinzip her gebrauchsfertig. Namen und Adressen können eingegeben werden, die Tabelle kann für Serienbriefe genutzt werden usw. Auslagerung von Daten in eine 2. Tabelle Je mehr Daten allerdings in die Tabelle kommen, desto mehr fällt auf, dass in einzelne Felder immer wieder die gleichen Texte eingetragen werden. Manchmal sind es dann auch nicht die ganz genau gleichen Texte, da Schreibfehler ungewollt zusätzliche Wortschöpfungen erzeugen. Diese Mehrfacheingaben sind bei einer Adressdatenbank z.B. einer Schule oder eines Sportvereins zuerst bei den Feldern „Ort“ und „Postleitzahl“ zu verzeichnen. Um solche Mehrfacheingaben zu umgehen werden die entsprechenden Felder aus der Haupttabelle in eigene Tabellen ausgelagert. Seite 4 von 31 Diese Auslagerung hat den Vorteil, dass die Datenbank selbst wegen sehr vieler Wiederholungen nicht weiter aufgebläht wird und dass eben Schreibfehler eher vermieden werden. Die Auslagerungen haben für den frischen Datenbänkler aber den Nachteil, dass die Haupttabelle jetzt nicht mehr so ohne weiteres editierbar ist. In der Haupttabelle steht jetzt statt der Postleitzahl nur noch eine Nummer, die auf den entsprechenden Primärschlüssel der Postleitzahltabelle verweist. Seite 5 von 31 Eine 2. Tabelle wurde erstellt, die vorherigen Felder für die Postleitzahl und den Ort entfernt und ein Feld für den Primärschlüssel aus der neuen Tabelle PLZ_Ort erstellt. Das Feld muss denselben Feldtyp haben wie der Primärschlüssel aus der 2. Tabelle. Beziehung zwischen den Tabellen Die Beziehung zwischen den Tabellen kann prinzipiell zwar offen gelassen werden und nur durch die Bestückung mit dem Formular definiert werden, aber wenn bestimmte Automatiken später funktionieren sollen bietet es sich ein, einen ersten Beziehungsentwurf zu erstellen. Seite 6 von 31 Der Beziehungsentwurf wird geöffnet und beide bisher erstellten Tabellen in das Entwurfsfenster geladen. Der Dialog zum Hinzufügen der Tabellen wird anschließend geschlossen. Seite 7 von 31 Zwischen den beiden Tabellen wird von dem Primärschlüsselfeld der Tabelle „PLZ_Ort“ zu dem diesen Wert vertretenden Feld in der Tabelle „Person“ mit der Maus eine Verbindung gezogen. Damit wird das Feld PLZ_Ort_ID in der Tabelle „Person“ ein zweites Schlüsselfeld, das als Fremdschlüssel bezeichnet wird. Die Beziehung von „PLZ_Ort“.“ID“ zu „Person“.“PLZ_Ort_ID“ ist eine 1:n-Beziehung. In der Tabelle „PLZ_Ort“ kommt der „ID“-Wert jeweils nur einmal vor (ein Kennzeichen eines Primärschlüssels), aber viele Personen aus der Tabelle „Person“ können am selben Ort mit derselben Postleitzahl wohnen. Die oben gezeigte Verbindung kann noch mit verschiedenen Eigenschaft versehen werden, die hier erst einmal nicht weiter in Anspruch genommen werden. Der Beziehungsentwurf wird gespeichert und verlassen. Das erste Formular Jetzt ist die Eingabe in die Tabelle natürlich nicht mehr so einfach. Beim Eingeben der Daten müsste jetzt jedes Mal nachgesehen werden, mit welcher Nummer denn die Postleitzahl in der ausgelagerten Tabelle verzeichnet ist. Spätestens jetzt ist die Zeit gekommen, das erste Formular zu erstellen. Der Formularassistent Seite 8 von 31 Prinzipiell kann ein Formular auf einer einfachen Seite des Writer erstellt werden. An dieser Stelle wird allerdings die Formularerstellung mit Hilfe des Assistenten in Base dargestellt. Seite 9 von 31 Das Formular kann mit Tabellen und Abfragen bestückt werden. Hier ist die Tabelle „Person“ ausgewählt. Von den Feldern, die im Formular angezeigt werden sollen, wurde das ID-Feld ausgeschlossen. In diesem Feld erfolgt ja sowieso keine Eingabe. Wenn es dennoch eingebunden wird, so sollte es später mit einem Schreibschutz versehen werden. Ein Subformular (Formular, das dem gewünschten Formular untergeordnet wird) gibt es nicht, so dass wir schnell im Assistenten weiter die Punkte abarbeiten können. Seite 10 von 31 Die Anordnung der Kontrollfelder für das Hauptformular (übergeordnetes Formular, in diesem Fall das einzige Formular) wird angeklickt. Standardmäßig ist hier das Tabellenkontrollfeld vorgesehen. Es ist für den Start sicher eine gute Wahl, wenn nicht allzu viel Datenfelder nebeneinander dargestellt werden sollen. Prinzipiell sind die Schritte, die jetzt folgen, auch mit diesem Kontrollfeld möglich. Oben ist aber jetzt die Darstellung „In Blöcken – Beschriftungen oben“ angewählt. Im Hintergrund zeigt sich schon die entsprechende Auswahl und ein kleines Manko des Assistenten: Einige Felder werden scheinbar willkürlich in die Länge gezogen, obwohl der Inhalt bereits im Tabellenentwurf auf eine bestimmte Zeichenzahl begrenzt wurde (z.B. die Hausnummer, die im Entwurf auf 10 Zeichen gesetzt war). Da die Einstellungen aber nicht endgültig wird einfach weitergegangen über Dateneingabe (Voreinstellung belassen), Stile (Je nach Wunsch, hier auch die Voreinstellung belassen) und den Formularnamen. Seite 11 von 31 Da das Formular so zwar grundsätzlich genauso brauchbar ist wie die vorherige Tabelle könnte jetzt nach der Abspeicherung (hier der Name „Person“ nach der zugrundeliegenden Tabelle) mit ihm gearbeitet werden allerdings ohne einen ersichtbaren Vorteil gegenüber den Tabellen. Es muss also weiter verändert werden. Weitere Formularbearbeitung Dreh- und Angelpunkt aller Veränderungen im Formular ist der Formular-Navigator, der jetzt aufgerufen wird. Zuerst werden einmal die Felder in eine ansehnlichere Form gebracht, die dem zu erwartenden Inhalt auch halbwegs entspricht. Der Assistent verknüpft die Überschriften zu den Eingabefeldern mit den Eingabefeldern. Werden Eingabefelder verkleinert, so wird gleichzeitig der Platz für die Überschrift dieser Felder verkleinert. Entweder muss die Gruppierung mit der rechten Maustaste betreten oder das einzelne Feld über den Navigator direkt ausgewählt werden. Seite 12 von 31 Bearbeitung von Beschriftungsfeldern Da für die Überschriften die Feldbezeichnungen aus der Tabelle „Person“ übernommen wurden ist hier sicherlich eine Änderung erwünscht. Dies geht über den Aufruf der mit dem Feld verbundenen Eigenschaften, nicht mit einem Umbenennen der Feldbezeichnung: Seite 13 von 31 Seite 14 von 31 Auch eventuelle Überschriften in den Formularen werden in der Regel über die Beschriftungsfelder erstellt und anschließend entsprechend mit einer Schriftformatierung, versteckt hinter dem Button mit den 3 Punkten rechts von dem Feld „Schrift“, versehen. Häufig passiert es, dass solche Neueinfügungen partout nicht aus der linken oberen Ecke des Formulares herauszubewegen sind. Hier hilft ein Blick auf die Verankerung, die dann nicht am Absatz sondern als Zeichen gesetzt wurde. Erstellung eines Listenfeldes In einem Formular können die Daten prinzipiell genauso eingegeben werden wie direkt in der Tabelle. Daneben hat aber für uns zuerst einmal das Listenfeld eine zusätzliche Bedeutung. Mit einem Listenfeld wird nämlich jetzt z.B. die Postleitzahl ausgewählt aber in der darunterliegenden Tabelle der zu der Postleitzahl gehörige Primärschlüssel abgespeichert. Das Listenfeld stellt also sozusagen den Blick auf die 2. Tabelle innerhalb eines Formulares dar. Allerdings benötigt dieses Listenfeld selbst natürlich entsprechende Einträge, die es aus der Postleitzahl-Tabelle liest. Zuerst muss also die Postleitzahl-Tabelle gefüllt werden, bevor ein entsprechender Wert für die Adresse ausgesucht werden kann. Etwas umständlich zu Anfang, bei sehr vielen gleichen Postleitzahlen aber recht schnell erledigt. Dieses Listenfeld wird anstelle des bisherigen (formatierbaren) Feldes fmtPLZ_Ort_ID eingebaut: Seite 15 von 31 Dass das Feld durch ein Listenfeld ersetzt wurde ist hier erst einmal nur an dem Symbolwechsel erkennbar. Erst der Aufruf der Eigenschaften zeigt, dass jetzt ein aufklappbares Feld mit entsprechenden Zusätzen verfügbar ist. Seite 16 von 31 Das Listenfeld soll in der Liste Postleitzahlen und Ort darstellen, aber den entsprechenden Primärschlüssel auf das darunterliegende Feld übertragen. Die Daten des Listenfeldes müssen also bearbeitet werden. Seite 17 von 31 SQL ist die Abfragesprache an Datenbanken. Mit dieser Sprache wird der Inhalt der Liste gefüllt. Jetzt könnte im „Listeninhalt“ der Code direkt eingegeben werden. Mit Betätigen des Buttons rechts von dem freien Feld öffnet sich der Editor für Abfragen, so dass die Abfragen dort einfacher zusammengestellt werden können. „Gebundenes Feld“ bedeutet, dass die Abfrage aus mindestens 2 Feldern bestehen muss. Ein Feld wird angezeigt, das andere (gebundene) Feld wird anschließend in die zugrundeliegende Tabelle geschrieben. Die Zählung der Felder beginnt bei 0, so dass das 2. Feld unserer Abfrage den nicht anzuzeigenden Zahlenwert (Primärschlüssel der Tabelle PLZ_Ort) enthält und an das obige Datenfeld weitergibt. Seite 18 von 31 Dem Abfrageentwurf werden die Tabellen hinzugefügt, aus denen die entsprechenden Werte ausgelesen werden sollen. Nachdem das Popup geschlossen wurde können im Unteren Fensterinhalt die anzuzeigenden Inhalte ausgewählt werden. Das 2. Feld ist hier, wie unten gezeigt, die ID. Seite 19 von 31 Leider ist die Abfrage so für den weiteren Gebrauch noch nicht so gut geeignet. Jetzt würde die Postleitzahl angezeigt und die ID gespeichert. Der User müsste also auswendig zu den Postleitzahlen die Orte wissen. Entweder bringt er also gleich Orte und Postleitzahlen in einem einzigen Feld unter oder die Abfrage muss so gestaltet werden, dass beide zusammen angezeigt werden. Um die Werte gemeinsam anzuzeigen ist es einfacher, Text direkt in die SQL-Anweisung zu schreiben. Dafür muss die Design-Ansicht ausgeschaltet werden. Hier ist der bisherige Befehl sichtbar, wie er mit der Design-Oberfläche erstellt wurde. Die SQLAnweisungen sind blau dargestellt, die Tabellenfelder ockerfarben gekennzeichnet: Seite 20 von 31 SELECT (wähle aus) „Postleitzahl“, „ID“ (Felder sind durch ein Komma voneinander getrennt) FROM (von Tabelle) „PLZ_Ort“ AS (bezeichnet als) „PLZ_Ort“. Eigentlich reicht auch die Abfrage ohne die Abschlusskennzeichnung (AS „PLZ_Ort“) aus. Diese Bezeichnung wird allerdings von der GUI automatisch hinzugefügt, da bei komplexeren Abfragen an dieser Stelle mit zusätzlichen Tricks gearbeitet werden kann. Das erste Feld „Postleitzahl“ soll nun auch den Ort anzeigen. Bei der eingebauten HSQLDB bietet sich dafür an, entsprechend zusammen darzustellende Inhalte durch jeweils 2 senkrechte Striche miteinander zu verbinden. ||' ' fügt an die „Postleitzahl“ einen einfachen Freiraum (Leertaste) ein; || „Ort“ schreibt zusätzlich den Ort in das Feld, so dass jetzt, wie erforderlich, die Postleitzahl und der Ort in dem Listenfeld angezeigt werden können. Die Abfrage wird durch Betätigung des Speicherbuttons an das Listenfeld weitergegeben. Der Listeninhalt zeigt jetzt den Abfragetext, zusätzlich erweitert um die Sortierung der Einträge in dem Listenfeld nach der Postleitzahl. Der Eigenschaftsdialog wird geschlossen,. Seite 21 von 31 Das Formular ist nach der Abspeicherung fertig zur Benutzung. Da es zur Zeit noch zur Formularerstellung geöffnet ist wird das Formular einfach geschlossen und erneut aufgerufen. Leider ist jetzt das Feld „Postleitzahl Ort“ immer noch ohne Inhalt. Dieser muss erst einmal direkt in die entsprechende Tabelle PLZ_Ort eingetragen werden, damit er hier verfügbar ist. Bei einer begrenzten Zahl an Datensätzen ist das recht schnell erledigt. Nachträgliche Erstellung eines weiteren Listenfeldes Das Formular ist fertig – und dann fällt uns ein, dass wir gerne noch ein weiteres Feld in der Tabelle abspeichern wollen, das zudem noch durch ein Auswahlfeld mit Daten beschickt werden soll. Ein weiteres Listenfeld, in disem Falle für das Geschlecht, muss her. Das Listenfeld wird ausgewählt und auf der Formularfläche aufgezogen. Seite 22 von 31 Der Assistent für das Listenfeld erscheint. Für unser spezielles Feld können wir ihn hier leider nicht weiter gebrauchen – also brechen wir einfach die Ausführung des Assistenten ab. Noch sieht nichts nach einem Listenfeld aus. Lediglich das Kästchen ist aufgezogen und kann jetzt in seinen Eigenschaften festgelegt werden. Seite 23 von 31 Die Kontrollfeldeigenschaften werden mit der rechten Maustaste aufgerufen. Im Reiter „Daten“ wird das Feld „Geschlecht“ ausgesucht. Seite 24 von 31 Als Listeninhalt wird eine Werteliste erstellt. Hier soll lediglich ein „m“ und ein „w“ eingetragen werden – in der Tabelle ist der Platz auf einen Buchstaben beschränkt worden. Die einzelnen Buchstaben werden untereinander in die Liste eingetragen, indem zum Abschluss eines jeden Eintrags die Hochstelltaste („Shift“) zusammen mit der Eingabetaste („Enter“) betätigt wird. Unter dem Reiter „Allgemein“ finden sich die Listen-Einträge, die in dem Feld vom Formular her sichtbar sind. Das können natürlich die gleichen Einträge sein. Auf jeden Fall sollte aber die gleiche Reihenfolge wie unter „Daten“ benutzt werden, da sonst „Herr“ als „w“ abgespeichert wird. Seite 25 von 31 Wird eine Standardselektion gewünscht so kann die hier ausgewählt werden. In dem Feld „Standardselektion“ erscheint dann eine Zahl, die die Position der Auswahl in der Listenreihenfolge verdeutlicht. Anfangsposition ist hier die „0“. Im Anschluss kann dann noch das Design des Feldes bearbeitet werden (ausklappbar, Farbhintergrund etc. an das Restformular angepasst usw.). Erstellung eines Formulares mit Subformular Das vorhergehende Formular benötigte bereits Eingaben in der Tabelle PLZ_Ort. Wird dieselbe Datenbank mit einer Kombination aus Formular und Subformular bearbeitet, so ist die Eingabe von Postleitzahl und Ort auch direkt möglich. Seite 26 von 31 Die Ausgangstabelle für das Hauptformular ist jetzt die Tabelle PLZ_Ort. Das ID-Feld wird dabei in der Darstellung des Formulares nicht benötigt. Als mögliches Subformular bietet Base die Tabelle „Person“ an. Da die Beziehung zu dieser Tabelle Seite 27 von 31 bereits definiert ist erkennt der Assistent die Beziehung und bietet sie an. Also: Subformular hinzufügen – Subformular basiert auf bestehender Beziehung, Tabelle „Person“ auswählen. In dem Subformular brauchen die beiden Felder, die auf den Primärschlüsseln der beiden benutzten Tabellen beruhen, nicht angezeigt zu werden. Als Darstellungsart ist hier für das Subformular das Tabellenkontrollfeld ausgewählt. So können direkt sichtbar zu Postleitzahl und Ort im Hauptformular entsprechend viele Datensätze im Seite 28 von 31 Subformular angezeigt und editiert werden. Das Formular ist danach prinzipiell fertig, wird aber sicher noch überarbeitet werden müssen. Die Spalten in dem Tabellenkontrollfeld können in der Breite beeinflusst werden (z.B. mit der Maus schieben). Die Lage der Felder in dem Subformular kann durch Verschieben, wie oben zu sehen, bearbeitet werden. Seite 29 von 31 Die Eigenschaften der einzelnen Felder im Tabellenkontrollfeld sind über die rechte Maustaste verfügbar. Wird das Formular jetzt aufgerufen, so geht der Cursor zuerst einmal nur durch das Hauptformular. Immer wieder werden Postleitzahlen und Orte eingegeben, aber die Eingabe von Personen ist erst möglich, wenn ein bereits bestehender Datensatz neu aufgerufen wird. Soll direkt nach der Eingabe im Hauptformular ins Subformular gesprungen werden, so muss die Aktivierungsreihenfolge der Formularfelder aufgerufen werden: Wird die Aktivierungsreihenfolge automatisch sortiert, so wird das Subformular auch mit einbezogen, obwohl es (leider) nicht angezeigt wird. Danach ist auch dieses Formular als Alternative zum Formular „Person“ einsatzbereit. Je größer eine Datenbank geplant ist, desto stärker werden Werte aus der Haupttabelle in andere Seite 30 von 31 Tabellen ausgelagert. Ziel ist einfach, wiederholte Eingabe von Werten zu vermeiden und so später auch einen schnelleren Zugriff auf ausgewählte Daten zu erhalten. Mit den ersten Datenbankerfahrungen wachsen natürlich die Ansprüche an die Bedienbarkeit. Gerade bei einer Adressdatenbank sind hier aber sehr schnell Grenzen zu spüren, die mit der gewohnten Adresseingabe zusammenhängen: Zuerst wird Vorname und Nachname erfasst, dann die Straße und die Hausnummer und zuletzt die Postleitzahl sowie der Ort. Diese Ansprüche in der Bedienbarkeit sind dann in der Regel nur über Makros zu realisieren. In einem 2. Teil dieser Anleitung wird ein möglicher Weg über Makros aufgezeigt. Seite 31 von 31