|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Delphi + Firebird альтернатива функции Locate
Здравствуйте, направьте пожалуйста на путь истинный.
База данных FireBird есть таблица с ключевым полем. Нужно перенести курсор в dbgrid на строку с определенным id обычно выполняю это так: dtmdlMain.ibqryViewUsluga.Locate('USLUGA_ID',uslID ,[]); frmMain.dbgrdhMain.SetFocus; при таблице в среднем в 400 записей locate проводится до 3 секунд на слабой машине. (проблема в том что база быстро увеличивается, соответственно время так же). Есть ли альтернатива данному методу? delphi xe2 |
#2
|
||||
|
||||
Попробуйте Seek использовать.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
Seek для работы с бинарными файлами как я понял а не с бд
|
#4
|
|||
|
|||
Цитата:
попробуй отключать DB Aware компоненты на момент поиска - TIBQuery.DisableControls/TIBQuery.EnableControls. Хотя это сильно не должно влиять. Что-то странное, поиск в 400 записях - не самая сложная задача. 3 сек на нее - очень долго... |
#5
|
||||
|
||||
Как вариант -- перестать использовать TIBTable и написать, наконец, нормальную программу.
|
#6
|
|||
|
|||
Я не использую ibtable, для подключения к firebird base использую такие компоненты
TIBDatabase - TIBquery - TIBTransaction - TDateSource. TIBQuery.DisableControls/TIBQuery.EnableControls эффекта не дает, проблемма с медленным Locate имеет место быть, но так в интернете метода решения проблемы не нашел. Только лишь переход на FIBPlus компоненты, но переписывать всю программу сомнительный вариант. может еще кто знает как возможно в дбгриде перенести курсор на определенную запись не используя Locate? |
#7
|
||||
|
||||
Тогда, скорее всего, у TIBQuery есть какие-то события, выполняющиеся для каждой записи, они и тормозят. Попробуй для начала выполнить Locate на чистом запросе.
|
#8
|
||||
|
||||
Да, действитеьно в IB нет Seek. Как-то и не знал об этом.
Я предположу, что у вас индексы не определены, хотя даже без индекса и для 4000 записей не должно быть такой задержки. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#9
|
||||
|
||||
Цитата:
|
#10
|
|||
|
|||
Цитата:
вот сам текст запроса Код:
select clients_table.fio, clients_table.fdate, usluga_table.pdate, usluga_table.time_start, clients_table.address, usluga_table.time_end, usluga_table.target_name, status_table.fstatus, usluga_table.kolvo_uslug, usluga_table.group_usluga, usluga_table.usluga_id, usluga_table.client from usluga_table inner join status_table on (usluga_table.status_usluga = status_table.status_id) inner join clients_table on (usluga_table.client = clients_table.clients_id) where usluga_table.group_usluga = 0 order by usluga_table.pdate, usluga_table.time_start, clients_table.fio usluga_table.usluga_id это одно поле из главной таблицы, и на ibquery событий не навешано. Последний раз редактировалось Ravennt, 04.07.2013 в 11:54. |
#11
|
||||
|
||||
может всё-таки есть смысл не выводить все данные, а изначально отобрать нужные и потом бегать по Locate?
ps. а вообще перейди на компоненты FIB+ ... они пошустрее будут. ps2. и да, как подсказал lmikle: перед началом locate делать DisableControls и после него EnableControls Поживу - увижу, Доживу - узнаю, Выживу - учту. [P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
|
Этот пользователь сказал Спасибо Yurk@ за это полезное сообщение: | ||
Ravennt (04.07.2013)
|
#12
|
||||
|
||||
Locate, если мне не изменяет мой склероз, это простой перебор записей сверху вниз до тех пор пока не найдем нужную. Напиши сам такой перебор, возможно он будет работать быстрее потому как в "родном" скорее всего учитываются типы полей и т.п. из-за чего происходит замедление процесса.
Цитата:
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение: | ||
Ravennt (04.07.2013)
|
#13
|
|||
|
|||
я формирую уже конкретно таблицу с необходимыми данными для просмотра.
DisableControls и после него EnableControls -- эффекта не дает. |
#14
|
|||
|
|||
Цитата:
писал вот такое эффекта не дало Код:
//поиск по полю procedure LocateTable(w:TIBQuery; Pole:String;Znachen:Integer); begin try w.Close; w.Open; w.FetchAll; w.First; while not w.Eof do begin if w.FieldByName(''+Pole+'').AsInteger=Znachen then Exit; w.Next; end; except on E: Exception do begin Application.MessageBox(PChar(E.Message), 'Ошибка', MB_ICONERROR); w.Close; Halt; end; end; end; |
#15
|
||||
|
||||
Цитата:
Возможно, существуют какие-то профилировщики под Delphi, но пользоваться не приходилось. Тут, скорее, дело именно в вызывающем коде, а не самом компоненте TIBQuery. Покажите заодно строчку с вызовом Locate. |