![]() |
Datenbank: FireBird • Version: 3.0 • Zugriff über: FireDac
Tabellen verknüpfen
Hallo zusammen
Ich schreibe mein CRM-Programm um und wechsle einerseits von einer Absolute DB auf Firebird. Mittlerweilen hab ich mich für die FireDac-Komponenten entschieden, da scheinbar die UNIDAC-Komponenten nicht ganz kompatibel sind. Mittlerweile hab ich mich in FireDac eingearbeitet bzw. ich komme gut zurecht damit. Die Hauptansicht des Adressmoduls besteht aus einem DBGrid, welches die Adressdaten anzeigt (können gefiltert, durchsucht usw. werden) - funktioniert gut. Dazu gibt es eine Tabelle, wo Kontakte gespeichert werden - die Verknüpfung geschieht über den Primärschlüssel der Adress-Tabelle. Ich möchte nun in einem anderen DBGrid die Kontatdaten zu dem entsprechend im Adress-Grid selektierten Datensatz anzeigen. Beim Wechsel der selektierten Adresse sollen logischerweise auch die Daten der Kontakte wechseln. Meine Frage wie löse ich das am Besten? Mit einer FDTable und entsprechender Filterfunktion oder über eine FDQuery-Komponent mit SQL-Anweisung und entsprechendem Parameter. Oder löst man das anders? Danke im Voraus. Bruno |
AW: Tabellen verknüpfen
Klassisch gibt es die Mastersource Eigenschaft. Dort konnte man für eine Subdatenmenge definieren, welche Master Datasource zu verwenden ist.
Weiß nicht, ob das mit den FD Komponenten noch genau so ist (oder ähnlich). ![]() Ob man das überhaupt so macht, ist eine philosophische Frage. Da Du Third Party data sensitive Components verwendest, wäre die Antwort vermutlich ja. Würdest Du mit anderen Verfahren arbeiten, dann wäre das "Mastersource" Verfahren wohl nicht das richtig. Auch mit den FD Komponenten kann man das Verhalten zu Fuß erreichen, in dem man das Subdataset neu filtert, wenn das Hauptdataset ein RecordChange hat (genau event Bezeichnung bei FD kenne ich nicht) |
AW: Tabellen verknüpfen
Zitat:
Code:
Dieses View kann ich genauso mit einem Query öffnen wie eine Tabelle. Dabei setze ich im Query ReadOnly auf True. Und ich muss mich nicht mehr um Verknüpfungen im Delphi-Programm kümmern.
CREATE OR ALTER VIEW V_SAMMLUNG(
ID, TITEL, KATEGORIE, INHALT) AS select SAMMLUNG.ID_SAMMLUNG, SAMMLUNG.TITEL, KATEGORIEN.KATEGORIE, SAMMLUNG.BESCHREIBUNG from SAMMLUNG inner join KATEGORIEN on KATEGORIEN.ID_KATEGORIEN = SAMMLUNG.KATEGORIE ; |
AW: Tabellen verknüpfen
Ein View liefert vermutlich nicht das gewünschte Ergebnis. Er könnte zwar eine Mischmenge präsentieren, aber das löst nicht das Problem der Nachführung der Daten bei Änderung des Hauptdatensatzes.
|
AW: Tabellen verknüpfen
Zitat:
Nachtrag: Meine Views liefern die gewünschten Ergebnisse. Das ist keine Vermutung, sondern wurde mehrfach empirisch überprüft. |
AW: Tabellen verknüpfen
Zitat:
Code:
Je nachdem wie normalisiert die DB ist, kannst Du mit einem View den Zugriff schon vereinfachen.
select MainID,Adrdata.Feld1,AdrData.Feld2
from Kontakte join Adressen on (Kontakte.MainID=Adresse.MainID) Um Mißverständnissen vorzubeugen, die Oberfläche benötigt natürlich ein "Datenänderungs"-Event, daß dann die entsprechenden Änderungen/Abfragen anstößt. Gruß K-H |
AW: Tabellen verknüpfen
Zitat:
Ansonsten bin ich der letzte, der etwas gegen die Verwendung von Views sagen würde. Meinetwegen kann man ausschließlich Views verwenden. |
AW: Tabellen verknüpfen
Zitat:
Wir habne hier eine Anwendung, die in einem DB-Grid im oberen Bereich des Formulars die View-Datenmenge anzeigt, während beim Scrollen dieser View-Datenmenge automatisch im unteren Bereich die Feldinhalte in DB-sensitiven Komponenten (TDBEdit usw.) angezeigt werden. Die Inhalte der jeweiligen Subtabellen-Felder werden in jeweils einer ![]() ![]() ![]() ![]() ![]() ![]() ![]() Die Anzeigen in TDbLookupComboBox werden beim Scrollen durch die Datenmenge der Mastertabelle automatisch aktualisiert. Zur Synchronisation zwischen View und Mastertabelle schreiben wir im AfterScroll des Views:
Delphi-Quellcode:
Hier wird das View nur dazu verwendet, eine lesbare Tabelle im Grid anzeigen zu können. Das Scrollen des Views lokalisiert automatisch den zugrundeliegenden Datensatz der Mastertabelle. Man könnte in ViewMasterTabelleAfterScroll auch einen SQL-Befehl reinschreiben, der immer nur den einen Datensatz selektiert. Bei einer großen Datenmenge ist das bestimmt günstiger, als ständig zwei nahezu gleiche Datenmengen im Speicher zu halten.
procedure TDatenModul.ViewMasterTabelleAfterScroll(DataSet: TDataSet);
begin MasterTabelle.Locate('ID_MASTER',ViewMasterTabelle.FieldByName('ID').AsInteger,[]); end; |
AW: Tabellen verknüpfen
Zitat:
Ob zwei Datenmengen, die eine Master Detail Beziehung darstellen sollen, per View oder per Query oder Table angesprochen werden, sollte wurscht sein. Da ich die gefragten Komponenten und ihre Properties nicht kenne sicherheitshalber der Hinweis, ich rede von einem View in der Datenbank, nicht einer Delphi Property oder sonst irgendwas. Für den TE sind vermutlich eher die OnScroll Events der Schlüssel zum Erfolg. |
AW: Tabellen verknüpfen
[OT]
Das interessiert mich jetzt Zitat:
Zitat:
Oder welch schrecklicher Gedanke, schreiben wir aneinander vorbei? Gruß K-H [/OT] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz