❤ Unterstütze jetzt das LIBREOFFICE-Forum ❤

Über ein Listenfeld mit Abfrage 2 Felder in der Tabelle im Subformular befüllen

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Benutzeravatar
zwackel
Beiträge: 10
Registriert: Di 2. Apr 2019, 22:17

Über ein Listenfeld mit Abfrage 2 Felder in der Tabelle im Subformular befüllen

Beitrag von zwackel » Do 16. Jan 2020, 00:01

Hallo zusammen,

ich versuche mal mein Problem zu schildern.

Ich habe eine
Tabelle Artikel (id_artikel[PK],titel,untertitel,...) die mit einer
Tabelle Artikel_Schlagworte (id [PK],id_artikel[FK],id_schlagwort[FK1],art_schlagwort[FK2])
welche über den PrimaryKey id_artikel verknüpft sind.

Die Tabelle Artikel_Schlagwort ist wiederum mit der
Tabelle Schlagwort (id_schlagwort[PK1],art_schlagwort [PK2], bezeichnung)
über den kombinierten PrimaryKey (PK1 und 2) id_schlagwort, art_schlagwort verknüpft.

wenn ich die Daten in die Tabellen von Hand eingebe funktioniert alles soweit.

Nun habe ich ein Formular erstellt, welches die Tabelle Artikel im Hauptformular anzeigt. Im Subformular wird die Tabelle Artikel_Schlagwort angezeigt.
Nun möchte ich in einem Feld die Einträge aus der Tabelle Schlagwort über das Feld bezeichnung auswählen und in die Tabelle Artikel_Schlagwort eintragen lassen.
Mit einem Listenfeld und einer Abfrage funktioniert das soweit, allerdings kann ich nur eines der beiden Felder id_schlagwort, art_schlagwort über die Auswahl im Feld Datenfeld befüllen. Das Feld id wird über den Autowert erzeugt und das Feld id_artikel kommt aus dem Hauptformular.

Wie kann ich über eine Auswahl in einem Feld im Subformular aus der Tabele Schlagwort die Tabelle Artikel_Schlagwort vollständig befüllen?
Ich habe hier keine Idee mehr, Alle Vorschläge sind willkomen.
Viele Grüße
Volker

RobertG
Beiträge: 2114
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Über ein Listenfeld mit Abfrage 2 Felder in der Tabelle im Subformular befüllen

Beitrag von RobertG » Fr 17. Jan 2020, 12:36

Hallo zwackel,

ich würde an der Konstruktion drehen, da es nicht möglich ist, mit einem Listenfeld 2 Schlüsselfelder zu beschicken.

Gibt es einen Grund dafür, dass Du in der Tabelle Schlagwort unbedingt 2 Schlüsselfelder haben willst? So etwas wird sonst nur verwandt, wenn zwischen zwei Tabellen eine n:m-Beziehung aufgestellt werden soll. Die beiden Schlüssel tauchen dann in der zwischengeschalteten Verbindungstabelle auf.

Vielleicht suchst Du statt eines zweiten Schlüsselfeldes ja nur einen gemeinsamen Index.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Benutzeravatar
zwackel
Beiträge: 10
Registriert: Di 2. Apr 2019, 22:17

Re: Über ein Listenfeld mit Abfrage 2 Felder in der Tabelle im Subformular befüllen

Beitrag von zwackel » Mi 22. Jan 2020, 21:07

Hallo Robert,

ich habe jetzt wieder lange recherchiert und mir viele für mich unverständliche Makros angeschaut. Ich habe einen Schlagwortkatalog mit verschiedenen Arten von Schlagworten (Länder, Regionen, Firmen, ...). Ich wollte jetzt nicht für jede Art eine eigene Tabelle anlegen. Ich könnte jetzt natürlich die beiden Felder zu einem Indexfeld mit | zusammenfassen und dann?
Wie kann ich mir z.B. einmal alle Länder-Schlagwort im Listenfeld und einmal alle Firmen-Schlagwort anzeigen lassen, die ich einem Zeitschriftenartikel zuordnen möchte?
Vorschläge aller Art sind gerne willkommen. Ich bin leider kein Makroprogrammierer und hatte gehofft auch hier mit Base zu Ziel zu kommen.
Viele Grüße
Volker

Benutzeravatar
zwackel
Beiträge: 10
Registriert: Di 2. Apr 2019, 22:17

Re: Über ein Listenfeld mit Abfrage 2 Felder in der Tabelle im Subformular befüllen

Beitrag von zwackel » Mi 22. Jan 2020, 22:26

zur Verdeutlichung habe ich mal meine Datenbank soweit wie möglich vereinfacht (Tabelle Heft ließ sich leider nicht vollständig entfernen: SQL-Status: HY000 Es existiert keine Tabelle "Heft". ) und angehängt.
ZeitschriftenTeilArtikelHeft.zip
(184.52 KiB) 43-mal heruntergeladen
Viele Grüße
Volker

RobertG
Beiträge: 2114
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Über ein Listenfeld mit Abfrage 2 Felder in der Tabelle im Subformular befüllen

Beitrag von RobertG » Do 23. Jan 2020, 07:39

Hallo Volker,

Du konstruierst ohne triftigen Grund in der Tabelle "Schlagwort" einen Primärschlüssel aus 2 Werten. Mach' da noch ein AutoWert-Feld mit rein, das zum Primärschlüssel wird. Dann hast Du von der Konstruktion her keine Probleme.
Das gleiche Vorgehen würde ich bei dem Heft machen. Auch da eine Kombination von 2 Feldern zu einem Schlüssel. Warum?
Die zwei Felder, die Du zu einem Schlüsselfeld gemacht hast, könnten über einen Indexentwurf zusammengeführt werden. Der regelt dann, dass diese Feldkombination immer eindeutig sein muss.

Grundsätzlich: Zwei Primärschlüssel sollten nur dort auftauchen, wo eine Tabelle mit einer anderen über eine n:m-Beziehung verknüpft wird. Nur dann wird Deine Datenbank über ein Formular auch vernünftig bedienbar.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Benutzeravatar
zwackel
Beiträge: 10
Registriert: Di 2. Apr 2019, 22:17

Re: Über ein Listenfeld mit Abfrage 2 Felder in der Tabelle im Subformular befüllen

Beitrag von zwackel » Di 28. Jan 2020, 21:45

Hallo Robert,

sorry, aber ein zusammengesetzter Primärschlüssel ist jetzt nichts besonderes und eine n:m Beziehung ist für mich ein Fehler im Datenmodel.
Was ist ein Indexentwurf? Bei mir bestätigt sich immer mehr die Befürchtung, das Base keine Office-Datenbank für Anwender sondern nur etwas für Programmierer ist ... :-(
Sobald es komplexer wird, steigt Base aus und es muss programmiert werden.

Grüße und Danke für die Aufklärung
Volker
Viele Grüße
Volker

Wanderer
Beiträge: 444
Registriert: Di 11. Feb 2014, 20:03
Wohnort: Berlin

Re: Über ein Listenfeld mit Abfrage 2 Felder in der Tabelle im Subformular befüllen

Beitrag von Wanderer » Mi 29. Jan 2020, 08:17

zwackel hat geschrieben:
Di 28. Jan 2020, 21:45
eine n:m Beziehung ist für mich ein Fehler im Datenmodel.
Dann solltest Du dringend ein Buch über SQL oder ähnliches schreiben... Diese These ist noch nicht so verbreitet.
Klingt für mich wie funktionale Programmierung ohne Seiteneffekte :-)

zwackel hat geschrieben:
Di 28. Jan 2020, 21:45
Bei mir bestätigt sich immer mehr die Befürchtung, das Base keine Office-Datenbank für Anwender sondern nur etwas für Programmierer ist ... :-(
Was heißt Befürchtung. Base ist eine einheitliche Oberfläche zum Verwalten von Daten in verschiedensten Datenbanken - von Textdateien über DBase zu lokalen Datenbanken wie eingebetteten HSQL/Firebird-Datenbanken oder auch SQLite bis zu MySQL/PostgreSQL-Serverdatenbanken.
Es war nie ein Klon von Access geplant, falls Du den suchst.
Da ich ursprünglich von der Seite der Programmierer komme, kann ich Dir allerdings versichern - in der Welt wird komplett anders gearbeitet, aber das führt hier nicht weiter.

MfG, Jörn
LO 6.0.7 (32Bit) Win8.1 Pro 32 Bit/ LO 6.3.2 Win10 64Bit / LO 6.0.7 Win7 Pro 64 Bit

RobertG
Beiträge: 2114
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Über ein Listenfeld mit Abfrage 2 Felder in der Tabelle im Subformular befüllen

Beitrag von RobertG » Mi 29. Jan 2020, 17:30

Um noch einmal auf die ursprüngliche Frage zurückzukommen:
1 Kontrollelement (wie ein Listenfeld, ein Textfeld, ein Zahlenfeld usw.) kann nur 1 Feld in der Datenbasis beschicken.

Wenn 2 Felder beschickt werden sollen, dann muss
- der Anzeigewert bei vorgegebenen Werten über eine entsprechende Abfrage geregelt werden und
- das Abspeichern mittels Makro erfolgen.

Es mag Konstruktionen geben, bei denen das notwendig ist. Ich habe diese Notwendigkeit noch nirgendwo gesehen, sondern mich daran gehalten, dass ich mit dem Werkzeug arbeite, wie es mir zur Verfügung steht. Und das ist in den beiden Bereichen, die ich kenne (Base und PHP/MySQL) gleich gestrickt.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Benutzeravatar
zwackel
Beiträge: 10
Registriert: Di 2. Apr 2019, 22:17

Re: Über ein Listenfeld mit Abfrage 2 Felder in der Tabelle im Subformular befüllen

Beitrag von zwackel » Mi 29. Jan 2020, 20:18

Schade, das ich hier keine Lösungsangebote bekomme. Muss ich wirklich meine Tabelle Schlagworte in die Tabellen Länder, Typ, Klasse, ... aufteilen, um eine Lösung zu bekommen?

Also nächster Versuch zu einer Lösung:

In der Untertabelle habe ich ein Feld das die Art des Schlagwortes darstellt. Wenn ich hier etwas ausgewählt habe, möchte ich im Feld Schlagwort nur die Einträge sehen, welche zur Art passen (Primärschlüssel hin oder her) oder einfach ausgedrückt, wenn ich einen Nachnamen auswähle, möchte ich nur die zugehörigen Vornamen sehen und nicht alle.

Wer kann mir hier ein verständliches Beispiel geben, das auch funktioniert. In der Beispieldatenbank (Beispiel_Suchen_und_Filtern_Firebird.odb) sind zwar Beispiele enthalten, aber für mich DUMMY nicht zu verstehen, welche Bestandteile jeweils dazugehören und wie Sie funktionieren. Und das Handbuch hilft mir hier auch nicht weiter, da ich nicht verstehe, wie ich im Tabellen Subformular auf den Filter zugreifen muss. Ich möchte den ausgewählten Wert aus dem Listenfeld Art als Filter für das Listenfeld Schlagwort verwenden.

SQL für Listenfeld Art:
SELECT "Art" FROM "Schlagwort" GROUP BY "Art" ORDER BY "Art"

SQL für das Listenfeld Schlagwort:
SELECT "Schlagwort", "Kürzel", "Art" FROM "Schlagwort" where <Filter.Art> = <Schlagwort.Art> ORDER BY "Art", "Schlagwort"
Viele Grüße
Volker

Benutzeravatar
zwackel
Beiträge: 10
Registriert: Di 2. Apr 2019, 22:17

Re: Über ein Listenfeld mit Abfrage 2 Felder in der Tabelle im Subformular befüllen

Beitrag von zwackel » Mi 29. Jan 2020, 20:43

Ich habe es mit dem Makro

SUB FilterSetzen
DIM oDoc AS OBJECT
DIM oForm AS OBJECT
DIM oFeld AS OBJECT
DIM stFilter As String
oForm = thisComponent.Drawpage.Forms.getByName("SubForm")
oFeld = oForm.getByName("Art_SW")
stFilter = oFeld.Text
oForm.filter = " UPPER(""Name"") LIKE '%'||'" + UCase(stFilter) + "'||'%'"
oForm.ApplyFilter = TRUE
oForm.reload()
End Sub

probiert. Ich habe es in das Ereignis des Listernfeldes "Schlagwort" "bei Fokus erhalt" gesetzt. Wenn ich jetzt das Formular aufrufe und in das Subform klicke, bekomme ich direkt einen Laufzeitfehler an der Stelle oForm=
Viele Grüße
Volker

Antworten