Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Delphi Access and ADO, Связать две таблицы 
:(
    Опции темы
crossmark
Дата 31.3.2011, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 28.4.2010

Репутация: нет
Всего: нет



Здравствуйте!
Пишу программу с первым применением БД.
БД Access. 
Там несколько таблиц. 
В данном случае беру две таблицы это шаблоны фраз и сама фраза.
связанны они по Id.
В приложении использовал: AdoConnection, AdoQuery, Source, 2 BDGrid
Смысл в том что поступает некая строка сообщения и ее надо проверить по таблице Frase по полю mask. 
делал вот так: 
dm.Query_Search.SQL.Clear;
dm.Query_Search.SQL.Add('SELECT Frase.Id_Frase, Frase.mask, Frase.text, Answer.answer');
dm.Query_Search.SQL.Add('FROM Frase');
dm.Query_Search.SQL.Add('WHERE mask LIKE'+' "%'+GetMask(val)+'%"');
// showmessage(dm.Query_Frase.SQL.Text);
dm.Query_Search.ExecSQL;
dm.Query_Search.Open;

этот метод работает находит или нет(если нет шаблона) выводится на таблицу DBGrid
Но столкнулся с такой проблемой.

на форме еще есть таблица DBGrid (и таблица в базе Answer) и в ней теперь должна отображаться связь (Frase and Answer по ID)
т.е. одна табличка заполняется и должна же как то вторая заполняться по этой связи.
как сделать не могу понять 
думал таким способом:
dm.QuerySearchFrase.SQL.Clear;
dm.QuerySearchFrase.SQL.Add('SELECT Answer.Id_Answ, Answer.answer');
dm.QuerySearchFrase.SQL.Add('FROM Answer');
dm.QuerySearchFrase.SQL.Add('WHERE FROM Frase INNER JOIN Answer ON Frase.Id_Frase=Answer.Id_Frase;');
// dm.QuerySearchFrase.ExecSQL;
dm.QuerySearchFrase.Open;
но выходит ошибка. 
помогите как их связать программно и запросом. Спасибо!
PM MAIL   Вверх
superVad
Дата 31.3.2011, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



Цитата(crossmark @  31.3.2011,  09:54 Найти цитируемый пост)
но выходит ошибка. 

Очень жаль, что нам ничего не известно про то, что это за ошибка и в какой строке она возникает.

Добавлено через 5 минут и 50 секунд
Цитата(crossmark @  31.3.2011,  09:54 Найти цитируемый пост)

Код

dm.Query_Search.SQL.Add('SELECT Frase.Id_Frase, Frase.mask, Frase.text, Answer.answer');
dm.Query_Search.SQL.Add('FROM Frase');
dm.Query_Search.SQL.Add('WHERE mask LIKE'+' "%'+GetMask(val)+'%"');


Не ясна связь с в запросе с таблицей Answer.

Цитата(crossmark @  31.3.2011,  09:54 Найти цитируемый пост)

Код

dm.QuerySearchFrase.SQL.Add('SELECT Answer.Id_Answ, Answer.answer');
dm.QuerySearchFrase.SQL.Add('FROM Answer');
dm.QuerySearchFrase.SQL.Add('WHERE FROM Frase INNER JOIN Answer ON Frase.Id_Frase=Answer.Id_Frase;');


Зачем в запросе делать связь с таблицей Frase если она не используется ни в селекте ни в условиях.
PM MAIL   Вверх
crossmark
Дата 31.3.2011, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 28.4.2010

Репутация: нет
Всего: нет



какая связь? в таблице Frase ключ Id_Frase в таблице Answer есть поле Id_Frase вот их и связал. таблицы в Accesse работают без нарекательств

хорошо, проще...

dm.Query_Search.SQL.Clear;
dm.Query_Search.SQL.Add('SELECT Frase.Id_Frase, Frase.mask, Frase.text, Answer.answer');
dm.Query_Search.SQL.Add('FROM Frase');
dm.Query_Search.SQL.Add('WHERE mask LIKE'+' "%'+GetMask(val)+'%"');
// showmessage(dm.Query_Frase.SQL.Text);
dm.Query_Search.ExecSQL;
dm.Query_Search.Open;

этим кодом нахожу поиск по шаблону и вывожу инфу в таблицу DBGrid1 из БД таблицы Frase

но таблица Frase связана с таблицей Answer и если есть инфа в Frase значит есть информация в таблице Answer  и есть у меня DBGrid2
вот как в DBGrid 2 вывести эту связь-информацию на основании Frase


PM MAIL   Вверх
superVad
Дата 31.3.2011, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



Пользуйся кнопкой код для оформления кода!


Цитата(crossmark @  31.3.2011,  13:25 Найти цитируемый пост)
какая связь? в таблице Frase ключ Id_Frase в таблице Answer есть поле Id_Frase вот их и связал.


Где же они связаны в запросе?
Цитата(crossmark @  31.3.2011,  13:25 Найти цитируемый пост)

Код

dm.Query_Search.SQL.Add('SELECT Frase.Id_Frase, Frase.mask, Frase.text, Answer.answer');
dm.Query_Search.SQL.Add('FROM Frase');
dm.Query_Search.SQL.Add('WHERE mask LIKE'+' "%'+GetMask(val)+'%"');


Для связи надо во втором запросе добавить условие с параметром. Параметру дать такое же имя как называется поле в первом запросе. В поле DataSource компонента QuerySearchFrase указать датасорс Query_Search.
PM MAIL   Вверх
crossmark
Дата 31.3.2011, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 28.4.2010

Репутация: нет
Всего: нет



Цитата
 "Для связи надо во втором запросе добавить условие с параметром" 


я и сам догадываюсь, что надо связь написать, собственно я об этом и спрашиваю.
иначе, если я это мог реализовать, и не создавал эту тему. 
я понимаю, что там одно к другому не пришей. но я написал свою начальную мысль. есть конечно написать два цикла по таблицам.... но это тупая глупость (хотя осуществима) это и долго и не оптимизировано.

я же и хочу узнать. я догадываюсь, что можно и на SQL как-то вложено написать. только как. ведь это первая моя программа с применением БД.
и чувствую что там нет ничего сложно, но ведь не все же с первого раза в асы.
PM MAIL   Вверх
Antimol
Дата 1.4.2011, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 28.7.2007
Где: Украина, Киев

Репутация: 4
Всего: 4



Для выбора в первый DBGrid1: (связь ADOConnection1 ->ADOQuery1->DataSource1->DBGrid1)
Код

ADOQuery1.SQL.Text:='SELECT Frase.Id_Frase, Frase.mask, Frase.text, Answer.answer FROM Frase WHERE Frase.Id_Frase = Answer.Id_Frase'+
' AND mask LIKE :mask';
ADOQuery1.Parameters.ParamByName('mask').Value:= '%'+GetMask(val)+'%';
ADOQuery1.Open;
// это в том случае если у нас есть данные как в первой так и во второй таблице, если нужно другие варианты - используй JOIN в запросе

Для выбора во второй DBGrid2: (связь ADOConnection1 ->ADOQuery2->DataSource2->DBGrid2)
У нас для вывода в первый DbGrid1 существует связь ADOConnection1 ->ADOQuery1->DataSource1->DBGrid1. Для дальнейшей обработки, мы пишем код на событие onDataChange в компонента DataSource1 или на событие AfterScroll компонента ADOQuery1.

Код

ADOQuery2.SQL.Text:='SELECT * FROM Answer WHERE Answer.Id_Frase = :Id_Frase';
ADOQuery2.Parameters.ParamByName('Id_Frase').Value:= AQuery1.Fiels.Field[0].Value;
ADOQuery2.Open;


Код писал в слепую - могут быть ошибки, но принцип думаю ясен. Когда осуществляется выбор в первом DBGrid1 - данные подгружаются во второй. 
Кстати AQuery1.Fiels.Field[0].Value  - берется id_Frase выбранной записи в первой табличке.

Ну забываем о благодарностях в виде повышения/понижения репутации. smile 

Спасибо superVad - ошибку исправил

Это сообщение отредактировал(а) Antimol - 2.4.2011, 13:24
--------------------
Лучшее спасибо это "+" к репутации.   Мой блог: ИНФОРМАТИЗАЦИЯ, и mirsovetov.net. Написание программ, исправление ошибок, статьи....
PM MAIL WWW ICQ   Вверх
superVad
Дата 1.4.2011, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



Antimol, у тебя в первом запросе 2 раза WHERE, там and наверное надо. Кстати вот и связь с Answer smile
Мне кажется, что если полю датасорс  ADOQuery2 присвоить DataSource1 то будет работать и без события onDataChange.
PM MAIL   Вверх
crossmark
Дата 2.4.2011, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 28.4.2010

Репутация: нет
Всего: нет



хорошо попробую разобраться потом отпишусь
PM MAIL   Вверх
Akella
Дата 2.4.2011, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



оформляй код с помощью кнопки КОД
PM MAIL   Вверх
crossmark
Дата 3.4.2011, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 28.4.2010

Репутация: нет
Всего: нет



Antimol спасибо!

все получилось! большое спасибо!
PM MAIL   Вверх
Looose91
Дата 4.4.2011, 06:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 13.3.2011

Репутация: нет
Всего: нет



Лююююди!Здрасте! помогите! мне надо сделать БД на Делфи + связать с ACCESS тоисть на оборот! пробую связать через ADO чет не получается! p.s Я не такой знаток программирования но учусь! помогите с этим!

PM MAIL   Вверх
Akella
Дата 4.4.2011, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Сколько?
PM MAIL   Вверх
Antimol
Дата 4.4.2011, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 28.7.2007
Где: Украина, Киев

Репутация: 4
Всего: 4



Пожалуйста.  smile  
--------------------
Лучшее спасибо это "+" к репутации.   Мой блог: ИНФОРМАТИЗАЦИЯ, и mirsovetov.net. Написание программ, исправление ошибок, статьи....
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1390 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.