Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DataSet.Locate не дружит с Filter, а надо - как быть [D7]


Страницы:   1 2 3

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;


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо