🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Inhalt eines Formularfeldes in Select-Where-Clause verwenden

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
althoffc
Beiträge: 5
Registriert: Mo 5. Mär 2012, 14:40

Inhalt eines Formularfeldes in Select-Where-Clause verwenden

Beitrag von althoffc » Mi 19. Mär 2014, 23:55

Hallo,

Habe drei Tabellen angelegt, mit der ich eine n:m-Beziehung zwischen Mitgliedern und Projekten abbilde:
Mitglieder
ID, Name, Vorname, ...

Projekt
ID, Projektname, Projektbeschreibung, ...

Projektgruppe
ID, MitgliederID, ProjektID
Jedem Projekt können mehrere Mitglieder zugeordnet werden.
Jedes Mitglied kann in mehreren Projekten tätig sein.

Habe ein Formular erstellt, mit der Tabelle "Projekt" als Haupttabelle. Im Unterformular ist die Tabelle "Projektgruppe" als Grid enthalten, in der ich dann die Mitglieder zu einem Projekt eintragen möchte. Über ein Listenfeld kann ich die MitgliederID aus der Mitgliedertabelle mit dem lesbarem Namen auswählen.
Die Tabellen sind über Projekt.ID = Projektgruppe.ProjektID miteinander verknüpft, so dass die Mitglieder im Grid gelistet werden, die in dem aktuellen Projekt mitarbeiten.

In dem Listenfeld werden aber immer alle vorhandenen Mitglieder aufgelistet. Wie kann ich verhindern, dass Mitglieder, welche bereits in der aktuellen Projektgruppe sind, in dem Listenfeld angezeigt werden?

Per SQL wäre das prinzipiell zu lösen:

Code: Alles auswählen

select Name || ', ' || Vorname as Mitglied, ID from Mitglieder where ID not in (select MitgliederID from Projektgruppe where ProjektID = <ID des aktuellen Projektes>)
Mit <ID des aktuellen Projektes> ist die ID des aktuellen Datensatzes aus der Tabelle Projekt gemeint, welches im Hauptformular angezeigt wird.
Ich weiss aber nicht, wie ich diese ID in den Select einbauen kann.
Wie kann ich also ID des aktuellen Projekt-Datensatzes im obigen Select verwenden?
Oder gibt es eine andere elegante Möglichkeit "doppelte Gruppenmitglieder" zu verhindern bzw. die Auswahl im Listenfeld auf Mitglieder zu beschränken, die nicht in der aktuellen Projektgruppe sind?

Gruß
Carsten

RobertG
* LO-Experte *
Beiträge: 2884
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Inhalt eines Formularfeldes in Select-Where-Clause verwe

Beitrag von RobertG » Do 20. Mär 2014, 17:56

Hallo Carsten,

Du wirst aus einem einfachen Grund sowieso zu Makros greifen müssen, wenn sie auch nicht so arg kompliziert sein werden. Das Listenfeld muss nämlich bei jeder Aktualisierung des Unterformulars separat auch aktualisiert werden, da sonst der Inhalt von dem vorhergehenden Hauptformular bestimmend für das Listenfeld sein würde.
Folgende Lösung würde ich vorziehen: Eine Tabelle erstellen, z.B. "Filter". Primärschlüssel dieser Tabelle kann ein Ja/Nein-Feld sein. Das bedeutet, dass die Tabelle nur einen Datensatz speichert. Das zweite Feld in dieser Tabelle wäre "ProjektID". Aus diesem Feld soll die Unterabfrage ihre <ID des aktuellen Projektes> beziehen.
Wird von dem Hauptformular in das Unterformular gegangen, so wird aus dem entsprechenden Feld des Hauptformulars der Wert für die ProjektID ausgelesen, in die Tabelle "Filter" eingetragen und das Listenfeld in dem Unterformular aktualisiert.

Wenn Du Dich mit Makros überhaupt nicht auskennst und auch aus den Beispieleinträgen des Handbuches nicht schlau wirst, dann melde Dich einfach wieder.

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

althoffc
Beiträge: 5
Registriert: Mo 5. Mär 2012, 14:40

Re: Inhalt eines Formularfeldes in Select-Where-Clause verwe

Beitrag von althoffc » Do 20. Mär 2014, 20:01

Hallo Robert,

vielen Dank für den Tipp. Mit Makros in LibreOffice habe ich bisher noch nichts gemacht, sollte aber für mich machbar sein, wenn ein geeignetes Beispiel zur Verfügung steht. In welchem Handbuch (Base, LO-Basic, ...?) finden sich die von Dir angesprochenen Beispiele (Handbucheinträge)?

So wie ich Deine Beschreibung verstanden habe, wäre der Ablauf ungefähr folgender:
  • Vorwärts/Rückwärts in den Datensätzen des Hauptformulars blättern --> An das Event "Blättern" ein Makro anhängen, welches die ProjektID in die Tabelle "Filter" schreibt (Update auf den einen Satz mit TRUE im Primärfeld; es kann ja prinzipiell zwei Sätze geben, wenn ein Boolesches Feld als Primärschlüssel definiert ist).
  • Für das Listenfeld eine Abfrage hinterlegen, welche die ProjektID aus der Tabelle "Filter" ausliest und damit das aktuell im Hauptformular angezeigte Projekt identifizieren kann.
Kannst Du mir einen Hinweis geben, wo ich die von Dir gemeinten Handbucheinträge finde?

Überlegung:
Wenn ich folgendes SQL-Statement in LO-Base im SQL-Editor aufrufe, erfolgt eine Wertabfrage für den Parameter <frmProjID> des SQL-Statements.
Wenn ich für diesen Parameter eine der vorhandenen ProjektIDs angebe, werden mir die gewünschten Datensätze (Mitglieder) angezeigt.

Code: Alles auswählen

select Name || ', ' || Vorname as Mitglied, ID from Mitglieder where ID not in (select MitgliederID from Projektgruppe where ProjektID = :frmProjID)
Gibt es keinen Weg, einen solchen SQL-Parameter (frmProjID) mit dem aktuellen Inhalt eines (Haupt-)Formularfeldes zu füllen?

Danke und Gruß
Carsten

RobertG
* LO-Experte *
Beiträge: 2884
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Inhalt eines Formularfeldes in Select-Where-Clause verwe

Beitrag von RobertG » Do 20. Mär 2014, 20:59

Hallo Carsten,

Du kommst mit dem Listenfeld nicht an die Parameter ran, die vom Formular her übergeben werden.

Ich habe einmal schnell ein Beispiel erstellt, mit dem das Listenfeld abhängig vom Hauptformular bestückt wird.
Das Ganze beruht auf der Filtertabelle und dem entsprechenden Makro, was eben den Filter befüllt und die Listbox aktualisiert.
Funktioniert in dieser Form nur ab LO 4.1.* - falls Du es für Vorversionen brauchst, muss der Wert der einzusetzenden ID anders ermittelt werden.

Gruß

Robert
Dateianhänge
Main_Sub_Select.odb.zip
Selectfeld im Subform aktualisieren abhängig vom Mainform
(12.33 KiB) 280-mal heruntergeladen
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

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

Re: Inhalt eines Formularfeldes in Select-Where-Clause verwe

Beitrag von F3K Total » Fr 21. Mär 2014, 19:28

Hallo,
es hat mich interessiert, ob es auch ohne Makros geht.
Mit ein paar Buttons und einer Filtertabelle kann man arbeiten.
Schau mal, ob es für dich so geht.

Gruß R
Dateianhänge
Projekte.zip
(11.44 KiB) 251-mal heruntergeladen
Windows 11: AOO, LO Linux Mint: AOO, LO

RobertG
* LO-Experte *
Beiträge: 2884
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Inhalt eines Formularfeldes in Select-Where-Clause verwe

Beitrag von RobertG » Fr 21. Mär 2014, 20:09

Hallo R.,

scheint so, als ob der Reload des Formulars auch einen Refresh des Listenfeldes auslöst. Ich hatte da bisher öfter Probleme und war deshalb der Ansicht, dass da irgendwo ein Haken drin sein müsste. Funktioniert aber auch so. Vermutlich habe ich das einfach an die Übergabe Formular - Subformular binden wollen.

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


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten