Haupt-Detailbeziehungen über Parameter definieren
Nach oben zu Abfrage-Datenmengen
Wenn Sie eine Haupt/Detail-Beziehung definieren möchten, bei der die Detaildatenmenge eine Abfrage-Datenmenge ist, müssen Sie eine entsprechende Abfrage mit Parametern definieren. Diese Parameter beziehen sich auf die aktuellen Feldwerte in der Hauptdatenmenge. Da diese sich zur Laufzeit dynamisch ändern, müssen Sie die Parameter der Detaildatenmenge jedes Mal erneut binden, wenn sich der Hauptdatensatz ändert. Es wäre zwar möglich, hierzu eine entsprechende Ereignisbehandlungsroutine zu schreiben, aber alle Abfrage-Datenmengen stellen ein einfacheres Verfahren zur Verfügung, bei dem die Eigenschaft DataSource verwendet wird.
Wenn Parameterwerte für eine parametrisierte Abfrage nicht zur Entwurfszeit gebunden oder zur Laufzeit angegeben wurden, versucht die Abfrage-Datenmenge, den Parametern über die Eigenschaft DataSource Werte zuzuweisen. DataSource gibt eine andere Datenmenge an, die nach Feldnamen durchsucht wird, welche mit den Namen nicht gebundener Parameter übereinstimmen. Bei der zu durchsuchenden Datenmenge kann es sich um einen beliebigen Typ handeln. Die zu durchsuchende Datenmenge muss erstellt und mit Daten gefüllt werden, bevor die Detaildatenmenge, die sich darauf bezieht, angelegt wird. Werden in der zu durchsuchenden Datenmenge Übereinstimmungen gefunden, so bindet die Detaildatenmenge die Parameterwerte an die Feldwerte im aktuellen Datensatz, auf den die Datenquelle verweist.
Dieser Mechanismus lässt sich anhand eines Beispiels einfach erläutern: Gehen wir davon aus, dass die beiden Tabellen Customer und Orders gegeben sind. Für jeden Kunden enthält die Tabelle Orders eine Menge von zugehörigen Aufträgen. Die Tabelle Customer enthält das Feld ID mit einer eindeutigen Kunden-ID. Die Tabelle Orders enthält das Feld CustID, das die ID des Kunden angibt, der einen Auftrag erteilt hat.
So richten Sie die Datenmenge Customer ein:
- Fügen Sie der Anwendung eine Tabellen-Datenmenge hinzu, und binden Sie diese an die Tabelle Customer.
- Fügen Sie eine TDataSource-Komponente mit dem Namen CustomerSource hinzu. Setzen Sie deren Eigenschaft DataSet auf die in Schritt 1 definierte Datenmenge. Diese Datenquelle repräsentiert jetzt die Datenmenge Customer.
- Fügen Sie eine Abfrage-Datenmenge hinzu, und setzen Sie deren Eigenschaft SQL auf:
SELECT CustID, OrderNo, SaleDate
FROM Orders
WHERE CustID = :ID
- Beachten Sie, dass der Name des Parameters dem Namen des Feldes in der Haupttabelle (Customer) entspricht.
- Setzen Sie die Eigenschaft DataSource Detaildatenmenge auf CustomerSource. Durch Setzen dieser Eigenschaft wird die Detaildatenmenge eine verknüpfte Abfrage.
Zur Laufzeit wird dem Parameter :ID in der SQL-Anweisung für die Detaildatenmenge kein Wert zugewiesen, so dass die Datenmenge versucht, eine dem Namen des Parameters entsprechende Spalte in der in CustomersSource angegebenen Datenquelle zu finden. CustomersSource ruft die Daten aus der Hauptdatenmenge ab, die diese wiederum aus der Tabelle Customer ableitet. Da die Tabelle Customer eine Spalte mit dem Namen CustID enthält, wird der Wert aus dem Feld ID des aktuellen Datensatzes der Hauptdatenmenge in der SQL-Anweisung dem Parameter :ID der Detaildatenmenge zugewiesen. Die Datenmengen sind damit in einer Haupt/Detail-Beziehung miteinander verknüpft. Bei jedem Wechsel des aktuellen Datensatzes in der Datenmenge Customers wird für die Detaildatenmenge die SELECT-Anweisung ausgeführt, um alle Aufträge über die aktuelle Kunden-ID abzurufen.