Dieses Dokument unterliegt dem Copyright © 2024 . Die Beitragenden sind unten aufgeführt. Sie dürfen dieses Dokument unter den Bedingungen der GNU General Public License (http://www.gnu.org/licenses/gpl.html), Version 3 oder höher, oder der Creative Commons Attribution License (http://creativecommons.org/licenses/by/3.0/), Version 3.0 oder höher, verändern und/oder weitergeben.
Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt.
Fast alle Hardware- und Softwarebezeichnungen und weitere Stichworte und sonstige Angaben, die in diesem Buch verwendet werden, sind als eingetragene Marken geschützt.
Da es nicht möglich ist, in allen Fällen zeitnah zu ermitteln, ob ein Markenschutz besteht, wird das Symbol (R) in diesem Buch nicht verwendet.
Mitwirkende/Autoren
|
Robert Großkopf |
Jost Lange |
Michael Niedermair |
|
Jochen Schiffers |
|
|
Rückmeldung (Feedback)
Kommentare oder Vorschläge zu diesem Dokument können Sie in deutscher Sprache an die Adresse discuss@de.libreoffice.org senden.
Vorsicht
Alles, was an eine Mailingliste geschickt wird, inklusive der E-Mail-Adresse und anderer persönlicher Daten, die die E-Mail enthält, wird öffentlich archiviert und kann nicht gelöscht werden. Also, schreiben Sie mit Bedacht!
Datum der Veröffentlichung und Softwareversion
Veröffentlicht am 01.02.2024 . Basierend auf der Version LibreOffice 24.2 .
Im täglichen Büroeinsatz werden häufig Tabellenkalkulationen dazu benutzt, Datensammlungen zu erstellen um anschließend damit eventuell noch kleine Berechnungen durchzuführen. Die Tabellensicht ist sofort da, der Inhalt einfach einzugeben – da fragen sich dann viele Nutzer, warum es denn eine Datenbank sein sollte. Dieses Handbuch versucht den Unterschied zwischen Tabellenkalkulation und Datenbank herauszuarbeiten. Zu Beginn wird erst einmal kurz dargestellt, was eine Datenbank denn überhaupt leisten kann.
Hinweis
In der Fachsprache wird statt von Datenbanken von einer Benutzeroberfläche und einem «Datenbanksystem» gesprochen. Dieser Begriff umfasst das «Datenbankmanagementsystem» (DBMS) und den eigentlichen Datenbestand, die «Datenbank».
Base bietet einen Zugriff auf verschiedene Datenbanksysteme über eine grafische Benutzeroberfläche. Base arbeitet standardmäßig mit dem eingebetteten Datenbanksystem «HSQLDB». Seit der Version LO 4.2 ist außerdem das Datenbanksystem «Firebird», zuerst als «experimentelle Funktion», hinzugekommen. Mit der Version LO 5.3 ist auf die Version 3.0 des Firebird-Datenbanksystems, ebenfalls zunächst noch als «experimentelle Funktion» umgestellt worden. Ab Version LO 6.1 funktionierte «Firebird» zwischendurch versuchsweise standardmäßig. Ob und wann die interne «HSQLDB» durch «Firebird» ersetzt wird steht auch bei Erscheinen von LO 24.2 noch nicht fest, da die Integration von «Firebird» in die GUI bisher nicht die Qualität der Integration der «HSQLDB» erreicht, aber stetig verbessert wird.
Dieses Handbuch zeigt an verschiedenen Stellen den Unterschied zwischen den beiden internen Datenbanksystemen auf, «(Hsqldb, Firebird)» würde bedeuten: Funktioniert mit der HSQLDB, nicht aber mit Firebird. Unterschiede sind entsprechend gekennzeichnet.
Vorsicht
Wenn Extras → Optionen → LibreOffice → Erweitert → Experimentelle Funktionen aktiviert wird, dann wird ein Migrationsmodul aktiviert, das eingebettete HSQLDB-Datenbanken nach Firebird zu migrieren versucht. Dieses Modul erfordert anschließend viele zusätzliche Eingriffe, da Funktionen in beiden Systemen teilweise nicht identisch sind. Die Migration sollte tunlichst nicht versucht werden, bevor eine Sicherungskopie der *.odb-Datei erfolgt ist. Siehe dazu auch die Hinweise im Kapitel «Datenbank erstellen», im Anhang des Handbuches und auf https://wiki.documentfoundation.org/Documentation/HowTo/MigrateFromHSQLDB/de.
Die experimentellen Funktionen werden aber auch benötigt, um überhaupt eine Firebird-Datenbank zu erstellen. Nach dem Erstellen der Datenbankdatei können dann die experimentellen Funktionen direkt wieder ausgeschaltet werden.
Das gesamte Handbuch bezieht sich in der Hauptsache auf zwei Beispieldatenbanken. Die eine Datenbank hat die Bezeichnung «Medien_ohne_Makros.odb», die andere Datenbank ist entsprechend mit Makros erweitert worden und trägt die Bezeichnung «Medien_mit_Makros.odb». Beide Datenbanken sollen einen Bibliotheksbetrieb ermöglichen: Medienaufnahme, Nutzeraufnahme, Medienverleih und alles, was damit verbunden ist wie z. B. das Anmahnen säumiger EntleiherInnen.
•Beispiel_Sport.odb (Kapitel «Einführung in Base»)
•Beispiel_CSV_Einbindung.odb (Kapitel «Datenbank erstellen»)
•Beispiel_Cursorsprung_Subform_Mainform.odb (Kapitel «Formulare»)
•Beispiel_Bericht_bedingte_Einblendung_von_Grafiken.odb (Kapitel «Berichte»)
•Beispiel_Bericht_Rechnung.odb (Kapitel «Berichte»)
•Beispiel_Bericht_Zeilen_Farbwechsel_Spalten.odb (Kapitel «Berichte»)
•Beispiel_PDFFormular_Import.odb (Kapitel «Datenbank-Anbindung»)
•Beispiel_Autotext_Suchmarkierung_Rechtschreibung.odb (Kapitel «Datenbank-Aufgaben»)
•Beispiel_Formular_Eingabekontrolle.odb (Kapitel «Datenbank-Aufgaben» und «Makros»)
•Beispiel_Dokumente_einlesen_auslesen.odb (Kapitel «Datenbank-Aufgaben»)
•Beispiel_Baseformular_mit_Diagramm.odb (Kapitel «Datenbank-Aufgaben»)
•Beispiel_Arrayfeld.odb (Kapitel «Datenbank-Aufgaben»)
•Beispiel_Listenfeld_Mehrfachauswahl.odb (Kapitel «Makros»)
•Beispiel_Suchen_und_Filtern.odb (Kapitel «Makros»)
•Beispiel_Direktberechnung_im Formular.odb (Kapitel «Makros»)
•Beispiel_Combobox_Listfeld.odb (Kapitel «Makros»)
•Beispiel_Fortlaufende_Nummer_Jahr.odb (Kapitel «Makros»)
•Beispiel_Datenbank_Serienbrief_direkt.odb (Kapitel «Makros»)
•Beispiel_Mailstart_Dateiaufruf.odb (Kapitel «Makros»)
•Beispiel_Daten_Import.odb (Kapitel «Makros»)
•Beispiel_Dialoge.odb (Kapitel «Makros»)
•Beispiel_hierarchische_Listenfelder.odb (Kapitel «Makros»)
•Beispiel_Druck_Writer_Tabellen.odb (Kapitel «Makros»)
Bis auf die Datenbank «Beispiel_CSV_Einbindung.odb» liegen alle Datenbanken sowohl in einer Fassung für die interne Hsqldb als auch für Firebird vor. Firebird kann *.csv-Dateien nicht als Datenquelle direkt nutzen und vor allem nicht in *.csv-Dateien schreiben.
Hinweis
Wie jede Software läuft auch LO-Base nicht vollkommen fehlerfrei. Besonders ärgerlich sind hier die «Regressionen», also Rückschritte von einer vorhergehenden Version zur gerade aktuellen Version. Der folgende Link führt zu den momentan noch offenen Regressionen: https://bugs.documentfoundation.org/buglist.cgi?bug_status=UNCONFIRMED&bug_status=NEW&bug_status=REOPENED&bug_status=NEEDINFO&component=Base&keywords=regression&keywords_type=allwords&product=LibreOffice&query_format=advanced&resolution=---
Ein Blick auf die Bug-Liste kann also helfen, Unterschiede zwischen dieser über viele Jahre zusammengetragenen Dokumentation und der eigenen Programmversion zu verstehen.
Hinweis
Base-Dateien sind Dateien, in denen die interne Datenbank mit abgespeichert wird. Diese Datenbankdateien sollten immer wieder gesichert werden, damit der Datenverlust gering gehalten wird. Besonderes Augenmerk gilt hier der Migration von der internen HSQLDB zur Firebird-Datenbank. Auch sollte eine Base-Datei mit interner Datenbank immer nach Beendigung der Arbeit abgespeichert werden. Ein Zuklappen des Laptops kann sonst beim Erwachen des Systems zu Datenverlust führen.
Hinweis
In diesem Handbuch werden Anführungszeichen mit unterschiedlichen Intentionen verwendet:
"Tabellenname"."Feldname" > Tabellen und Felder in Datenbanken werden in doppelten Anführungszeichen oben wieder gegeben.
'Wert' > Werte, die in die Datenbank eingegeben oder aus ihr gelesen werden, sollen in einfachen Anführungszeichen erscheinen.
«Hervorhebungen» > Alles, was sonst hervorgehoben werden soll, erscheint in der französischen Form der Anführungszeichen.
Eine Base-Datei ist eigentlich nur ein gepacktes Verzeichnis, in dem Informationen für die verschiedenen Arbeitsbereiche von Base stecken. In der täglichen Nutzung startet eine Base-Datei erst einmal mit der folgenden Ansicht:
Zur Arbeitsumgebung von Base gehören insgesamt vier Arbeitsbereiche: Tabellen, Abfragen, Formulare und Berichte. Je nach gewähltem Arbeitsbereich können bestimmte Aufgaben zur Neuerstellung der Elemente in Angriff genommen oder fertiggestellte Elemente aufgerufen werden.
In den Arbeitsbereichen Formulare und Berichte können die jeweiligen Elemente auch innerhalb einer Verzeichnisstruktur angeordnet werden:
Dies geht entweder direkt beim Abspeichern über den Speicherdialog oder durch Neugründung von Verzeichnissen über Einfügen → Ordner. Wird ein Formular über den Assistenten erstellt, so steht der Speicherort in dem Ordner leider nicht zur Verfügung. Hier müsste dann das Formular anschließend in den Unterordner verschoben werden.
Obwohl die Basis für eine Datenbank durch Tabellen gebildet wird, startet Base mit der Formularansicht, weil Formulare in der Regel die Elemente sind, mit denen die tägliche Datenbankarbeit vonstatten geht. Über die Formulare werden Einträge in die Tabellen vorgenommen und Inhalte aus den Tabellen ausgewertet.
Einfache Formulare bilden lediglich eine Tabelle wie im oben sichtbaren Tabellenkontrollfeld mit den Namen ab. Dieses Formular erfüllt durch seine Struktur einige zusätzliche Punkte.
•Die Auswahl der Personen kann mit Filtern eingeschränkt werden. Die einfache Eingabe des Buchstaben 'G' und das anschließende Drücken von OK erzeugt eine Auswahl aller Personen, deren Nachname mit 'G' beginnt.
•Neue Mediennutzer können direkt in das Tabellenkontrollfeld eingegeben werden.
•Die Ausleihdaten des aktuell markierten Nutzers werden in den darunterliegenden Feldern angezeigt. Dabei wird auch noch einmal der Name des Nutzers deutlich hervorgehoben. Hat ein Nutzer ein Buch entliehen und müsste es bereits zurückgegeben werden, so steht das Tabellenkontrollfeld «aktuelle Ausleihe» erst einmal nicht zur Verfügung. Stattdessen wird angegeben, dass die Ausleihe zur Zeit gesperrt ist.
•Das Entleihdatum wird mit dem aktuellen Datum vorgegeben. In dem daneben stehenden Listenfeld werden die zu entleihenden Medien ausgewählt. Dabei können keine Medien ausgewählt werden, die zur Zeit noch entliehen sind.
•Die ausgewählten Daten werden mit dem Button Aktualisieren in das Tabellenkontrollfeld für den aktuellen Ausleihvorgang übernommen.
•Im Tabellenkontrollfeld für die Rückgabe ist es nicht möglich, einen Datensatz einfach zu löschen. Nur die Felder «Rück-Datum» und «Verlängerung» können bearbeitet werden. War ein Mediennutzer vorübergehend gesperrt und hat seine entliehenen Medien zurückgegeben, so lässt sich die Ausleihe über den Button Aktualisieren wieder freischalten.
Alle diese Funktionen können ohne den Einsatz von zusätzlicher Programmierung mit Makros gewährleistet werden, wenn entsprechend an den Formularen gefeilt wird.
Die Tabellen in einer Datenbank hängen in einem großen Geflecht zusammen. Eine Tabelle bezieht Informationen aus einer anderen oder gibt Informationen an andere Tabellen weiter. Dies wird als «Relation» bezeichnet.
Die Tabelle "Ausleihe" steht in direkter Beziehung zu den Tabellen "Medien" und "Leser".
Statt in der Ausleihe den Titel eines Buches abzuspeichern, wird dort nur eine Zahl abgespeichert. Das eindeutige Kennzeichen eines Datensatzes der Tabelle "Medien" ist in dem Feld "ID" gespeichert. Das Feld ist das Schlüsselfeld der Tabelle "Medien", der Primärschlüssel.
In der Tabelle "Ausleihe" wird auch nicht jedes Mal der Lesername eingetragen. Hier gibt die Tabelle "Leser" Auskunft. Auch sie hat ein Primärschlüsselfeld. Der Wert dieses Feldes kann dann in die Tabelle "Ausleihe" eingetragen werden.
Die Beziehungen zwischen den Tabellen haben hier den Vorteil, dass die Schreibarbeit im Formular erheblich reduziert wird. Statt bei jeder Ausleihe ein Medium zumindest unverwechselbar und für jeden erkennbar aufzuschreiben und Leser mit Vor- und Nachnamen zu notieren, wird einfach im Inhalt der anderen Tabellen nachgesehen. Schließlich wird dasselbe Medium später noch öfter ausgeliehen und derselbe Leser kann schon beim ersten Entleihvorgang mehrere Medien entleihen.
Relationen helfen auch, Fehler durch unterschiedliche Schreibweisen z.B. von Lesernamen zu vermeiden.
Die Tabellengrundlage für das oben vorgestellte Formular sieht erst einmal recht nüchtern aus. In der oben abgebildeten Tabelle werden bis auf die Nutzerneueingabe alle Eingaben gemacht, die in dem vorher gezeigten Formular möglich sind. Dabei werden im Formular die Verbindungen dieser Tabelle zu den anderen Tabellen der Datenbank genutzt.
•Das erste Feld zeigt den für die meisten Datenbanken unabdingbaren, unverwechselbaren Inhalt, den Primärschlüssel ("ID"), der automatisch geschrieben wird.
Mehr dazu im Kapitel «Beziehungen zwischen Tabellen allgemein».
•Das zweite Feld "Medien_ID" speichert den Primärschlüssel der Tabelle "Medien". Es verweist über die Nummer auf den entsprechenden Inhalt in dieser Tabelle. Solch ein Verweis auf einen Primärschlüssel wird als Fremdschlüssel bezeichnet. Im Formular werden statt des Fremdschlüssels über ein Listenfeld der Titel und der Verfasser angezeigt. Das Listenfeld gibt im Hintergrund den Fremdschlüssel an die Tabelle weiter.
•Das dritte Feld "Leser_ID" speichert den Primärschlüssel der Tabelle "Leser", also nur eine Nummer, die auf den Leser verweist. Im Formular wird aber der Nachname und der Vorname angegeben. Wie in der Tabelle zu sehen ist, hat der Leser mit der Primärschlüsselnummer '0' sehr viele Medien entliehen. Die Tabelle kann beliebig oft den einzigartigen Primärschlüssel der Tabelle "Leser" als Fremdschlüssel "Leser_ID" abspeichern. Auf keinen Fall darf aber ein Leser, der in dieser Tabelle über den Fremdschlüssel verzeichnet ist, gelöscht werden. Sonst wäre nicht mehr nachvollziehbar, wer denn nun das jeweilige Medium entliehen hat. Die Datenbank macht in den Standardeinstellungen so ein Löschen unmöglich. Der Fachbegriff dafür ist die Gewährung der «referentiellen Integrität».
•Im vierten Feld wird das Ausleihdatum abgespeichert. Ist dieses Datum abgespeichert und entspricht das Datum nicht dem aktuellen Datum, so erscheint der entsprechende Datensatz zu dem entsprechenden Leser im Formular im untersten Tabellenkontrollfeld zu Rückgabe der Medien.
•Im letzten Feld wird eine Verlängerung ermöglicht. Was hier eine 1, 2 usw. bedeutet wird an anderer Stelle festgelegt. Dafür enthält die Datenbank eine gesonderte Tabelle mit der Bezeichnung "Einstellungen".
Diese Eingaben reichen aus, um letztlich einen Bibliotheksbetrieb in Gang zu halten.
Abfragen zeigen eine Sicht auf die Tabellen. Sie bringen Inhalte mehrerer Tabellen zusammen in einer Übersicht. Abfragen werden nur in der Abfragesprache «SQL» gespeichert. Sie sind also keine neuen Tabellen, auch wenn sie von der Ansicht her in Base erst einmal gleich erscheinen.
Diese Abfrage listet alle Medien auf, die zur Zeit entliehen sind. Darüber hinaus berechnet sie, wie lange die Medien bereits entliehen sind und wie lange sie noch entliehen werden dürfen. Während das Feld "Medien_ID" das Fremdschlüsselfeld ausliest, wird in dem Feld "Medium" aus dem Primärschlüssel, dem Titel und dem Autor des Mediums ein zusammenhängender Text gebildet. Dieses Feld wird dann im Formular unter dem Untertitel «Rückgabe» benötigt. Einige Felder der Abfrage dienen dabei als Verbindungsfelder zu dem eigentlichen Ausleihformular mit der Tabelle "Ausleihe", nämlich die Felder "Medien_ID" und "Leser_ID".
•Alle Medien, bei denen das Rückgabedatum in der Tabelle "Ausleihe" nicht ausgefüllt ist, werden aufgelistet. Die Medien sind hier als zusätzliche Übersicht auch noch entsprechend benannt.
•Der Bezug zu den Lesern ist hergestellt über den Primärschlüssel der Tabelle "Leser"
•Aus dem Ausleihdatum "Leih_Datum" und dem aktuellen Datum wird die Zeitdifferenz in Tagen als "Leihzeit" angegeben.
•Von der Ausleihzeit, die je nach Medienart unterschiedlich sein kann, wird die Leihzeit abgezogen. Daraus wird die verbleibende Restzeit gebildet.
•Bei einer Verlängerung wurde in der Tabelle "Einstellungen" vermerkt, dass der Wert '1' für eine Verlängerung von 7 Tagen steht. Im vorletzten Datensatz mit der "Medien_ID" '2' ist so eine Verlängerung bei der Restzeit berücksichtigt worden.
Über Berichte werden die Daten so aufbereitet, dass sie sinnvoll ausgedruckt werden können. Formulare wie das folgende sind nicht dazu geeignet, z. B. einen sauber formatierten Brief auszugeben.
Bevor ein aktueller Bericht in Form einer Mahnung ausgedruckt werden kann, müssen in diesem Formular erst einmal die Mahnungen bestätigt werden. Im oberen Tabellenkontrollfeld stehen dafür alle Namen der Leser, die ein Medium entliehen haben und für die eine negative Restzeit vermerkt ist.
Für jedes anzumahnende Buch wird im unteren Tabellenkontrollfeld ein Mahndatum festgelegt. Dies dürfte bei der Abarbeitung von Mahnungen das aktuelle Datum sein. Die Mahnungsnummer wird nicht extra geschrieben. Sie wird anhand der bisher ergangenen Mahnungen einfach durch Addition ermittelt.
Dieses Formular benötigt in der Fassung ohne Makros noch eine Eingabe durch den Nutzer. In der Fassung, die mit Makros arbeitet, wird einfach das Datum automatisch geschrieben und anschließend der Bericht zum Mahnungsdruck aufgerufen.
Mit Hilfe einer Abfrage lässt sich aus den getätigten Eingaben solch eine Mahnung zum Ausdruck fertig erstellen. Der Nutzer der Datenbank braucht dazu lediglich bei den Berichten den Bericht Mahnung auszuwählen und kann dann einen entsprechenden Mahnbrief an alle die Personen schicken, bei denen im vorher angegebenen Formular eine Mahnung bearbeitet wurde.
In so einem Bericht stehen also gegebenenfalls auf den folgenden Seiten jeweils auf einer Seite weitere Mahnungen für andere Personen. Sollte ein Leser so viele Medien entliehen haben, dass der Platz auf einer Seite nicht ausreicht, so wird die Tabelle auf der Folgeseite einfach fortgesetzt.
Ein so erstellter Bericht ist also umfangreicher als ein Serienbrief, der mit Writer erstellt wird: er stellt automatisch alle Datensätze zusammen, die gedruckt werden sollen und ordnet den zusätzlichen Text entsprechend an.
Ein ähnlicher Brief wie in der obigen Abbildung lässt sich sonst nur unter Zuhilfenahme von Makros realisieren, wie es in «Drucken über Textfelder» beschrieben wird.
Tabellen der internen Datenbank, Abfragen, Formulare und Berichte werden in einer Base-Datei gespeichert. Durch diese Vielzahl an Elementen, von denen z.B. die Datenbank auch noch während der Arbeit in den Arbeitsspeicher ausgelagert wird, ist solch eine Datei ein Element, mit dem sorgsam umzugehen ist. Manchmal sind Bugmeldungen zu lesen, die vor diesem Hintergrund deutlich machen, dass eine Datenbankdatei eben einen etwas sorgfältigeren Umgang benötigt als z.B. eine Textdatei, die mit dem Writer geschrieben wird.
Die folgenden Hinweise sollten deshalb beim Umgang mit einer Base-Datei berücksichtigt werden:
•Eine geöffnete Datenbankdatei sollte möglichst nicht über Speichern unter mit einem anderen Namen abgespeichert werden. Wenn es schon nicht anders geht, so sollten Tabellen, Abfragen, Formulare und Berichte vorher geschlossen werden. Besser ist es, die Datenbankdatei zu schließen und eine Kopie der Datei zu erstellen.
Der Report-Designer ist ein Addon. Er wird zwar inzwischen nicht mehr als gesonderte Erweiterung sichtbar, arbeitet aber weitgehend unabhängig von der Datenbankdatei. Das Umbenennen der Datenbankdatei über Speichern unter entzieht dem Report-Designer seine Grundlage.
•Die Abspeicherung einer Tabelle, einer Abfrage, eines Formulars oder eines Berichtes hat nicht zur Folge, dass die komplette Datenbankdatei abgespeichert wird. Diese Abspeicherung muss separat erfolgen. Nach wichtigen Schritten bei der Erstellung von Elementen für die *.odb-Datei muss deshalb immer das Element und anschließend die Datenbankdatei gespeichert werden.
Besonders trifft dieses Speicherverhalten auf die Arbeit mit dem Report-Designer zu. Die Erstellung eines Berichtes ist noch die labilste Komponente innerhalb der Base-Datei. Deshalb nach jedem Schritt Bericht und *.odb-Datei sichern. Ist der Bericht erstellt, so funktionieren die Berichte selbst ohne besondere Probleme.
•Eine einmal fertig gestellte *.odb-Datei, die anschließend nur noch mit Daten gefüttert wird, wird nicht wieder über den Speicherbutton abgespeichert. Die Speicherung der Datensätze erfolgt letztlich beim Schließen der *.odb-Datei. Der Inhalt der Datenbank wird erst dann zurück in die Datei geschrieben. Ein Absturz an dieser Stelle kann zu Datenverlust führen. Deshalb sollte eine Strategie entwickelt werden, wie Sicherungskopien rechtzeitig erstellt werden. Im Kapitel «Makros» befindet sich ein Makro, mit dem solch eine Sicherungskopie beim Öffnen einer Datenbankdatei automatisch erstellt wird. Ebenso ist dort eine Möglichkeit aufgeführt, wie auch zwischendurch gesichert werden kann.
Einem deutlich höheren Sicherheitsstandard genügen schließlich externe Serverdatenbanken wie MySQL/MariaDB oder PostgreSQL. Für diese könnte dann Base als Frontend mit Abfragen, Formularen und Berichten dienen.
Werden die Serverfunktionen mit dem Zugriff mehrerer Nutzer nicht benötigt, so kann schon der Zugriff auf z. B. eine Firebird-Datei ein klarer Sicherheitsgewinn sein. Selbst wenn LibreOffice komplett abstürzt ist der zuletzt eingegebene Datensatz in solch einer externen Datenbankdatei abgespeichert.
Weitere Informationen zum Zugriff auf externe Datenbank sind im Kapitel «Datenbank erstellen» → «Zugriff auf externe Datenbanken» zu finden.
Vorsicht
Für Firebird vorläufig noch: Daten werden nicht automatisch gespeichert. Das Speichersymbol in Tabellen zeigt zwar eine Speicherung beim Datensatzwechsel an. Diese Speicherung muss aber noch im Hauptfenster der Base-Datei bestätigt werden. Ohne diese Speicherung gehen alle neu eingegebenen Daten verloren.
Die Erstellung einer Datenbank wird in «Neue Datenbank als interne Datenbank» abgehandelt. Dort werden neben der internen HSQLDB oder der internen Firebird-Datenbank verschiedene andere Datenbanksysteme eingebunden.
Das folgende Beispiel basiert auf der Standarddatenbank HSQLDB, die mit LibreOffice als interne Datenbank installiert wird. Unterschiede zur internen Firebird-Datenbank werden an entsprechender Stelle gesondert gekennzeichnet.
Es wird zuerst eine «Neue Datenbank als interne Datenbank» erstellt, die nicht angemeldet wird.
Erstes Kennzeichen bei der Erstellung einer Datenbank ist, dass zum Abschluss des Assistenten zuerst einmal ein Speicherort gesucht wird und die Datei abgespeichert wird.
Sobald die Abspeicherung erfolgt ist, erscheint der Startbildschirm der Benutzeroberfläche für die Datenbank. Standardmäßig sind zuerst auf der linken Seite im Bereich Datenbank → Tabellen ausgewählt. Die Tabellen sind das zentrale Speicherelement für die Daten. Ohne Tabellen keine Datenbank.
Tabellen → Aufgaben → Tabelle in der Entwurfsansicht erstellen … wird angeklickt. Es öffnet sich der folgende Bildschirm:
Hier werden zuerst einmal die verschiedenen Feldnamen für die erste Tabelle eingetragen. Die Tabelle soll die Teilnehmer und Teilnehmerinnen enthalten. Sie ist hier erst einmal auf die wesentlichen Bestandteile reduziert.
Die Feldnamen "Vorname", "Nachname" und "Geburtstag" dürften klar sein. Zusätzlich wurde ein Feld mit der Bezeichnung "ID" eingetragen. Dieses Feld soll später einen Wert aufnehmen, der die einzigartige Eigenschaft eines jeden Datensatzes ist. So ein einzigartiges Schlüsselfeld ist für die eingebettete Datenbank notwendig. Ansonsten lassen sich keine Datensätze in die Tabelle eingeben. Dieses Schlüsselfeld wird bei Datenbanken als «Primärschlüssel» bezeichnet.
Es könnte natürlich auch ein anderes Feld für diese Eigenschaft genutzt werden. Wird aber z. B. der "Nachname" alleine dafür genutzt, so können nicht zwei Personen mit gleichem Nachnamen abgespeichert werden. In diesem Fall könnte es helfen, zwei Felder zusammen zu einem gemeinsamen Primärschlüssel zu erklären. Eine Garantie, dass das auf Dauer funktioniert, ist das aber nicht. Deshalb wird hier die einfachere Variante bevorzugt.
Im zweiten Arbeitsgang werden jetzt die Feldtypen für die bereits benannten Felder aus der Liste ausgewählt. Das Feld "ID" wird auf den Feldtyp → Integer eingestellt. Es wird dann Ganzzahlen speichern. Dieser Feldtyp hat den Vorteil, dass er bei neuen Datensätzen automatisch mit der nächst höheren Ganzzahl versehen werden kann.
Die Feldeigenschaft des Feldes "ID" wird bearbeitet. Für dieses Feld wird die automatische Einsetzung von aufsteigenden Zahlenwerten aktiviert: Feldeigenschaften → Auto-Wert → Ja.
Durch die Einstellung des Auto-Wertes sollte beim Verlassen der Feldtypenauswahl auf dem Zeilenkopf ein Schlüsselsymbol zu sehen sein. Das zeigt an, dass dieses Feld den Primärschlüssel der Tabelle bildet. Wird nicht der Auto-Wert gewählt, so kann der Primärschlüssel auch über das Kontextmenü der Maus (rechte Maustaste → Primärschlüssel) ausgewählt werden.
Für den Geburtstag ist noch der Feldtyp → Datum einzustellen. Dadurch wird gewährleistet, dass nur gültige Datumseingaben aufgenommen werden und außerdem mit Hilfe des Datums Sortierungen durchgeführt oder z. B. das Alter berechnet werden kann.
Welche Felder müssen auf jeden Fall einen Inhalt haben? Diese Tabelle macht ohne Inhalt im Feld "Nachname" und "Datum" keinen Sinn. Schließlich soll die Person erkannt werden und einer Altersklasse zugeordnet werden können. Bei "Nachname" und "Datum" sollte also Feldeigenschaften → Eingabe erforderlich → Ja gewählt werden.
Die Tabelle wird nun unter dem Namen "Teilnehmer" abgespeichert. Anschließend können Daten eingegeben werden. Im Feld "ID" ist die Eingabe nicht nötig. Sie wird automatisch beim Abspeichern des Datensatzes erledigt.
Tipp
Bei der intensiveren Nutzung von Base vor allem mit Makros kann es zu Verwechselungen von Tabellenbezeichnungen, Abfragebezeichnungen, Formularbezeichnungen und Berichtsbezeichnungen führen. Um hier eine deutlichere Unterscheidung zu ermöglichen, werden häufig Kürzel vor die Namensbezeichnungen gesetzt:
tbl_Name > Tabellenbezeichnung («tbl» steht für «table»)
viw_Name > Ansichtsbezeichnung («viw» steht für «view»)
qry_Name > Abfragebezeichnung («qry» steht für «query»)
frm_Name > Formularbezeichnung («frm» steht für «form»)
rpt_Name > Berichtsbezeichnung («rpt» steht für «report»)
Die für dieses Handbuch erstellten Beispieldatenbanken folgen dieser Namensgebung nicht. Eine entsprechende Benennung wäre bei umfangreichen Datenbanken von Anfang an sinnvoll. Die umfangreichsten Datenbanken dieses Handbuches sind aber bereits entstanden, bevor dieser Vorschlag zur Benennung auftauchte.
Hinweis
Die Datenbankdatei ist ein gepacktes Verzeichnis von einzelnen Dateien. Das Speichern eines einzelnen Elementes wie der Tabelle wird deshalb nicht direkt in die Datenbankdatei selbst geschrieben. Deswegen muss nach der Erstellung von Tabellen, Abfragen, Formularen und Berichten anschließend auch der Speicherbutton für die Datenbankdatei selbst betätigt werden.
Einzig das Abspeichern von eingegebenen Daten funktioniert beim Verlassen der Datenzeile automatisch.
Die Teilnehmer können jetzt eingegeben werden. Folgende Informationen fehlen allerdings auf den ersten Blick:
•Eine Liste der Sportarten, die die Teilnehmer belegen wollen.
•Für Wettkämpfe die Unterscheidung von Teilnehmern und Teilnehmerinnen.
Es wird eine Tabelle "Sportarten" erstellt. Da nicht so sehr viele unterschiedliche Sportarten in Frage kommen, wird hier nicht der automatisch hoch zählende Primärschlüssel gewählt. Stattdessen wird der Feldtyp → Text belassen, aber auf 5 Zeichen begrenzt. Die 5 Zeichen reichen aus, um damit auch passende Kürzel für die Sportarten zu finden.
Der Feldtyp «Text» hat den Vorteil, dass schon bei einem Blick auf den Primärschlüssel "ID" klar wird, um welche (ausgeschriebene) "Sportart" es sich handelt. Das Feld "Sportart" wird über Feldeigenschaften → Eingabe erforderlich → Ja zum Pflichtfeld erklärt.
Anschließend kann diese Tabelle zur Eingabe von Daten geöffnet werden (Doppelklick auf die Tabelle oder rechter Mausklick → Öffnen).
So könnte dann der Inhalt der Tabelle nach der Eingabe von Daten aussehen. Ohne Daten in dieser Tabelle stehen nachher in dem Formular keine Sportarten zur Auswahl.
Die Tabelle "Teilnehmer" soll noch einmal zum Bearbeiten, nicht zur Dateneingabe, geöffnet werden. Dies geschieht über das Kontextmenü der Tabelle.
Der Tabelle wird das Feld "Geschlecht" hinzugefügt. Ein neues Feld kann mit der grafischen Benutzeroberfläche nur am Ende der Tabelle hinzugefügt werden. Über SQL ist auch die Möglichkeit gegeben, neue Felder an einer bestimmten Position einzufügen.
Die Länge des Textes in diesem Feld beschränkt sich auf einen Buchstaben. Es reicht also 'm' und 'w', ggf. auch 'd' als Eingabe.
Auch diese Eingabe ist notwendig, damit bei den Wettbewerben nach dem Geschlecht unterschieden werden kann. Mit Feldeigenschaften → Eingabe erforderlich → Ja soll das abgesichert werden.
Hinweis
Die nachträgliche Einstellung eines Feldes auf Eingabe erforderlich → Ja setzt voraus, dass entweder noch keine Daten in der Tabelle sind oder alle Datensätze für das entsprechende Feld mit einer Eingabe versehen sind. Gegebenenfalls müssen also zuerst sämtliche Datensätze aus "Teilnehmer" mit einem Eintrag bei "Geschlecht" versehen werden.
Irgendwie müssen die beiden Tabellen verbunden werden, so dass jedem Teilnehmer mehrere Sportarten und jeder Sportart mehrere Teilnehmer zugeordnet werden können. Dies geschieht durch eine Tabelle, in der die Werte der beiden Primärschlüssel der Tabellen "Teilnehmer" und "Sportart" abgespeichert werden sollen. Da nicht mehr als die Kombination dieser Felder gespeichert werden soll, sind beide Felder zusammen der Primärschlüssel für diese Tabelle. Um beiden Feldern einen Primärschlüssel zuzuweisen, wird zunächst am Zeilenkopf eine Zeile markiert, danach die Großschreibtaste (Umschalt oder Shift) betätigt und die zweite Zeile zusätzlich markiert. Über das Kontextmenü der Maus lässt sich, wenn die Taste Umschalt losgelassen wurde, jetzt der Primärschlüssel festlegen.
Damit wirklich die entsprechenden Werte aus "Teilnehmer" und "Sportart" aufgenommen werden können, müssen die Felder genau dem Feldtyp entsprechen, den sie speichern sollen. "ID_Teilnehmer" muss also den Feldtyp «Integer» haben. "ID_Sportart" muss den Feldtyp «Text» haben und außerdem, wie das Feld "ID" aus der Tabelle "Sportart", auf 5 Zeichen begrenzt werden.
Die Tabelle wird unter dem Namen "rel_Teilnehmer_Sportart" abgespeichert.
Tipp
In diese Verbindungstabelle würden auch z.B. die Ergebnisse eines Wettkampfes gehören. Sollen allerdings mehrere Wettkämpfe abgehalten werden, so ist zusätzlich ein Wettkampfdatum in den gemeinsamen Primärschlüssel mit aufzunehmen.
Sind die Tabellen fertiggestellt, so sollte eine entsprechende Verbindung der Tabellen fest definiert werden. So kann verhindert werden, dass in der Tabelle "rel_Teilnehmer_Sportart" z. B. eine Nummer für einen Teilnehmer auftaucht, die gar nicht in der Tabelle "Teilnehmer" verzeichnet ist.
Über Extras → Beziehungen wird das Fenster für die Beziehungsdefinition geöffnet.
Für die Beziehungsdefinition sind alle bisher erstellten Tabellen notwendig. Die einzelnen Tabellen werden markiert und über Hinzufügen in den Beziehungsentwurf aufgenommen. Anschließend wird der Dialog «Tabellen hinzufügen» geschlossen.
Bei den hinzugefügten Tabellen sind alle Felder aufgeführt. Die Primärschlüsselfelder sind zusätzlich mit einem Schlüsselsymbol gekennzeichnet. Die vorgesehenen Rechtecke für die Tabellen können übrigens beliebig verschoben und in der Größe verändert werden.
Das Feld "Teilnehmer"."ID" wird mit der linken Maustaste markiert. Die Maustaste wird gehalten und die Maus auf das Feld "rel_Teilnehmer_Sportart"."ID_Teilnehmer" gezogen. Der Cursor zeigt eine Verknüpfung an. Die Maustaste wird über dem Feld "rel_Teilnehmer_Sportart"."ID_Teilnehmer" los gelassen. Es erscheint der folgende Dialog zur Definition der Beziehung («Relation»).
Das Feld "rel_Teilnehmer_Sportart"."ID_Teilnehmer" soll nicht verändert werden, wenn "Teilnehmer"."ID" verändert würde. Das ist die Standardeinstellung. "Teilnehmer"."ID" wird sowieso nicht verändert, da es sich um ein automatisch hoch zählendes Feld handelt und dort kein Eingriff vorgenommen werden soll.
Der Datensatz der Tabelle "rel_Teilnehmer_Sportart" soll gelöscht werden, wenn "ID_Teilnehmer" gleich "Teilnehmer"."ID" ist und "Teilnehmer"."ID" gelöscht wird. Wenn also aus der Teilnehmer-Tabelle ein Teilnehmer entfernt wird, dann werden alle entsprechenden Datensätze aus der Tabelle "rel_Teilnehmer_Sportart" entfernt. Dieses Vorgehen wird als «kaskadierendes Löschen» bezeichnet.
Im nächsten Schritt werden "rel_Teilnehmer_Sportart"."ID_Sportart" und "Sportart"."ID" durch Ziehen der Maus bei gedrückter linker Maustaste verbunden. Auch hier soll ein Datensatz gelöscht werden, wenn die entsprechende Sportart gelöscht wird.
Für die Datenänderung bei "Sportart"."ID" ist allerdings eine andere Variante gewählt worden. Wird "Sportart"."ID" geändert, so wird entsprechend "rel_Teilnehmer_Sportart"."ID_Sportart" angepasst. So kann gegebenenfalls das Kürzel von maximal 5 Zeichen für eine Sportart problemlos angepasst werden, auch wenn bereits viele Datensätze in der Tabelle "rel_Teilnehmer_Sportart" stehen. Dieser Vorgang wird als «kaskadierendes Update» bezeichnet.
Die Felder sind nun fertig verbunden. An den Enden der Verbindungen erscheint jeweils eine «1» und ein «n». Ein Teilnehmer kann mehrmals in der Tabelle "rel_Teilnehmer_Sportart" auftauchen. Eine Sportart kann ebenfalls mehrmals in der Tabelle "rel_Teilnehmer_Sportart" auftauchen. Nur die Kombination von Teilnehmer und Sportart gibt es in der Tabelle nur maximal ein Mal. Aus zwei 1:n-Beziehungen wird so über die dazwischen gesetzte Tabelle "rel_Teilnehmer_Sportart" eine n:m-Beziehung.
Solch eine Tabellenkonstruktion lässt sich nur schlecht über die Eingabe in Tabellen mit Inhalt füllen. Es müssten alle 3 Tabellen geöffnet sein, wenn einem Teilnehmer eine Sportart zugewiesen werden soll. In der Tabelle "Teilnehmer" muss "Teilnehmer"."ID" gesucht werden und nach "rel_Teilnehmer_Sportart" übertragen werden. In der Tabelle "Sportart" muss "Sportart"."ID" gesucht und entsprechend in "rel_Teilnehmer_Sportart" eingetragen werden. Zu umständlich: Ein Formular löst das eleganter.
Formulare können direkt in der Entwurfsansicht oder mit Hilfe des Assistenten erstellt werden. Die Erstellung mit dem Assistenten greift dabei auch alten Hasen so gut unter die Arme, dass diese eben schnell den Assistenten durchlaufen lassen und anschließend ein erst einmal vom Grund her erstelltes Formular ihren Wünschen anpassen. Das ist häufig der deutlich zeitsparendere Weg.
Zuerst wird unter Datenbank der Arbeitsbereich für Formulare gewählt. Dann wird unter Aufgaben → Formular unter Verwendung des Assistenten erstellen … ausgeführt.
In der Hauptsache sollen in die Tabelle "Teilnehmer" Daten eingegeben werden. Die Tabelle "Sportarten" wird direkt mit den wenigen notwendigen Sportarten bestückt und nur selten ergänzt.
Von der Tabelle "Teilnehmer" werden alle Felder bis auf das Primärschlüsselfeld "ID" benötigt. Das Primärschlüsselfeld wird ja automatisch mit einem entsprechend unverwechselbarem Wert gefüllt.
Die Felder im Formular werden über die Pfeiltasten zwischen den beiden Auswahlkästchen bestückt.
Es soll ein Unterformular eingerichtet werden, in dem die Sportarten dem Teilnehmer zugewiesen werden können. Die Beziehung für das Unterformular wird aus der vorher definierten Beziehung ausgelesen. Allerdings muss sie hier noch durch einen Klick auf die Tabelle "rel_Teilnehmer_Sportart" bestätigt werden.
Aus der Tabelle "rel_Teilnehmer_Sportart" wird nur das Feld "ID_Sportart" benötigt. Das Feld "ID_Teilnehmer" wird über die Verbindung von Hauptformular zu Unterformular mit dem Wert versehen, der in der Teilnehmer-Tabelle für den Primärschlüssel des aktuellen Datensatzes steht.
Dass diese Verknüpfung bereits geregelt ist, ist auch an dem 4. Schritt des Assistenten zu erkennen: Der Schritt Verknüpfte Felder ist inaktiv.
Wie die Elemente im Hauptformular und wie im Unterformular angeordnet sind, ist letztlich egal. Damit aber die Zuordnung von Daten auch für ungeübte einfach zu ersehen ist, sollte für das Hauptformular in unserem Beispiel nicht das Tabellenkontrollfeld gewählt werden. Im Unterformular soll das Feld später alle Sportarten des Teilnehmers anzeigen. Deswegen an dieser Stelle am besten das Tabellenkontrollfeld belassen.
Schritt 6 sollte so bleiben, wie er vorgesehen ist, also Dateneingabe → Das Formular zeigt existierende Daten an. Damit ist dann eine Neueingabe ebenso möglich wie eine Veränderung bereits bestehender Daten.
Schritt 7 ist reine Geschmackssache. Nur Vorsicht: manche Stile bergen unverhoffte kontrastarme Darstellungen vor allem in Tabellenkontrollfeldern. Hier muss dann gegebenenfalls die Schriftfarbe der Tabellenkontrollfelder nachjustiert werden.
Mit dem Formular soll noch nicht gearbeitet werde, weil das Unterformular noch die Eingabe des Kürzels für die Sportarten erfordert. Hier wäre eine Auswahl der Sportarten nach dem kompletten Namen wünschenswert. Deswegen: Das Formular weiter verändern.
Zuerst wird mit der rechten Maustaste auf den Tabellenkopf des Tabellenkontrollfeldes geklickt. Dort steht «ID_Sportart». Im Kontextmenü wird Ersetzen durch → Listenfeld ausgewählt.
Anschließend soll das Listenfeld bearbeitet werden, damit es auch die entsprechenden Daten anzeigen kann. Wieder über das Kontextmenü geht es zu Spalte...
Es öffnen sich die Eigenschaften des ausgewählten Listenfeldes. Daten → Art des Listeninhaltes → SQL soll gewählt werden. Mit Hilfe von SQL (StructuredQueryLanguage – Standardabfragesprache für Datenbanken) soll das Feld seinen Inhalt aus der Tabelle "Sportart" erhalten.
Ist SQL ausgewählt, so erscheint in der Zeile Listeninhalt rechts ein Button mit 3 Punkten … . Wird dieser Button gedrückt, so öffnet sich der Editor für die Erstellung von Abfragen. Die im Folgenden zu erstellenden Abfrage wird hier nur zusammengestellt und schließlich in dem Listenfeld selbst gespeichert.
Im Dialog «Tabelle oder Abfrage hinzufügen» erfolgt ein Klick auf Sportart → Hinzufügen → Schließen.
Für die erste Spalte wird in dem Abfrage-Editor das Feld "Sportart" ausgewählt. Dieses Feld soll im Listenfeld sichtbar sein.
Die zweite Spalte soll mit dem Feld "ID" bestückt werden. Dieses Feld gibt nachher seinen Wert an die Tabelle weiter, auf der das Unterformular basiert. Es werden also die ausgeschriebenen Worte dargestellt und die passenden Kürzel abgespeichert.
Die Abfrage wird mit dem Speicherbutton in die Eigenschaften des Listenfeldes übertragen. Der Editor wird anschließend geschlossen.
Im Listeninhalt ist jetzt der folgende Text zu lesen:
001 SELECT "Sportart", "ID" FROM "Sportart"
Das ist der SQL-Code, der aus der Betätigung des Editors erwachsen ist. Umgangssprachlich ausgedrückt heißt der Code: Wähle von der Tabelle "Sportart" als erstes die "Sportart" und als zweites den dazugehörigen Schlüsselwert aus.
Diese Abfrage stellt das Minimum dar, das ausgewählt werden sollte. Natürlich könnte auch eine Sortierung eingebaut werden. Mit geschickter Wahl der in "ID" abgespeicherten Kürzel ergibt sich aber bereits eine brauchbare Zusammenstellung der Sportarten. Wird nämlich keine Sortierung vorgegeben, so erfolgt die Sortierung immer nach dem Primärschlüsselfeld. Um später in dem Listenfeld Sportarten zu sehen, müssen diese natürlich zuerst einmal in die Tabelle "Sportart" entsprechend eingegeben werden.
Nun soll noch der Titel geändert werden, der für das Feld "ID_Sportart" eingetragen wurde. Es wird zwar weiterhin "ID_Sportart" abgespeichert. Sichtbar ist aber "Sportart". Deswegen: Allgemein → Titel → Sportart.
Soll z.B. das Design bei anderen Feldern angepasst werden, so lassen sich diese am besten über den Formularnavigator ansteuern. Werden Felder direkt angeklickt, so werden nicht nur die Eingabefelder, sondern auch die Beschriftungsfelder markiert. Durch den Assistenten wurden sie zu Gruppen zusammengefasst. Das erfordert dann weitere Aktionen im Kontextmenü der Auswahl.
Hinweis
Um ein Formularelement in einer Gruppe zu markieren hilft dann das Drücken von Strg beim Drücken der linken Maustaste. Wird dann noch die Umschalt (Shift) hinzugenommen, so lassen sich mehrere Elemente zusammen markieren.
Der Formularnavigator wird über die Symbolleiste «Formular-Entwurf» am unteren Bildschirmrand gestartet.
Hinweis
Manchmal kann es vorkommen, dass die Symbolleisten für die Erstellung von Formularen beim Bearbeiten der Formulare nicht korrekt geöffnet werden. Der Formularnavigator ist dann nicht zu finden.
Die Symbolleisten lassen sich über
Ansicht → Symbolleisten → Formular-Entwurf sowie Formular-Steuerelemente einblenden. Sollten die Symbolleisten danach auch bei der Dateneingabe sichtbar sein, so muss hier entsprechend wieder die Ansicht ausgeschaltet werden.
Neben den Symbolleisten ist der Formularnavigator auch direkt im Menü Formular → Formularnavigator zu finden.
Über den Formularnavigator kann jedes Feld einzeln aufgesucht werden. Im Kontextmenü sind dann die Eigenschaften des Feldes aufrufbar. Die Eigenschaften werden nach dem Verlassen der Eigenschaften automatisch gespeichert. Es kann auch bei geöffnetem Eigenschaftsdialog von einem Feld zum anderen gesprungen werden. Hierbei wird auch der jeweilige Zwischenstand gespeichert.
Wenn die Gestaltung nun beendet wurde, kann das Formular gespeichert und geschlossen werden. Auch eine Speicherung der Base-Datei ist jetzt wieder sinnvoll.
Wird jetzt das Formular zur Eingabe von Daten aufgerufen, dann könnte es ungefähr wie folgt aussehen. In das folgende Formular wurde zum Test ein Datensatz eingetragen. Nach der Eingabe des Geschlechtes wurde erst einmal der Button Speichern betätigt. Dann konnten auch Sportarten gewählt werden.
Bei der Nutzung des Formulars fallen einige Unannehmlichkeiten auf:
1.Das Unterformular mit den Sportarten ist nicht direkt erreichbar. Wird mit dem Tabulator navigiert, so springt der Tabulator nach der Eingabe des Geschlechtes direkt zum nächsten Teilnehmerdatensatz.
2.Die Navigationsleiste zeigt, wenn sie im Unterformular steht, die Datensatzzahl des Unterformulars an. Sie sollte besser nur durch das Hauptformular navigieren.
3.Das Geschlecht wird zur Zeit auswendig je nach Benutzervorliebe eingegeben. In der Tabelle ist lediglich die Länge des Feldes auf 1 Zeichen begrenzt worden. Hier muss also eine sicherere Eingabe gewährleistet werden.
Zur Lösung dieser Probleme muss das Formular nicht für die Dateneingabe, sondern zum Bearbeiten geöffnet werden:
Um mit dem Tabulator nach der Eingabe in das Feld "Geschlecht" nicht gleich weiter zum nächsten Teilnehmer-Datensatz zu rutschen ist einmal die Bearbeitung der Aktivierungsreihenfolge, erreichbar über die Symbolleiste «Formular-Entwurf», notwendig.
Mit der Auswahl Auto Sortierung erfolgt nicht nur die Sortierung der angezeigten Steuerelemente, sondern auch die automatische Weiterleitung in das Unterformular. Das ist zwar aus dem Dialog nicht ersichtlich, wird aber im Hintergrund so geregelt.
Der Formularnavigator wird geöffnet. Die Eigenschaften des Unterformulars werden aufgesucht.
Unter Daten → Symbolleiste Navigation wird der Wert von «Ja» auf «Übergeordnetes Formular» geändert. Anschließend zeigt die Symbolleiste Navigation immer die Nummer des Datensatzes aus der Tabelle "Teilnehmer" (Hauptformular) an.
Für die Einschränkung der Eingabe darf das Kontrollfeld kein einfaches Texteingabefeld sein. Im Hauptkapitel Formulare findet sich für die Eingabe des Geschlechtes die Lösung über einen «Gruppierungsrahmen». Hier soll deshalb eine andere Lösung, nämlich noch einmal über ein Listenfeld, vorgestellt werden.
Zuerst wird das Formularfeld für die Eingabe des Geschlechts über den Navigator markiert. Über das mit der rechten Maustaste erreichbare Kontextmenü wird Ersetzen durch → Listenfeld ausgewählt. Anschließend wird über das Kontextmenü Eigenschaften ausgewählt.
Daten → Art des Listeninhalts bleibt auf dem Wert «Werteliste» stehen. In Daten → Listeninhalt werden die Kürzel 'm' und 'w' über den Button ▼ in das Feld untereinander eingegeben. Diese Kürzel sind die Daten, die an die Tabelle "Teilnehmer" weiter gegeben werden.
In Allgemein → Listen-Einträge wird das angegeben, was durch das Listenfeld angezeigt werden soll. Das kann auch 'm' und 'w' sein. Es muss auf jeden Fall die gleiche Reihenfolge haben wie die Einträge unter Daten.
Jetzt wird noch unter Allgemein → Aufklappbar → Ja gewählt. Hierzu muss in den allgemeinen Eigenschaften recht weit unten gesucht werden.
Damit ist das Eingabeformular so weit, dass die auffälligsten Unannehmlichkeiten beseitigt wurden. Das Formular und die Datenbankdatei müssen wieder abgespeichert werden. Die Eingabe von Teilnehmern und Teilnehmerinnen sowie die Zuordnung zu Sportarten kann beginnen.
Damit die folgenden Schritte sinnvoll sind, sollten erst einmal einige Datensätze eingegeben werden. Dabei sollte darauf geachtet werden, dass die Teilnehmer und Teilnehmerinnen vom Alter und von der Sportart auch einmal in Konkurrenz zueinander treten können. Sonst sehen die anschließenden Abfragen und Berichte doch recht nichtssagend aus.
In einer Abfrage können z. B. Inhalte verschiedener Tabellen zusammengefasst werden. Mit dem ersten Zugriff sollen erst einmal alle Teilnehmer mit den Sportarten dargestellt werden, die sie belegt haben.
Der Start dazu geht über Abfragen → Abfrage in der Entwurfsansicht erstellen … . Es erscheint ein Dialog zur Tabellenauswahl, aus dem wir alle Tabellen für die Abfrage auswählen. Am übersichtlichsten ist es, wenn dabei die Tabelle "rel_Teilnehmer_Sportarten" als zweite Tabelle ausgewählt wird. Dann sind auch gleich die Verbindungen gut zu erkennen.
Die Felder, die in der Abfrage dargestellt werden sollen, können entweder durch einen Doppelklick auf die Feldnamen in den Tabellen oder durch Auswahl in der Zeile Feld eingestellt werden. Bei der Auswahl in der Zeile werden die Felder sämtlicher aufgeführter Tabellen aufgelistet. Um die Felder den Tabellen richtig zuordnen zu können, werden sie in Abfragen nach "Tabellenname"."Feldname" bezeichnet. Wird statt des Feldnamen ein «*» eingesetzt, so bedeutet dies, dass alle Felder der entsprechenden Tabelle angezeigt werden sollen.
Eine Abfrage sollte grundsätzlich vor dem Abspeichern auch einmal ausgeführt werden um zu sehen, ob sie denn wirklich das erhoffte Ergebnis liefert. Hierzu kann entweder direkt der oben gezeigten Button angeklickt, alternativ auch F5 gedrückt oder der Weg über Bearbeiten → Abfrage ausführen gewählt werden.
Die Abfrage zeigt jetzt alle Kombinationen der Teilnehmer und Sportarten an. Hat ein Teilnehmer mehrere Sportarten belegt, so werden mehrere Datensätze angezeigt. Teilnehmer ohne Sportarten erscheinen nicht.
Um bei einem Wettkampf unterschiedliche Altersgruppen zusammen zu stellen, ist der Geburtsjahrgang entscheidend. Es kommt darauf an, wie alt eine Person in dem jeweiligen Jahr wird.
Der Geburtsjahrgang kann mit unterschiedlichen Funktionen ermittelt werden. Die folgende Eingabe zeigt die Variante, die für Personen mit Englischkenntnissen vielleicht auch so erschließbar ist:
001 EXTRACT (YEAR FROM CURRENT_DATE) - EXTRACT (YEAR FROM "Geburtstag")
Über EXTRACT(YEAR FROM CURRENT_DATE) wird das aktuelle Jahr bestimmt. Entsprechend wird auch über EXTRACT(YEAR FROM "Geburtstag") das Jahr des Geburtstags ermittelt.
Diese und viele andere Funktionen, die mit der eingebauten Hsqldb oder der Firebird-Datenbank zusammen arbeiten, sind im Anhang des Handbuches beschrieben.
Wird die Abfrage ausgeführt, so erscheint die entsprechende Berechnung für das Jahr 2014, da diese Abfrage eben in dem entsprechenden Jahr ausgeführt wurde.
Etwas störend dürfte dabei sein, dass der gesamte Code, den wir als Feld eingegeben haben, eben auch in der Spaltenüberschrift erscheint. Dem wird abgeholfen, indem für den Code ein alternativer Name eingegeben wird, unter dem das Ergebnis erscheinen soll.
In der Zeile «Alias» wird die Bezeichnung «Sportalter» eingegeben. Hier sollte nicht «Alter» stehen, weil die Person vielleicht erst im Laufe des Jahres dieses Alter erreicht. Im Kapitel «Aktuelles Alter ermitteln» steht beschreiben, wie das tatsächliche Alter ermittelt werden kann.
Wird die Abfrage erneut ausgeführt, so erscheint in dem Spaltenkopf nicht mehr die Formel sondern die Bezeichnung «Sportalter».
Damit der Code für den Anfang nicht zu verwirrend wird, sollte die Abfrage unter dem Namen "Sportalter" abgespeichert werden. Diese Abfrage dient dann als Grundlage für die nächste Abfrage, die das "Sportalter" jetzt einer "Altersklasse" zuordnet.
Die Abfrage "Sportalter" wurde als Grundlage für die 2. Abfrage ausgesucht. Vor der Bezeichnung «Sportalter» im Tabellenarbeitsbereich ist ein anderes Symbol zu sehen als bei den Tabellen der ersten Abfrage. Dieses Symbol zeigt an, dass die Grundlage dieser Abfrage eben eine Abfrage und keine Tabelle ist.
Durch Doppelklick auf «*» oder Auswahl von «Sportalter.*» werden alle Felder ausgewählt. Die gesamte Abfrage von vorher wird also übernommen. Nur die Formel ist nicht mehr zu sehen.
Auf das Feld "Sportalter" soll nun zugegriffen werden. Das Sportalter bestimmt ja, in welcher Altersklasse die jeweiligen Personen starten.
Damit die Ermittlung nicht allzu kompliziert wird soll hier folgende Zuordnung nachvollzogen werden: Unter 20 Jahren werden die Teilnehmer immer in zwei Jahrgängen, beginnend mit 0, zusammen gefasst. Ab 20 Jahren werden Gruppen für jeweils 10 Jahre gebildet, also von 20-30 Jahren usw.
Solche Formeln gehören eigentlich längst nicht mehr zum Einstiegs-Repertoire. Eine einfachere Zuteilung der Altersklassen wäre sogar mit Hilfe des folgenden Berichtes möglich. Für differenziertere Zuteilung sei erneut auf den Anhang des Handbuches verwiesen.
001 CASE WHEN "Sportalter" > 19 THEN CEILING( "Sportalter" / 10 ) * 10 ELSE "Sportalter" - MOD( "Sportalter", 2 ) END
Überprüfung einer Bedingung (CASE WHEN), wenn korrekt (THEN), dann diesen Wert nehmen, wenn nicht korrekt (ELSE), dann den anderen Wert nehmen.
In die deutsche Sprache übertragen bedeutet das so viel wie:
Für den Fall, dass das Sportalter über 19 Jahren ist, dividiere das Sportalter durch 10 und gib nur den Ganzzahlwert wieder. Diesen Ganzzahlwert multipliziere wieder mit 10.
Ist das Sportalter bis einschließlich 19 Jahren, so nehme den Wert des Sportalters und subtrahiere davon den Rest, der sich ergibt, wenn das Sportalter durch 2 dividiert wird. Das ergibt dann z. B. für 19:
19/2 = 18, Rest 1, also 19 – 1 = 18.
Alle Teilnehmer über 19 Jahren werden damit einer Gruppe für das jeweilige Jahrzehnt zugewiesen. Alle Teilnehmer darunter werden einer Gruppe zugewiesen, die der jeweiligen niedrigeren geraden Zahl entspricht.
Dieser Formel wurde wieder ein Alias zugewiesen, in diesem Falle der Alias "Altersklasse".
Die Abfrage kann jetzt unter dem Namen "Meldung" gespeichert werden.
Das Ausschalten der Design-Ansicht ist hier eigentlich nicht notwendig, da alle Eingaben in der Design-Ansicht ohne größere Probleme möglich sind. Den Code von Abfragen einmal genauer anzusehen, kann allerdings nie schaden. Schließlich gibt es auch SQL-Formulierungen, die nur schlecht in die Design-Ansicht passen oder die dort gar nicht möglich sind. Dafür wird dann die direkte Eingabe im SQL-Code genutzt.
Im Code sind Felder und Tabellen in doppelte Anführungszeichen gesetzt und in einem ockerfarbigen Farbton dargestellt. Begriffe des SQL-Codes sind in blau gehalten, Funktionen der Datenbank in grün. Die Bezeichnung AS erscheint in neueren Versionen von LO nicht mehr.
001 SELECT
002 "Sportalter".*,
003 CASE WHEN "Sportalter" > 19 THEN CEILING( "Sportalter" / 10 ) * 10
004 ELSE "Sportalter" - MOD( "Sportalter", 2 ) END
005 AS "Altersklasse"
006 FROM "Sportalter"
Der Teil mit der Formel wurde ja schon erwähnt. Hier jetzt der Rahmen.
001 SELECT "Sportalter".*, ... AS "Altersklasse" FROM "Sportalter"
Wähle aus der Tabelle "Sportalter" alle Datensätze aus und zusätzlich das, was durch die Formel bestimmt wird. Das, was durch die Formel bestimmt wird, bezeichne als "Altersklasse".
Der Code unterscheidet nicht zwischen Tabellen und Abfragen als Grundlage der Daten. Er funktioniert deshalb nur in der grafischen Benutzeroberfläche von Base. Die Benennung von Abfragen muss dafür immer anders sein als die Benennung von Tabellen.
Sobald in einer Abfrage bei ausgeschalteter Design-Ansicht der Button SQL (für SQL-Kommando direkt ausführen) gedrückt wird, wird die Datenbank mit einer Fehlermeldung reagieren. Die eingebettete Datenbank kennt die Abfrage "Sportalter" nicht, auf die sich die aktuellen Abfrage "Meldung" bezieht.
Hinweis
Die Datenbank selbst kennt die Abfragen nicht. Die Abfragen sind unabhängig von der Datenbank in der grafischen Benutzeroberfläche von Base abgelagert. Soll eine Abfrage auch für die Datenbank bekannt sein, so muss sie als Ansicht in der Datenbank gelagert werden. Dies lässt sich über einen rechten Mausklick auf die geschlossene Abfrage und dann Als Ansicht erstellen bewirken.
Über Berichte → Bericht in der Entwurfsansicht erstellen … wird ein Bericht erstellt, der eine übersichtliche Teilnehmerliste, sortiert nach Sportart, Geschlecht und Altersklasse darstellen soll.
Wird der Editor gestartet, so ist zuerst der Dialog «Feld hinzufügen» im Vordergrund. Für diesen Dialog wird die von der alphabetischen Sortierung her erste Tabelle als Basis genommen. Es muss für den Bericht aber die Abfrage als Datenquelle herausgesucht werden.
Im Berichtsfenster befindet sich auf der rechten Seite die Übersicht über die Eigenschaften des gerade aktiven Objektes. Sollte die Leiste nicht sichtbar sein, so muss sie über Ansicht → Steuerelement-Eigenschaften… ausgewählt werden.
Aus den Eigenschaften wird im Reiter Daten → Art des Inhaltes → Abfrage ausgewählt. Als Inhalt wird dann die Abfrage "Meldung" gewählt, die als letzte zusammenfassende Abfrage erstellt wurde.
Der Report-Designer zeigt jetzt sämtliche Felder der ausgesuchten Abfrage an.
Im nächsten Schritt wird der Sortier-Dialog ausgewählt:
Die Sortierung kann auch über Ansicht → Sortierung und Gruppierung angezeigt werden.
Im Sortierungs- und Gruppierungs-Dialog werden nacheinander die Felder "Sportart", "Geschlecht" und "Altersklasse" ausgewählt.
Auf der linken Seite des Berichtes erscheint bei jeder Sortierungsauswahl ein Gruppenkopf für die Sortierung. Die Eigenschaften der Sortierung und Gruppierung werden einfach erst einmal so gelassen wie im Standard vorgesehen.
Der Dialog «Sortierung und Gruppierung» kann nun geschlossen werden.
Der Gruppenkopf «Sportart Kopf» wird ausgewählt. Dies ist an der weißen Umrandung des Kopfes sichtbar. Anschließend wird im Dialog «Feld hinzufügen:» mit einem Mausklick auf das Feld «Sportart» ein Beschriftungsfeld und ein Textfeld eingefügt, das den Inhalt des Feldes «Sportart» aufnehmen soll.
Mit dem gleichen Verfahren werden die Felder «Geschlecht» und «Alter» den passenden Gruppenköpfen zugewiesen.
Sämtliche verbleibenden Felder werden in den Bereich «Detail» eingefügt.
Der Berichtsentwurf dürfte jetzt wie folgt aussehen:
Anschließend sollte der Bericht erst einmal abgespeichert werden. Als Name würde sich so etwas wie «Teilnehmerliste» anbieten.
Auch die Datenbankdatei selbst sollte abgespeichert werden, da sonst die Speicherung des Berichtes erst einmal nur temporär vorgenommen wird.
Hinweis
Gerade beim Gestalten eines Berichtes mit dem Report-Designer fallen oft Instabilitäten des Programms auf. Ist ein wichtiger Schritt gelungen, so sollte auf jeden Fall sowohl der Bericht als auch die Datenbankdatei gespeichert werden.
Die spätere Ausführung eines Berichtes ist von diesen Instabilitäten zum Glück nicht betroffen.
Wird dieser Bericht mit entsprechenden Daten ausgeführt, dann ergibt sich in etwa das folgende Bild:
Der Beginn des Berichtes zeigt hier zwei männliche Teilnehmer an, die Hochsprung machen wollen und der Altersklasse 20 angehören.
Bei der Ausführung des Berichtes fallen einige Designmängel auf:
1.Die Abstände zwischen den Gruppenköpfen und dem Inhalt des Detailbereichs sind viel zu groß.
2.Das Geschlecht wird mit «m» bzw. «w» angegeben. Besser wäre eine Bezeichnung wie «Herren» und «Damen».
3.Bei der Altersklasse steht, vermutlich wegen der Division in der Abfrage, eine Zahl mit einer Nachkommastelle, wobei als Dezimaltrenner ein Punkt gesetzt wird.
4.Die Bezeichner für die dargestellten Felder aus dem Bereich «Detail» («Nachname», «Vorname» usw.) sollten besser gemeinsam für alle Inhalte des Bereiches als Tabellenköpfe über den Inhalten stehen.
Die Abstände zwischen den Bereichen können direkt an den Tabellenköpfen durch Schieben mit der Maus verringert werden. Es ist auch möglich, einen Bereich zu markieren und in den Eigenschaften des Gruppenkopfes die Höhe über eine Zahleneingabe zu regeln. Dafür darf kein Feld, sondern nur der Gruppenkopf markiert sein.
Es ist nicht möglich, einen Bereich kleiner zu wählen als die darin existierenden Beschriftungs- und Textfelder sind.
Der Bereich «Altersklasse» sollte dabei so groß gewählt werden, dass er noch die Beschriftungsfelder aus dem Bereich «Detail» aufnehmen kann.
Außerdem muss bei der Auswahl der Abstände berücksichtigt werden, dass eine folgende Gruppe nicht zu nah unter der vorhergehenden Gruppe erscheint. Die Beschriftungs- und Textfelder benötigen gegebenenfalls auch einen Abstand nach oben. Wird dieser Abstand nach oben nicht gewünscht, so kann damit nachgeholfen werden, dass zusätzlich zu den Gruppenköpfen auch Gruppenfüße angezeigt werden. Eine solche Einstellung ist über Ansicht → Sortierung und Gruppierung für jede Gruppe möglich.
Die Bezeichnung des Geschlechtes aus der Tabelle reicht für die Ansprüchen einer Teilnehmerliste nicht aus. Es könnte eine entsprechende Umbenennung bereits in der Abfrage erfolgen. Da die Abfrage aber bereits erstellt wurde, werden jetzt die Möglichkeiten des Berichtes genutzt.
Das Textfeld «=Geschlecht» wird markiert. In den Eigenschaften auf der rechten Seite des Report-Designers wird der Reiter Daten → Datenfeld aufgesucht. Dort wird der Button mit den 3 Punkten … betätigt. Es erscheint der Funktions-Assistent. Alle Funktionen sind hier allerdings nicht übersetzt, sondern in englischer Sprache erreichbar.
In der Kategorie «Logical» steckt die Funktion «IF». Die Vorgehensweise bei dieser Funktion ist gleich der Funktion «WENN» aus LO-Calc.
Ein Testwert wird eingegeben. Dabei ist das Feld der Abfrage, aus der die Daten ausgelesen werden, in eckige Klammern zu setzen. Texte müssen in doppelte Anführungszeichen gesetzt werden. Wenn im Feld "Geschlecht" der Wert «m» steht, dann soll in dem Feld des Berichtes «Herren» angezeigt werden. Steht dort kein «m», dann wird «Damen» angezeigt.
Die Eingabe wird mit OK bestätigt.
Damit ist die Formulierung des Feldes entsprechend umgestellt.
Das Feld, das den Inhalt der Datenbank aufnehmen soll, wird zwar in Berichten als «Textfeld» bezeichnet. Es kann aber genau so formatiert werden wie Felder in Tabellen im Writer oder in Calc.
Das Feld «=Altersklasse» wird markiert. Bei den Eigenschaften am rechten Bildschirmrand wird Allgemein → Formatierung aufgesucht. Die Formatierung steht dort auf «Text». Der Button mit den 3 Punkten (…) wird gedrückt. Es öffnet sich der Formatierungs-Dialog, der auch aus Calc, dem Writer oder bei Formularerstellungen bekannt ist. Hier wird Kategorie → Zahl ausgewählt und mit OK bestätigt.
Die Formatierung der Anzeige ist nun von Text auf Zahl umgestellt.
Felder können beim Report-Designer auch über die Grenzen eines Bereiches hinweg verschoben werden. Im Zielbereich muss allerdings genügend Platz für das Feld vorhanden sein. Es kann nämlich nicht ein Feld über einem anderen liegen. Das Verschieben funktioniert aber leider nicht in allen Versionen von LibreOffice sicher. Sicherer ist es daher, Felder für den Zielbereich neu zu erstellen.
Die Positionierung mit der Maus ist je nach System so ungenau, dass am besten reichlich Platz vorhanden sein sollte. Sind erst einmal die Felder in einem Bereich vorhanden wie hier dem Gruppenkopf «Altersklasse», so lassen sie sich auch mit den Pfeilfeldern und mit Tastatureingaben genau positionieren.
Zur Positionierung mit der Tastatur ist in den Eigenschaften Allgemein → Position X und Allgemein → Position Y auf zu suchen.
Hier wurde noch ein Beschriftungsfeld für die Überschrift hinzugefügt. Die Eingabe des Textes für das Beschriftungsfeld erfolgt in den Eigenschaften des Feldes.
Der Seitenfuß wurde in den Eigenschaften auf Sichtbar → Nein eingestellt. Er nimmt sonst am unteren Rand des Dokumentes zu viel Platz weg. Hierbei sollte bedacht werden, dass die verfügbare Höhe bereits durch die Größe der Seitenränder zusätzlich verringert wird. Standardmäßig sind alle Seitenränder bei einer DIN-A4-Seite auf 2 cm eingestellt.
Weitere Formatierungsmöglichkeiten für den Bericht werden in dem gesonderten Kapitel «Berichte mit dem Report-Designer» beschreiben.
Das vorgestellte Beispiel ist natürlich nur der erste Schritt für eine Datenbank im Sportbereich. Zuerst einmal sollte auf jeden Fall ein Feld ergänzt werden, das die jeweiligen Leistungen aufnimmt. Solch ein Feld wäre gut in der Tabelle "rel_Teilnehmer_Sportart" unter zu bringen.
Sollen die Eingaben allerdings für mehrere Wettkämpfe in gleichen Sportarten gelten, so ist außerdem noch ein Datumsfeld oder ein anderes Feld, das dem jeweiligen Wettkampf zugeordnet werden kann, in die Tabelle "rel_Teilnehmer_Sportart" aufzunehmen. Das Feld muss dann auch Teil des gemeinsamen Primärschlüssels sein.
Vielleicht käme noch die Vereinszugehörigkeit hinzu. Dazu würde ein Feld in der Tabelle "Teilnehmer" ausreichen. Bei vielen gleichen Vereinen bietet sich aber auch eine separate Tabelle "Vereine" sowie der entsprechende Fremdschlüssel in der Tabelle "Teilnehmer" an.
Dann muss natürlich, wie bei allen Wettbewerben, ermittelt werden, wer denn nun in der jeweiligen Altersklasse auf welcher Platzierung gelandet ist. Sortierung ist hier gefragt, die vielleicht wieder als Bericht in einer Ergebnisliste landet.
Schön wäre dann, wenn jeder Teilnehmer (wieder über einen Bericht) eine gestaltete Urkunde mit den persönlichen Leistungen und der Platzierung erhält.
Solche Erweiterungen sind ohne weiteres möglich. Das sollen die kommenden Kapitel des Handbuches zeigen.
Neben den beiden Hauptdatenbanken für das Handbuch «Medien_ohne_Makros.odb» und «Medien_mit_Makros.odb» steht noch ein ganzes Bündel von Beispieldatenbanken mit einer ausführlichen Erklärung an gleicher Stelle wie das Handbuch zum Download bereit.
Ein mehrstufiges Videotutorial von F3K Total, das von den Grundlagen her den Einstieg ermöglicht ist gut von dieser Seite aus zu starten: http://de.openoffice.info/viewtopic.php?f=27&t=54234#p237478
Anlaufpunkte für Fragen zu Base ist im deutschsprachigen Raum vor allem das Forum https://ask.libreoffice.org/c/german/6 (Forum von LibreOffice – Dokument Foundation).
1Alle Beispieldatenbanken können auf http://de.libreoffice.org/get-help/documentation/ oder https://wiki.documentfoundation.org/Documentation/de#Handbuch_f.C3.BCr_Base_.28Datenbank-Programm.29 herunter geladen werden. Weitere Beispiele auch auf: https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_beispiele
2Die Datenbank «Beispiel_Sport.odb» ist den Beispieldatenbanken für dieses Handbuch beigefügt.