![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не удается отфильтровать записи в связке Firebird1.0+IBX+EhLib. [D7]
miwa © (2004-11-14 16:34:00)Делаю так:
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;
После выполнения всего этого записи не фильтруются, хотя набор данных переоткрывается. Но все же остается неизменным.
ЮЮ (2004-11-15 09:46:00) [21]Или хотя бы
Accept:=DataSet.Fields[COUNT_IDX].AsInteger=1;
где COUNT_IDX глобальная константа, если религия не позволяет использовать persistent fields
Johnmen (2004-11-15 09:40:00) [22]Ну естественно, будет идти в коллекции полей.
И что с того ? В чём твоя печаль ?
Fay (2004-11-15 09:34:00) [23]FieldByName('const') - инвариант (не всегда, но это лечится).
Если я всё правильно понимаю, то метод выполнится на каждой записи. И каждуй раз будет идти поиск поля по имени. А в то же время Коран не запрещает сделать что-нибудь типа
Accept := IBQuery1COUNT.AsInteger = 1;
Johnmen (2004-11-15 09:27:00) [24]>Fay © (15.11.04 09:19) [8]
>Или находить поле по имени для каждой записи считается круто?
А как считается, отстойно ? Почему ? Основания.
kostan (2004-11-15 09:22:00) [25]я использую фильтрацию на
уровне серверного запроса SelectSql в DataSet_е
(так вроде быстрее - возни правда больше с запоминанием
предыдущего состояния SQL)
Fay (2004-11-15 09:19:00) [26]2 Johnmen © (15.11.04 09:15) [7]
Если ты не понял "Получить нудное поле", то имелось ввиду "нужное". А если нет... Ты же не хочешь сказать, что FieldByName выполнится 1 раз для всего НД? Или находить поле по имени для каждой записи считается круто?
P.S.
Мне иногда кажется, что я задаю вопросов больше, чем все остальные 8)
Johnmen (2004-11-15 09:15:00) [27]Не понял...
Fay (2004-11-15 09:08:00) [28]Получить нудное поле (хоть тем же FieldByName) лучше заранее. Инвариант как-никак.
Johnmen (2004-11-15 09:04:00) [29]>Fay © (15.11.04 08:43) [4]
>FieldByName в OnFilterRecord - это сильно!
А что не так ?
Fay (2004-11-15 08:43:00) [30]FieldByName в OnFilterRecord - это сильно! Можно ещё Sleep(0) туда поставить - тоже прикольно получится 8)
Johnmen (2004-11-14 17:18:00) [31]Да-да, именно фича, а не баг.
>Это будет выглядеть примерно так?
Ну да. Примерно.
Accept:=DataSet.FieldByName('COUNT').AsInteger=1;
miwa (2004-11-14 17:09:00) [32]
> Это известная фича 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 16:58:00) [33]Это известная фича IBX, существо которой состоит в нереализованности свойства Filter.
Поэтому пользуйся OnFilterRecord.