Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.05;
Скачать: CL | DM;

Вниз

Связать 2 TQuery   Найти похожие ветки 

 
Alibaba ©   (2002-07-05 16:00) [0]

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

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

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


 
Johnmen ©   (2002-07-05 16:05) [1]

В AfterScroll TQuery1 прописываешь изменение фильтра в фильтруемом TQuery2


 
Skier ©   (2002-07-05 16:16) [2]

>Alibaba
Смотри описание св-ва TQuery.DataSource в Help-e


 
Alibaba ©   (2002-07-05 16:18) [3]

2Johnmen

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

Результат в таблице:
1 Вася
2 Петя

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

TQuery2:
select Pokupka1, Pokupka2
from Table2
where Table2.CLN_ID = ??? ЧЕМУ


 
Johnmen ©   (2002-07-05 16:23) [4]

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

TQuery2:
select Pokupka1, Pokupka2
from Table2




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

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;

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

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


 
Alibaba ©   (2002-07-11 12:47) [6]

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


 
fool ©   (2002-07-11 12:54) [7]

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


 
Alibaba ©   (2002-07-11 13:01) [8]

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

На AfterScroll TQuery1 :

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


 
kaif ©   (2002-07-11 13:01) [9]

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


 
Johnmen ©   (2002-07-11 13:12) [10]

>kaif © (11.07.02 13:01)

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



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

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


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

> Alibaba

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


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

> 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;

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


 
Alibaba ©   (2002-07-11 18:49) [14]

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


 
fool ©   (2002-07-11 18:58) [15]

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


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

> 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;


 
Alibaba ©   (2002-07-11 19:02) [17]

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


 
Alibaba ©   (2002-07-11 19:04) [18]

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


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

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


 
Alibaba ©   (2002-07-11 19:28) [20]

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


 
Johnmen ©   (2002-07-12 09:46) [21]

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


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

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


 
Johnmen ©   (2002-07-15 16:29) [23]

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


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



Страницы: 1 вся ветка

Текущий архив: 2002.08.05;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.009 c
1-13609
Filat
2002-07-24 19:59
2002.08.05
Вот уж не думал, что тут не будет работать.......


6-13739
z_1
2002-05-21 21:24
2002.08.05
Помогите с UDP


1-13720
BJValentine
2002-07-24 13:46
2002.08.05
Мерцающий текст


1-13607
Filat
2002-07-24 16:22
2002.08.05
Сканирование каталогов In & Out + перемещение файлов по ф6?


8-13730
Серж Долгов
2002-03-28 21:58
2002.08.05
Вопрос про пиксели