Korzystam z Firebird 1.5 i do komunikacji z tą bazą używam komponentów
dbexpress.
Mam 2 tabele, np:
DOM
iddom
nazwa
MEBLE
idmeble
iddom
nazwa
Tabele są wypełnione tak:
DOM
iddom nazwa
1 dom1
2 dom2
MEBLE
idmeble iddom nazwa
1 1 m1
2 1 m2
3 2 m3
4 2 m4
I moje pytanie jest proste. Jakie zapytanie zadać w SQLClientDataSet2
aby połączyć te tabele tak, że w jednym dbgridzie będzie wyświetlona
tabela DOM (master), a w drugim odpowiednie pozycje tabeli MEBLE
(detail).
Na Formie są takie komponenty:
- SQLConnection1
- SQLClientDataSet1 -> DataSource1 -> DBGrid1
- SQLClientDataSet2 -> DataSource2 -> DBGrid2
W SQLClientDataSet1 jest takie zapytanie (wyświetla cała zawartość
tabeli DOM):
SELECT *
FROM DOM;
Natomiast w SQLClientDataSet2 mam tak:
SELECT MEBLE.*
FROM MEBLE, DOM
WHERE DOM.iddom = MEBLE.iddom;
W dokumentacji interbase i firebird oraz w różnych kursach SQL znalazłem
odpowiedź jednoznaczną, że aby połączyć tabele ze sobą to takie
polecenie powinno wystarczyć. Jednak w rzeczywistości wyświetla mi
wszystkie dane z tabeli MEBLE. Tak jakby wyświetleniu uległy nie
wiersze, które spełniają warunek dla aktualnie aktywnego w tabeli DOM,
ale dla każdego sprawdzanego wiersza z tej tabeli. Co wydaje się nawet
logiczne, ale gdy spróbuje w komponencie SQLClientDataSet2 ustawić
master source na SQLClientDataSet1 i master fields na iddom-iddom, to
pojawia się błąd.
Dlatego czy wie ktoś jak prawidłowo połączyć owe tabele? Naturalnie chce
aby komponenty SQLClientDataSet pracowały w trybie ctQuery, bo w trybie
ctTable działa bez problemów.
Bardzo proszę o pomoc.
Parameters.Clear;
SQL.Text:='SELECT MEBLE.* FROM MEBLE, DOM WHERE DOM.iddom = :p_iddom';
Parameters.ParamByName('p_iddom'):=SQLClientDataSet1.FieldByName('iddom').As
...;
Open;
Andrzej