![]() |
Master-Detail-Beziehung zur Laufzeit erstellen
Hallo,
ich versuche zur Laufzeit eineMaster-Detail Beziehung zwischen zwei Tabellen zu erzeugen.
Delphi-Quellcode:
Leider bekomme ich beim Zugriff (ScrollEvent) des Detail-Datasets immer eine AV.
DetailQuery.Close;
DetailQuery.Datasource:= MasterDatasource; DetailQuery.SQL.Clear; DetailQuery.SQL.Add('SELECT *'); DetailQuery.SQL.Add('FROM '+TableName); // Abzufragende Tabelle DetailQuery.SQL.Add('WHERE '+KeyField+'='+':'+KeyField); // Fremdschlüssel als QueryParameter DetailQuery.Open; Weiß jemand Rat? |
Re: Master-Detail-Beziehung zur Laufzeit erstellen
Ist die MasterSource auch offen?
|
Re: Master-Detail-Beziehung zur Laufzeit erstellen
Zitat:
|
Re: Master-Detail-Beziehung zur Laufzeit erstellen
Hallo,
Korrektur: Die Fehlermeldung lautet: "DetailQuery: Field '' not found " Kann jemand damit etwas anfangen? Ich schätze, dass der Parameter nicht erkannt wird?! |
Re: Master-Detail-Beziehung zur Laufzeit erstellen
Stichwort: MasterField
Du musst dem DataSet sagen, über welches Feld es mit dem Master verbunden ist. |
Re: Master-Detail-Beziehung zur Laufzeit erstellen
Hallo Steve,
wie Du am Statement erkennen kannst, verwende ich einen Parameter. Dieser stellt die Verbindung her... Aber vielleicht ist das so nicht ganz richtig oder wird nicht richtig erkannt? |
Re: Master-Detail-Beziehung zur Laufzeit erstellen
Hallo,
meine Query enthält das richtige Statement mit dem Parameter, wenn ich es mir anzeigen lasse. Trotzdem funktioniert es nicht. Ich bekomme immer ein leeres DetailDataset. Wenn ich folgendes mache:
Delphi-Quellcode:
So geht es. Ich verstehe das nicht.
Query.Close;
Query.SQL.Clear; Query.SQL.Add('SELECT *'); Query.SQL.Add('FROM '+TableName); Query.SQL.Add('WHERE '+KeyName+'='+QuotedStr(2)) // Hier gebe ich den Fremdschlüssel direkt an, // statt über Parameter. ... Ich habe zwei Querys: 1. Kunde Kunde_ID 2. Waren Waren_ID Kunde_ID Ich möchte die folgende Master-Detail-Beziehung zur Laufzeit, beim erzeuge der Querys, erstellen.
Delphi-Quellcode:
Lasse ich mir das Statement beim Scrollen ausgeben, so steht der Parameter mit in der Query.
WarenQuery.Close;
WarenQuery.SQL.Clear; WarenQuery.SQL.Add('SELECT *'); WarenQuery.SQL.Add('FROM '+TableName); WarenQuery.SQL.Add('WHERE '+KeyName+'=:'+KeyName) // Wobei 'KeyName' der Parameter dieser Query // ist Nur das Ergebnis bleibt leer, obwohl ein Wert vorhanden sein sollte... Kann jemand helfen und mir sagen wie ich den Parameter richtig miteingebunden bekomme? |
Re: Master-Detail-Beziehung zur Laufzeit erstellen
Hai barnti,
an welcher Stelle setzt Du denn den Wert des Parameters? |
Re: Master-Detail-Beziehung zur Laufzeit erstellen
Hallo Sharky,
Zitat:
Die Boxen werden erzeugt sobald der Benutzer auf den 'Tabelle Waren anzeigen'-Button drückt.
Delphi-Quellcode:
Der Wert des Parameters ergibt sich aus der Verbindung der beiden Quellen. Da In der LookupBox 'Kunde' Werte vorhanden sind, scheint die Quelle 'Kunde' offen zu sein. In der Box der Waren werden halt nur keine Waren angezeigt. Das Statement wird aber ausgeführt...
...
procedure SetExtraLookup(...) ...// Hier wird jeweils eine Box mit einem Standard-SQL-Statement konfiguriert(alle Daten der // Tabelle) ListField:= GetListFieldLookupBox.ListSource:= GetXLookupDatasource(Tablename); LookupBox.ListSource.DataSet.Open; LookupBox.KeyField:= LookupBox.ListSource.DataSet.Fields[0].FieldName; LookupBox.ListField:= ListField; SetMasterDetail(LookupBox); // hier soll die Master-Detail-Beziehung etabliert werden ... procedure SetMasterDetail(LookupBox: TDBLookupComboBox); begin ... // Neu abzufragende Tabelle, Fremdschlüssel und die zugehörige Query Tablename:= GetTableName; KeyName:= MasterDataset.Fields[0].FieldName; DetailQuery:= GetDetailQuery; DetailQuery.Datasource:= MasterDatasource // Hier wird die Verbindung beider Quellen hergestellt DetailQuery.Close; // Hier wird das Statement neu gesetzt, so dass der // Parameter 'KeyName' DetailQuery.SQL.Clear; // ermittelt aus dem Masterdataset eingesetzt wird DetailQuery.SQL.Add('SELECT *'); DetailQuery.SQL.Add('FROM '+TableName); DetailQuery.SQL.Add('WHERE '+KeyName+'=:'+KeyName)}; DetailQuery.SQL.Add('and valid is Null'); DetailQuery.Open; end; |
Re: Master-Detail-Beziehung zur Laufzeit erstellen
Zitat:
Du musst aber nicht die Where-Klausel in die Abfrage miteinfügen, sondern über Masterfield die Beziehung festlegen. Dann wird auch die Detail-Datenmenge aktualisiert, wenn sich die Master-Datenmenge ändert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:16 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