![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не могу разобраться с Filter ;в IBQuery и IBDataSet. [D6, IB6.x]
off © (2003-03-21 16:02:00)Мастера, подскажите. У компонента TTable и TQuery в редакторе объектов можно прописать свойство Filter в соответствующем. Причем, что именно туда следует записать рассказанно в книге. А у копмонентов IBQuery и IBDataSet в редакторе объектов такого поля нет, но есть свойства Filter и Filtered. В книгах я не нашел как пользоваться свойством Filter в IBQuery(DataSet). Хотя можно воспользоваться SQL запросом с текстом
select * from ...
where ... like "%...%",
что мне делать и рпиходится. Но хотелось бы все таки через Filter. Но тогда не понятно, что и куда прописать?
off (2003-03-24 14:03:00) [1]Дык, не вышло че-то через хранимую :-(
zacho (2003-03-24 14:00:00) [2]
> off © (24.03.03 13:55)
Рассчитывай все в хранимой процедуре, и не надо будет тысячи записей на клиента тянуть.
off (2003-03-24 13:55:00) [3]Возможно, следует прерфразировать вопрос. Допустим, есть у меня несколько водителей. У каждого водителя может быть нескоглько гаражей, а в каждом гараже не по одной машине. Существует необходимость расчета расхода бензина и т.п. по каждому водителю и вывод расшифровки по каждому гаражу,автомобилю. Раньше когда использовались таблицы все было проще. Было два запроса, и на AfterScroll для первого применялся фильтр для второго. Т.е. в первом запросе встаю я на гараж №1, и вижу соответствующие авто №1.1, авто №1.2 и т.д.
Не спорю, все это можно реализовать посредствам
>SELECT ....
>FROM ....
>WHERE <conditions>
но получается слишком долго, т.к. условие сложное и запрос возвращает много полей, в итоге на каждую запись тратиться около двух секунд. А теперь представьте что в автопарке свыше 1000 авто.
off (2003-03-24 13:36:00) [4]Виноват
Соловьев (2003-03-24 13:33:00) [5]
> Соловьев © (24.03.03 12:27)
off (2003-03-24 13:31:00) [6]А как еще вызвать onFilterRecord?
Соловьев (2003-03-24 12:56:00) [7]
> procedure TForm1.Button2Click(Sender: TObject);
> begin
> IBDataSet1.Filtered:=true;
> end;
Зачем? Это не нужно.
tomkat (2003-03-24 12:55:00) [8]а слабо написать
IBDataset1.Close;
IBDataset1.SelectSql.Clear;
IBDataset1.SelectSql.Add("SELECT * "+
"FROM <table> t "+
"WHERE t.FIO=:CustomFio " );
IBDataset1.ParamByName("CustomFio").AsString:=Edit1.Text;
IBDataset1.Open;
тебе одну запись отыскать нада или нет ?
ты поиск осуществляеш ?
off (2003-03-24 12:46:00) [9]
procedure TForm1.IBDataSet1FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
begin
Accept := IBDataSet1.FieldByName("CUSTOMERSF").AsString = "МЕРКУЛЯЕВ";
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
IBDataSet1.Filtered:=true;
end;
Соловьев (2003-03-24 12:40:00) [10]Код!!!
off (2003-03-24 12:37:00) [11]ПОнятно! C "%" я от безысходности. Копирую значение из таблицы, вставляю в условие onFilterRecord, а он(DBGrid) мне ничего не показывает. А может все дело в регистре?
zacho (2003-03-24 12:32:00) [12]
> off © (24.03.03 12:27)
Нет, только те, в которых в Field будет "%"
:-)
Соловьев (2003-03-24 12:31:00) [13]нет. Выдаст где у тебя Field="%", все поля это Accept = true;
off (2003-03-24 12:27:00) [14]А если допустим написать
Accept := IBDataSet1.FieldByName("Field").AsString = "%";, то по идее должны вывестись все записи, или НЕТ?
Соловьев (2003-03-24 12:27:00) [15]
> off © (24.03.03 12:24)
> Дык не пашет что-то. Написал как сказано (ну почти как сказано)
> на кнопку засунул IBDataSet1.Filtered:=true; После чего
> в DBGrid появляется лишь одна строка и та пустая. Как лечить?
не надо этого делать... onFilterRecord срабатывает когда идет загрузка данных, т.е. пишеш условие и переоткрываешь НД.
off (2003-03-24 12:24:00) [16]Дык не пашет что-то. Написал как сказано (ну почти как сказано) на кнопку засунул
IBDataSet1.Filtered:=true;После чего в DBGrid появляется лишь одна строка и та пустая. Как лечить?
Соловьев (2003-03-24 11:57:00) [17]Ссори не Access, а Accept :
procedure Tdm.ibDataSetFilterRecord(DataSet: TDataSet;
var Accept: Boolean);
begin
Accept := DataSet.FieldByName("Field").AsString = "ла ла" and
DataSet.FieldByName("Field").AsString = "бу бу";
end;
off (2003-03-24 11:53:00) [18]>Соловьев
>onFilterRecord:
>...
>Access := <условие>
>...
Не совсем понял, что такое access и с чем его едят.
Wellslava (2003-03-24 11:30:00) [19]через фильтр не быстрее, а надо делать запросом и использовать группировку (Group by)...
off (2003-03-24 11:27:00) [20]Дело в том, что после фильтрации необходимо подсчитать сумму по трем таблицам. Сделал через
>SELECT ....
>FROM ....
>WHERE <conditions>
но работает очень медленно. Думал, что если отфильтровать, то получится быстрее.