Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Połączenie tabel interbase/firebird - dbexpress

38 views
Skip to first unread message

kabik

unread,
Nov 29, 2003, 7:23:58 AM11/29/03
to
Cześć pytanie pewnie banalne, ale jednak nie mogę rozwiązać
następującego problemu:

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.

AndrzejM

unread,
Nov 29, 2003, 2:33:26 PM11/29/03
to

Użytkownik "kabik" <ka...@skr.pl> napisał w wiadomości
news:bqa35g$js6$1...@nemesis.news.tpi.pl...
Tylko tutaj nie ma relacji M/D.
Prosty sposób to w zdarzeniu onscroll DS1 wykonaj Query dla DS2 z warunkiem
wiążącym wybrany rekord z DS1 (a więc w DBGridzie) z rekordami dla DS2:

Parameters.Clear;
SQL.Text:='SELECT MEBLE.* FROM MEBLE, DOM WHERE DOM.iddom = :p_iddom';
Parameters.ParamByName('p_iddom'):=SQLClientDataSet1.FieldByName('iddom').As
...;
Open;

Andrzej


0 new messages