Bräuchte Hilfe bei Master/Detail-Beziehung mit ADO-Connection und MySQL-DB
-
Hi Ihr!
Ich hab eine Master-Tabelle von der Felder auf der Form liegen. Zu dieser Master-Tabelle gibt es eine Detail-Tabelle von der auch Felder auf der Form liegen... Mein Problem (ihr wisst es sicher schon) ist dass auch Detail-Datensätze angezeigt werden, die nicht zum angezeigten Master passen!
In der Borlandhilfe hab ich Syntax gefunden, die mir auch sicher weiter helfen wird... Aber ich hab leider keine Ahnung, wo ich die hinschreiben soll, damit der Borland Builder auch versteht, was ich ihm damit sagen möchte!

Orders->MasterSource = CustSource; Orders->MasterFields = "CustNo";Also, wo soll ich das hinschreiben...? Ich hab eine ADO-Connection, zwei ADO-Querys, zwei Sources und meine Felder.
Ich hoff ihr könnt mir helfen! Hab im Forum schon gesucht, aber nichts gefunden, was mir weiterhelfen könnte!
Liebe Grüße Nora
-
Hallo Nora,
bei der ADOQuery für die Detailtabelle mußt Du die Eigenschaft DataSource auf die Master-Query setzen (geht auch im Objektinspektor).
Zusätzlich mußt Du in der DetailQuery den Select beschränken:
SELECT * FROM DetailTabelle WHERE (DetailId = :MasterId)DetailId und MasterId sind die Felder über die die Tabellen verknüpft sind, der songenannte Foreign Key.
-
!Hi Ihr!
Danke schon mal an Joe!
Ich hab das vorher schon mal ausprobiert - ging aber nicht. Und auch beim jetztzigen Versuch ging's nicht. Es werden keine Daten mehr gezogen!?! Ich weiß nicht warum...!?!
Ich hoff Ihr könnt mir noch n bisschen helfen

Liebe Grüße Nora
-
Hallo nochmal,
kannst Du mal die Select-Anweisungen posten (falls da SELECT * steht, dann bitte auch die Feldnamen in den Tabellen)?
Grüße Joe_M.
-
Hi...!
SELECT d.* FROM detail d, master m where d.id = :edtM_idDanke für die Hilfe

Gruß Nora
-
Na ja, Du mußt doch 2 verschiedene SELECTs haben?!?
z.B.:
Master (Aufträge):SELECT AufNr, AufPos, KundNr FROM AuftraegeDetail (Kundendetails):
SELECT Nr, Name, Ort FROM Kunden WHERE (Nr = :KundNr)
-
Hi Du!
Also... Klar hab ich zwei verschiedene Selects

Hier ist das vom Master (ADOQuery vom Master)
SELECT m.m_id, m.feld_1, m.feld_2 FROM t_master mDavon kommt unter anderem auch die m_id, die in der t_master-Tabelle PrimaryKey ist zurück.
Das ist das Select von der ADOQuery des Details
SELECT d.d_id, d.m_id, d.feld_1, d.feld_2 FROM t_detail d WHERE t_detail.m_id = "WERT DES FELDES DER m_id DER t_master-Tabelle"Auch hier kommt unter anderem die m_id zurück, die in der t_detail-Tabelle ForeignKey ist. Die Tabellen sind also über m_id verknüpft.
Soweit so gut! Bei der ADOQuery des Details habe ich im Objektinspektor in den SQL-String geschrieben:
SELECT d.d_id, d.m_id, d.feld_1, d.feld_2 FROM t_detail d WHERE t_detail.m_id = :edtMaster_m_idedtMaster_m_id ist ein DBEdit-Feld in welchem die m_id der t_master-Tabelle steht. Durch :edtMaster_m_id greife ich doch praktisch auf den Wert in diesem Feld zu oder (so wie eine Bindvariable zu verstehen)? Wenn da also 1 drin steht, sollte das SELECT-Statement so aussehen
SELECT d.d_id, d.m_id, d.feld_1, d.feld_2 FROM t_detail d WHERE t_detail.m_id = 1Heißt: dass alles selektiert wird, was in der t_detail die m_id 1 hat. Und genau das brauch ich ja!?!? Nur versteh ich nicht, warum es nicht funktioniert...

Liebe Grüße und vielen Dank nochmal
Nora
-
Hallo Nora,
ja - so wie Du das anfängst, läuft das darauf hinaus, dass Du jedesmal, wenn sich der ausgewählte Datensatz in der Mastertabelle ändert, die Detailquery schließen, den Parameter neu setzen und die Detailquery wieder öffnen mußt... Nicht so praktisch.

Das Prinzip der Master- Detailbeziehung ist losgelöst von den darstellenden Komponenten zu betrachten. Dies betrifft nur die beiden Queries.
Die WHERE-Klausel in der Detailquery muß lauten:
WHERE d.m_id = :m_idZusätzlich muß in der Detailquery die Eigenschaft DataSource auf die Masterquery gesetzt werden.
Dann liest die Detailquery die Variable m_id aus der Masterquery. Sobald Du jetzt in der Masterquery einen anderen Satz auswählst, wird automatisch die Detailquery geschlossen, mit dem neuen Parameter aus der Masterquery versehen und automatisch wieder geöffnet.
-
Hi Joe!

Joe_M. schrieb:
ja - so wie Du das anfängst, läuft das darauf hinaus, dass Du jedesmal, wenn sich der ausgewählte Datensatz in der Mastertabelle ändert, die Detailquery schließen, den Parameter neu setzen und die Detailquery wieder öffnen mußt... Nicht so praktisch.

Was ist falsch daran? Du schreibst ja unten selbst, dass es so sein soll oder steh ich total auf der Leitung?
Joe_M. schrieb:
Die WHERE-Klausel in der Detailquery muß lauten:
WHERE d.m_id = :m_idZusätzlich muß in der Detailquery die Eigenschaft DataSource auf die Masterquery gesetzt werden.
Dann liest die Detailquery die Variable m_id aus der Masterquery. Sobald Du jetzt in der Masterquery einen anderen Satz auswählst, wird automatisch die Detailquery geschlossen, mit dem neuen Parameter aus der Masterquery versehen und automatisch wieder geöffnet.Aber genau so ist es doch auch...!
DataSource der DetailQuery ist die der Masterquery...!
Und dein oberer Absatz sagt genau das gleiche wie der untere... oder versteh ich da was falsch? Es soll doch so sein, dass immer wenn sich der Masterdatensatz ändert die Detailquery geschlossen wird, der Parameter (also m_id) neu gesetzt und neu ausgeführt wird.Danke für deine Geduld!

Gruß Nora
-
Der große Unterschied ist: Wenn Du den Wert aus einem TDBEdit holst, mußt Du alles im Code 'von Hand' machen (Query schließen, Parameter setzen, Query öffnen). Wenn Du statt dessen das Quellfeld aus der Mastertabelle nimmst, und die Eigenschaft DataSource verwendest geschieht das automatisch.