Date: prev next · Thread: first prev next last
2017 Archives by date, by thread · List index


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.