Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.08.05;
Скачать: [xml.tar.bz2];

Вниз

Связать 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.005 c
3-13550
studentik
2002-07-09 20:18
2002.08.05
Как перенести прогу, работающую с БД InterBase на


14-13777
Александр
2002-07-09 14:09
2002.08.05
Флайт Симулятор от Майкрософт


14-13786
Вася______
2002-07-10 13:14
2002.08.05
База данных


3-13532
Tenger
2002-07-14 09:32
2002.08.05
РАЗДЕЛИТЕЛЬ ОПЕРАТОРОВ В SQL


6-13746
undersun
2002-05-23 18:02
2002.08.05
Кто-нибудб помогите





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский