Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Связать 2 TQuery [D6, MSSQL]


Страницы:   1 2

Alibaba ©   (2002-07-05 16:00:00) 

Всем привет!
Уважаемые Мастера, подскажите плиз.
У меня есть TQuery1, который выбирает список покупателей.
Результат я показываю в TDBGrid1 (используя TDataSource для связи)

TQuery2 в TDBGrid2 должен показывать список покупок каждого покупателя, когда мы двигаемся по таблице TDBGrid1.

Как мне связать эти два TQuery?


Johnmen   (2002-07-15 16:29:00) [1]

>AlexSV (15.07.02 16:12)
>Явное выполнение Prepare - улучшает работу.


Делает ее качественнее что ли ? :))))))))


AlexSV   (2002-07-15 16:12:00) [2]

Явное выполнение Prepare - улучшает работу.


Johnmen   (2002-07-12 09:46:00) [3]

Для тех, кто приводил строки кода, замечу, что в данном контексте совершенно излишне делать Prepare, т.к. он неявно будет сделан при Open.


Alibaba   (2002-07-11 19:28:00) [4]

Да, все работает!
Спасибо AlexSV.


fool   (2002-07-11 19:09:00) [5]

Ни строчки кода не надо(не считая текста запросов и, если надо программно, открытия запросов)!!!!


Alibaba   (2002-07-11 19:04:00) [6]

>AlexSV
Сейчас попробую...


Alibaba   (2002-07-11 19:02:00) [7]

>fool
Приведи плиз, пример.


AlexSV   (2002-07-11 19:00:00) [8]

> Alibaba

А если такая схема:
Query1 - > DataSource1 -> DBGrid1
Query2 - > DataSource2 -> DBGrid2
Query2.DataSource - > DataSource1

Р А Б О Т А :
1. Query1.Prepare;
Query1.Open;
Query2.Prepare;
Query2.Open;

и двигаемся по DBGrid1 вверх и вниз, получая при этом полное удовольствие от информации в DBGrid2 и от того, что больше ничего не надо кодировать, а тем более отслеживать моменты типа

DataSource2.DataSet:=nil;
...
DataSource2.DataSet:=Query2;


fool   (2002-07-11 18:58:00) [9]

> Alibaba
Ты "немного" усложнил идею, если твое поле CID выбирается обоими Query, то не надо таких сложностей с явным присвоением параметра, из того поля, перед которым ставиться твоеточие, автоматически будет браться новое значение после прокрутки, и параметр нужный сам сгенириться с именем поля перед которым :
И не нада Query2.Close Query2.Open


Alibaba   (2002-07-11 18:49:00) [10]

3 шаг происходит внутри процедуры AfterScroll.


Alibaba   (2002-07-11 18:47:00) [11]

> AlexSV
то тогда использование обоих TQuery идет в связке
Я просто отключаю привязку на период расчета TQuery2
а потом опять связываю :

Схема такая :
TQuery1 - > TDataSource1 -> TDBGrid1
TQuery2 - > TDataSource2 -> TDBGrid2

Р А Б О Т А :
1. TDataSource2.DataSet:=nil;
2. TQuery1.Prepare;
TQuery1.Open;
(двигаемся по таблице TDBGrid1, происходит AfterScroll)
3. TQuery2.Close;
TQuery2.ParamByName("CID").AsInteger:=TQuery1.FieldByName("CID").AsInteger;
TQuery2.Prepare;
TQuery2.Open;
TDataSource2.DataSet:=TQuery2;

Все работает замечательно!


AlexSV   (2002-07-11 15:12:00) [12]

> Alibaba

Если на AfterScroll TQuery1 вешать процедуры действий с TQuery2,
то тогда использование обоих TQuery идет в связке.
Если же использовать стандартный вариат Delphi, то в этом случае подчиненный TQuery2 будет работать когда он необходим, т.е. когда грузиться форма представления данных его использующая.
Да, собственно говоря, зачем изобретать велосипед, если есть готовое решение, проверенное разработчиком.


Alibaba   (2002-07-11 13:22:00) [13]

> Johnmen
Приведенный Вами пример хорош в данном случае.
Вот только я вместо фильтра использую параметр
TQuery2.ParamByName("CID").AsInteger:=TQuery1.FieldByName("CID").AsInteger;


Johnmen   (2002-07-11 13:12:00) [14]

>kaif © (11.07.02 13:01)

И более того, во всех моих прогах делается именно через указание DataSource для НД с параметрами !
А данный мною пример хоть и некрасив, но может, в некоторых случаях, работать быстрее...


kaif   (2002-07-11 13:01:00) [15]

AlexSV (05.07.02 18:27) прав.
А использовать AfterScroll не есть хорошо. Оно иногда до 3 раз срабатывает на ту же запись. А при открытии запроса может вообще не сработать при некоторых условиях.


Alibaba   (2002-07-11 13:01:00) [16]

Спасибо, уважаемый, fool.
Я уже решил вопрос.
И именнно так как вы говорите :

На AfterScroll TQuery1 :

TQuery2.Close;
TQuery2.ParamByName("CID").AsInteger:=TQuery1.FieldByName("CID").AsInteger;
TQuery2.Prepare;
TQuery2.Open;
end;


fool   (2002-07-11 12:54:00) [17]

Какие к черту фильтры, делай как AlexSV пишет, только не забудь в условиях Query2 что то вроде Where поле = :поле (поле ето то по которому идет связь м/у покупателем и покупкой).


Alibaba   (2002-07-11 12:47:00) [18]

Удалено модератором


AlexSV   (2002-07-05 18:27:00) [19]

Hi, Alibaba!

TQuery1:
select CLN_ID, CLN_NAME
from Table1
where (какие-то условия)

TQuery2:
select Pokupka1, Pokupka2
from Table2
where Table2.CLN_ID = :CLN_ID

Это в Object Inspector"e:

Query2.DataSource := DataSource1;

А дальше наслаждайся.

Привет с биржи.


Johnmen   (2002-07-05 16:23:00) [20]

procedure TfrmMain.Query1AfterScroll(DataSet: TDataSet);
begin
TQuery2.Filter:="CLN_ID = "+DataSet.FieldByName("CLN_ID").AsString;
end;

TQuery2:
select Pokupka1, Pokupka2
from Table2



Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо