Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Delphi Access and ADO


Автор: crossmark 31.3.2011, 10:54
Здравствуйте!
Пишу программу с первым применением БД.
БД 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;
но выходит ошибка. 
помогите как их связать программно и запросом. Спасибо!

Автор: superVad 31.3.2011, 14:05
Цитата(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 если она не используется ни в селекте ни в условиях.

Автор: crossmark 31.3.2011, 14:25
какая связь? в таблице 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


Автор: superVad 31.3.2011, 14:43
Пользуйся кнопкой код для оформления кода!


Цитата(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.

Автор: crossmark 31.3.2011, 21:06
Цитата
 "Для связи надо во втором запросе добавить условие с параметром" 


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

я же и хочу узнать. я догадываюсь, что можно и на SQL как-то вложено написать. только как. ведь это первая моя программа с применением БД.
и чувствую что там нет ничего сложно, но ведь не все же с первого раза в асы.

Автор: Antimol 1.4.2011, 13:50
Для выбора в первый 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 - ошибку исправил

Автор: superVad 1.4.2011, 21:37
Antimol, у тебя в первом запросе 2 раза WHERE, там and наверное надо. Кстати вот и связь с Answer smile
Мне кажется, что если полю датасорс  ADOQuery2 присвоить DataSource1 то будет работать и без события onDataChange.

Автор: crossmark 2.4.2011, 14:04
хорошо попробую разобраться потом отпишусь

Автор: Akella 2.4.2011, 19:48
оформляй код с помощью кнопки КОД

Автор: crossmark 3.4.2011, 13:54
Antimol спасибо!

все получилось! большое спасибо!

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

Автор: Akella 4.4.2011, 09:10
Сколько?

Автор: Antimol 4.4.2011, 09:19
Пожалуйста.  smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)