Współpraca 3 tablic

0

Mam 3 tablice np Miasto, Ulica, Mieszkancy. Chce wyświetlać wszystkich mieszkańców danego miasta z danej ulicy. Stworzyłem 4 tablice - Powiazanie, która przechowuje w 3 kolumnach kto gdzie mieszka. Program ma działać tak, że wskazuje się w jednym Gridzie miasto w drugim ulice a w trzecim pojawiają się odpowiednie nazwiska mieszkańców.

Chciałem zrobic to tak ale nie działa :-(

Query4.SQL.Clear;
Query4.SQL.Add('SELECT Powiazanie.nazwisko FROM Powiazanie WHERE Powiazanie.ID_miasta = :X AND Powiazanie.ID_ulicy = :Y');
Query4.ParamByName('X').AsString:=Query1.FieldByName('ID_miasta').AsString;
Query4.ParamByName('Y').AsString:=Query2.FieldByName('ID_ulicy').AsString;
Form1.Query4.Open;

0

Na początek proponowałbym uprościć zapytanie
Query4.SQL.Add('SELECT nazwisko FROM Powiazanie WHERE ID_miasta = :X AND ID_ulicy = :Y');
Nie bardzo widzę gdzie w tym wszystkim jest tabela Mieszkańcy /tabela, nie tablica/.
Stawiałbym na to że parametry są puste.

0

Tabela Powiazanie posiada 3 kolumny: Miasto, Ulica, Nazwisko. Tą tebele uzupełniłem już danymi. Tabela Mieszkańcy służy do przypisywanie nazwisk do tabeli Powiazanie. Chodzi o to, że nie portafię tylko wyświetlić danych tzn. wyślwietlić samych nazwisk dla wskazanych (w sąsiednich Gridach) Miasta i Ulicy.

0
piwik napisał(a)

Tabela Powiazanie posiada 3 kolumny: Miasto, Ulica, Nazwisko.

a w zapytaniu podajesz ID_miasta i ID_ulicy.

0

Wyraziłem się nieprecyzyjnie. Chodziło mi o to że w tabeli są trzy kolumny: jedna z danymi miasta, druga ulic, trzecia mieszkańców. Fakt, pola te noszą nazwy Id_miasta, Id_ulicy, Nazwisko.

0

Spróbuj wykonać zapytanie bez parametrów
Query4.SQL.Add('SELECT nazwisko FROM Powiazanie WHERE ID_miasta = 'id_jakiegoś_miasta' AND ID_ulicy = 'id_jakiejś_ulicy'');
jezeli się wykona tzn. że w parametrach miałeś nic lub w tabeli Powiazanie nie ma takiego miasta lub ulicy.

Kompilator wypłuwa jakieś komunikaty? Jakie są objawy nie wykonania się zapytania?

0

wersja z ograniczeniem jednego miejsca zamieszkania dla jednej osoby

Miasto 
--------
*miasto_id
nazwa
Ulica
------
*ulica_id
nazwa
Osoba
--------
*osoba_id
imie
nawisko
#miasto_id
#ulica_id
SELECT imie, nazwisko FROM osoba WHERE ulica_id = :ulica_id AND miasto_id = :miasto_id

wersja bez powyższego ograniczenia

Miasto 
--------
*miasto_id
nazwa
Ulica
------
*ulica_id
nazwa
Osoba
--------
*osoba_id
imie
nawisko
Zamieszkanie
---------------
*zamieszkanie_id
#miasto_id
#ulica_id
#osoba_id
SELECT o.imie, o.nazwisko FROM osoba o, zamieszkanie z WHERE z.osoba_id = o.osoba_id AND z.ulica_id = :ulica_id AND z.miasto_id = :miasto_id
0

Jak wpisuje to zapytanie z konkretnymi wartościami żeby sprawdzić czy działa, kompilator wyrzuca komunikat Missing operator or semicolon :-/ Czy te apostrofy to są te z "klawisza cudzysłowa"?

Misiekd chodzi właśnie o to że tu muszą być możliwe wszelkie kombinacje, także taka, w której jedna osoba ma kilka miejsc zamieszkania.

0

OK. Zastosowałem zamiast aspostrofów cudzysłowy i działa a więc jest tak jak pisałeś to parametry są puste. Pytanie dlaczego? Jak w takim razie jak je określić; jak przekazać z sąsiednich Gridów Id_ulicy i Id_miasta.

0

Parametry przypisujesz prawidłowo.
Sprawdź co jest w Query1.FieldByName('ID_miasta').AsString
Można by użyć debbugera ale... wrzuć na formę buttona i w OnClick wpisz:
ShowMessage(Query1.FieldByName('ID_miasta').AsString);

Zaznacz w DBGridzie jakieś miasto i kliknij buttona, będzie widać co prubujesz przypisać do parametru.

0
ashin napisał(a)

Misiekd chodzi właśnie o to że tu muszą być możliwe wszelkie kombinacje, także taka, w której jedna osoba ma kilka miejsc zamieszkania.
no to masz drugą wersję, gdzie osoba może mieszkać i w 100 miejscach na raz

a co do parametrów to ID są zazwyczaj typu INTEGER a nie STRING więc wypadało by je pobierać jako INTEGER i jako INTEGER też przekazywać do zapytnia. Robiąc tak jak Ty robisz

Query4.SQL.Add('SELECT Powiazanie.nazwisko FROM Powiazanie WHERE Powiazanie.ID_miasta = :X AND Powiazanie.ID_ulicy = :Y');
Query4.ParamByName('X').AsString:=Query1.FieldByName('ID_miasta').AsString;
Query4.ParamByName('Y').AsString:=Query2.FieldByName('ID_ulicy').AsString;

w rezultacie (dla ID_Miasta = 12 i ID_Ulicy = 17) dostajesz zapytanie SQL

SELECT Powiazanie.nazwisko FROM Powiazanie WHERE Powiazanie.ID_miasta = "12" AND Powiazanie.ID_ulicy = "17"

co nijak się ma do rzeczywistości i nigdy takie zapytanie (przy założeniu, że pola ID_Ulicy i ID_Miasta są typu INTEGER) nie zwróci Ci wyniku innego niż pusty

0

Ok, program działa. Problem nie tkwił w błędnym przypisywaniu paramentów ale w przypisaniu ich do złych zdarzeń. :-D
Dziękuje za pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1