Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.19;
Скачать: CL | DM;

Вниз

Не удается отфильтровать записи в связке Firebird1.0+IBX+EhLib.   Найти похожие ветки 

 
miwa ©   (2004-11-14 16:34) [0]

Делаю так:

procedure TfrmMain.btnFilterClick(Sender: TObject);
begin
 frmFilter.ShowModal;
 if frmFilter.ModalResult = mrOK then
   ApplyMyFilter;
end;

procedure TfrmMain.ApplyMyFilter;
begin
 dtmIBase.IBDataSet1.Filter:=frmFilter.ResultFilter;
 dtmIBase.IBDataSet1.Filtered:=true;
end;
{***********************}
procedure TfrmFilter.btnOKClick(Sender: TObject);
begin
 ResultFilter:=ChangeFilter;
 lblResult.Caption:=ResultFilter;
end;

function TfrmFilter.ChangeFilter:string;
begin
 Result:=cmbField.Text + cmbOperation.Text + edtValue.Text;
end;

После выполнения всего этого записи не фильтруются, хотя набор данных переоткрывается. Но все же остается неизменным.


 
Johnmen ©   (2004-11-14 16:58) [1]

Это известная фича IBX, существо которой состоит в нереализованности свойства Filter.
Поэтому пользуйся OnFilterRecord.


 
miwa ©   (2004-11-14 17:09) [2]


> Это известная фича IBX, существо которой состоит в нереализованности
> свойства

Круто. Типа, "это не баг - это фича"? Мне понравилось :о))


> Поэтому пользуйся OnFilterRecord.

Блин, а ведь когда-то на форуме уже читал об этом. Не запомнилось :о((

Это будет выглядеть примерно так?

procedure TdtmIBase.IBDataSet1FilterRecord(DataSet: TDataSet;
 var Accept: Boolean);
begin
 if DataSet.FieldByName("COUNT").AsInteger = 1
   then Accept:=true
   else Accept:=false;
end;


Спасибо.


 
Johnmen ©   (2004-11-14 17:18) [3]

Да-да, именно фича, а не баг.

>Это будет выглядеть примерно так?

Ну да. Примерно.
Accept:=DataSet.FieldByName("COUNT").AsInteger=1;


 
Fay ©   (2004-11-15 08:43) [4]

FieldByName в OnFilterRecord - это сильно! Можно ещё Sleep(0) туда поставить - тоже прикольно получится 8)


 
Johnmen ©   (2004-11-15 09:04) [5]

>Fay ©   (15.11.04 08:43) [4]
>FieldByName в OnFilterRecord - это сильно!

А что не так ?


 
Fay ©   (2004-11-15 09:08) [6]

Получить нудное поле (хоть тем же FieldByName) лучше заранее. Инвариант как-никак.


 
Johnmen ©   (2004-11-15 09:15) [7]

Не понял...


 
Fay ©   (2004-11-15 09:19) [8]

2 Johnmen ©   (15.11.04 09:15) [7]
Если ты не понял "Получить нудное поле", то имелось ввиду "нужное". А если нет... Ты же не хочешь сказать, что FieldByName выполнится 1 раз для всего НД? Или находить поле по имени для каждой записи считается круто?

P.S.
Мне иногда кажется, что я задаю вопросов больше, чем все остальные 8)


 
kostan ©   (2004-11-15 09:22) [9]

я использую фильтрацию на
уровне серверного запроса SelectSql в DataSet_е  
(так вроде быстрее - возни правда больше с запоминанием
предыдущего состояния SQL)


 
Johnmen ©   (2004-11-15 09:27) [10]

>Fay ©   (15.11.04 09:19) [8]
>Или находить поле по имени для каждой записи считается круто?

А как считается, отстойно ? Почему ? Основания.


 
Fay ©   (2004-11-15 09:34) [11]

FieldByName("const") - инвариант (не всегда, но это лечится).
Если я всё правильно понимаю, то метод выполнится на каждой записи. И каждуй раз будет идти поиск поля по имени. А в то же время Коран не запрещает сделать что-нибудь типа

Accept := IBQuery1COUNT.AsInteger = 1;


 
Johnmen ©   (2004-11-15 09:40) [12]

Ну естественно, будет идти в коллекции полей.
И что с того ? В чём твоя печаль ?


 
ЮЮ ©   (2004-11-15 09:46) [13]

Или хотя бы
 Accept:=DataSet.Fields[COUNT_IDX].AsInteger=1;

где COUNT_IDX глобальная константа, если религия не позволяет использовать persistent fields


 
Fay ©   (2004-11-15 09:47) [14]

Я, видимо, либо сплю ещё, либо просто чего-то не понимаю.
>> И что с того ? В чём твоя печаль ?
Мне пофиг - у меня такого кода не бывает.


 
Johnmen ©   (2004-11-15 09:57) [15]

>Мне пофиг

Ну это заметно, начиная с [4] :)))

>у меня такого кода не бывает.

А какой бывает ? И почему ?


 
Fay ©   (2004-11-15 10:08) [16]

2 Johnmen ©   (15.11.04 09:57) [15]
Признаюсь, мне сложно говорить в таком тоне - ощущаю себя кретином.
1) Правда ли, что OnFilterRecord выполняется "много раз"?
2) Скажите мне, plz, какие преимущества у поиска поля при каждом вызове OnFilterRecord?


 
Mike Kouzmine ©   (2004-11-15 10:12) [17]

Fay ©   (15.11.04 10:08) [16] Возможно, ты хочешь сказать, что этот способ намного медленнее, чем другие? Тогда подскажи - насколько медленнее.


 
Fay ©   (2004-11-15 10:15) [18]

Я хочу сказать, что некрасиво (IMHO) заставлять программу выполнять бессмысленные действия.


 
Johnmen ©   (2004-11-15 10:17) [19]

>Fay ©   (15.11.04 10:08) [16]
>Признаюсь, мне сложно говорить в таком тоне - ощущаю себя кретином.

Я в недоумении... Какой тон, какие кретины...:)

1. Конечно.
2. Читабельность.

см.также Mike Kouzmine ©   (15.11.04 10:12) [17]


 
Johnmen ©   (2004-11-15 10:19) [20]

>Fay ©   (15.11.04 10:15) [18]

Ну да, пусть она отдохнёт, а ты поработаешь над разборкой кода...:)


 
Fay ©   (2004-11-15 10:21) [21]

2 Johnmen ©   (15.11.04 10:17) [19]
Тон такой.
>> И что с того ? В чём твоя печаль ?

>> 2. Читабельность.
Видимо эта та самая красота, которая мир не спасает, но жертв требует.


 
Mike Kouzmine ©   (2004-11-15 10:23) [22]

Fay ©   (15.11.04 10:21) [21] "Видимо эта та самая красота, которая мир не спасает, но жертв требует."

П.. п... переведи....


 
Fay ©   (2004-11-15 10:27) [23]

2 Mike Kouzmine ©   (15.11.04 10:23) [22]
Это я о читабельности.
Мне вот совершенно не очевидно, что код с FieldByName читабельней. Скажу больше - увидев это, я первым делом полезу проверять, действительно ли такой поле будет найдено. Это и есть читабельность?


 
Johnmen ©   (2004-11-15 10:30) [24]

>Fay ©   (15.11.04 10:21) [21]

>Тон такой.
>> И что с того ? В чём твоя печаль ?

Ну не поставил смайлик :)

Вообще-то, OnFilterRecord вызывается при каждом явном или неявном обращении к записи. И в большинстве случаев именно неявно, когда необходимо отобразить запись. Так вот, время на отображение многократно превышает время на обработку данного события. Не побоюсь этого слова...:)


 
Fay ©   (2004-11-15 10:34) [25]

>> Так вот, время на отображение многократно превышает время на обработку данного события. Не побоюсь этого слова...:)
Трудно поспорить. Но поиск поля каждый раз не имеет смысла (если этот обработчик прибит к одному DataSet-у, а так обычно и бывает), и я всё ещё настаиваю на этом. 8)


 
Mike Kouzmine ©   (2004-11-15 10:37) [26]

Fay ©   (15.11.04 10:27) [23] То бишь FieldByName("MyField") менее читабельно, чем IBXMyfield или паче того IBX[0]


 
Johnmen ©   (2004-11-15 10:40) [27]

>Fay ©   (15.11.04 10:34) [25]

Во-первых, объекта поля (как ты указал IBQuery1COUNT) может вообще не существовать.
Во-вторых, если мы не "видим" поиска, а это так, то можно считать, что его просто и нет...


 
Fay ©   (2004-11-15 10:43) [28]

2 Mike Kouzmine ©   (15.11.04 10:37) [26]
>> IBX[0]
Так лучше не делать. Особенно в слечае с "select * from table1"

>> То бишь FieldByName("MyField") менее читабельно, чем IBXMyfield
Существую правила/соглашения об образовании имён переменных. И они (эти правила/соглашения) призваны повысить читаемость кода. Можно (к примеру) взять и дать переменной хорошо читаемое/распознаваемое имя.


 
Fay ©   (2004-11-15 10:46) [29]

2 Johnmen ©   (15.11.04 10:40) [27]
>> Во-первых, объекта поля (как ты указал IBQuery1COUNT) может вообще не существовать.
См. [6]
>> Во-вторых, если мы не "видим" поиска, а это так, то можно считать, что его просто и нет...
if DataSet.FieldByName("COUNT").AsInteger = 1
  then Accept:=true
  else Accept:=false;

Это мы тоже "видим" ещё хуже 8)


 
Johnmen ©   (2004-11-15 10:53) [30]

>Fay ©   (15.11.04 10:46) [29]
>См. [6]

Т.е. завести переменную и написать некоторое количество кода проще, чем обращаться FieldByname ???

>...

Дальше не понял...


 
Fay ©   (2004-11-15 10:56) [31]

Всё, ладно. Мы по-разному смотрим на вещи (во всяком случае на некоторые). Нет смысла друг-друга убеждать.


 
Johnmen ©   (2004-11-15 11:01) [32]

А я и не убеждаю. Я хочу понять твои резоны.
Пока не понял...


 
Fran   (2004-11-21 12:25) [33]

Да не пользуйтесь вы фильтром. Есть в SELECT штука WHERE.



Страницы: 1 вся ветка

Текущий архив: 2004.12.19;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.031 c
14-1101515011
Andy BitOff
2004-11-27 03:23
2004.12.19
Дорогой IE, я ухожу от тебя навсегда


1-1102081787
Aleksandr.
2004-12-03 16:49
2004.12.19
Объясните мне, тупому, что делать с DesignEditors?


3-1101121950
Aleksandr.
2004-11-22 14:12
2004.12.19
Не удается избавиться от ошибки "Не удалось найти строку..." ADO


3-1100674627
Intelligent
2004-11-17 09:57
2004.12.19
Друзья, мне бы пару слов про основы :))


1-1101980982
PURGEN
2004-12-02 12:49
2004.12.19
Tedit