Quantcast

Base: Formulare und n:n Relationen

classic Classic list List threaded Threaded
3 messages Options
Ulrich Goebel-2 Ulrich Goebel-2
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Base: Formulare und n:n Relationen

Hallo,

wie kann man n:n Relationen mit LO-Base in einem Formular darstellen?

Genauer: ich habe eine PostgreSQL-Datenbank mit Personen und möchte
diese Personen Gruppen zuordnen.

Die Tabellen:

Personen:
        id integer
        name text
        (und eine Reihe von weiteren Feldern...)
Gruppen:
        id integer
        bez text

Entsprechende gibt es eine dritte Tabelle, die die n:n Ralation darstellt:

Zugehörigkeiten:
        id integer
        prsID integer referenziert Personen(id)
        grpID integer referenziert Gruppen(id)

So kann eine Person mehreren Gruppen zugeordnet sein, und eine Gruppe
kann mehrere Personen enthalten.

Nun möchte ich ein Formular zum erfassen der Personen-Daten erstellen,
in dem auf der linken Seite die Daten der Tabelle "Personen" erfasst
werden können, und auf der rechten Seite möchte ich eine Liste der
vorhandenen Gruppen sehen, wo man ankreuzen kann, welcher Gruppe die
Person angehört.

Irgendwo zwei Butten "Sichern" und "Update", die sowohl die
Personen-Tabelle füttert als auch die angekreuzten Zugehörigkeiten in
der Tabelle "Zugehörigkeiten"

Geht das?

Gruß Ulrich


--
Ulrich Goebel
Am Büchel 57, 53173 Bonn

--
Liste abmelden mit E-Mail an: [hidden email]
Probleme? http://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: http://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: http://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert
Gerhard Weydt Gerhard Weydt
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Base: Formulare und n:n Relationen

Hallo Ulrich,

wie es der Zufall will, habe ich gerade dieses Thema durchprobiert, weil
ich die Neufassung des Kapitels "Base" für das Handbuch "Erste Schritte
mit LibreOffice" schreibe.
Ich kann dir zwei Wege beschreiben, der zweite ist noch ein bisschen
bequemer als der erste, benötigt aber ein kleines Makro. Es wird sicher
noch weitere ähnliche Varianten für die Lösung geben.
Ich gehe in meinerBeschreibung erst einmal davon aus, dass du schon in
etwa weißt, wie das mit den Formularen funktioniert, und auch
grundsätzlich ein Makro anlegen könntest (den Code liefere ich unten).
Ich kümmere mich auch überhaupt nicht um die optische Gestaltung. Wenn
meine Beschreibung für deine derzeitigen Kenntnisse zu knapp ist, melde
dich nochmal.
Der Tabellenentwurf ist erst mal in Ordnung, minimal, aber genau das,
was man braucht.
Für das Formular würde ich die Zuordnung zu den Gruppen für eine Person
anzeigen, das ist das natürlichere Vorgehen, unter anderem auch, weil es
weniger Grupen als Personen gibt; ich glaube aus deiner Beschreibung
herauszulesen, dass du das auch so auffasst. Ein zweites Formular (oder
ein Bericht) könnte ja dann die Gruppen mit den Ihnen zugeordneten
Personen zeigen.
Das ganze Formular(-dokument, leider ist der Sprachgebrauch
doppeldeutig, denn ein Formulardokument enthält Formulare!) kann man
nicht mit dem Assistenten erzeugen, weil der eine hierarchische
Anordnung vorsieht und auch nur zwei Formulare kann. Erzeuge also mit
dem Assistenten (oder wenn du willst, in der Entwurfsansicht) ein
Formular - ich vergebe jetzt Namen, damit klare Bezeichner da sind -
"fPersonen" für die Tab. Personen und eine Unterformular "fZugeh" für
die Zugehörigkeiten, das mit fPersonen über Personen.id =
Zugehörigkeiten.prsId verknüpft ist; die Verknüpfung muss sein, auch
wenn die DB die Verknüpfung schon kennt, es könnte ja mehrere Relationen
geben, du kannst aus den vorhandenen Relationen beim Assistenten
auswählen. Für beide Formulare willst du offensichtlich eine
tabellarische Darstellung, was ich genauso machen würde, also wähle beim
Assistenten bzw. im Entwurf jeweils das Tabellen-Steuerelement.
Wenn du dann - beim Assistenten - in der Anzeigesicht des
Formulardokuments gelandet bist, schließe sie und rufe es zum Bearbeiten
auf.
Für das dritte Formular "fGruppe" rufe zunächst den Formular-Navigator
auf, markiere das oberste Element "Formulare" und rufe im Kontextmenü
Neu -> Formular auf (das neue Formular ist ja nicht fPersonen
untergeordnet, deshalb ist das der richtige Platz). Das neue Formular
heißt jetzt wohl - wir sind noch im Navigator - "Formular"; benenne es
in fGruppe um. Füge jetzt über die Symbolleiste Formular-Steuerelemente
und die Auswahl des Symbols Weitere Steuerelemente ein
Tabellen-Kontrollfeld ein, das hängt unter fGruppe, weil das noch vom
Erzeugen markiert ist. Das musst du dann über Kontext -> Eigenschaften
-> Daten der DB-Tabelle zuordnen. Dann musst du zumindest das Feld für
bez hinzufügen, die id nur dann, wenn du sie sehen willst.
In der Tabelle der Zugehörigkeiten in fZugeh (nicht in der DB) änderst
du über Kontext -> Ersetzen durch -> Listenfeld das Feld für grpId in
ein Listenfeld. Dem gibst du dann über Kontext -> Eigenschaften -> Daten
den Listeninhalt mit, der aus den zwei Spalten id und bez der DB-Tabelle
Gruppen besteht, entweder über das SQL SELECT id, bez FROM Gruppen
[ORDER BY ...] oder über eine entsprechende View der DB oder eine
Abfrage , die du in Base erzeugt hast. Ändere auch ggf. in den
EIgenschaften -> Allgemein, dass die Liste aufklappbar ist, und die
Anzahl der gezeigten Zeilen. Das hat den Zweck, dass du in der
Formular-Tabelle der Zugehörigkeiten die Gruppe nach ihrer Bezeichnung
auswählen kannst.
Das geht gut, wenn die Gruppe schon existiert hat, als das
Formular-Dokument aufgerufen wurde. Nun kannst du aber neue Gruppen über
fGruppe anlegen. Die werden zunächst nicht in der Auswahlliste
angezeigt. Hier gibt es nun - zumindest - zwei Wege.
1) Markiere im Navigator fPersonen - oder "Formulare", das läuft auf das
Gleich hinaus - und füge dann eine Schaltfläche ein, der du als Aktion
"Formular aktualisieren" zuweist. Die musst du drücken, nachdem du in
der Tabelle der Gruppen eine oder mehrere Sätze hinzugefügt hast, egal
ob über die Formular-Tabelle oder direkt in der DB; den neuen Stand
kriegt ansonsten das Formular nur mit, wenn es nach der Änderung geladen
wird. Danach kanst du auch die neuen Gruppen in der Auswahlliste auswählen.
2) Etwas bequemer geht es mit einem Makro, das die in der
Formular-Tabelle ausgewählte Gruppe in die Tabelle der Zugehörigkeiten
überträgt. Das ist bei schon vorhandenen Gruppen im Aufwand vergleichbar
mit der Auswahl aus der Auswahlliste, aber bei neuen Gruppen direkter.
Dazu brauchst du auch eine Schaltfläche, die aber als Aktion "Keine"
hat. Im Reiter "Ereignisse" weist du dem Ereignis "Aktion ausführen"
oder - wenn dein DB-System aufgrund deiner Festlegungen eventuell ein
Veto gegen den Insert in Gruppen einlegen kann, besser in "Aktion
bestätigen", was erst nach dem eventuellen Veto aufgerufen wird - das
folgende Makro zu. Die Formularnamen habe ich einfach im Text geändert,
möglicherweise habe ich dadurch einen Fehler erzeugt, aber das
Ausgangsmakro funktioniert.

Sub neu
     forms = ThisComponent.Drawpage.Forms
     fGruppe = forms.getByName("fGruppe")
     if fGruppe.isNew then
         fGruppe.insertRow
     end if
     grpId = fGruppe.Columns.getByName("id").string
     fZugeh = forms.fGruppe getByName("fPersonen").getByName("fZugeh")
     fZugeh.moveToInsertRow
     fZugeh.Columns.getByName("grpId").updateString(grpId)
     fZugeh.insertRow
     fZugeh.getByName("Name des Tabellen-Kontrollelements für
Zugehörigkeit").getByName("Name der Spalte für grpId").refresh
End Sub

Das Makro speichert zunächst eine eventuell neu angelegte Zeile in der
Tabelle Gruppen, dann holt es sich die dann vergebene Id (ich gehe davon
aus, dass du die Ids automatisch vergibst), hangelt sich zu dem Formular
für die Zugehörigkeiten durch, legt eine neue Zeile an, trägt da die
grpId ein (die persId wird automatisch vorgeschlagen wegen der
Hierarchie zur Person), speichert die Zeile und aktualisiert den Inhalt
der Auswahlliste.

Zu den Buttons, die du am Ende erwähnst: das Formular-Dokument hat eine
Navigationsleiste, die auch ein Speichern-Symbol enthält. Außerdem wird
auch gespeichert, wenn man durch Pfeil-auf oder -ab oder Klicken
woanders hin die Zeile verlässt (und bei der Gruppe durch das Makro).
Extra Schaltflächen sind also Luxus, aber vielleicht hilfreich. Lege Sie
im zugehörigen Formular an und gib ihnen die Aktion "Datensatz speichern".

Gruß

Gerhard

Am 19.05.2017 um 19:04 schrieb Ulrich Goebel:

> Hallo,
>
> wie kann man n:n Relationen mit LO-Base in einem Formular darstellen?
>
> Genauer: ich habe eine PostgreSQL-Datenbank mit Personen und möchte
> diese Personen Gruppen zuordnen.
>
> Die Tabellen:
>
> Personen:
>     id    integer
>     name    text
>     (und eine Reihe von weiteren Feldern...)
> Gruppen:
>     id    integer
>     bez    text
>
> Entsprechende gibt es eine dritte Tabelle, die die n:n Ralation
> darstellt:
>
> Zugehörigkeiten:
>     id    integer
>     prsID    integer referenziert Personen(id)
>     grpID    integer    referenziert Gruppen(id)
>
> So kann eine Person mehreren Gruppen zugeordnet sein, und eine Gruppe
> kann mehrere Personen enthalten.
>
> Nun möchte ich ein Formular zum erfassen der Personen-Daten erstellen,
> in dem auf der linken Seite die Daten der Tabelle "Personen" erfasst
> werden können, und auf der rechten Seite möchte ich eine Liste der
> vorhandenen Gruppen sehen, wo man ankreuzen kann, welcher Gruppe die
> Person angehört.
>
> Irgendwo zwei Butten "Sichern" und "Update", die sowohl die
> Personen-Tabelle füttert als auch die angekreuzten Zugehörigkeiten in
> der Tabelle "Zugehörigkeiten"
>
> Geht das?
>
> Gruß Ulrich
>
>


--
Liste abmelden mit E-Mail an: [hidden email]
Probleme? http://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: http://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: http://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert
Robert Großkopf Robert Großkopf
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Base: Formulare und n:n Relationen

In reply to this post by Ulrich Goebel-2
Hallo Ulrich,

ich schreibe hier einmal nur das Prinzip auf:
Einfachste Methode für eine n:m-Beziehung ist ein Hauptformular
"Personen" und ein Unterformular "Zugehörigkeiten".

Das Unterformular benötigt nur ein Feld "grpID". Aus diesem Feld wird
ein Listenfeld gemacht, das alle Gruppen darstellt und alle
Schlüsselwerte schreibt.

Anmerkung zur Tabelle "Zugehörigkeiten":
Die Tabelle benötigt eigentlich kein Feld "id". Die Fremdschlüssel
"prsID" und "grpID" sind zusammen einzigartig und können gemeinsam den
Primärschlüssel bilden.

Anmerkung zu Ankreuzfeldern für Gruppen:
So etwas hat nur dann Sinn, wenn Du eine beschränkte Anzahl von Gruppen
hast, die auch nicht mehr erweitert werden. Diese Konstruktion hat
allerdings außerdem noch den Nachteil, dass die Datenerfassung nicht
ohne Makro auskommt, da ja für jedes Feld eine neue Zeile in der
"Zugehörigkeiten"-Tabelle erstellt werden muss. Auch das Auslesen der
Daten und darstellen in den Ankreuzfeldern ist nicht so simpel
umzusetzen. Ich würde darauf verzichten.

Gruß

Robert
--
Homepage: http://robert.familiegrosskopf.de
LibreOffice Community: http://robert.familiegrosskopf.de/map_3


--
Liste abmelden mit E-Mail an: [hidden email]
Probleme? http://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: http://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: http://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert
Loading...