![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DataSet.Locate не дружит с Filter, а надо - как быть [D7]
Silver... © (2006-07-15 21:55:00)Очень надо чтоб
DataSet.Locate искал только в записях отвечающих условию DataSet.Filter
например если DataSet содержит
ID Name
---------
1 Name1
2 Name2
3 Name3
4 Name1
5 Name3
после фильтрации остается
ID Name
---------
4 Name1
5 Name3
DataSet.Locate('Name', 'Name1', [loCaseInsensitive, loPartialKey])
находит ID = 1а надо ID = 4
что делать?
Johnmen (2006-07-27 10:29:00) [1]>sniknik © (26.07.06 18:18) [43]
>Johnmen тебе то это просто посмотреть надо, сразу понятно...
Да, мне сразу понятно, что находит даже в отфильтрованном. Что и подтверждается быстро накиданным мною примерчиком...
Так что
> Должна находить. Даже в отфильтрованном.
> Ошибка закомуфлирована. Она не здесь...
По-прежнему актуально.
Silver... (2006-07-26 21:14:00) [2]
> в ADO на locate свет клином не сошолся.
согласен тока веди в DBGridEh Locate-ом рялизованно теперь мне либо там либо сям менять надо. а вообше разработчикам совет бы переслать вшить в генофонд типа[loFullDataSet/loFilteredDataSet]- было бы красивше
Silver... (2006-07-26 21:09:00) [3]
> в ADO на locate свет клином не сошолся.
согласен тока веди в DBGridEh Locate-ом рялизованно теперь мне либо там либо сям менять надо. а вообше разработчикам совет бы переслать вшить в генофонд[loFullDataSet]- было бы красивше
Anatoly Podgoretsky (2006-07-26 20:37:00) [4]StriderMan © (26.07.06 14:14) [22]
Это не фильтр, а новый запрос к серверу.
sniknik (2006-07-26 20:29:00) [5]> но не могу понять кто именно разработчикам VCL сказал убирать фильтр перед поиском
это не убирание, это скорее гарантия, однотипного поведения (чтоб предыдущие поиски не наложились...) а изначально там и так пусто, неважно есть у тебя фильтр или нет.
и поведения вероятно специально запрограммированого... логика скорее всего такая - locate должен показывать есть ли искомая запись в рекордсете, и ведь показывает же! а от установки фильтра физически данные из рекордсета не исчазают... просто фильтруется вывод на показ. и что теперь должен искать locate? толко среди выводимых на показ? но ведь locate это метод рекордсета (который неизменился) а не какогото дополнительного обьекта "отфильтрованные для отображения записи".
т.е. с этой точки зрения все правильно (хотя х.з. что там на самом деле в головах разработчикой присходило...)
есть и другое соображение, если сделать "по Silver-овски" то потеряем возможность поиска вне фильтра (узнать есть ли вообще запись) при установленном, а вот если так как есть то желаемый поик только в отфильтрованном легко осуществить и другими методами... в ADO на locate свет клином не сошолся.
> Теперь чего генофонд править?
ну попробуй. ;)
но вообще, советы, что делать, тоже в [14] были. + упоминавшийся поиск другими методами, да и locate поправить элементарно главное не в генофонде, а к себе модуль скопировать.
Silver... (2006-07-26 18:36:00) [6]смотрю и вижу...
FLookupCursor.Filter := '';
одно не могу понять кто именно разработчикам VCL сказал убирать фильтр перед поиском или мож проблемы дает?
Теперь чего генофонд править?
sniknik (2006-07-26 18:18:00) [7]Johnmen © (26.07.06 17:35) [42]
> Должна находить. Даже в отфильтрованном.
> Ошибка закомуфлирована. Она не здесь...
она и находит, даже в отфильтрованном...
интересно долго еще будет рассусоливание одного и тогоже?... когда ктонибудь реализацию ADODB.LocateRecord посмотрит? еще в [14] предлагал... элементарно ведь.
Johnmen тебе то это просто посмотреть надо, сразу понятно...
Johnmen (2006-07-26 17:35:00) [8]
> понятное дело не находит и курсор остается на первой записи
Должна находить. Даже в отфильтрованном.
Ошибка закомуфлирована. Она не здесь...
Silver... (2006-07-26 16:40:00) [9]интересно чего не понятного
Тест - тот что я сделал отдельно в [12]
вот объясните ...
ADODataSet1...
ID A
--------
1 aaa
2 bbb
3 ccc
4 aaa
5 bbb
фильтрируем:
ADODataSet1.Filter := 'ID > 3';
ADODataSet.Filtered := True;
получаем:
ADODataSet1...
ID A
--------
4 aaa
5 bbb
ишем:
ADODataSet1.Locate('A', 'BB', [loCaseInsensitive, loPartialKey]);
ShowMessage('ID = ' + VarToStr(ADODataSet1.FieldByName('ID').Value));
понятное дело не находит и курсор остается на первой записи
как получить ID = 5--- не даст ведь :( в этом то и вся проблемма
Johnmen (2006-07-26 16:25:00) [10][39]
> из теста видно что Locate ищет во всем DataSet-е -- а не
> должен.
[15]
> у меня на строчке if... ошибку выдает до"нашел" / "не нашел" и не доходит
Как Вас понимать, сэр?
Silver... (2006-07-26 16:19:00) [11][16] - уже пробовал - Не работает
Да я думаю Lookup тут вовсе не причем, из теста видно что Locate ищет во всем DataSet-е -- а не должен. Мне бы какимто образом (локально не WHERE) ограничить его поиск тока на не отфильтрированые записи.
Как?
PS. я б сказал что это баг в функции: С чего бы вдруг искать в данных вне поля зрения (на крайняк параметр бы сунули типа[loFullDataSet])
StriderMan (2006-07-26 16:15:00) [12]
> Правильно.
как правильно? есть стандарт фильтрации наборов данных?
Johnmen (2006-07-26 15:55:00) [13]
> Desdechado © (26.07.06 15:40) [36]
Пусть так.
Desdechado (2006-07-26 15:40:00) [14]> 2. Комментарий означает, что данные фичи НЕ ЛОКАЛИЗОВАНЫ,
> т.е. не имеют локальной реализации для набора данных.
Выдаешь желаемое за действительное :)
Комментарий означает всего лишь то, что текстовая строка ' where 'не является ресурсом, требующим перевода на другие языки при попытках локализации (перевода).
Johnmen (2006-07-26 15:29:00) [15]> что значит локальная реализация?
Это значит для данных, которые уже на клиенте, локально.
> IBTable и есть набор данных.
И что?
> Это не абстрактный класс.
Про абстрактный класс я ничего не говорил.
> а что нужно от нормальной фильтрации?
Чтобы она работала.
>как она должна работать?
Правильно.
Sergey13 (2006-07-26 15:25:00) [16]2 [32] StriderMan © (26.07.06 15:20)
> а что нужно от нормальной фильтрации? как она должна работать?
На клиенте наверное. Без обращения к серверу.
Johnmen (2006-07-26 15:23:00) [17]
> sniknik © (26.07.06 14:53) [30]
Кстати, надо смотреть SetFilterText, который переопределён для TIBTable а тянется от предпредка - TDataSet.
StriderMan (2006-07-26 15:20:00) [18]
> НЕ ЛОКАЛИЗОВАНЫ, т.е. не имеют локальной реализации для
> набора данных
что значит локальная реализация? IBTable и есть набор данных. Это не абстрактный класс.
> то эта якобы фильтрация есть простое изменение текста запроса
> с повторным выполнением.
а что нужно от нормальнойфильтрации? как она должна работать?
Johnmen (2006-07-26 15:13:00) [19]1. Вот именно! Происходит переоткрытие НД с изменением в запросе параметров WHERE. Причём тут ФИЛЬТРАЦИЯ (набора данных)????????
2. Комментарий означает, что данные фичи НЕ ЛОКАЛИЗОВАНЫ, т.е. не имеют локальной реализации для набора данных.
А коли так, то эта якобы фильтрация есть простое изменение текста запроса с повторным выполнением.
sniknik (2006-07-26 14:53:00) [20]Johnmen © (26.07.06 14:30) [26]
> 1. Обращаю Ваше внимание на то, где у Вас стоИт Open. ...
неважно, судя по исходникам (D7)
procedure TIBDataSet.SetFiltered(Value: Boolean);
begin
if (Filtered <> Value) then
begin
inherited SetFiltered(value);
if Active then
begin
Close;
Open;
end;
end
else
inherited SetFiltered(value);
end;