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

Вниз

Что лучше , filter или locate ?   Найти похожие ветки 

 
Grey   (2003-03-14 11:29) [0]

Сначала использовал в запросах locate для выбора нужной записи, но ввиду больших тормозов перешёл на фильтр , тормоза исчезли, но приятель говорит , что использование фильтров не есть хорошо, потому что на слабых машинах будет жутко тормозить, т.к. якобы фильтр проходит все записи и проверяет на удовлетворению условий причем все это на стороне клиента, чем больше записей и медленней комп тем хуже.
Рассудите нас пожалуйста, Мастера.


 
Anatoly Podgoretsky ©   (2003-03-14 11:35) [1]

Ты путаешь апельчины с ананасами
Первое это поиск, а второе фильтрация и они никак не связаны по функциональности.
И то и другое проходит по записям, и то и другое делается на клиенте, и то и другое может тормозить, и то и другое зависит от скорости компьютера, количества памяти.
Для выбора нужной записи надо использовать Select * from table where условие, вот это будет делаться на сервере и будет работать быстро.

Вам обоим в книжный магазин за книгами, только потом включать компьютер. :-)


 
Grey   (2003-03-14 11:51) [2]

>Anatoly Podgoretsky

Знаю я что locate это поиск, а filter фильтрация и они никак не связаны по функциональности, главное - что результат получается одинаковый , что с filter , что с locate.

Думаю, что Select * from table where условие тоже будет тормозить , т.к. это используется в OnCalcFields и если постоянно открывать/закрывать запрос, то будет ещё тормознее.

Попутный вопрос:
Правда, что чтобы получить запись , используя фильтр, нужно все записи просмотреть, а lоcate бежит по индексу до нужной (т.е. как бы быстрее) ?

Кстати ошибся в наборе БД, БД - не MySQL, а MSSQL.


 
Anatoly Podgoretsky ©   (2003-03-14 12:00) [3]

Результат никак не может получаться одинаковым, абсолютно никак.
Настоятельно советую в магизин.
Неправда в общем, но может быть правда для MySQL
Опять фильтрация и перемещение курсора абсолютно ортогональные вещи как по внешнему результату так и назначению.
Lоcate можешь применить к перемещению курсора на отфильтрованной таблице, обратное дикий абсурд.

MSSQL - одназначно SELECT WHERE в ответ одну и только одну запись, ту которую ты бы указал в Lоcate

Применять навигационные методы к реляционным данным, как кто то сказал, это даже не прошлый век, а каменный.

Вам обоим не хватает знания теории.


 
zacho ©   (2003-03-14 12:01) [4]


> Попутный вопрос:
> Правда, что чтобы получить запись , используя фильтр, нужно
> все записи просмотреть, а lоcate бежит по индексу до нужной
> (т.е. как бы быстрее)

В клиет-серверных СУБД на клиенте ни каких индексов нет ! Соответственно, и Locate работает простым перебором всех записей.

> т.к. это используется в OnCalcFields

Что-то не в порядке у тебя с постановкой задачи. Может тебе нужно тривиальное Master-Detail ?


 
NickBat ©   (2003-03-14 12:04) [5]

> Anatoly Podgoretsky © (14.03.03 12:00)
> Применять навигационные методы к реляционным данным, как кто то сказал, это даже не прошлый век, а каменный.

Зачем же так категорично? Иногда пользователю гораздо быстрее получить набор данных из 10 записей и потом бегать по ним на своей машине, чем каждый раз заново посылать серверу запрос на выборку ТОЛЬКО одной записи.


 
NetKnight ©   (2003-03-14 12:10) [6]

Во-первых это разные вещи,
Во-вторых locate - это и есть select <field> from <table> where <condition>
В третьих locate не использует индексы.
В третьих locate - вещь унивирсальная и работает на любой БД (в отличии от FindKey, который использует индексы)

Если интересно, могу кинуть универсальный компонент для поиска в базе слеланый на основе TEdit и использующий самый быстрый метод в зависимоти от БД.


 
Anatoly Podgoretsky ©   (2003-03-14 12:22) [7]

Если надо получить набор, да пожаулйста, затем по нему можно локально бегать
Первое это фильтр (ограничение выборки), для клиент серверных через Where ...
Второе это перемещение по локальному курсору

NetKnight © (14.03.03 12:10)
Кроме во-первых остальное неверно
Во-вторых locate это никак не то, что ты написал, а перемещение по локальному набору.

В третьих locate использует индексы, если они доступны.


 
Grey   (2003-03-14 12:28) [8]

> zacho ©
Master-Detail не подходит, т.к. OnCalc используется в lookup полях , при изменении поля сразу должен быть виден результат в другом поле

>Anatoly Podgoretsky ©
да знаю я что делает filter и locate
конечно результат в общем не одинаковый , но фильтром я выделяю 1 запись , также как и locate выделяет одну.

Попробую конечно SELECT WHERE , но не думаю, что быстрее будет, надо же на каждую запись будет обращаться к серверу за данными (открывать / закрывать запрос).



 
zacho ©   (2003-03-14 12:33) [9]


> OnCalc используется в lookup полях

Покажи код этого OnCalc. А то я не понял, что оно делает и зачем это нужно.


 
NetKnight ©   (2003-03-14 12:42) [10]

--> Anatoly Podgoretsky
Согласен насчёт во-вторых, что-то я наоборот про фильтрацию написал..
И индексы тоже использует... Только что код просмотрел...
Пора врачам сдаваться.. :)


 
Grey   (2003-03-14 12:43) [11]

>zacho ©
Вот код :

procedure TMainForm.InputQueryCalcFields(DataSet: TDataSet);
begin
wh_01_Order_filter.Filter:="OrgCode="+QuotedStr(InputQuerywh_01_Order_complex_key.Value);
wh_01_Order_filter.Filtered := true;
InputQueryCustomer_name.Value:=wh_01_Order_filterdcCustomer_name.Value;
InputQueryAddress.Value:=wh_01_Order_filterdcCustomerAddress_Address.Value;
InputQueryContract.Value:=wh_01_Order_filterdcContract_description.Value;

if (not InputQuerywh_01_Order_whGood_ID.IsNull
AND not InputQuerywh_01_Order_whPriceList_ID.IsNull) then
begin
whGoodPrice_filter.Filter:="whGoodPrice_whGood_ID="+InputQuerywh_01_Order_whGood_ID.AsString+ " AND "+
"whGoodPrice_whPriceList_ID="+InputQuerywh_01_Order_whPriceList_ID.AsString;
whGoodPrice_filter.Filtered := true;
InputQueryprice.Value :=whGoodPrice_filterwhGoodPrice_result_price.Value;
end;
InputQuerytotal.Value :=InputQueryprice.Value * InputQuerywh_01_Order_quantity.Value;
if not InputQuerywh_01_Order_whGood_ID.isNull then
begin
whGood_filter.Filter:="whGood_ID="+InputQuerywh_01_Order_whGood_ID.AsString;
whGood_filter.Filtered :=true;
InputQueryGood_name.Value := whGood_filterwhGood_name.Value;
InputQuerytotal_with_NDS.Value := InputQuerytotal.Value + InputQuerytotal.Value*0.01*whGood_filterwhGood_NDS_rate.Value;
InputQueryNDS_rate.Value := whGood_filterwhGood_NDS_rate.Value;
InputQueryweight.Value := whGood_filterwhGood_gross_weight.Value*InputQuerywh_01_Order_quantity.Value;
end
end;



 
zacho ©   (2003-03-14 12:48) [12]

Детально в твой код пока не вникал, но у меня сложилось впечатление, что тебе нужны тривиальные lookup поля вместо calculated или join в запросе. И не придется извращаться с locate или фильтром


 
Grey   (2003-03-14 12:53) [13]

>zacho ©
join не подойдёт, т.к. он выводит уже введённую запись. а мне надо на этапе редактирования


 
zacho ©   (2003-03-14 12:59) [14]


> а мне надо на этапе редактирования

Не совсем понял эту фразу. Напиши конкретней, как тебе надо что бы работало. А чем lookup поля не устраивают ?


 
Grey   (2003-03-14 13:13) [15]

>zacho ©

Не совсем понял эту фразу. Напиши конкретней, как тебе надо что бы работало.



ввожу новую запись , используя lookup поля , когда изменяю данные в lookup поле , перемещаясь по lookupdataset, в другом поле данные должны сразу же изменяться , до сохранения записи,т.е. ввводим в одной колонке в гриде из выпадающего списка 1 , должно подставлять в другую колонку "номер1" из таблицы соответствия
1 "номер 1"
2 "номер 2"
.........



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

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

Наверх




Память: 0.51 MB
Время: 0.019 c
3-6292
Silver_
2003-03-05 10:18
2003.04.03
Посоветуйте решение


14-6766
Leon Crom
2003-03-17 12:50
2003.04.03
а вот интересно какой антоним к слову Accept


14-6670
Ihor Osov'yak
2003-03-17 11:52
2003.04.03
Прошу не принять за провокацию...


14-6689
Ш-К
2003-03-18 20:50
2003.04.03
Синхронизация времени.


1-6481
LyzD
2003-03-24 11:38
2003.04.03
Свернуть программу после запуска