Seite 1 von 1

Inhalt eines Formularfeldes in Select-Where-Clause verwenden

Verfasst: Mi 19. Mär 2014, 23:55
von althoffc
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

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

Verfasst: Do 20. Mär 2014, 17:56
von RobertG
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

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

Verfasst: Do 20. Mär 2014, 20:01
von althoffc
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

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

Verfasst: Do 20. Mär 2014, 20:59
von RobertG
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

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

Verfasst: Fr 21. Mär 2014, 19:28
von F3K Total
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

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

Verfasst: Fr 21. Mär 2014, 20:09
von RobertG
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