Текущий архив: 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.49 MB
Время: 0.007 c