![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Здравствуйте. Подскажите в написание события фильтрации. Пишу обработчик события фильтрации поиска фамилии, указанной в Edit1.
Код:
procedure TForm2.N3Click(Sender: TObject);
begin ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM Sotrudniki WHERE familiya LIKE ''%Edit1.Text%''');
ADOQuery1.Active:=True;
end;![]() |
|
#2
|
||||
|
||||
|
Цитата:
Код:
ADOQuery1.SQL.Add('SELECT * FROM Sotrudniki WHERE familiya LIKE ''%'+Edit1.Text+'%'''); |
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Evgen_Balbes (28.09.2012)
| ||
|
#3
|
||||
|
||||
|
там ещё есть свойство Filter и Filtered
ставишь Filter:='familiya LIKE ''%'+Edit1.Text+'%''' и Filtered в True по итогу не надо квэрик гонять за данными на сервер фильтрация локальная |
| Этот пользователь сказал Спасибо Lost_Fish за это полезное сообщение: | ||
Evgen_Balbes (28.09.2012)
| ||
|
#4
|
||||
|
||||
|
Все работает))) Но у меня есть в базе поле с типом счетчик. Пишу код
Код:
procedure TForm2.Edit1Change(Sender: TObject); begin if Length(Edit1.Text) > 0 then begin ADOQuery1.Filtered:=false; ADOQuery1.Filter:='№ i\b LIKE '+ '''' + Edit1.Text + '%' + ''''; ADOQuery1.Filtered:=true; end else ADOQuery1.Filtered:=false; end; Код:
procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not (Key in ['0'..'9', #8])then Key:=#0; end; Последний раз редактировалось Evgen_Balbes, 29.09.2012 в 00:03. |
|
#5
|
||||
|
||||
|
Вот скриншот ошибки.
|
|
#6
|
||||
|
||||
|
Цитата:
Код:
ADOQuery1.Filter:='[Имя поля] LIKE '+ '''' + Edit1.Text + '%' + ''''; Цитата:
|
|
#7
|
||||
|
||||
|
Исправил , теперь пишет что не возможно открыть фильтр.Но в др Edit открывает, в чем подвох?( выделяет строку 7)
Код:
procedure TForm2.Edit1Change(Sender: TObject); begin if Length(Edit1.Text) > 0 then begin ADOQuery1.Filtered:=false; ADOQuery1.Filter:='[№ i\b] LIKE '+ '''' + Edit1.Text + '%' + ''''; ADOQuery1.Filtered:=true; end else ADOQuery1.Filtered:=false; end; |
|
#8
|
||||
|
||||
|
Цитата:
Цитата:
Вместо этого можешь использовать событие OnFilterRecord примерно так: Код:
procedure TForm2.ADOQuery1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
Accept := Copy(ADOQuery1.FieldByName('№ i\b').AsString, 1, Length(Edit1.Text)) = Edit1.Text;
end; |
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Evgen_Balbes (29.09.2012)
| ||
|
#9
|
||||
|
||||
|
Спасибо за помощь, заработало
а такой вопрос (для общего развития): если у меня на форме 2 таблицы BDGrid с одинаковыми полями [familiya] ,можно искать запись сразу в двух, при вводе данных в Edit1, используя вот такую конструкцию ?Код:
procedure TForm2.Edit1Change(Sender: TObject);
begin
if Length(Edit1.Text) > 0 then
begin
ADOQuery1.Filtered:=false;
ADOQuery2.Filtered:=false;
ADOQuery1.Filter:='[familiya] LIKE '+ '''' + Edit1.Text + '%' + '''';
ADOQuery2.Filter:='[familiya] LIKE '+ '''' + Edit1.Text + '%' + '''';
ADOQuery1.Filtered:=true;
ADOQuery2.Filtered:=true;
end
else ADOQuery1.Filtered:=false;
ADOQuery2.Filtered:=false;
end;![]() |
|
#10
|
||||
|
||||
|
Цитата:
А ещё эту конструкцию можно упростить как минимум таким образом: Код:
procedure TForm2.Edit1Change(Sender: TObject);
begin
ADOQuery1.Filtered := False;
ADOQuery2.Filtered := False;
if Edit1.Text <> '' then
begin
ADOQuery1.Filter := '[familiya] LIKE '+ '''' + Edit1.Text + '%' + '''';
ADOQuery2.Filter := '[familiya] LIKE '+ '''' + Edit1.Text + '%' + '''';
ADOQuery1.Filtered := True;
ADOQuery2.Filtered := True;
end;
end;Последний раз редактировалось poli-smen, 30.09.2012 в 02:59. |
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Evgen_Balbes (30.09.2012)
| ||
|
#11
|
||||
|
||||
|
Попробовал воплотить : все работает спасибо
Если где то понадобится такой "финт" обязательно воспользуюсь!!! |