Archiv des LibreOffice- und OpenOffice.org-Wiki

[ÜberSicht] [TitelIndex] [WortIndex] [SeiteFinden

(./) SO8 OOo2.0.2

Ein Formular erstellen für eine 1:n-Beziehung.

1. Beschreibung der Beispieldatenbank

1.1. Tabellendesign

Tabelle „Klassen“

ID

CHAR

Enthält eine eindeutige Kennzeichnung der Klasse wie z.B. 5a oder 10c

Lehrer

CHAR

Enthält das Kürzel des Klassenlehrers. Real wäre es wahrscheinlich ein Fremdschlüssel auf eine Lehrerdatei.

Raum

VARCHAR

Gibt den Klassenraum der Klasse an, eine übliche Raumnummer wie U012.

Das Feld ID ist der Primärschlüssel.

Tabelle „Schüler“

ID

INTEGER

Nummer, die den Schüler eindeutig identifiziert. Real werden diese Nummern meist von der Kommune vergeben.

Nachname

VARCHAR

Vorname

VARCHAR

Geburtsdatum

DATE

weiblich

BOOLEAN

Klasse

CHAR

Fremdschlüssel auf die Klasse, das heißt es steht dort eine ID aus der Tabelle „Klassen“. Das Feld darf hier im Beispiel auch leer sein, wenn der Schüler zwar schon aufgenommen wurde, aber noch keiner Klasse zugeteilt ist.

ID ist der Primärschlüssel mit Autowert.

Hier liegt eine Eins-zu-Viele-Beziehung vor. Ein Schüler gehört zu maximal einer Klasse (Eins); eine Klasse hat im allgemeinen mehrere Schüler (Viele). Für solche Beziehungen schreibt man kurz 1:n-Beziehung.

1.2. Realisierung in Base

Sie können die Tabellen sowohl mit dem Assistenten als auch in der Entwurfsansicht erstellen. Die Beziehung können Sie problemlos mit Ziehen herstellen. Einzelheiten sind in DatenbankErzeugen beschrieben.

Die eingebettete HSQL-Datenbank kennt Primärschlüssel und Beziehungen und überwacht selbstständig die referenzielle Integrität. Das heißt, dass Verweise nur zu tatsächlich existierenden Datensätzen führen.

Wenn die Datenbank keine Primärschlüssel kennt, wie z.B. dBase, müssen Sie eindeutige Indizes benutzen. Für die referenzielle Integrität sind Sie dann selbst verantwortlich.

Die Schreibweise der SQL-Befehle ist eventuell bei ihrem Datenbanksystem etwas anders. Die Anweisungen müssen Sie dann ggf. anpassen.

Beispieldatenbank zum Rumprobieren schule.odb

2. Formulare

Für die Bearbeitung der Datensätze (Eingeben, Ändern, Löschen) werden meistens Formulare benutzt. Wie solche Formulare prinzipiell erstellt werden, ist in DatenbankErzeugen und InternesFormularBeiDatenbank beschrieben. Hier geht es um Besonderheiten bei 1:n-Beziehungen.

Für die Tabelle „Klassen“, die ja die Quelle der Fremschlüssel ist, ist nichts Besonderes erforderlich. Die Tabelle „Schüler“ erfordert aber besondere Formulare, die berücksichtigen, dass das Feld „Klasse“ eine Referenz auf einen Datensatz aus der Tabelle „Klassen“ enthält.

2.1. Nachschlageliste

Das Formular soll so gestaltet werden, dass der Benutzer bei der Eingabe/Bearbeitung des Feldes „Klasse“ einen Wert aus einer Liste der tatsächlich vorhandenen Klassen aussuchen kann.

2.1.1. Einzelnes Listenfeld

Benutzen Sie das Kontrollelement Listenfeld.

Datenfeld
Wählen Sie aus der Tabelle das Datenfeld des Fremschlüssels, also das Feld, das die Daten aufnehmen soll, die Sie hier auswählen. Im Beispiel ist es das Datenfeld „Klasse“.
Art des Listeninhalts und Listeninhalt
Diese legen zusammen fest, wie die Ergebnisliste gebildet wird, aus der die Auswahl durch die Drop-Down-Liste erfolgt.
Gebundenes Feld
Bestimmt welcher Wert der Ergebnisliste als Wert des Fremdschlüssels benutzt wird.

2.1.2. Listenfeld in einem Tabellenfeld

Sie können für die Eingabe in die Tabelle „Schüler“ auch ein Tabellenfeld benutzen. Standardmäßig wird aber keine der Spalten als Listenfeld angelegt. Sie müssen dies nachträglich ändern. Öffnen Sie das Kontextmenü des Spaltenkopfs. Beim Eintrag „Ersetzen durch“ wählen Sie das Listenfeld aus. Beim Eintrag Spalte… erhalten Sie den Eigenschaftdialog. Dort tragen Sie dann die nötigen Werte im Register Daten ein. Im Register ALlgemeinlegen Sie die Anzahl der angezeigten Listenelemente fest.

In der Entwurfsansicht des Formulars sehen Sie keinen Unterschied. Aber wenn Sie das Formular zur Dateneingabe öffnen, erhalten Sie eine Drop-Down-Liste, sobald Sie in ein Feld dieser Spalte klicken.

2.1.3. Inhaltstyp SQL

SELECT "ID", "ID" FROM "Klassen"

Diese Abfrage wird erzeugt, wenn Sie nicht selbst die Werte eintragen sondern dem Assistenten für Listenfelder folgen. Wenn Sie die Abfrage selbst eingeben, werden die äußeren Anführungszeichen nicht mit eingegeben, sondern sie erscheinen automatisch.

Wenn Ihr Datenbanksystem mit der Schreibweise die OOo benutzt nicht klarkommt, dann können Sie auch die Art SQL [native] festlegen und die Schreibweise ihres Datenbanksystems benutzen.

Eine solche Abfrage liefert als Ausgabe eine Datenmenge in Tabellenform. Die Einstellung Gebundenes Feld legt dann fest, welche Spalte der Ergebnistabelle als Wert für den Fremdschlüssel benutzt wird. Die Zählung beginnt bei 0. Allerdings können Sie die 0 nicht eingeben, sondern Sie müssen in diesem Fall das Feld ganz löschen.

Für die Anzeige wird immer das erste Feld der Ergebnisliste benutzt, und zwar sowohl in der Drop-Down-Liste selbst, als auch in der Tabellenansicht des Formulars.

Statt den SQL-Befehl direkt dort einzugeben, können Sie auch zunächst eine Abfrage definieren und dann als Art Abfrage wählen. Das hat den Vorteil, dass Ihnen die Design-Ansicht und die Vorschau des Abfrage-Entwurfs zur Verfügung steht.

2.1.4. Vergleich mit Access

In OOo ist in der Liste immer nur das erste Feld der Ergebnistabelle zu sehen. In Access kann diese Nachschlageliste auch mehrere Spalten enthalten. Dadurch können Sie dort recht einfach sehen, welche zusätzlichen Daten zu einem Datensatz gehören, den Sie an Hand eines – mitunter recht kryptischen – Primärschlüssels ausgewählt haben.

Um in OOo den Inhalt mehrerer Datenfelder in der Liste zu sehen, kann man als Workaround die Inhalte dieser Felder aneinanderhängen und diese „berechnete Spalte“ als erste Spalte der Abfrage benutzen. Als zweite Spalte, d. h. für das verbundene Datenfeld, nimmt man dann den Primärschlüssel.

Zum Aneinanderhängen gibt es die Operatoren + und || sowie die Funktion CONCAT. Welche Version funktioniert, hängt von Ihrem Datenbanksystem ab.

SELECT "ID" + SPACE( 1 ) + CHAR( 124 ) + SPACE( 1 ) + "Lehrer" + SPACE( 1 ) + CHAR( 124 ) + SPACE( 1 ) + "Raum" AS "info", "ID" FROM "Klassen" "Klassen"

oder

SELECT "ID" + (' | ') + "Lehrer" + (' | ') + "Raum" AS "info", "ID" FROM "Klassen" "Klassen"

Funktioniert als SQL [native] Abfrage in HSQL. Die Anweisung funktioniert für eine reine Abfrage auch wenn OOo den Befehl interpretiert. Aber die so erstellte Abfrage funktioniert in dem Listenfeld nicht wie gewünscht.

SELECT "ID" ||' | ' || "Lehrer"||' | '||"Raum" AS "info", "ID" FROM "Klassen" "Klassen"

Funktioniert als SQL [native] Abfrage in HSQL.

SELECT CONCAT( "ID", ' | ', "Lehrer", ' | ', "Raum" ) AS "info", "ID" FROM "Klassen" "Klassen"

Funktioniert in dBase. In HSQL kann man mit CONCAT aber nur zwei Zeichenketten verbinden, da sieht die Anweisung dann so aus: SELECT CONCAT( CONCAT( CONCAT( CONCAT( "ID", ' | ' ), "Lehrer" ), ' | ' ), "Raum" ) AS "info", "ID" FROM "Klassen" "Klassen"

2.1.5. Inhaltstyp Tabelle

Funktioniert nicht!

Ich versuche das Problem über die Mailingliste zu klären.

2.1.6. Vor- und Nachteile

Geeignet, wenn man „sprechende“ Primärschlüssel hat, wie im Beispiel die Bezeichnung der Schulklasse. Bei automatisch erstellten Primärschlüsseln nur mit Ergänzungen geeignet, die den Inhalt des referenzierten Datensatzes zeigen.

2.2. Unterformular

Bei einem UnterFormular werden aus einer Tabelle diejenigen Datensätze gezeigt, die mit dem Hauptformular in dem Verbindungsfeld übereinstimmen.

2.2.1. So geht es

Wenn Sie das Formulardokument nicht mit dem Assistenten erstellen, öffnen Sie den Formularnavigator. Im Kontextmenü des (Haupt-)formulars wählen Sie nochmals Formular. In der Baumdarstellung im FormularNavigator erscheint es eine Ebene tiefer. In den Eigenschaften stellen Sie wie beim Hauptformular zunächst die Datenquelle ein. Dann geben Sie die Verbindungsfelder an. Diese ergeben sich automatisch aus den für die Datenbank festgelegten Beziehungen. Nach Klick auf die Schaltfläche können Sie diese einfach auswählen.

Ein Unterformular braucht wie das Hauptformular nicht auf einer Tabelle zu basieren, sondern kann auch eine Abfrage oder die Ergebnistabelle eines SQL-Befehls als Datenquelle haben.

2.2.2. Vor- und Nachteile

Hauptformular „Schüler“ , Unterformular „Klassen“
Zu einem Schüler werden dann alle Klassen angezeigt, in denen der Schüler ist, also maximal eine. Eine solche Konstruktion ist sinnvoll, wenn man beim jeweiligen Schüler die zusätzlichen Informationen zu seiner Klasse anzeigen will.

Man kann mit diesem Unterformular eine neue Klasse anlegen, diese wird jedoch nicht beim gerade aktiven Schüler eingetragen. Eine Änderung der Klasse beim Schüler wird erst dann ins Unterformular übernommen, wenn die Änderung gespeichert wurde. (Verbesserungswunsch unter http://www.openoffice.org/issues/show_bug.cgi?id=64898 )

Hauptformular „Klassen“, Unterformular „Schüler“
Wird im Hauptformular eine Klasse ausgewählt, zeigt das Unterformular alle Schüler, die in dieser Klasse sind. Man kann dort auch einen neuen Schüler für diese Klasse eintragen. Dieser gehört dann automatisch dieser Klasse an. Man kann auch einen vorhandenen Schüler von einer Klasse in eine andere Klasse verschieben, indem man die neue Klasse von Hand einträgt. Es ist aber nicht möglich einen Schüler, der bisher ohne Klasse ist, einer Klasse zuzuweisen, weil man diesen Schüler durch das Unterformular nicht sieht.


KategorieBase


LizenzBedingungen | AnbieterKennzeichnung | DatenschutzErklärung | Stand: 2013-04-28