Eingabeformular

Hi
Ich versuche für unseren Kräutergarten eine Datenbank zu erstelllen, da wir die vorhandenen Ressourcen nur zum Teil nutzen.
Ich habe vor vielen Jahren mal mit Access “rumgespielt” und inzwischen zu Ubuntu gewechselt. Nach Ewigkeiten starte ich mal wieder den Versuch eine Datenbank zu kreieren und so stoße ich auch Base.

Ich komme allerdings trotz des Manuals nicht weiter.

Ich habe vom Ansatz her eine Tabelle für die Pflanzen (tbl_Pflanzen) in der nur ein Primary Key (PflanzenID - Integer Auto), der Name (Indexiert), die Variante (indexiert) , der botanische Name (indexiert) und Anmerkungen stehen, sowie das n:m Konstrukt um die medizinischen Anwendungen zu erfassen.
Das sind die Tabellen Bereiche (tbl_Bereiche)für die Körperbereiche Kopf, Nerven, Magen/Darm… ) diese hat einen PK VARCHAR mit Kürzel und ein Feld für die Bereiche (indexiert). Dann gibt es die Tabelle für die Indikationen (tbl_Indikationen - PK Integer und Feld für Indikation, indexiert). Diese beiden Tabellen zusammen ergeben ein Symptom (Merere Indikationen können in einen Bereich gehören - mehrere Bereiche können dieselbe Indikation haben) das ich durch eine Zwischentabelle zu erfassen versuche (int_tbl Symptome) dies besteht nur aus Schlüsseln ( SymptomID - Integer, Auto , und die Fremdschlüsseln BereicheID und IndikationenID). Da ich nun eine Verbindung zu den Pflanzen brauche und mehrere Pflanzen auf dieselben Symptome wirken können (u. vice versa) brauche ich auch hier eine Zwischentabelle (int_tbl_Medizinanwendungen) mit den kombinierten Schlüsseln PflanzenID und SymptomID.

Jetz abgesehen davon ,dass es noch andere Stränge gibt, wie Alternative Namen, Art, Inhaltsstoffe, Kulinarik, Anwendungsformen (z.b. Tee, Tinktur…), Erntegut oder Verwendungsarten (i.e. Räucherpflanzen), scheitere ich bereits beim Problem der Dateneingabe für den oben beschriebenen Strang.
Wenn ich ein Formular anlege, um das von der Eingabe her aus der zentralen Sicht der Pflanze (erschien mir zunächst einfacher als von der Sicht der Medizinanwendung auszugehen) anzugehen, habe ich als oberstes Formular Pflanzen (Daten aus tbl_Pflanzen) dann ein Unterformular (int_tbl_Medizinanwendungen) unter diesem UF ein weiteres UF int_tbl_Symptome und unter diesem UF die UF für die Bereiche (int_tbl_Beriche) und Indikationen (int_tbl_Indikationen). Das Ganze der Einfachheit halber alles in Tabelllenform(Grid). Die Formulare sind durch die jeweiligen Schlüssel verbunden und die Spalten ebenfalls mit den Tabellendaten verbunden.
Jetzt sehe ich zumindest mal alle Pflanzen in dem einen Grid - im anderen sehe ich die Pflanzen und SymptomID und kann an den Datensätzen erkennen, ob eine Pflanze mit mehreren Datensätzen davon in Verbindung steht. Wenn ich in diesen Datensätzen(Medizinanwendungen) scrolle bekomme ich die zugehörigen Daten in den UF-Grids angezeigt …
ABER …
Ich kann keine Daten eingeben - ich würde also gerne eine Pflanze eingeben, dann bei den Bereichen und Indikationen neue Datensätze eingeben, die ihrerseits ein Symptom mit den Schlüsseln kreieren und somit in der Zwischentabelle int_tbl_Medizinbereiche einen Datensat mit dem Connect zu der Pflanze generieren. Geht aber nicht und ich habe keine Ahnung, wie ich das realisieren kann …
Ich hoffe ich habe mich nicht allzu unverständlich ausgedrückt …
Kann mir’s wer erklären oder mir sagen, wo ich da Klarheit erlangen kann ?
Beste Grüße.

Du hast da eine sehr umfangreiche Beschreibung geliefert, die aber ohne Beispieldatei wohl für die meisten User hier nicht nachvollziehbar ist.

Wenn Du keine Daten in ein Formular eingeben kannst und nicht nur irgendeine Fehlermeldung beim Abspeichern auftaucht, dann hast Du eine schreibgeschützte Datenquelle. Beruht das ganze auf einer Abfrage, dann wirst Du auch dort den Schreibschutz haben. Beruht das Ganze auf lediglich einer Tabelle, dann wird der Tabelle der Primärschlüssel fehlen.

Da Du das Base Handbuch herunter geladen hast (ich nehme an, dass Du das mit “Manual” meinst): Schau Dir einmal im Kapitel “Abfragen” das Unterkapitel “Eingabemöglichkeit in Abfragen” an.

1 Like

@libels,
wenn du schon mehrgleisig fährst, teile das bitte immer mit.

1 Like

Hi
Wie sollte die Beispieldatei denn eingestellt werden - in welcher Form ? - die ganze .odt ?

Das Formular hat MEHRERE Tabellen, die in Beziehung stehen. Meines Wissens ist da nichts schreibgeschützt, da ich in die Tabellen getrennt durchaus eingeben kann - nur eben im Formular nicht …
Jede der Tabellen hat Primärschlüsseln.
Ja - ich habe das Base Handbuch gemeint. Da ich noch keine Abfragen dazu generiert habe, sondern nur mal versucht habe, die Tabellen in einem Formular zu fassen, wird mich das Abfrage - Kapitel dazu nicht weiterbringen, oder doch ?
lg

ok, Danke !

Du hast doch eine Datenbankdatei mit Formularen erstellt. Oder hast Du gleich externe Formulare erstellt (odt-Dateien)?
Die *.odb-Datenbankdatei ohne irgendwelche persönlichen Daten wäre hier für ein Posting sinnvoll.

Wenn Du bisher keine Abfragen erstellt hast, dann bringt Dir natürlich das Abfrage-Kapitel nichts.

Für den Start mit Formularen ist immer empfehlenswert, erst einmal innerhalb einer Base-Datei den Assistenten für Formulare zu nutzen. Die Erstellung von Formularen ohne Assistenten ist da etwas mühsamer.

Oder das ID-Feld fehlt in der Abfrage.

Kräuter_Indikationen_bsp.odb (21.4 KB)

Jetzt habe ich aus den genannten Tabellen eine Abfrage erstellt (Abfrageassistent) und ALLE Felder hineingenommen. Die beteiligten Tabellen habe ich über die Schlüssel verknüpft - wie das auch bei den Tabellenbeziehungen ist …
Sobald ich etwas in die ausgeführte Abfrage eingebe (wobei die FremdPS der Zwischentabellen offenbar nich befüllt werden - das Primärschlüsselfeld das kein Integer hat (Tabelle Bereiche) habe ich manuell mit einem Kürzel versehen - stürzt LOBase ab - und zwar IMMER. Nach der Wiederherstellung stehen die neuen Daten in den Tabellen Pflanzen, Bereiche, Indikationen aber in KEINER Zwischentabelle (Symptome, Medizinanwendungen)…

SELECT “tbl_Pflanzen”.“PflanzenID” AS “PflanzenID”, “tbl_Pflanzen”.“Name” AS “Name”, “tbl_Pflanzen”.“Variante” AS “Variante”, “tbl_Pflanzen”.“Botanischer Name” AS “Botanischer Name”, “tbl_Bereiche”.“Bereiche” AS “Bereiche”, “tbl_Indikationen”.“Indikation” AS “Indikation”, “tbl_Pflanzen”.“Anmerkungen” AS “Anmerkungen”, “int_tbl_Medizinanwendung”.“PflanzenID” AS “PflanzenID_M”, “int_tbl_Symptome”.“SymptomID” AS “SymptomID”, “int_tbl_Medizinanwendung”.“SymptomID” AS “SymptomID_M”, “tbl_Bereiche”.“BereicheID” AS “BereicheID”, “int_tbl_Symptome”.“BereicheID” AS “BereicheID_S”, “tbl_Indikationen”.“IndikationenID” AS “IndikationenID”, “int_tbl_Symptome”.“IndikationenID” AS “IndikationenID_S” FROM “int_tbl_Symptome”, “tbl_Bereiche”, “tbl_Indikationen”, “int_tbl_Medizinanwendung”, “tbl_Pflanzen” WHERE “int_tbl_Symptome”.“BereicheID” = “tbl_Bereiche”.“BereicheID” AND “int_tbl_Symptome”.“IndikationenID” = “tbl_Indikationen”.“IndikationenID” AND “int_tbl_Medizinanwendung”.“SymptomID” = “int_tbl_Symptome”.“SymptomID” AND “tbl_Pflanzen”.“PflanzenID” = “int_tbl_Medizinanwendung”.“PflanzenID”

(Änderung - Ich habe der Einfachheit halber in der Tabelle Bereiche statt dem VARCHAR Kürzel als Primärschlüssel ebenfalls auf eine Integer-ID umgestellt)
Das Problem, oder mein Denkfehler scheint zu sein, dass ich annehme, wenn ich in die Tabellen (Bereiche, Indikationen) neue Daten eintrage, dass nur durch die Beziehung zur Zwischentabelle Symptome, dort ein neuer Datensatz mit den Primärschlüsseln der Tabellen entsteht und der neue PS dieses neuen Datensatzes in der Zwischentabelle Symptome dann durch dessen Beziehung mit der Tabelle Medizinanwendungen dort ebenfalls automatisch einen neuen Datensatz mit dem Fremdschlüssel aus Symptome generiert - dann schreibt die Pflanzentabelle ihren PS als Fremdschlüssel dazu und somit ist die Kette fertiggestellt.
Wenn ich mir das so überlege ist das natürlich unsinniger Voodoo, denn dazu müsste die Datenbank auf ein Hirnimplantat meinerseits zugreifen - Die Kette ist wohl nur über Makros lösbar … oder ?

Bei einer Abfrage aber, in der ich alle Felder in einer Reihe habe, passiert obiger Vorgang aber auch nicht, sondern - wenn ich aus der Abfrage Datensätze löschen will passiert gar nichts, wenn ich in die Abfrage Daten eingebe, stürzt LOBase ab. Offenbar wird auch dort, trotz Verbindung der Schlüssel, in den Zwischentabellen die Fremdschlüssel nicht automatisch eingetragen … und dort sind auch keine Makros vorgesehen … Wo liegt der Denkfehler ?

Die Verbindung der Tabellen besteht sehr häufig aus Konstruktionen, die eine n:m-Beziehung verwirklichen sollen. Zum Verständnis einer solchen Verbindung und wie die mit Daten zu befüllen ist wäre es sinnvoll, die Beispieldatenbank im Kapitel “Einführung in Base” nach zu vollziehen.

Du hast die Tabelle “int_tbl_Medizinanwendung”. Diese Tabelle besteht aus zwei kombinierten Fremdschlüsseln, die gemeinsam einen Primärschlüssel bilden. Jetzt hast Du eine Tabelle als Hauptformular (Tabelle “tbl_Pflanzen”). Die gibt nach der Eingabe der Pflanze bei abgespeichertem Datensatz den Primärschlüssel an das Unterformular für “int_tbl_Medizinanwendung” weiter. Die Tabelle “int_tbl_Medizinanwendung” braucht jetzt aber noch einen Fremdschlüsselwert aus “int_tbl_Symptome”. Ohne den kann sie keinen Wert abspeichern, da sonst der (kombinierte) Primärschlüssel nicht komplett ist. Du brauchst also zum Befüllen dieses Wertes jetzt ein Listenfeld in dem Unterformular, in dem Du aus “int_tbl_Symptome” den entsprechenden Schlüsselwert ausliest.

In Deiner momentanen Konstruktion kann die Verbindung von Unterformular zu UnterUnterFormular nicht funktionieren, da das UnterUnterFormular den Schlüsselwert produzieren muss, den das darüberliegende Formular benötigt.

Ich habe einmal das entsprechende Formular auf Hauptformular und Unterformular gekürzt und den 2. Fremdschlüssel über ein Listenfeld zum Befüllen vorgesehen.
Kräuter_Indikationen_bsp.odb (30.0 KB)

1 Like

Vielen Dank für deine Antwort.

Ich sehe, dass das Formular ein Listenfeld hat, das mit einer SQL-Code Abfrage funktioniert (Wobei ich mir das mit dem COALESCE noch ansehen muss :wink: - wie auch die für mich kuriose Konstruktion im zweiten Formular, wo ein Listenfeld etwas anderes anzeigt, als im Datenfeld eingetragen ist - aber das habe ich schon im Handbuch nicht wirklich verstanden).
Das funktioniert jetzt mit der Neueingabe von Pflanzen.

Wenn ich nun aber eine Pflanze eingeben möchte, die eine neue Indikation und evt. einen neuen Bereich braucht (wobei zweiteres unwahrscheinlich ist …) geht das mit dieser Varaiante nicht mehr, da das Listenfeld ja nur die Zwischentabelle Symptome ausliest und die dort eingetragenen Werte aus den Tabellen Bereiche und Indikationen holt.
Das Ziel ist aber eine Kompletteingabe aller Werte → Pflanzen- (Name, botanisch…) sowie Bereiche und Indikationen …
Wenn auch die Pflanzen ein zentrales Element der Datenbank sind, gehts letztlich um die Indikationen und die ihr zugehörigen Pflanzen … schlussendlich sollen da auch noch deren Anwendungsformen( Tee, Tinktur, Öle, Badezusatz …) sowie Verwendungsarten (Räucherpflanze, Gewürzpflanze, Obst, Zierpflanze, Insektenabwehr …), Erntegut (Blüten, Blätter, Samen Wurzeln …), Pflanzenart, Inhaltsstoffe oder deren Kulinarik (Küchenanwendung) Platz finden und das muss man bei einer neu eingetragenen Pflanze u.U. alles neu eintragen, oder nur teilweise neu eintragen und aus vorhandenen Werten übernehmen …
Tja - das war hoffentlich wieder nicht allzu chaotisch ausgedrückt :wink:

Ich nehme ja an, dass Du erst einmal eine Datenbank ohne Makros zusammenbauen willst. Dazu hilft vielleicht ein Blick auf das Kapitel “Eine Ansicht - viele Formulare” im Kapitel “Formulare”. Da ist gleich zu Beginn das Formular zur Medieneingabe abgebildet, das aus der entsprechenden Beispieldatenbank kommt. Auf der rechten Seite des Formulars sind lauter Tabellenkontrollfelder, die alle in eigenständigen Formularen stecken. Fehlt mir links im Formular z.B. eine Kategorie, so gebe ich die fehlende Kategorie rechts in dem Tabellenkontrollfeld ein und speichere sie dort ab. Dann gehe ich nach links auf das Listenfeld und lasse das Listenfeld aktualisieren (Navigationsleiste, Kontrollfeld aktualisieren). Jetzt ist die Neueingabe verfügbar und kann mit den Medien über das Listenfeld verbunden werden.

https://forum.openoffice.org/en/forum/download/file.php?id=11250 ist eine Demo-Datenbank über one-to-many und many-to-many Beziehungen. Jede Person hat ein Tier und jede Person kann viele Dinge haben. Die Datenbank beruht ausschließlich auf den ID-Nummern, die jeweils genau eine Person, ein Tier und ein Ding bezeichnen.

Offne das Fenster Menü:Extras>Beziehungen…
In der Tabelle “Persons” ist eine Spalte “AnimalID”, in der stehen nur Nummern von “Animals”. Man kann in “AnimalID” nur Werte eingeben, die im Primärschlüssel “ID” der Tabelle “Animals” vorkommen. Die ID ist als Primärschlüssel markiert, das Feld “AnimalID” am anderen Linie ist ein Fremdschlüssel.
In der Tabelle “P_T” werden nur die ID-Nummern von Personen und Dingen gespeichert, die einander zugeordnet sind (many-to-many-Beziehung).
Was Du in den Personen-, Ding- und Tier-Tabellen sonst noch für Attribute (Geburtsdatum, Adresse, Preise, Anmerkungen…) speicherst ist vollkommen egal. Die Beziehungen werden über die ID-Nummern hergestellt, die immer auf genau ein eindeutiges Element verweisen.

In den Formularen siehst Du keine einzige ID-Nummer. Die IDs spielen jedoch die Hauptrollen in den Beziehungen zwischen Formularen und Unterformularen und in den Listenfeldern.
Ein Listenfeld zeigt immer einen menschenlesbaren Text an während es den dazugehörigen ID-Wert Fremdschlüssel speichert (Verweis auf einer Zeile in einer anderen Tabelle).

1 Like

Hi Danke!

Ich behirne es offenbar nicht.

Ich habe versucht es durch Nachbildung mal zu verstehen, wie ich die Anzeige (noch ohne Eingabe) für z.b. die Tabelle Symptome reproduzieren kann.
Also simpel das Unterformular Symptome (Grid) mit 3 Spalten /SymptomeID, Bereiche, Indikationen)
(Bei bestehendem Formular Pflanzen und UF Medizinanwendungen und UUF Symptome, wie in deinem Beispiel)

Das klappt schon mal nicht, denn das zeigt mir nur sporadisch Werte an (ausser der SymptomID, die ja ein Textfeld bleibt), mal beide (Bereich, Indikationen) mal nur eines (Entweder Bereich oder Indikation) etc und ich kann in den SQL-Anweisungen keinen Unterschied erkennen.

Ich habe in der Spalte Bereiche:

SELECT “tbl_Bereiche”.“Bereiche”, “int_tbl_Symptome”.“SymptomID” FROM “int_tbl_Symptome”, “tbl_Bereiche” WHERE “int_tbl_Symptome”.“BereicheID” = “tbl_Bereiche”.“BereicheID” ORDER BY “tbl_Bereiche”.“Bereiche” ASC

und in der Spalte Indikationen:

SELECT “tbl_Bereiche”.“Bereiche”, “int_tbl_Symptome”.“SymptomID” FROM “int_tbl_Symptome”, “tbl_Bereiche” WHERE “int_tbl_Symptome”.“BereicheID” = “tbl_Bereiche”.“BereicheID” ORDER BY “tbl_Bereiche”.“Bereiche” ASC

Wenn ich die Listenfelder wieder zu Textfeldern ändere wird alles wieder korrekt angezeigt - aber natürlich in ID Zahlen.

Da bin ich aber noch meilenweit von Neueingaben entfernt, denn wohl kann ich neue Pflanzen hinzufügen und denen dann aus der Tabelle Medizinanwendungen die bereits vorhandenen Symptome(Bereich/Indikationen - Kombis) zuweisen.
Im Unterformular Symptome kann ich, wie oben beschrieben nicht mal die Spalten konsistent anzeigen. Wenn ich im Unterformular Symptome für Bereich und Indikation neue ID-Kombinationen eingebe, nur um mal einen Bereich mit einer anderen Indikation zu generieren stellt sich kein neuer Autowert für die SymptomID ein und somit auch kein neuer Datensatz mit dessen SymptomID ich einen Bezug zu einer PflanzenID herstellen könnte …
Vom Erstellen neuer Bereiche und Indikationen und deren Kombination zu Symptomen mit ID noch ganz abgesehen …

Hi
Danke für das Beispiel. Werde versuchen es umzulegen …

Das spezielle Problem ist aber, dass in meinem Fall 2 Tabellenwerte zusammen eine ID ergeben die dann über eine Zwischentabelle wiederum mit einer ID verbunden werden soll …

Also: BereicheID + IndikationenID = SymptomID // SymptomID + PflanzenID = Medizinanwendung (Kombinierte Primärschlüssel).

Und ich würde gerne beim Anlegen einer neuen Pflanze im selben Formular auch, so notwendig, neue Bereiche und Indikationen anlegen können …

Schau Dir nochmal Roberts Antwort oben an: Ein Formular, das Du auf dem Bildschirm siehst, kann mehrere “logische” Formulare nebeneinander enthalten. Du kannst also z.B. in der linken Hälfte die Tabelle der Pflanzen und in der rechten eine andere bearbeiten ode natürlich auch ein komplettes Durcheinander “designen”, wenn es für Dich nötig erscheint.
.
Ob die Teile eines “optischen” Formulars hierarchisch verknüpft sind (Unterformular) oder einfach nebeneinander existieren sieht man im Formular-Navigator.

Hier noch einmal die Beispieldatenbank mit der Bearbeitungsmöglichkeit der einen etwas umfassenderen Verbindung und einer einfachen n:m-Verbindung.
Kräuter_Indikationen_bsp.odb (30.7 KB)
Du musst neue Werte zuerst in die (mit einem Gruppenrahmen versehenen) Tabellen einfügen und danach die entsprechenden Listenfelder aktualisieren. Dann stehen die neuen Einträge auch in den Listen des “Hauptformulars” zur Verfügung.

1 Like

Sind wirklich 2 Felder als gemeinsamer Primärschlüssel gesetzt?
.
Ich hatte den Fall in einer Archiv-Datenbank, im SQLite-Format, die ich tatsächlich nicht in Base ändern kann, aber via Sqlite-Studio. Das “könnte” also auch eine Einschränkung in Base sein. Habe ich nicht weiter verfolgt, da meine neueren Datenbanken nur Int-Primärschlüssel haben.

Ohne 2 Felder als gemeinsamer Primärschlüssel in der Verbindungsdatei sind natürlich auch n:m-Verbindungen möglich. Nur ist dann ein Wert der eine Tabelle beliebig of mit der gleichen Zeile einer anderen Tabelle verknüpfbar.

Das einfache Beispiel zu Beginn des Handbuches mit dem Sportfest macht das deutlich: TeilnehmerInnen und Sportarten. Jeder TeilnhemerIn können beliebig viele Sportarten zugewiesen werden, jede Sportart kann beliebig viele TeilnehmerInnen haben, aber keine TeilnehmerIn kann eine Sportart doppelt belegen. Das wird durch die Zwischentabelle mit 2 Feldern als Primärschlüssel erreicht.