![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Locate в отфильтрованных данных
Лёша © (2009-04-29 10:10:00)Набор данных в TADOTable.
В начальном наборе запись присутствует. Locate её находит.
В отфильтрованном наборе запись отсутствует. Locate выдает эксепшин: "Record not found".
Анализ метода TCustomADODataSet.Locate показывает, что LocateRecord выполняется без учета фильтра, а потом вызывается Resync - там и ошибка.
Филитрую через OnFilterRecord.
Что делать, чтобы Locate выдавал False, а не raise?
Сергей М. (2009-04-29 12:06:00) [41]
> Лёша (29.04.09 11:56) [12]
Ну так и это не единственное решение !
Ведь и Locate и Resync - виртуальные методы, ничто не мешает в своем наследнике перекрыть тот или иной с целью изменения дифолтного их поведения у предка
Лёша (2009-04-29 11:56:00) [42]Сергей М. © (29.04.09 11:43) [11]
Я про это и написал.
Вместо того, чтобы открывать философскую дисскусию по дао справки, отсойности ADO, правильного значения слова "фильтр, можно было просто ответить:
Лёша (29.04.09 11:13) [7]
Сергей М. (2009-04-29 11:43:00) [43]
> Лёша
А что, настолько проблематично заключить локейт в try..exept для контроля над такой ситуацией ?
Лёша (2009-04-29 11:28:00) [44]После смены пользователем критериев отображаемых данных (фильтрации в обечеловеческом понимании, а не для DataSet). Курсор на записи должен остаться, если запись после фильтрации осталась. Или переместиться на первую. Что тут глупого?
Anatoly Podgoretsky (2009-04-29 11:20:00) [45]
> что Locate в ADO не учитывает OnFilterRecord
Никто не учитывает, видимо ты плохо представляешь принципы работы OnFilterRecord и то что это не фильтр, Locate с фильтрованым набором работает правильно.
Anatoly Podgoretsky (2009-04-29 11:18:00) [46]Глупо совместно применять OnFilterRecord (и не называй это фильтром) и Locate одновременно, для перемещения на запись которая не должна быть показа.
Лёша (2009-04-29 11:13:00) [47]ADO досталось в наследство - выкинуть не могу. Фильтрую только локальные данные.
Можно было просто ответить, что Locate в ADO не учитывает OnFilterRecord, и его вызов надо душить в try exeption.
sniknik (2009-04-29 10:55:00) [48]вот тут про разницу в подходах писал, почитай.
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1240848334&n=1
sniknik (2009-04-29 10:54:00) [49]> Проблеме в том, что св-во Filter использовать не могу.
фильтр вообще для отбора записей нежелательно использовать... он только для локального отбора в уже полученном рекордсете, но ни в коем случае не для данных из базы.
sniknik (2009-04-29 10:50:00) [50]> И что? Я знаю, что по справке все должно работать.
неправильно. не "все должно работать" а "все работает как должно (ударение на последний слог)".
т.е. все что происходит у тебя есть правильно, если не устраивает меняй методы.
(вот сколько раз повторять не использовать TADOTable ?)
> Я же прошу найти, где лыжи не едут.
это искать не надо, они всегда не едут в программе. программы в вопросах меняются а местоположение глюков неизменно...
Лёша (2009-04-29 10:48:00) [51]Если вместо OnFilterRecord использовать св-во Filter, все работает:
LocateRecord возвращает False.
Проблеме в том, что св-во Filter использовать не могу. У меня фильтрация с использованием внешних данных.
Лёша (2009-04-29 10:37:00) [52]Anatoly Podgoretsky © (29.04.09 10:17) [1]
И что? Я знаю, что по справке все должно работать.
Я же прошу найти, где лыжи не едут.
Anatoly Podgoretsky (2009-04-29 10:17:00) [53]> Лёша (29.04.2009 10:10:00) [0]
Справка говорит
> Locate returns true if it finds a matching row, and makes that row the current one. Otherwise Locate returns false.