Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.99/88: Рейтинг темы: голосов - 88, средняя оценка - 4.99
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 10
1

Как связать в делфи 2 таблицы через ADOquery?

26.04.2013, 13:35. Показов 15760. Ответов 30
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
я создал 2 таблицы в аксессе. в одной находятся личные данные сотрудника, а во второй данные о работе и об образовании. потом установил связь между таблицами по фамилии. теперь мне надо связать их в делфи через Adoquery. связать через adotable знаю и это удобно конечно, но мне так не надо... прочитал здесь в форуме как через Adoquery делать, но там они указывают на свойство MASTERSOURSE И MASTERFIELD. Я В инспекторе объектов ADOQUERY не нашел таких пунктов. помогите связать 2 таблицы через adoquery. Заранее спасибо!!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.04.2013, 13:35
Ответы с готовыми решениями:

Как в делфи добавить через Adoquery в таблицу вещественное число, через insert
Как в делфи добавить через Adoquery в таблицу вещественное число, через insert. При добавлении у...

Как связать две формы через ADOQuery?
я создал 4 таблицы в акссее и 2 формы. в одной форме анкета студентов (все работает) а на в второй...

Как связать 2 таблицы в делфи
Здравствуйте. Подскажите как связать таблицы в делфи. Имеем табл1 (владелец) с полями ФИО id...

Как связать таблицы через sql запрос
Добрый день, имеется, к примеру, такие таблицы со связью:...

30
969 / 644 / 97
Регистрация: 01.11.2012
Сообщений: 1,447
26.04.2013, 13:48 2
Гектор, через SQL так:
SQL
1
SELECT b1.*, b2.* FROM [ваша_таблица1] AS b1 INNER JOIN [ваша_таблица2] AS b2 ON b1.[ключевое_поле]=b2.[ключевое_поле]
1
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 10
26.04.2013, 14:31  [ТС] 3
у меня 2 adoquery. на какой из них писать этот код???
0
969 / 644 / 97
Регистрация: 01.11.2012
Сообщений: 1,447
26.04.2013, 15:02 4
Гектор, я подумал, это чуть-чуть не то. Это код объединяющий две таблицы в одну. Если вам нужно чтобы была зависимость типа MasterSource/MasterFields, то нужно использовать свойство Filter (при смене записи в главной таблице автоматически отображаются соответствующие записи в зависимой таблице).
0
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 10
26.04.2013, 15:39  [ТС] 5
опишу конкретнее свою ситуация...
у меня 2 таблицы.. связаны в аксессе через столбцы ФАМИЛИЯ... теперь мне надо связать их в делфи... через adoquery. потом на эту форму добавить BITBTN и чтоб при нажатии на него у меня открывалась форма с компонентами dbedit и BITBTN для добавления данных в эти 2 таблицы... и после добавления данных в таблицы, и чтоб при выборе одного из фамилии, у меня отображались данные связанные искючительно с этой фамилией и на второй таблице...

Добавлено через 1 минуту
спасибо за совет Waddonator) тока я чета через фильтр не очень понял как делать...
0
969 / 644 / 97
Регистрация: 01.11.2012
Сообщений: 1,447
26.04.2013, 15:51 6
1) Ключевым полем для связей таблиц рекомендовано выбирать числовое поле с уникальными значениями. Если у вас два Иванова Ивана Ивановича, то база работать не будет.
2) Для фильтрации необходимо в событии AfterScroll главной таблицы написать приблизительно такой код (Query1 - главная таблица, Query2 - подчиненная):
Delphi
1
2
3
4
5
6
7
8
procedure TForm1.ADOQuery1AfterScroll(DataSet: TDataSet);
begin
   if ADOQuery1.RecordCount>0 then begin
      ADOQuery2.Filtered:=False;
      ADOQuery2.Filrer:='<ключевое_поле_подчиненной_таблицы>='+ADOQuery1.FieldByName('<ключевое_поле_главной_таблицы>').AsInteger;
      ADOQuery2.Filtered:=True;
   end;
end;
2
0 / 0 / 0
Регистрация: 26.04.2013
Сообщений: 10
27.04.2013, 07:18  [ТС] 7
Waddonator спасибо большое!!!

щас попробую разобраться)

Добавлено через 15 часов 13 минут
у меня на 5 строке, где вводится ключевые поля, выходит ошибка... кажется чего то не хватает. filrer поменял на filter. все равно не пашет... теперь не знаю че делать.... Waddonator, подскажи что нибудь.. буду благодарен!!!

Добавлено через 3 минуты
у меня на 5 строке, где вводится ключевые поля, выходит ошибка... кажется чего то не хватает. filrer поменял на filter. все равно не пашет... теперь не знаю че делать.... Waddonator, подскажи что нибудь.. буду благодарен!!!
0
Эксперт Pascal/Delphi
4914 / 2783 / 853
Регистрация: 04.10.2012
Сообщений: 10,129
27.04.2013, 13:39 8
Гектор, ошибку компилятора выложите
0
1085 / 571 / 79
Регистрация: 07.04.2011
Сообщений: 971
Записей в блоге: 2
27.04.2013, 21:37 9
Filter есть тип string, поэтому передавать нужно соответствующие значение
Или
Delphi
1
ADOQuery2.Filrer:='<ключевое_поле_подчиненной_таблицы>='+IntToStr(ADOQuery1.FieldByName('<ключевое_поле_главной_таблицы>').AsInteger);
или
Delphi
1
ADOQuery2.Filrer:='<ключевое_поле_подчиненной_таблицы>='+ADOQuery1.FieldByName('<ключевое_поле_главной_таблицы>').AsString;
0
W
115 / 115 / 33
Регистрация: 16.04.2013
Сообщений: 750
31.10.2014, 13:38 10
Получается связь таблиц только через компоненты ADOQuery делается? А в ClientDataSet (для подчиненной) поля MasterSource, MasterFields, IndexFieldName заполнять вообще не надо?

Я думал их стыковать главную-подчиненную только через ClientDataSet можно, а ADOQuery у них однотипно настраиваются.

А то проблема в чем: если ADOQuery ставлю для подчиненной, то в случае отсутствия подчиненных записей для какой-либо записи из главной таблицы - вылазит ошибка "key violation" и программа вылетает. А если для подчиненной вместо ADOQuery поставить ADOTable - то все нормально. А мне бы хотелось все-таки ADOQuery в подчиненной, там же SQL можно менять и т.д.

Может в свойстве SQL ADOQuery подчиненной весь косяк? В этом запросе можно что-то ставить типа ORDER BY например?
0
35 / 35 / 3
Регистрация: 27.10.2014
Сообщений: 120
31.10.2014, 13:52 11
Это оригинально через фильтр связывать таблицы, а если в подчиненной таблице мульон записей?
Обычно по нормальному делают в подчиненной таблице новый SELECT по связанным полям, или уж вместо ADOQuery юзают ADODataset или ADOTable, в которых есть свойства для мастер-детайл.
0
W
115 / 115 / 33
Регистрация: 16.04.2013
Сообщений: 750
31.10.2014, 15:02 12
Ну вот и напиши как надо).
Куда этот SELECT писать? Вместо ADOQuery можно только ADOTable, но замена слабоватая получается((.
ADODataset и так есть только на клиенте.
Не знаю как если мульен, а вот если 0 записей - ошибка вылазит.
0
35 / 35 / 3
Регистрация: 27.10.2014
Сообщений: 120
31.10.2014, 15:18 13
kavasaka, ммм я вощето писал автору поста Гектор, и его советчикам... Или это ты автор перелогиненый
ClientDataSet - это вобще другая песня, а ADODataset - это тот ADOQuery, но немного "прокачаный". У него св-во CoommandText - вот туда SELECT и засовывать...
0
W
115 / 115 / 33
Регистрация: 16.04.2013
Сообщений: 750
31.10.2014, 15:27 14
Цитата Сообщение от dim07 Посмотреть сообщение
вощето писал автору поста Гектор, и его советчикам
Им уже по барабану оно думаю, с 27.04.2013 молчат)))
Цитата Сообщение от dim07 Посмотреть сообщение
Или это ты автор
нет
Цитата Сообщение от dim07 Посмотреть сообщение
ADODataset - это тот ADOQuery
Надо попробовать! Как-то я его вообще не заметил.. Т.Е. ADODataset можно подключить вместо ADOQuery?
А фильтр как они писали вообще не нужен?
0
35 / 35 / 3
Регистрация: 27.10.2014
Сообщений: 120
31.10.2014, 20:22 15
Им уже по барабану оно думаю, с 27.04.2013 молчат)))
Мда... реаниматор тем. Не смотрел на даты. На sql.ru в таких случаях появляется строка типа "прошло 2 года..."
Надо попробовать! Как-то я его вообще не заметил.. Т.Е. ADODataset можно подключить вместо ADOQuery?
можно
А фильтр как они писали вообще не нужен?
а зачем, фильтр обычно не для этого применяют.

Короче, если ADODatSet1 - главная, а ADODatSet2 - подчиненная (связь полями Код -> КодГлавнойТаблицы), то делается все на раз-два
Раз
Delphi
1
ADODatSet2.CommandText := 'Select * from table2 where КодГлавнойТаблицы = :k';
Два
Delphi
1
2
3
4
5
6
procedure TForm1.ADODatSet1AfterScroll(DataSet: TDataSet);
begin
 ADODatSet2.Close;
 ADODatSet2.Parameters[0].Value:=  DataSet['Код'];
 ADODatSet2.Open;
end;
0
W
115 / 115 / 33
Регистрация: 16.04.2013
Сообщений: 750
03.11.2014, 15:29 16
На раз-два это когда в инспекторе подчиненной указал какая для нее главная и все работает. А если код писать - это уже извращения всякие))).

Цитата Сообщение от dim07 Посмотреть сообщение
Раз
не понял куда этот код вставить, просто поставил в инспекторе этот Select... в CommandText своего аналога ADODatSet2. Так можно было?

Цитата Сообщение от dim07 Посмотреть сообщение
Два
сделал так:
Delphi
1
2
3
4
   
//  ADODatSet2.Close;
 ADODatSet2.Parameters[0].Value := ADODatSet1.FieldValues ['kod'];
  //  ADODatSet2.Open;
Close и Open пришлось закоментить - иначе программа виснет, и снимать в диспетчере задач приходится.
Все ADODatSet (и ADOQuery) у меня всегда .Active = false иначе виснет.

Вот проблема теперь - как этот Select обновлять, похоже он только 1 раз срабатывает и в подчиненной всегда данные для первого кода главной (параметр к = 1).
Может в ADODatSet еще какое свойство изменить чтобы Close и Open можно было включить?
0
35 / 35 / 3
Регистрация: 27.10.2014
Сообщений: 120
03.11.2014, 15:55 17
не понял куда этот код вставить, просто поставил в инспекторе этот Select... в CommandText своего аналога ADODatSet2. Так можно было?
Можно.
Close и Open пришлось закоментить - иначе программа виснет, и снимать в диспетчере задач приходится.
Все ADODatSet (и ADOQuery) у меня всегда .Active = false иначе виснет.
Без close и open работать не будет, поскольку набор записей в подчиненной не будет обновляться.
Не знаю что там виснет, может коннекшен неправильно настроен, вообще в дизайнере свойство Active должно нормально переключаться в тру, иначе нет смысла компилировать программу.
0
W
115 / 115 / 33
Регистрация: 16.04.2013
Сообщений: 750
03.11.2014, 16:56 18
Нет, похоже событие ADODatSet1AfterScroll (главной) не подходит! Только что понял - этот код срабатывает N раз (у меня вот <3000 записей) при открытии формы и останавливается на последнем значении кода - параметра к = 1 (у меня обратная сортировка главной), и больше не работает при перемещении по строкам главной.

А если раскоментить Close и Open то эти команды начнут выполняться 3000 раз при открытии и все - висяк.))

Добавлено через 29 минут
Или еще вероятно моя схема программы не позволит таким образом работать с ADODatSet, т.к. он на сервере, а не на клиенте.

Сервер: AdoConnection
ADODatSet (или AdoQuery или AdoTable)
DataSetProvider

Клиент:
SocketConnection
ClientDataSet
DataSource
DBGrid

Возможно надо работать с ClientDataSet или вместо него воткнуть ADODatSet... В общем завтра буду пробовать)
0
35 / 35 / 3
Регистрация: 27.10.2014
Сообщений: 120
03.11.2014, 17:12 19
Хорошо. Тогда написать ADODatSet1.AfterScroll:=NIL; в OnBeforeClose и в дизайнере его убрать (саму процедуру в коде оставить), а ADODatSet1.AfterScroll:= ADODatSet1AfterScroll в OnAfterOpen. Тогда афтескрол будет выполняться лишь при изменении курсора в ADODatSet1 действиями пользователя.
0
W
115 / 115 / 33
Регистрация: 16.04.2013
Сообщений: 750
04.11.2014, 09:31 20
Круто!) Извини, не силен в камасутре, давай сначала и помедленнее)))

Цитата Сообщение от dim07 Посмотреть сообщение
написать ADODatSet1.AfterScroll:=NIL; в OnBeforeClose
оnBeforeClose чего, какого компонента???

Цитата Сообщение от dim07 Посмотреть сообщение
и в дизайнере его убрать (саму процедуру в коде оставить)
удалить компонент ADODatSet1 так что ли? И что его код не удалится автоматом?

Цитата Сообщение от dim07 Посмотреть сообщение
ADODatSet1.AfterScroll:= ADODatSet1AfterScroll в OnAfterOpen
OnAfterOpen какого компонента???

И что за OnBeforeClose и OnAfterOpen?? Нашел только BeforeClose и AfterOpen.
0
04.11.2014, 09:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2014, 09:31
Помогаю со студенческими работами здесь

Редактирование таблицы через ADOQuery
Здравствуйте. Есть две таблицы с одинаковой структурой, отображаю их в DBGridEh с помощью ADOQuery:...

Связать две таблицы через dbedit
Если кто сталкивался, подскажите как адаптировать данный delphi код для borland c++ procedure...

Не получается связать таблицы через форму
Не получается связать таблицу призывной пункт и учет.

Связал таблицы в AdoQuery через Sql запрос, для отчета. Сам отчет делаю в FastReport
Связал таблицы в AdoQuery через Sql запрос, для отчета. Сам отчет делаю в FastReport. Но при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru