Übersichtsformulare

In Bezug auf den Thread: Eingabeformular
Hi
Danke für die Erläuterung(en)

Ich habe das jetzt mal so weit, dass ich die Pflanzen und alle Subtabellen eingeben kann …

Jetzt ist mir “natürlich” aufgefallen, dass sich in den verschiedenen Bereichen Indikationen ansammeln, die ähnlich sind, aber bei verschiedenen Pflanzen verschieden beschrieben stehen … (adstringierend/zusammenziehend , tonisierend/stärkend/kräftigend etc …)
Jetzt habe ich versucht ein Formular zu erstellen, wo ich aus der Tabelle Bereiche oben ein Auswahlfeld habe, in dem ich den Bereich auswähle - und unten eine Tabelle, wo alle Indikationen dieses Bereiches aufgelistet sind (und eventuell noch die Pflanzen(namen), die diese Indikationen beinhalten …
Die beteiligten Tabellen sind offenbar: tbl_Bereiche, tbl_Indikationen und int_tbl_Symptome (sowie evt. tbl_Pflanzen.
Wenn ichs wie die Beispieldatenbank “Listboxen” löse und über das Namensfeld durch die Bereiche - Datensätze blättere bekomme ich es halbwegs hin - dann habe ich eben das Hauptformular “Bereiche” das Unterformular int_Symptome und darin ein Listenfeld mit den Inhalten von Indikationen über die Schlüssel verbunden … aber auch da schaffe ich es nicht, die Indikationen aufsteiegend zu sortieren, da ich nur die Sortierung aus der Zwischentabelle bekomme und die hat eben nur die ID;s.

Ich würde aber gerne über ein Drop-Down die Bereiche auswählen und dann eine Alphabetische Liste der Indikationen haben um die Begriffe vereinheitlichen zu können - später wärs toll dann auch die zugehörigen Pflanzen (zu den Indikationen in Kombination mit den Bereichen) zu listen (weils Indikationen gibt, die in mehrere Bereiche fallen können …
Bitte schreiben, wenn’s zu lästig wird :innocent:

Packst Du noch die aktuelle Datenbankversion mit an Deinen Einführungsbeitrag?

Ergänzung: Du willst nicht nur durchsuchen und ordnen, sondern auch Einträge in den Tabellen ändern, mit denen Du Deine Listenfelder beschickst? Zum Suchen würde ich eine Ansicht erstellen, die alle Tabellen beinhaltet:

SELECT "a".*, "tbl_Bereiche".*, "tbl_Indikationen".*, "tbl_Alternative Namen".*, "tbl_Art".* FROM "tbl_Pflanzen" AS "a" 
LEFT JOIN "int_tbl_Medizinanwendung" ON "a"."PflanzenID" = "int_tbl_Medizinanwendung"."PflanzenID"
LEFT JOIN "int_tbl_Symptome" ON "int_tbl_Medizinanwendung"."SymptomID" = "int_tbl_Symptome"."SymptomID"
LEFT JOIN "tbl_Bereiche" ON "int_tbl_Symptome"."BereicheID" = "tbl_Bereiche"."BereicheID"
LEFT JOIN "tbl_Indikationen" ON "int_tbl_Symptome"."IndikationenID" = "tbl_Indikationen"."IndikationenID"
LEFT JOIN "int_tbl_Alternative Namen" ON "a"."PflanzenID" = "int_tbl_Alternative Namen"."PflanzenID"
LEFT JOIN "tbl_Alternative Namen" ON "int_tbl_Alternative Namen"."AltID" = "tbl_Alternative Namen"."AltID"
LEFT JOIN "int_tbl_Art" ON "a"."PflanzenID" = "int_tbl_Art"."PflanzenID"
LEFT JOIN "tbl_Art" ON "int_tbl_Art"."ArtID" = "tbl_Art"."ArtID"

Das ist jetzt nur der Start. Bei den vielen Anbindungen, die Du da hast, musst Du die anderen Verknüpfungen wie die letzten beiden Zeilen immer wieder unten anhängen.
Wenn das alles in eine Ansichtz kommt, dann kannst Du das auch nach dem Alphabet sortieren. Änderungen sind darin nicht möglich. Das ginge dann über einen Aufruf der einzelnen Tabellen und anschließendes Aktualisieren dieser Ansicht.

Kräuter_Indikationen_bsp.odb (98.7 KB)

Hi
Der von dir gepostete SQL-Code ist offenbar eine Abfrage … Ich checke nur nicht wo/wie ich den verwenden soll.

Aktuell stellen sich mir zwei Fragen:

Wo auch immer die Tabelle int_tbl_Medizinanwendungen auftaucht, deren Listenfeld mit dem SQL bestückt ist:

SELECT “tbl_Bereiche”.“Bereiche”||COALESCE(’ → ‘||“tbl_Indikationen”.“Indikation”,’’) AS “Anzeige”, “int_tbl_Symptome”.“SymptomID” FROM “int_tbl_Symptome”, “tbl_Bereiche”, “tbl_Indikationen” WHERE “int_tbl_Symptome”.“BereicheID” = “tbl_Bereiche”.“BereicheID” AND “int_tbl_Symptome”.“IndikationenID” = “tbl_Indikationen”.“IndikationenID” ORDER BY “Anzeige”

erscheint die Liste nach den ID’s geordnet und nicht nach den angezeigten Feldern. Ich sehe keine Möglichkeit die Sortierung nach den Namen der Bereiche/Indikationen alphabetisch zu gestalten.

  1. Obwohl schon anders gelöst (durch ein eigenes Formular mit Tabellenkontrollfeld) wäre es trotzdem interessant zu wissen, wie man ein Hauptformular so gestaltet, dass ein Dropdown oder ein Suchfeld den aktuellen Datensatz auswählt nach dem sich die Unterformulare ausrichten.
    Bisher kenne ich nur die Varianten entweder ein Text/Listenfeld zu haben und dann wird durch die Datensätze horizontal geblättert oder eben ein Tabellen - Kontrollfeld (meine jetzige Lösung) wo vertikal durch die DS geblättert wird.

In weitere Folge wird die Herausforderung für mich sein, über die Indikationen zu suchen (Da die in hoher Anzahl vorhanden sind) und den zugehörigen Bereich sowie die zugehörigen Pflanzen anzeigen zu lassen und dann eventuell durch einen Doppelklick auf eine Pflanze die Pflanzenübersicht aufzurufen …
lg

Wenn Du den gesamten Datenbestand miteinander vergleichen und durchsuchen möchtest, dann brauchst Du eine Abfrage, in der auch der gesamte Bestand aus allen Tabellen drin ist. Dann kannst Du dort entsprechend auch nach Begriffen und nicht nur nach Schlüsselwerten sortieren. Die von mir beschriebene Abfrage muss also entsprechend erweitert werden.

Wenn Du Code einfügst, dann solltest Du das als Preformatted text (</>) machen. Sonst werden alle Anführungszeichen so umgesetzt, dass die Abfrage nicht mehr brauchbar ist. Die Abfrage zum Listenfeld ist bei mir nach dem angezeigten Feld geordnet, nicht nach den IDs. Du meinst vermutlich: Wenn Du eine Sortierung einer Tabelle, die so ein Listenfeld enthält, vornehmen willst, dann erfolgt die Ordnung nach der ID. Das ist korrekt, weil die Tabelle darunter ja die ID enthält und nicht den Text. Deswegen brauchst Du so etwas wie eine Abfrage, die auch den Text enthält, damit Du nach dieser Abfrage ordnen kannst.

Mach’ doch erst einmal die Abfrage fertig. Da fehlen noch 5 Verbindungen zu Tabellen (Inhaltsstoffe, Kulinarisch, Verwendungsarten, Erntegut und Anwendungsformen). Danach wird diese Abfrage zum Durchsuchen genutzt. Das kann dann mittels Textsuche oder eben mit Listenfeldern erfolgen.

Hi
Abfrage sieht so aus:

SELECT "a".*, "tbl_Alternative Namen".*, "tbl_Anwendungsformen".*, "tbl_Art".*, "tbl_Erntegut".*, "tbl_Bereiche".*, "tbl_Familie".*, "tbl_Indikationen".*, "tbl_Inhaltsstoffe".*, "tbl_Kulinarische Verwendung".*, "tbl_Verwendungsarten".*  FROM "tbl_Pflanzen" AS "a"
LEFT JOIN "int_tbl_Alternative Namen" ON "a"."PflanzenID" = "int_tbl_Alternative Namen"."PflanzenID"
LEFT JOIN "tbl_Alternative Namen" ON "int_tbl_Alternative Namen"."AltID" = "tbl_Alternative Namen"."AltID"
LEFT JOIN "int_tbl_Anwendungsformen" ON "a"."PflanzenID" = "int_tbl_Anwendungsformen"."PflanzenID"
LEFT JOIN "tbl_Anwendungsformen" ON "int_tbl_Anwendungsformen"."FormID" = "tbl_Anwendungsformen"."FormID"
LEFT JOIN "int_tbl_Art" ON "a"."PflanzenID" = "int_tbl_Art"."PflanzenID"
LEFT JOIN "tbl_Art" ON "int_tbl_Art"."ArtID" = "tbl_Art"."ArtID"
LEFT JOIN "int_tbl_Erntegut" ON "a"."PflanzenID" = "int_tbl_Erntegut"."PflanzenID"
LEFT JOIN "tbl_Erntegut" ON "int_tbl_Erntegut"."ErnteID" = "tbl_Erntegut"."ErnteID"
LEFT JOIN "int_tbl_Familie" ON "a"."PflanzenID" = "int_tbl_Familie"."PflanzenID"
LEFT JOIN "tbl_Familie" ON "int_tbl_Familie"."PFamID" = "tbl_Familie"."PFamID"
LEFT JOIN "int_tbl_Inhaltsstoffe" ON "a"."PflanzenID" = "int_tbl_Inhaltsstoffe"."PflanzenID"
LEFT JOIN "tbl_Inhaltsstoffe" ON "int_tbl_Inhaltsstoffe"."InhaltID" = "tbl_Inhaltsstoffe"."InhaltID"
LEFT JOIN "int_tbl_Kulinarische Verwendung" ON "a"."PflanzenID" = "int_tbl_Kulinarische Verwendung"."PflanzenID"
LEFT JOIN "tbl_Kulinarische Verwendung" ON "int_tbl_Kulinarische Verwendung"."KulID" = "tbl_Kulinarische Verwendung"."KulID"
LEFT JOIN "int_tbl_Medizinanwendung" ON "a"."PflanzenID" = "int_tbl_Medizinanwendung"."PflanzenID"
LEFT JOIN "int_tbl_Symptome" ON "int_tbl_Medizinanwendung"."SymptomID" = "int_tbl_Symptome"."SymptomID"
LEFT JOIN "tbl_Bereiche" ON "int_tbl_Symptome"."BereicheID" = "tbl_Bereiche"."BereicheID"
LEFT JOIN "tbl_Indikationen" ON "int_tbl_Symptome"."IndikationenID" = "tbl_Indikationen"."IndikationenID"
LEFT JOIN "int_tbl_Verwendungsarten" ON "a"."PflanzenID" = "int_tbl_Verwendungsarten"."PflanzenID"
LEFT JOIN "tbl_Verwendungsarten" ON "int_tbl_Verwendungsarten"."VerwendungsartenID" = "tbl_Verwendungsarten"."VerwendungsartenID"

lg libels

Abfragen kannst Du ja direkt testen. Dann wird Dir auffallen, dass das nicht ganz hin hat. Das liegt unter anderem daran, dass in Deinen Tabellen Schreibfehler sind:
In "tbl_Anwendungsformen" heißt das Feld "FormId" und nicht "FormID".
Die Tabelle "Int_tbl_Verwendungsarten" hast Du leider mit einem Großbuchstaben versehen, nicht wie geplant mit einem Kleinbuchstaben.

Wenn Du so eine Abfrage zusammenstellst: Prüfe nach jeder hinzugefügten Tabelle (hier: jedem Tabellenpaar), ob die Abfrage funktioniert. Sonst suchst Du Dir einen Wolf.

SELECT "a".*, "tbl_Bereiche".*, "tbl_Indikationen".*, "tbl_Alternative Namen".*, "tbl_Art".*, "tbl_Inhaltsstoffe".*, "tbl_Kulinarische Verwendung".*, "tbl_Verwendungsarten".*, "tbl_Erntegut".*, "tbl_Anwendungsformen".*
FROM "tbl_Pflanzen" AS "a" 
LEFT JOIN "int_tbl_Medizinanwendung" ON "a"."PflanzenID" = "int_tbl_Medizinanwendung"."PflanzenID" 
LEFT JOIN "int_tbl_Symptome" ON "int_tbl_Medizinanwendung"."SymptomID" = "int_tbl_Symptome"."SymptomID" 
LEFT JOIN "tbl_Bereiche" ON "int_tbl_Symptome"."BereicheID" = "tbl_Bereiche"."BereicheID" 
LEFT JOIN "tbl_Indikationen" ON "int_tbl_Symptome"."IndikationenID" = "tbl_Indikationen"."IndikationenID" 
LEFT JOIN "int_tbl_Alternative Namen" ON "a"."PflanzenID" = "int_tbl_Alternative Namen"."PflanzenID" 
LEFT JOIN "tbl_Alternative Namen" ON "int_tbl_Alternative Namen"."AltID" = "tbl_Alternative Namen"."AltID" 
LEFT JOIN "int_tbl_Art" ON "a"."PflanzenID" = "int_tbl_Art"."PflanzenID" 
LEFT JOIN "tbl_Art" ON "int_tbl_Art"."ArtID" = "tbl_Art"."ArtID"
LEFT JOIN "int_tbl_Inhaltsstoffe" ON "a"."PflanzenID" = "int_tbl_Inhaltsstoffe"."PflanzenID"
LEFT JOIN "tbl_Inhaltsstoffe" ON "int_tbl_Inhaltsstoffe"."InhaltID" = "tbl_Inhaltsstoffe"."InhaltID"
LEFT JOIN "int_tbl_Kulinarische Verwendung" ON "a"."PflanzenID" = "int_tbl_Kulinarische Verwendung"."PflanzenID"
LEFT JOIN "tbl_Kulinarische Verwendung" ON "int_tbl_Kulinarische Verwendung"."KulID" = "tbl_Kulinarische Verwendung"."KulID"
LEFT JOIN "Int_tbl_Verwendungsarten" ON "a"."PflanzenID" = "Int_tbl_Verwendungsarten"."PflanzenID"
LEFT JOIN "tbl_Verwendungsarten" ON "Int_tbl_Verwendungsarten"."VerwendungsartenID" = "tbl_Verwendungsarten"."VerwendungsartenID"
LEFT JOIN "int_tbl_Erntegut" ON "a"."PflanzenID" = "int_tbl_Erntegut"."PflanzenID"
LEFT JOIN "tbl_Erntegut" ON "int_tbl_Erntegut"."ErnteID" = "tbl_Erntegut"."ErnteID"
LEFT JOIN "int_tbl_Anwendungsformen" ON "a"."PflanzenID" = "int_tbl_Anwendungsformen"."PflanzenID"
LEFT JOIN "tbl_Anwendungsformen" ON "int_tbl_Anwendungsformen"."FormID" = "tbl_Anwendungsformen"."FormId"

Die Abfrage habe ich als direkte Abfrage in SQL erstellt, so dass auch die Formatierung erhalten bleibt.

Was mir allerdings zusätzlich auffiel: Als ich die Abfrage zum Schluss auslöste wurde sie immer langsamer. Beim Scrollen zum letzten Datensatz hing plötzlich LO. Bei entsprechend vielen Daten und Scrollen habe ich so etwas zusammen mit der internen HSQLDB schon hin und wieder festgestellt. Kann an meinem System liegen (zusammen mit der entsprechenden Java-Version). Wenn ich so ein Verhalten feststelle weiche ich auf die andere interne Datenbank Firebird aus. Die läuft da deutlich schneller.

Ich habe jetzt noch einmal weiter getestet: Wenn ich 3 Tabellepaare auslasse kommme ich bereits auf fast 14000 Datensätze in der Abfrage. Das sind die vielen Kombinationen, die Du jetzt schon drin hast. Die Abfrage mit allen Tabellen kann ich ausführen, aber nie zum Ende scrollen …

Ich habe das jetzt einmal zum testen nach Firebird exportiert. Dort zeigt die Abfrage nach kurzer Zeit korrekt 162004 Datensätze an. Das macht die interne HSQLDB bei mir nicht mehr mit.
Hier die Version in Firebird mit einer entsprechenden Filterung - bisher für 3 Felder:
Kräuter_Indikationen_FB.odb (126.3 KB)

Hi
Die Schreibfehler hatte ich schon geändert, so dass die Abfrage funktioniert hat …
Im Moment kämpfe ich auch noch mit einem anderen Problem, dass sich nach dem letzten update von LO ergeben hat - und zwar kann ich meine Makros nicht mehr verwalten - es werden schlichtweg keine mehr angezeigt … aber das in einem anderen Thread …
Aber auch bei meiner Abfrage … beim scrollen komme ich nicht zum Ende und LOB stürzt ab …

Ich lade mal meine aktuelle Version hoch …
Kräuter_Indikationen.odb (149.5 KB)
PS: Wenn ich meine DB nach Firebird exportiere funktionieren viele meiner Formulare nicht mehr und zwar mit der Fehlermeldung:

firebird_sdbc error:
*Dynamic SQL Error
*SQL error code = -206
*Column unknown
*LINK_FROM_PFLANZENID
*At line 1, column 74
caused by
'isc_dsql_prepare'
 at ./connectivity/source/drivers/firebird/Util.cxx:69

lg libels

Deswegen der Schritt zu Firebird.

SUB FB_Parameter
 DIM oSettings AS OBJECT
 oSettings = ThisComponent.DataSource.Settings
 oSettings.ParameterNameSubstitution = True
END SUB

Aus dem Handbuch, aktuell S. 114. Das Makro einmal bei geöffneter Datenbank ablaufen lassen. Dann wird die ParameterNameSubstitution von false auf true gesetzt und die Formulare laufen.

Schau Dir meine Beispieldatenbank an. Da kannst Du Deine alten Formulare öffnen.

Hi
Das funktioniert bei mir leidlich, denn bei meiner Pflanzeneingabe funktioniert das Symptome-UF nicht.
Fehlermeldung:

firebird_sdbc error:
*Dynamic SQL Error
*SQL error code = -104
*Token unknown - line 1, column 172
*"int_tbl_Symptome"
caused by
'isc_dsql_prepare'
 at ./connectivity/source/drivers/firebird/Util.cxx:69

Kräuter_Indikationen.odb (166.9 KB)

Ich habe einmal die Abfrage für das Listenfeld wieder auf den Ursprungszustand zurück gesetzt:

SELECT COALESCE ( "tbl_Bereiche"."Bereiche", ' - ' ) || COALESCE ( ' → ' || "tbl_Indikationen"."Indikation", '' ) AS "Anzeige", "int_tbl_Symptome"."SymptomID" FROM "int_tbl_Symptome" LEFT JOIN "tbl_Bereiche" ON "int_tbl_Symptome"."BereicheID" = "tbl_Bereiche"."BereicheID" LEFT JOIN "tbl_Indikationen" ON "int_tbl_Symptome"."IndikationenID" = "tbl_Indikationen"."IndikationenID" ORDER BY "Anzeige" ASC

Damit kommt die Fehlermeldung nicht, obwohl die Afrage, die dort vorher gespeichert war, auch als eigenständige Abfrage ausgeführt wurde. Das wird in dem 2. Formular mit identischer Meldung entsprechend sein.

In der Version, die ich hoch geladen hatte, war auch ein Formular zum Durchsuchen der Daten dabei. Das ist bei Dir nicht mit drin …

Hi
Ich habe mal alles aus deinem Beispiel integriert.
Offenbar wurde aus der Abfrage eine Ansicht erstellt (Einfach im Datenbankfenster bei der Abfrage ->Ansicht erstellen) viw_Filter_komplett
Dann gibt es eine Tabelle tbl_Filter die offenbar die Filterparameter zwischenspeichert und in die nie ein neuer Datensatz geschrieben wird, was durch die Einstellungen im Formular frm_Filter (Datensatz ändern/Ja Datensatz Hinzufügen/Nein) erreicht wird.

Zu Guter Letzt gibt es jenes Formular frm_Filter indem 2 Formulare parallel werkeln frmFilterKomplett(viw_Filter_komplett) und frmFilter (tbl_Filter) wobei der dort eingetragene Filter ( “tbl_Filter”.“ID” = TRUE ) dafür sorgen soll, dass nur der Datensatz mit einer ID verwendet wird - also kein Leerer …

Was sich mir nicht erschließt ist, WIE die Filterung geschieht. Die eingetragenen Parameter kommen in die Zwischentabelle … und dann ? Ich sehe keine Verbindung zwischen frmFilterKomplett und frmFilter ich finde da auch keinen Zusammenhang in den “Beziehungen” …
Bitte um Aufklärung :sunglasses:

… und VIELEN DANK !
Kräuter_Indikationen.odb (178.5 KB)
Zusatzfrage am Rande: Mir passiert es oft, dass ich beim editieren eines Formular beim ankommen am Mausrad, die Dropdownfelder unabsichtlich verändere … kann man das irgendwie verhindern ? (Ausser durch Nicht ankommen :rofl: )

Schau Dir einmal “viw_Filter_komplett” an. Da ist in den Bedingungen der Zugriff auf die Filtertabelle, den Du auch um weitere Listenfelder erweitern kannst. In dem entsprechenden Formular wird mit Parallelformularen gearbeitet, weil alle Daten angezeigt werden sollen, wenn nichts gefiltert wird. Es wird lediglich die Ansicht neu eingelesen, wenn daten für “tbl_Filter” geändert wurden.

Du meinst vermutlich bei der Bearbeitung der Eigenschaften des Formularfeldes, oder? Das Dumme ist da: Jede gemachte Änderung wird direkt umgesetzt. Mit ESC kommst Du da auch nicht wieder raus. Das Mausrad benutze ich beim Erstellen von Formularen nie.

Ok,also ich verstehe es soweit …
Das Tabellenfeld listet ALLE Datensätze, solange im ersten Datensatz der Tabelle tbl_Filter ein leerer Datensatz mit einer vorhandenen ID steht…
Wenn jetzt in den Suchfeldern ein Eintrag erfolgt, wird dieser in den ersten Datensatz der tbl_Filter in die Felder “Suche, AltID und/oder FormID” geschrieben"
Bei Aktualisierung (Filter) werden bei gesetztem Filter die Bedingungen in der viw Ansicht “schlagend”.

Die Bedingung unter “Name” scheint mit klar und zwar werden nur jene Datensätze angezeigt wo das Feld Name in der Ansichtstabelle dem Feld “Suche” in der Filtertabelle entspricht und dieser Datensatz auch eine ID hat.

Bei den anderen beiden Bedingungen stellen sich mir Fragen: Ich nehme mal an das “=” statt dem “Wie” hat mit dem Ausdruck COALLESCE zu tun … ist also eine Art Funktion die aufgerufen wird …

Nur warum die Filterung nach Alternativen Namen und Anwendungsformen in der Ansicht unterschiedlich aussieht ist mir nicht erkenntlich.

Bei “tbl_Alternative Namen”.“AltID” wird offenbar mit “-1” in der Ansicht die “AltID” des ersten Datensatzes angezeigt, was ich überhaupt nicht verstehe … oder hat es damit zu tun, dass ja nicht alle alternativen Namen angezeigt werden können, daher wird nur der Erste ausgewählt ? Allerdings werden ja ALLE Datensätze angezeigt also so oft Pflanze/Alternative Namen wie es alternative Namen gibt. Oder bewirkt das Coallesce, das NACH DER REIHE alle nicht-leeren Einträge beginnend mit dem ersten Datensatz abgearbeitet werden ? (Was das Coallesce bei dem obigen Namen - Feld wieder verständlich macht.)
In der nachfogenden Bedingung bin ich noch verwirrter. Ich nehme an, es bedeutet, es sollen nur jene Datensätze der Ansicht gezeigt werden, die mit dem Feld ALtID im ersten (und einzigem) Datensatz der tbl_Filter überein stimmen (also dass, das im Suchfeld “Alternative Namen” eingetragen wurde) und falls dieses NULL, also leer ist sollen jene gezeigt werden, die mit dem AltID - Wert des ersten Datensatzes der tbl_Alternative Namen übereinstimmen … wobei sich die selbe Frage wie bei der Feldauswahl stellt …

Bei den Anwendungsformen wird dann aber kein “-1” verwendet - warum der Unterschied ? …

Wozu die Zusammenfassung in “a” genau dienen soll ist mir auch nicht wirklich klar …

Ergo: Ich raff’s nicht :crazy_face:

… Tja und das Mausrad ruhig zu halten wird noch eine “Challenge” :fearful:

WHERE "a"."Name" 
LIKE '%'||COALESCE((SELECT "Suche" FROM "tbl_Filter" WHERE "ID" = TRUE),'')||'%'

Wenn in dem Suchfeld auch nur irgendein Buchstabe steht, dann muss dieser Buchstabe auch in dem Feld “Name” vorhanden sein. Es wird also nicht ein fester Begriff gesucht sondern nur eine Buchstabenfolge. Noch besser ist das, wenn unabhängig von Groß- und Kleinschreibung gesucht werden soll:

WHERE UPPER("a"."Name") 
LIKE '%'||COALESCE((SELECT UPPER("Suche") FROM "tbl_Filter" WHERE "ID" = TRUE),'')||'%'

Bei den weiteren bedingungen werden Primärschlüsselwerte von Tabellen zur Suche genommen. Es wird also in dem folgenden Teil nicht nach den “Alternativen Namen”, sondern nach dem Primärschlüssel gesucht (über Listenfelder im Filter)

AND COALESCE("tbl_Alternative Namen"."AltID",-1) = 
COALESCE((SELECT "AltID" FROM "tbl_Filter" WHERE "ID" = TRUE), "tbl_Alternative Namen"."AltID",-1)

COALESCE ist eine Funktion, die den ersten Wert nimmt, wenn der nicht leer ist (NULL). Ist also "tbl_Alternative Namen" nicht leer, dann wird das genommen. Da es aber auch Datensätze gibt, bei denen eben kein Alternativer Name steht, wird, wenn das Feld leer ist, stattdessen -1 gesetzt. Würde das hier nicht stehen, dann würde die Bedingung von vornherein dafür sorgen, dass nur Datensätze mit alternatvien Namen angezeigt werden - alle anderen aber nicht. -1 habe ich genommen, weil es sich bei dem Primärschlüsselfeld um ein INTEGER-Feld handelt. Da muss also eine Zahl zum Vergleich hin. Und dann muss die Zahl auch noch nicht in den zugewiesenen Primärschlüsseln vorkommen.

AND COALESCE("tbl_Anwendungsformen"."FormID",'') = 
COALESCE((SELECT "FormID" FROM "tbl_Filter" WHERE "ID" = TRUE), "tbl_Anwendungsformen"."FormID",'')

Die Anwendungsformen haben lediglich einen anderen Primärschlüssel. Da ist das Feld für den Primärschlüssel kein INTEGER, sondern ein VARCHAR-Feld. Also muss ein Textersatz für ein Feld her, das sonst NULL ist. Der leere Text ist ''.

Für alle weiteren Suchfelder gilt also lediglich: Ist der Primärschlüssel ein INTEGER-Feld, dann kannst Du mit -1 operieren, ist er ein VARCHAR-Feld, dann ist eben '' das leere Textfeld, das nicht NULL ist.

Ich habe da ein Alias gesetzt, weil ich mir ersparen wollte jedes Mal in den Bedingungen “tbl_Pflanzen” zu schreiben. Da ist das “a” eben deutlich kürzer.

Hi
Vielen Dank für die Erklärungen und ich beginne es zu verstehen.
Nicht - verstehen tue ich aber, warum folgendes nicht klappt:

Ich habe die Tabelle tbl_Filter ergänzt. u.a durch ein Feld “Indisuch” Varchar 100
In das Suchformular habe ich ein Textfeld plaziert, dass mit dem Datenfeld “Indisuch” in der Filtertabelle verbunden ist.

In der Abfrage bzw./und in der Ansichtstabelle habe ich folgenden SQL code hinzugefügt:

AND UPPER("tbl_Indikationen"."Indikation")LIKE '%'||COALESCE((SELECT UPPER ("Indisuch") FROM "tbl_Filter" WHERE "ID" = TRUE),''||'%')

Die ganze Abfrage/Ansicht sieht also so aus:

SELECT "a".*, "tbl_Bereiche".*, "tbl_Indikationen".*, "tbl_Alternative Namen".*, "tbl_Art".*, "tbl_Inhaltsstoffe".*, "tbl_Kulinarische Verwendung".*, "tbl_Verwendungsarten".*, "tbl_Erntegut".*, "tbl_Anwendungsformen".*
FROM "tbl_Pflanzen" AS "a" 
LEFT JOIN "int_tbl_Medizinanwendung" ON "a"."PflanzenID" = "int_tbl_Medizinanwendung"."PflanzenID" 
LEFT JOIN "int_tbl_Symptome" ON "int_tbl_Medizinanwendung"."SymptomID" = "int_tbl_Symptome"."SymptomID" 
LEFT JOIN "tbl_Bereiche" ON "int_tbl_Symptome"."BereicheID" = "tbl_Bereiche"."BereicheID" 
LEFT JOIN "tbl_Indikationen" ON "int_tbl_Symptome"."IndikationenID" = "tbl_Indikationen"."IndikationenID" 
LEFT JOIN "int_tbl_Alternative Namen" ON "a"."PflanzenID" = "int_tbl_Alternative Namen"."PflanzenID" 
LEFT JOIN "tbl_Alternative Namen" ON "int_tbl_Alternative Namen"."AltID" = "tbl_Alternative Namen"."AltID" 
LEFT JOIN "int_tbl_Art" ON "a"."PflanzenID" = "int_tbl_Art"."PflanzenID" 
LEFT JOIN "tbl_Art" ON "int_tbl_Art"."ArtID" = "tbl_Art"."ArtID"
LEFT JOIN "int_tbl_Inhaltsstoffe" ON "a"."PflanzenID" = "int_tbl_Inhaltsstoffe"."PflanzenID"
LEFT JOIN "tbl_Inhaltsstoffe" ON "int_tbl_Inhaltsstoffe"."InhaltID" = "tbl_Inhaltsstoffe"."InhaltID"
LEFT JOIN "int_tbl_Kulinarische Verwendung" ON "a"."PflanzenID" = "int_tbl_Kulinarische Verwendung"."PflanzenID"
LEFT JOIN "tbl_Kulinarische Verwendung" ON "int_tbl_Kulinarische Verwendung"."KulID" = "tbl_Kulinarische Verwendung"."KulID"
LEFT JOIN "int_tbl_Verwendungsarten" ON "a"."PflanzenID" = "int_tbl_Verwendungsarten"."PflanzenID"
LEFT JOIN "tbl_Verwendungsarten" ON "int_tbl_Verwendungsarten"."VerwendungsartenID" = "tbl_Verwendungsarten"."VerwendungsartenID"
LEFT JOIN "int_tbl_Erntegut" ON "a"."PflanzenID" = "int_tbl_Erntegut"."PflanzenID"
LEFT JOIN "tbl_Erntegut" ON "int_tbl_Erntegut"."ErnteID" = "tbl_Erntegut"."ErnteID"
LEFT JOIN "int_tbl_Anwendungsformen" ON "a"."PflanzenID" = "int_tbl_Anwendungsformen"."PflanzenID"
LEFT JOIN "tbl_Anwendungsformen" ON "int_tbl_Anwendungsformen"."FormID" = "tbl_Anwendungsformen"."FormID"
WHERE UPPER("a"."Name") LIKE '%'||COALESCE((SELECT UPPER("Suche") FROM "tbl_Filter" WHERE "ID" = TRUE),'')||'%'
AND UPPER("tbl_Indikationen"."Indikation")LIKE '%'||COALESCE((SELECT UPPER ("Indisuch") FROM "tbl_Filter" WHERE "ID" = TRUE),''||'%')
AND COALESCE("tbl_Alternative Namen"."AltID",-1) = COALESCE((SELECT "AltID" FROM "tbl_Filter" WHERE "ID" = TRUE), "tbl_Alternative Namen"."AltID",-1)
AND COALESCE("tbl_Anwendungsformen"."FormID",'') = COALESCE((SELECT "FormID" FROM "tbl_Filter" WHERE "ID" = TRUE), "tbl_Anwendungsformen"."FormID",'')

Während es nun klappt, im Suchformular nach Pflanzennamen mit Teilstrings zu suchen, klappt das bei den Indikationen nicht.

Ich habe z.b. Magenbeschwerden und Darmbeschwerden als Indikationen …

Wenn ich im Suchfeld z.b. “Magen” oder “Darm” eingebe findet das Formular nichts. Wenn ich “beschwerden” eingebe findet es die Pflanzen mit Magenbeschwerden als Indikation…
Wenn ich “ungen” eingebe findet es Entzündungen, Blähungen …
Wenn ich “zündungen” eingebe findet es aber wiederum nichts …
Wenn ich “Leberbeschwerden” eingebe wird gefunden, bei der Eingabe “Leber” nicht …

Wieso ?

Btw: Bei der Suche nach Indikationen oder Bereiche etc … interessiert mich eigentlich nur der Pflanzenname/Bereich und nicht alle Varianten mit alt.Namen, , Kulinarik, Anwendungsformen etc … Ich brauche da nicht hunderte Datensätze ausgegeben - Ich bräuchte eigentlich nur bei der Indikationssuche den Pflanzennamen und den Bereich und bei den Bereichen vice versa.
Kann man das in dem Suchformular bewerkstelligen oder braucht’s da eine Abfrage/Ansicht mit weniger Verknüpfungen ?

Btw:: Was ich noch immer nicht realisieren kann, ist in der Pflanzen Übersicht oder der Pflanzen Eingabe, die Anzeige der Symptome so gestalten, dass diese alphabetisch nach Bereichen/Indikationen geordnet sind und nicht nach deren ID…

lg :pray: :pray: :pray:

Schau Dir einmal die letzte Klammer bei den Indikationen an. Die steht ganz hinten:
WHERE "ID" = TRUE),''||'%') während sie im Original darüber nach dem leeren Text steht WHERE "ID" = TRUE),'')||'%'
Du brauchst doch in der Tabelle “tbl_Filter” nicht noch ein weiteres Textfeld “Indisuch”. Du kannst auch das Feld “Suche” für alle möglichen Texte nehmen. Dann kommen vielleicht ein paar mehr Treffer raus, aber es werden eben alle Texte nach dem gleichen Inhalt durchsucht und Du hast mehr Platz im Formular für die Listenfelder zur Filterung.

Hi
Offenbar kann man noch so genau schauen - irgendwas übersieht man immer …
Allerdings: Auch die geänderte Klammer ändert nichts daran, dass bei der Eingabe von “beschwerden” zwar die Pflanze für Magenbeschwerden angezeigt wird, jene für Darmbeschwerden oder Leberbeschwerden aber nicht.
Das ändert sich auch nicht, wenn ich das Feld “Suche” verwende, hat aber dann den kuriosen Effekt, dass natürlich auch der eingegebene String im Suchfeld “Namen” angezeigt wird und eine Suche im Feld “Namen” zu keinem Ergebnis führt, weil es ja keine Indikation mit dieser Zeichenfolge gibt. Wenn ich das Feld “Suche” für beide Suchen (Namen, Indikation) verwende sucht doch die Abfrage nach Datensätzen, wo BEIDE (AND) Bedingungen erfüllt sind … Jedenfalls funktioniert das Konstrukt nicht.

Auch wenn ich deine Beispieldatenbank hernehme und z.b. in dem Suchfeld “Name” nur B eingebe bekomme ich nur eine Pflanze, deren Namen mit B beginnt und zwar die Erste in der Tabelle … sonst keine. Gebe ich z.b. Bo ein bekomme ich auch nur die erste Pflanze in der Tabelle angezeigt, die mit Bo beginnt … mit UPPER wirds dann die erste Pflanze, die irgendwo ein “bo” hat - in meinem Falle “Bergbohnenkraut”, denn Borretsch und Bockshornklee kommen erst danach in der Ursprungstabelle und werden nicht mehr angezeigt … Also irgendwas hakt da …

Außerdem bleibt der Umstand, dass schon die Anzeige der nur jeweils ersten gefundenen Pflanze in ihren vielfältigen Verbindungen die gefundenen Ergebnisse unübersichtlich macht - da gibts dann zig Datensätze mit Baldrian und zig mit Beinwell und Borretsch mit all ihren Kombinationen von alternativen Namen und unterschiedlichen Verwendungsarten… Informationen, die für das zu findende Ergebnis unerheblich und sogar störend sind … das ganze auch noch ohne alphabetische sortierung …
Na da wird das Hirn noch rauchen …

lg libels

Ich habe einmal die Originalabfrage durchlaufen lassen - mit dem Suchbegriff ‘Bo’. Durch die vielen Kombionationen, die Du mit den Tabellen hast, erscheinen 56928 Datensätze. Und da ist ‘Borretsch’ und ‘Bockshornklee’ bei.

Setze ich jetzt UPPER mit in die entsprechende Abfrage, dann sind es 102288 Datensätze. Da ist dann auch das ‘Bergbohnenkraut’ dabei.

Damit die Abfrage mit gleichem Feld auch bei anderen Tabellenfeldern funktioniert müsste die Verbindung zwischen den Feldern, die zum Suchen dienen, eine OR-Verbindung sein.

Allein die Menge an Datensätzenzeigt mir aber, dass wohl noch einige Inhalte über den Befehl LIST in einem Feld zusammengefasst werden sollen. Wenn schon 3 Kräuter über 100000 Kombinationen erzeugen, wie willst Du da etwas bestimmtes finden?

Ich habe das einmal erstellt. Die Abfrage läuft so auch schneller - nur die Treffer sind nicht immer sofort sichtbar, da ja Felder jetzt mit mehr Werten versehen sind.
Kräuter_Indikationen_FB.odb (139.6 KB)

Hi Vorerst mal wieder: Danke für die Mühe !
Was bedeutet: “nur die Treffer sind nicht immer sofort sichtbar, da ja Felder jetzt mit mehr Werten versehen sind.” ? Bedeutet das nur, dass die eingegebene Zeichenfolge nicht hervorgehoben ist und man nicht genau weiß, in welchem Feld diese Folge gefunden wurde ? (Kann man die Felder in den Spalten “scrollbar” machen ? Denn wenn z.b. die Symptomliste länger als die Zeillenhöhe ist, wird die Symptomliste nicht bis zum Ende lesbar.

Ich sehe, dasss zu jeder int_Tabelle eine Abfrage mit einem LIST-Befehl generiert wurde. Was macht dieser Befehl genau ? - Ich konnte beim Suchen im Netz den LIST-Befehl nicht finden.
… dann wurde eine Abfrage erstellt …_komplett_list die diese “Listen” zusammenstellt und mit der Tabelle tbl_Pflanzen verknüpft. Dann wurde zu jeder dieser Abfragen eine Ansicht erstellt.

Das Formular frm_Filter_List hat als Hauptformular die Ansicht “viw_Filter_komplett_List” und in den Spalten die Datenfelder der Komplettliste.
Ich nehme mal an, die restlichen Ansichten sind nur der Vollständigkeit halber vorhanden, denn in dem Filterformular scheinen sie keine Funktion zu haben.
Mit dem Schema kann ich mir dann eine “weniger komplette” Suche “basteln” die nur relevante Datenfelder beinhaltet … ?

Ganz was anderes… Ich versuche gerade ein Makro zu finden/basteln ,dass dafür sorgt, dass beim drücken einer Schaltfläche in meinem Pflanzen-Übersichtsformular eine Textdatei (.odt) geöffnet wird, deren Dateiname den Namen beinhaltet, der im ersten Feld (Namen) des ausgewähllten Datensatzes steht und die im selben Verzeichnis liegt, wie die Datenbank. Meine Versuche mich anzunähern scheitern kläglich, weil schon der Versuch, das Makro “Datei öffnen” des Handbuches zu verwenden, damit endet, das das Objekt “DrawPage” nicht gefunden wird …