Текущий архив: 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