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: users+unsubscribe@de.libreoffice.org
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
Context
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.