![]() |
Re: Master-Detail-Beziehung zur Laufzeit erstellen
Hi,
das geht auch über die Parameter der Where-Klausel. Habe ich vorher bereits gemacht. |
Re: Master-Detail-Beziehung zur Laufzeit erstellen
Hallo branti!
Ich habe versucht Dein Problem nachzubilden. Ich habe 2 TQuery, 2 TDataSource, 2 TDBLookupListBox und ein TButton auf der Form platziert ohne irgendeine Eigenschaft der Elemente im Objektinspektor gesetzt zu haben. Alle Eigenschaften sollten während der Laufzeit gesetzt bzw. manipuliert werden. Dadurch ist der folgende Code entstanden und der funktioniert prima. Und hier der vollständige Code:
Delphi-Quellcode:
Ich hoffe, dass ich Dir helfen konnte.
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Db, DBTables, StdCtrls, DBCtrls; type TForm1 = class(TForm) Button1: TButton; MasterQuery: TQuery; MasterDataSource: TDataSource; MasterDBLookupListBox: TDBLookupListBox; DetailQuery: TQuery; DetailDataSource: TDataSource; DetailDBLookupListBox: TDBLookupListBox; procedure Button1Click(Sender: TObject); procedure MasterDBLookupListBoxClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin // MasterQuery MasterQuery.Active := false; MasterQuery.DatabaseName := 'FAM001_Lvs'; MasterQuery.SQL.Clear; MasterQuery.SQL.Add('select distinct dnote_id from disp_head'); MasterQuery.Prepare; MasterQuery.Active := true; // MasterDataSource MasterDataSource.DataSet := MasterQuery; // MasterDBLookupListBox MasterDBLookupListBox.ListSource := MasterDataSource; MasterDBLookupListBox.KeyField := 'dnote_id'; // DetailQuery DetailQuery.Active := false; DetailQuery.DatabaseName := 'FAM001_Lvs'; DetailQuery.SQL.Clear; DetailQuery.SQL.Add('select distinct art_id from disp_line'); DetailQuery.SQL.Add(' where dnote_id = :dnote_id'); DetailQuery.ParamByName('dnote_id').AsInteger; DetailQuery.Prepare; DetailQuery.DataSource := MasterDataSource; DetailQuery.Active := true; // DetailDataSource DetailDataSource.DataSet := DetailQuery; // DetailDBLookupListBox DetailDBLookupListBox.ListSource := DetailDataSource; DetailDBLookupListBox.KeyField := 'art_id'; end; procedure TForm1.MasterDBLookupListBoxClick(Sender: TObject); begin // DetailQuery neuaufbauen DetailQuery.Active := false; DetailQuery.Active := true; end; end. Viele Grüße Markus :gruebel: |
Re: Master-Detail-Beziehung zur Laufzeit erstellen
Hallo MarkusB,
das entspricht in etwa dem, was ich auch implementiert habe. Wie gesagt bei mir funktioniert es nicht. Das Problem dabei ist, dass ich beim 'OnScroll-Ereignis' die Datasets und ihre Abhängigkeiten aktualisieren muss. Dabei scheint das Problem aufzutauchen. Vielleicht finde ich den Fehler noch. Danke für die Mühe! Sollte ich das Problem gelöst haben, werde ich es hier berichten... |
Re: Master-Detail-Beziehung zur Laufzeit erstellen
Hallo,
jetzt habe ich das Problem gelöst. Es funktioniert mit der normalen Master-Detail-Verbindung. Folgende Komponenten konfiguriert:
Delphi-Quellcode:
Das in Kurzform. Für weitere Fragen stehe ich gern zur Verfügung.
...
MasterLookupBox.ListSource:= MasterSource; DetailLookupBox.ListSource:= DetailSource; MasterLookupBox.ListField:= 'ListFieldName' DetailLookupBox.ListField:= 'ListFieldName'; MasterLookupBox.KeyField:= 'KeyName'; DetailLookupBox.KeyField:= 'KeyName'; ... procedure LookupBoxOnEnter(Sender: TObject); begin SetMasterDetail(TDBLookupComboBox(Sender)); end; procedure SetMasterDetail(...) begin ... // Query der LookupBox DetailQuery.DataSource:= MasterLookupBox.ListSource; Tablename:= GetTableName; KeyName:= MasterLookupBox.ListSource.KeyName; DetailQuery:= GetQuery(TableName); // Parameter einfügen DetailQuery.Close; DetailQuery.SQL.Clear; DetailQuery.SQL.Add('SELECT * '); DetailQuery.SQL.Add('FROM '+Tablename); DetailQuery.SQL.Add('WHERE '+KeyName+'=:'+KeyName); DetailQuery.Open; end; Woran es jetzt gelegen hat vermag ich nicht zu sagen. Wahrscheinlich lag es am Zeitpunkt des Setzens der Master-Detail-Beziehung. So geht es auf jeden Fall. Nochmals Danke an alle. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:14 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-2025 by Thomas Breitkreuz