Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

IBQuery->Locate(...)

293
02 июля 2003 года
SEDEGOFF
586 / / 06.10.2002
При 30 записях ищет прекрасно а при 8000 вешает программу (или ищет так долго) - как ускорить?
295
02 июля 2003 года
gray_k
356 / / 20.12.1999
Цитата:
Originally posted by SEDEGOFF
При 30 записях ищет прекрасно а при 8000 вешает программу (или ищет так долго) - как ускорить?


Какой запрос в Query и какой Locate? Попробуй в запросе написать select * from .... order by field1, field2...
Поля в order by - те по которым делаешь Locate.

293
02 июля 2003 года
SEDEGOFF
586 / / 06.10.2002
Цитата:
Originally posted by gray_k

Какой запрос в Query и какой Locate? Попробуй в запросе написать select * from .... order by field1, field2...
Поля в order by - те по которым делаешь Locate.



Спасибо за совет, но... по первому символу прыгнул резво а дальше как всегда

295
02 июля 2003 года
gray_k
356 / / 20.12.1999
Цитата:
Originally posted by SEDEGOFF


Спасибо за совет, но... по первому символу прыгнул резво а дальше как всегда


Покажи запрос и Locate(код)

293
02 июля 2003 года
SEDEGOFF
586 / / 06.10.2002
Запрос
select ID_TOVAR, ID_GROUP, ID_PGROUP, ID_PRODUCER, NAME, TECHE, KOEF, ID_STATUS, ID_POST, TIP,enter_nds, NP,ALTER_POST from TOWAR order by id_tovar, name, ID_GROUP, ID_PGROUP

Locate
TLocateOptions op;
op.Clear();
op<<loPartialKey;
op<<loCaseInsensitive;
if(DBGrid1->SelectedIndex == 1)
IBQuery1->Locate("NAME", Label4->Caption, op);
if(DBGrid1->SelectedIndex == 0)
IBQuery1->Locate("ID_TOVAR", Label4->Caption, op);

В Label4 Накапливается строка для поиска
295
02 июля 2003 года
gray_k
356 / / 20.12.1999
Цитата:
Originally posted by SEDEGOFF
Запрос
select ID_TOVAR, ID_GROUP, ID_PGROUP, ID_PRODUCER, NAME, TECHE, KOEF, ID_STATUS, ID_POST, TIP,enter_nds, NP,ALTER_POST from TOWAR order by id_tovar, name, ID_GROUP, ID_PGROUP

Locate
TLocateOptions op;
op.Clear();
op<<loPartialKey;
op<<loCaseInsensitive;
if(DBGrid1->SelectedIndex == 1)
IBQuery1->Locate("NAME", Label4->Caption, op);
if(DBGrid1->SelectedIndex == 0)
IBQuery1->Locate("ID_TOVAR", Label4->Caption, op);

В Label4 Накапливается строка для поиска


А в базе у тебя индексы созданы по тем полям, где ты поиск делаешь?

293
02 июля 2003 года
SEDEGOFF
586 / / 06.10.2002
Не повсем
Но вот ID_TOVAR вообще ключевое поле - так по нему ищет долще чем по NAME - которое без индекс
Я где то читал что LOCATE не пользуется индексами
295
02 июля 2003 года
gray_k
356 / / 20.12.1999
Странно. Вот у меня такой код:
TDateTime lcDate = MonthCalendar1->Date;
int lcAfsId = StrToInt(edAfsId->Text);
AnsiString lcTime = edTime->Text;
TLocateOptions Flags;
Variant Locvalues[] = {lcAfsId, lcDate, lcTime};
qu->Locate("AFS_ID;DATA;TIM",
VarArrayOf(Locvalues,2), Flags);
Работает первый раз порядка 2-х сек, потом проядка 0.5 сек. База на томже компе, где и программа. В таблице более 70 000 строк.
AFS_ID;DATA;TIM - primary key.
293
02 июля 2003 года
SEDEGOFF
586 / / 06.10.2002
Более того ID_TOVAR integer - программа долго думает и никуда не двигается
295
02 июля 2003 года
gray_k
356 / / 20.12.1999
Цитата:
Originally posted by SEDEGOFF
Более того ID_TOVAR integer - программа долго думает и никуда не двигается


Если база не секретная и не очень большая (меньше 20 метров), пришли на [email]gray_k@front.ru[/email]. Покопаюсь, когда время будет. А то даже самому интересно в чём проблема может быть.

293
03 июля 2003 года
SEDEGOFF
586 / / 06.10.2002
Спасибо за предложение но база секретная и в back up занимает больше 30 метров
Но вот что я подумал - чем отличается Locate и LoacateNext и во вторых влияет ли Количество связей таблицы на скорось поиска. Та таблица про которую ты говорил - связана с тругими таблицами или нет. Моя имеет связи с 4 таблицами - общее число строк которых 400000
295
03 июля 2003 года
gray_k
356 / / 20.12.1999
Цитата:
Originally posted by SEDEGOFF
Спасибо за предложение но база секретная и в back up занимает больше 30 метров
Но вот что я подумал - чем отличается Locate и LoacateNext и во вторых влияет ли Количество связей таблицы на скорось поиска. Та таблица про которую ты говорил - связана с тругими таблицами или нет. Моя имеет связи с 4 таблицами - общее число строк которых 400000


Locate находит ПЕРВУЮ строку в наборе данных, удовлетворяющую условию поиска, а LocateNext находит первую запись от ПОЗИЦИИ КУРСОРА в наборе данных. Моя таблица не связана с другими. А каким образом связана твоя. Если это просто выборка из нескольких таблиц, то на сам процесс поискаэто влиять не должно, а должно влиять на скорость открытия НД. Кстати может у тебя потому и медленно ищет. Ведь IBQuery сразу качает с сервера не всю выборку а только необходимую часть, отбражающуюся в контролле. А потом докачивает. Попробуй после IBQuery->Open(); сделать IBQuery->Last(); и увидишь скорость.

293
03 июля 2003 года
SEDEGOFF
586 / / 06.10.2002
Цитата:
Originally posted by gray_k

Ведь IBQuery сразу качает с сервера не всю выборку а только необходимую часть, отбражающуюся в контролле. А потом докачивает. Попробуй после IBQuery->Open(); сделать IBQuery->Last(); и увидишь скорость.


А как сделать что бы она все данные загрузила?

293
03 июля 2003 года
SEDEGOFF
586 / / 06.10.2002
IBQuery->Last() - занимает примерно 1 секунду
Может быть дело в настройках IBQuery
295
04 июля 2003 года
gray_k
356 / / 20.12.1999
Цитата:
Originally posted by SEDEGOFF
IBQuery->Last() - занимает примерно 1 секунду
Может быть дело в настройках IBQuery


Сделать чтобу грузило всё сразу нельзяю Я делаю при открытиии таблицы сначала Last() потом First(). После этого набор оказывается в памяти.
А почему у тебя медленно ищет не знаю даже. А как у тебя осуществляется связь с другими таблицами. Да и ещё можно поробовать так:
IBQuyery->DisableControls();
IBQuery->Locate(......)
IBQuery->EnableControls();
Кстати второй параметр в Locate имеет тип variant, поэтому его надо приводить к тому типу, какого типа у тебя поле поиска. Т.е. если ID_TOVAR - integer, то вместо

Цитата:
IBQuery1->Locate("ID_TOVAR", Label4->Caption, op);

надо писать
IBQuery1->Locate("ID_TOVAR", StrToInt(Label4->Caption), op);

293
04 июля 2003 года
SEDEGOFF
586 / / 06.10.2002
Цитата:
Originally posted by gray_k

А как у тебя осуществляется связь с другими таблицами.


4 лук ап поле и одно вычисляемое

293
08 июля 2003 года
SEDEGOFF
586 / / 06.10.2002
Если интересно то ускорил я поиск таким вот образом
1. Перенес запрос на DataSet
2. Все лукапы и вычисления возложил на сервак - сделал прививы
Вот теперь летает как заведенный
295
08 июля 2003 года
gray_k
356 / / 20.12.1999
Цитата:
Originally posted by SEDEGOFF
Если интересно то ускорил я поиск таким вот образом
1. Перенес запрос на DataSet
2. Все лукапы и вычисления возложил на сервак - сделал прививы
Вот теперь летает как заведенный


Я думаю второе более критично чем первое. Не проверял? Прививы - это view?

293
08 июля 2003 года
SEDEGOFF
586 / / 06.10.2002
Цитата:
Originally posted by gray_k

Я думаю второе более критично чем первое. Не проверял? Прививы - это view?


Ну да


Как пишет господин Архангельский DataSet - дословно - Обеспечивает наиболее эффективный досту к данным

Ты случаем не знаешь как Prepare влияет на скорость запроса

295
08 июля 2003 года
gray_k
356 / / 20.12.1999
Цитата:
Originally posted by SEDEGOFF

Ну да


Как пишет господин Архангельский DataSet - дословно - Обеспечивает наиболее эффективный досту к данным

Ты случаем не знаешь как Prepare влияет на скорость запроса


Влияет. Насколько ускоряет не проверял. В хелпе написано, что если ты используешь один и тот же запрос, то после Prepare запрос будет выполняться сразу, а не проверятся на корректность.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог