![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Добрый вечер. У меня есть база в аксессе. Таблицы: Dom, Kvart, Zilci. Подключена к делфи ч-з АДОконект. Подскажите, через какие компоненты лучше отображать данные, чтобы была возможность организовать поиск по полям из разных таблиц. Например, в Edit1 ввели "Вася". Мне нужно Чтоб отобразился только тот дом, в котором живет вася, только та квартира, в которой он живет, и из всех жильцов этой квартиры только один Вася. Или, если в эдит ввели 2-ой Донской, должны отобразиться домв с двнным адресом и все квартиры в них и все жильцы квартир.
Сейчас у меня все НЕ работает ![]() Dom --> ADOTable1 --->DataSource1 --> DBGrid1 / Kvart ---> ADOTable2 ---> DataSource2 ---> DBGrid2 / Zilci ---> ADOQuery1 ---> DataSource3 ---> DBGrid3. В DataSource Query указан DataSource2. В на в кладке Diagramm датамодуля выставлены связи. Dom - главная таблица, Kvart - зависимая. Zilci зависит от Kvart. Проблема в следующем: пишу запрос fDM.adoquery1.sql.add('Select Distinct Z.*'); fDM.adoquery1.sql.add('From Zilci as z, Kvart AS K, Dom AS D'); fDM.adoquery1.sql.add('where ((Z.FIOHost LIKE '+#39+'%'+edit1.text+'%'+#39') OR (D.GOD LIKE '+#39+'%'+edit1.text+'%'+#39') OR (D.Comment LIKE '+#39+'%'+edit1.text+'%'+#39') OR (Z.Pasport LIKE '+#39+'%'+edit1.text+'%'+#39')) AND Z.Flat=K.Flat AND Z.Address=K.Address And K.Address=D.Address'); С нижней таблицей все отлично, из всех жильцов отображается только Вася. Но, в других таблицах отображаются все дома и все квартиры. Решил проблему, заменив тейбл1 и тейбл2 на два квери и в каждый кидал одинаковый запрос, меняя только имя таблицы в селекте, но этот способ, судя по-всему не самый правильный. ![]() ![]() P.S. 1.Засунуть все таблицы в один грид не вариант - он получится километровой длины. 2.В поиске участвуют также memo поля. Последний раз редактировалось gjtrd, 29.10.2010 в 15:27. |
#2
|
||||
|
||||
![]() А ты соединил таблицы
Дом с Квартирой Квартиру с жильцами??? Нет ничего не возможного. Вопрос только во времени... |
#3
|
|||
|
|||
![]() В датамодуле, на вкладке Diagramm выставлены связи. Dom - главная таблица, Kvart - зависимая. Zilci зависит от Kvart. В аксесе связи не выставлял. Это может помочь?
|
#4
|
|||
|
|||
![]() на сколько я понимаю Вам надо построить "представление" или "вьюшку" в Аксцессе (или в самом делфи сделать объединяющий запрос) где нужно связать таблицы домов квартир и жильцов в один запрос что-то вроде
... select d.Dom_Name, k.Kvart_Name, z.Zilets from Zilets z left outer join kvart on z.kvart_id = k.kvart_Id left outer join Dom on z.Dom_id = d.Dom_Id where ... ну и даже условие с Вашими условиями "LIKE" Последний раз редактировалось birrrma, 30.10.2010 в 00:48. |
#5
|
|||
|
|||
![]() Я не силен в терминологии.
![]() |
#6
|
|||
|
|||
![]() Мм... А апать темы тут можно?
![]() |
#7
|
||||
|
||||
![]() Выложи сюда свою программу - допишу отдам...Просто может быть ты что то не правильно сделала - когда базу на аксезе создавал
Нет ничего не возможного. Вопрос только во времени... |
#8
|
|||
|
|||
![]() Не думаю, что проблема в аксесе. Напиши меил - кину прогу.
Попробую еще раз объяснить что мне нужно. Видимо получилось непонятно. ![]() 1. До применения поиска все работает отлично. При нажатии на одну из квартир показываются только ее жильцы, при нажатии на какой-нибудь дом показываются только квартиры из этого дома. То есть со связью таблиц проблем нет. 2. Начинаю делать поиск по полям Dom.God, Dom.Comment, Zilci.FIOHost, Zilci.Pasport. В Квери, к которому подключены таблица Dom и первый ДБГрид, передаю запрос. fDM.adoquery3.sql.add('Select Distinct D.*'); fDM.adoquery3.sql.add('From Zilci as z, Kvart as K, Dom AS D'); fDM.adoquery3.sql.add('where (Z.Flat=K.Flat) and (Z.Address=K.Address) and (K.Address=D.Address) and ((Z.FIOHost LIKE '+#39+'%'+edit1.text+'%'+#39') OR (D.GOD LIKE '+#39+'%'+edit1.text+'%'+#39') OR (D.Comment LIKE '+#39+'%'+edit1.text+'%'+#39') OR (Z.Pasport LIKE '+#39+'%'+edit1.text+'%'+#39'))'); В Таблице DOM ключевое поле Address В Таблице Kvart ключевые поля Address и Flat В Таблице Zilci ключевые поля Address, Flat, ID_Zilci В итоге, ввожу я в Эдит1 фамилию жильца. Этот запрос, ясное дело, выводит мне в верхнем гриде дом, в котором живет этот жилец. ПЕРВЫЙ ВОПРОС: Как сделать так, чтоб в первом гриде выводился только тот дом, в котором живет жилец, во втором гриде только та квартира, в которой живет жилец, в третьем только нужный жилец. ВТОРОЙ ВОПРОС: насколько неадекватен мой способ решения проблемы. ![]() fDM.adoquery3.active := False; fDM.adoquery1.active := False; fDM.adoquery2.active := False; fDM.adoquery3.sql.clear; fDM.adoquery1.sql.clear; fDM.adoquery2.sql.clear; fDM.adoquery3.sql.add('Select Distinct D.*'); fDM.adoquery3.sql.add('From Zilci as z, Kvart as K, Dom AS D'); fDM.adoquery3.sql.add('where (Z.Flat=K.Flat) and (Z.Address=K.Address) and (K.Address=D.Address) and ((Z.FIOHost LIKE '+#39+'%'+edit1.text+'%'+#39') OR (D.GOD LIKE '+#39+'%'+edit1.text+'%'+#39') OR (D.Comment LIKE '+#39+'%'+edit1.text+'%'+#39') OR (Z.Pasport LIKE '+#39+'%'+edit1.text+'%'+#39'))'); fDM.ADOQuery1.sql.Add('Select Distinct K.*'); fDM.adoquery1.sql.add('From Zilci as z, Kvart as K, Dom AS D'); fDM.adoquery1.sql.add('where (Z.Flat=K.Flat) and (Z.Address=K.Address) and (K.Address=D.Address) and ((Z.FIOHost LIKE '+#39+'%'+edit1.text+'%'+#39') OR (D.GOD LIKE '+#39+'%'+edit1.text+'%'+#39') OR (D.Comment LIKE '+#39+'%'+edit1.text+'%'+#39') OR (Z.Pasport LIKE '+#39+'%'+edit1.text+'%'+#39'))'); fDM.ADOQuery2.sql.Add('Select Distinct Z.*'); fDM.adoquery2.sql.add('From Zilci as z, Kvart as K, Dom AS D'); fDM.adoquery2.sql.add('where (Z.Flat=K.Flat) and (Z.Address=K.Address) and (K.Address=D.Address) and ((Z.FIOHost LIKE '+#39+'%'+edit1.text+'%'+#39') OR (D.GOD LIKE '+#39+'%'+edit1.text+'%'+#39') OR (D.Comment LIKE '+#39+'%'+edit1.text+'%'+#39') OR (Z.Pasport LIKE '+#39+'%'+edit1.text+'%'+#39'))'); fDM.adoquery2.active := true; fDM.adoquery1.active := true; fDM.adoquery3.active := true; |