Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Master-/Detail wie am Besten (https://www.delphipraxis.net/178443-master-detail-wie-am-besten.html)

ByteAngel 8. Jan 2014 18:51

Datenbank: Firebird • Version: 2.5 • Zugriff über: UniDac

Master-/Detail wie am Besten
 
Hallo Leute,

ich beschäftige mich seit langem mal wieder mit Delphi
und möchte gleich mal meine erste Frage loswerden.

Welche Ansätze gibt es zur Umsetzung von einer Oberfläche
die das Editieren von Master-/Detail Datensätzen ermöglicht ?

Aktuell habe ich gerade das Problem.
Es sind folgende 2 bzw. 3 Table gegeben :

- Table Benutzer (MasterTable)
ID Integer PK AutoInc(Generator)
Name Varchar(45)
.........

- Table Benutzer2Gruppe (Detail-table)
ID Integer PK AutoInc(Generator)
BENUTZER_ID FK auf Benutzer/ID
BENUTZERGRUPPEN_ID FK auf BENUTZERGRUPPEN/ID
.........

- Table BenutzerGruppen
ID Integer PK AutoInc(Generator)
Name Varchar(45)
.........

Bei DetailTable wurde :
- MasterSource auf den BenutzerTable gesetzt
- MasterField auf "ID"
- DetailField auf "BENUTZER_ID"
- CachedUpdates auf True

Damit funktioniert fast alles so wie es soll, nur ich bekomme es um's
verrecken nicht hin, das wenn im Mastertable ein neuer Datensatz angelegt wird
auch die neuen Datensätze des Detailtable erfolgreich mitgepostet werden.
Die neue ID wird im OnBeforePost des MasterTables aus einem Generator gelesen
und gesetzt.
Die neue Benutzer ID wird im DetailTable im OnNewRecord/BeforeInsert gesetzt,
somit müssten eigentlich alle Felder gefüllt sein.
Wenn ich aber MasterTable.Post aufrufe, werden die MasterDaten gespeichert,
die Detail-Daten aber nicht, es kommt keine Fehlermeldung nichts.

Hat jemand eine Idee/Tipp für mich ?

Welche Alternative Lösungsansätze gibt es noch ?
Querys für die Detail-Daten ? (Vor-/Nachteile)

Für ein paar Denkanstöße wäre ich sehr dankbar,

Gruß ByteAngel

sx2008 8. Jan 2014 19:47

AW: Master-/Detail wie am Besten
 
Das ist auch keine Master-Detail-Beziehung sondern eine N:M-Beziehung.
Ein Benutzer kann Mitglied in mehren Gruppen sein.
Eine Gruppe kann mehrere Benutzer haben.
Dies wird durch die 3. Tabelle "Benutzer2Gruppe" abgebildet.

Wenn du ein Formular hast in dem die Benutzer angelegt und editiert werden,
dann könnte man dort für den aktuell selektierten User eine Liste der Gruppen anzeigen
in denen der User Mitglied ist.
Allerdings wäre diese Liste read-only; man kann sie nicht direkt editieren.

SQL-Code:
SELECT BenutzerGruppen.Name FROM
BenutzerGruppen INNER JOIN Benutzer2Gruppe ON BenutzerGruppen.ID=Benutzer2Gruppe.BENUTZERGRUPPEN_ID
WHERE Benutzer2Gruppe.BENUTZER_ID = :IdUser
Es gibt dann 2 Buttons "zu Gruppe hinzufügen" und "aus Gruppe entfernen".
Beim Hinzufügen wird ein SQL INSERT ausgeführt und beim Entfernen ein DELETE.

Genau das Gleiche kann man in dem Formular machen in dem die BenutzerGruppen editiert werden.

Du wirst um SQL-Kenntnisse nicht drumrumkommen.
Die Tabelle Benutzer2Gruppe braucht übrigens nur 2 Felder; das Autoinc-Feld kannst du löschen und im Gegenzug den Primärschlüssel auf die beiden verbleibenden Felder legen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf