Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как отфильтровать данные, помогите новичку 
:(
    Опции темы
User
Дата 12.11.2004, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 5.11.2004

Репутация: нет
Всего: нет



На форме присутствуют компоненты DBGrid1, Table1, DataSource1, Edit1. Я написал следующий код для фильтрации в DBGrid1:

procedure TForm1.Edit1Change(Sender: TObject);
begin
if Length(Edit1.Text)>0 then
Table1.Filtered:=true
else
Table1.Filtered:=false;

Table1.Filter:='Famil>'''+FindEdit.Text+'''';
end;

Проблема вот в чем. Разные глюки идут. Подскажите как лучше осуществить фильтрацию.
P.S. 1). Токо прошу подсказать при условии что Qyeru1 на форму не добовлять.
2). Или как грамотно добавить Qyeru1 и подключить как для осуществления фильтрации. smile
PM MAIL WWW   Вверх
Mr.Picwick
Дата 12.11.2004, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 23.3.2004

Репутация: нет
Всего: нет



По-моему надо сначало задавать фильтр, а потом свойство Filtered в True или False
Код

Table1.Filter:='Famil>'''+FindEdit.Text+'''';
if Length(Edit1.Text)>0 then
Table1.Filtered:=true
else
Table1.Filtered:=false;

PM MAIL   Вверх
User
Дата 15.11.2004, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 5.11.2004

Репутация: нет
Всего: нет



Попробую правда не знаю что получиться? А как еще можно задать фильтрацию кроме указанного способа, подскажите? Лучше с примером.
PM MAIL WWW   Вверх
Mal Hack
Дата 15.11.2004, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: нет
Всего: 261



Цитата
Table1.Filter:='Famil>'''+FindEdit.Text+'''';

Ну как вариант, чтобы не заптаться с опострофами:
Код

Table1.Filter:='Famil>' + chr( 39 ) + Edit1.Text + chr( 39 );

PM ICQ   Вверх
User
Дата 16.11.2004, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 5.11.2004

Репутация: нет
Всего: нет



У меня при всех вариантах что то фильтруется, но при этом фигня какаято выскакивает. А именно. Когда я отфилтровал по первому значению все ОК. Когда фильтрую по второму то остается и первое и второе отфильтрованное значение как будто фильтрация предыдущих значений гдето сохраняется. Люди - программисты помогите справиться с этой бедой. !! Плиз!
PM MAIL WWW   Вверх
Vit
Дата 16.11.2004, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Покажи код двух фильтраций


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
MacTep
Дата 17.11.2004, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: нет
Всего: 4



Скорее всего после первой фильтрации ты не приводишь таблицу к первоначальному виду и фильтруешь уже оставшиеся записи. Или нет?


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Akella
Дата 24.11.2004, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



bFilterFilials - глобальная переменная
если true, то можно фильтровать



procedure TfmMain.tZayFilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
if bFilterFilials then
Accept := DataSet['ZFilial'] = lcbFilials.KeyValue;
end;

procedure TfmMain.tZayFilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
if DataSet['ZFilial'] = 'филиал' then
Accept := true;
end;

если Accept = true, то запись попадет в набор данных
и так попадут в набор данных все записи, которые имеют значение 'филиал' в поле 'ZFilial'




это событие срабатывает тогда, когда ты выполняешь фильтрацию, причем в свойсве
Filter не обязательно должно быть выражение фильтрации, просто выполняешь

Код
Table1.Filtered:=True


т.е. здесь можно фильтровать записи с помощью язывка высокого уровня, а не пятью операторами SQL


http://forum.vingrad.ru/index.php?showtopi...ead=1&hl=фильтр
PM MAIL   Вверх
Коця
Дата 17.2.2005, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 13.2.2005

Репутация: нет
Всего: нет



Цитата(User @ 16.11.2004, 09:10)
У меня при всех вариантах что то фильтруется, но при этом фигня какаято выскакивает. А именно. Когда я отфилтровал по первому значению все ОК. Когда фильтрую по второму то остается и первое и второе отфильтрованное значение как будто фильтрация предыдущих значений гдето сохраняется. Люди - программисты помогите справиться с этой бедой. !! Плиз!

Вот и у меня то-же самое...
PM MAIL   Вверх
Akella
Дата 17.2.2005, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Коця, покажи код
PM MAIL   Вверх
Коця
Дата 17.2.2005, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 13.2.2005

Репутация: нет
Всего: нет



procedure TForm1.Edit1Change(Sender: TObject);
begin

Table1.Filtered:=false;
Table1.Filter:='FIO>'''+Edit1.Text+'''';
if Length(Edit1.Text)>0 then
Table1.Filtered:=true
else
Table1.Filtered:=false;
end;

PM MAIL   Вверх
Akella
Дата 17.2.2005, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



динамическая фильтрация
Код

procedure TForm1.Edit1Change(Sender: TObject);
begin
 Table1.Filtered:=False;
 Table1.Filter:='LAST_NAME = '+QuotedStr(Edit1.Text+'*');
 Table1.Filtered:=true;
end;



Это сообщение отредактировал(а) dsergey - 17.2.2005, 16:25
PM MAIL   Вверх
Коця
Дата 17.2.2005, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 13.2.2005

Репутация: нет
Всего: нет



чтоб при удалении символов с Едита фильтрация отменялать нада добавить

procedure TListClients.Edit1Change(Sender: TObject);
begin
Form1.Table1.Filtered:=False;
Form1.Table1.Filter:='LAST_NAME = '+QuotedStr(Edit1.Text+'*');

if Length(Edit1.Text)>0 then
Table1.Filtered:=true
else
Table1.Filtered:=false;

end;


PM MAIL   Вверх
User
Дата 18.2.2005, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 5.11.2004

Репутация: нет
Всего: нет



А можно просто запросами, правда если у тебя таблица подключена через Query

begin
Query1.Active :=False;
Query1.TextSQL :='SELECT Телефон FROM NAME WHERE Телефон =:Edit1.Text';
Query1.Active :=True;
end;

Писал по памяти, так как дельфи под рукой нет, возможны ошибки.
Добавлено @ 11:12
Да забыл сказать, в самом Query нужно очищать список!
Query1.SQLText.Create; - вроде так
PM MAIL WWW   Вверх
Akella
Дата 18.2.2005, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Код

procedure TfmFind.bbFindClick(Sender: TObject);
Var
S,dom,kv:String;
begin
 with fmMain do begin
   if edFind.Text='' then begin
     beep;
     ShowMessage('Отсутствует текст для поиска');
     edFind.SetFocus;
   end else
   begin
     sbFilter.SimpleText:='Идет фильтрация...';
     tPhone.Close;
     dsPhone.DataSet:=qFilter;
     qFilter.DisableControls;
     //заменяем знак звезды на знак процента
     s:=AnsiUpperCase(StringReplace(edFind.Text,'*', '%', [rfReplaceAll]));
     Case cbFind.ItemIndex of
       0: begin
            qFilter.Close;
            qFilter.SQL.Clear;
            qFilter.SQL.Add('SELECT ID, TEL, NAM, UL, D, K, MEMO FROM "Tel_db.DB" Tel_db WHERE UPPER(tel) LIKE '+QuotedStr(s));
            qFilter.Prepare;
            qFilter.Open;
          end;
       1: begin
            qFilter.Close;
            qFilter.SQL.Clear;
            qFilter.SQL.Add('SELECT ID, TEL, NAM, UL, D, K, MEMO FROM "Tel_db.DB" Tel_db WHERE UPPER(nam) LIKE '+QuotedStr(s));
            qFilter.Prepare;
            qFilter.Open;
          end;
       2: begin
            if edDom.Text = '' then edDom.Text:='*';
            if edKvart.Text = '' then edKvart.Text:='*';
            dom:=StringReplace(edDom.Text,'*', '%', [rfReplaceAll]);
            kv:=StringReplace(edKvart.Text,'*', '%', [rfReplaceAll]);

            qFilter.Close;
            qFilter.SQL.Clear;
            qFilter.SQL.Add('SELECT ID, TEL, NAM, UL, D, K, MEMO FROM "Tel_db.DB" Tel_db WHERE UPPER(ul) LIKE '+QuotedStr(s)+' AND D LIKE '+QuotedStr(Dom)+ ' AND K LIKE '+QuotedStr(kv));
            qFilter.Prepare;
            qFilter.Open;
          end;
       3: begin
            qFilter.Close;
            qFilter.SQL.Clear;
            qFilter.SQL.Add('SELECT ID, TEL, NAM, UL, D, K, MEMO FROM "Tel_db.DB" Tel_db WHERE UPPER(D) LIKE '+QuotedStr(s));
            qFilter.Prepare;
            qFilter.Open;
          end;
       4: begin
            qFilter.Close;
            qFilter.SQL.Clear;
            qFilter.SQL.Add('SELECT ID, TEL, NAM, UL, D, K, MEMO FROM "Tel_db.DB" Tel_db WHERE UPPER(K) LIKE '+QuotedStr(s));
            qFilter.Prepare;
            qFilter.Open;
          end;

     end;//case
     qFilter.EnableControls;
     sbFilter.SimpleText:='Фильтрация закончена';
   end;
 end;
end;


PM MAIL   Вверх
Коця
Дата 18.2.2005, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 13.2.2005

Репутация: нет
Всего: нет



Цитата(dsergey @ 17.2.2005, 16:25)
динамическая фильтрация
Код

procedure TForm1.Edit1Change(Sender: TObject);
begin
 Table1.Filtered:=False;
 Table1.Filter:='LAST_NAME = '+QuotedStr(Edit1.Text+'*');
 Table1.Filtered:=true;
end;


а как сделать фильтрацию по дате, от даты - до даты,
чтото типа
Код

Form1.Table1.Filter := 'podkl>'+QuotedStr(DBDateTimeEditEh1.Text) AND 'podkl<'+QuotedStr(DBDateTimeEditEh2.Text);

PM MAIL   Вверх
Бойцов А.А.
Дата 24.2.2005, 17:00 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А почему никто не сказал ничего по поводу OnFilterRecord?
С этим событием можно отвязаться от любого синтаксиса
(звездочек там, процентиков...) и самому принимать решение
о фильтрации записи.
  Вверх
Akella
Дата 24.2.2005, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Бойцов А.А., лучше примеры бы привел.
Читай внимательнее:
Код

procedure TfmMain.tZayFilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
 if bFilterFilials then Accept := DataSet['ZFilial'] = lcbFilials.KeyValue;
end;

procedure TfmMain.tZayFilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
 if DataSet['ZFilial'] = 'филиал' then Accept := true;
end;

Добавлено @ 17:15
В событии OnFilterRecord проверяется каждая запись.
Если запись удовлетворяет условию кода (т.е. Accept := True), то запись будет показана в сетке.
В этом событии можно выполнять очень сложные условия, включая и циклы и все, что позволяет язык программирования.
Есть недостаток - ресурсоемкость. На медленных машиных тормозит конкретно.

Это сообщение отредактировал(а) dsergey - 24.2.2005, 17:16
PM MAIL   Вверх
StayAtHome
Дата 24.2.2005, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Домосед
**


Профиль
Группа: Участник
Сообщений: 456
Регистрация: 26.1.2004
Где: Украина

Репутация: нет
Всего: 16



dsergey
А как соотносится использование OnFilterRecord с сетевым трафиком? На клиент все равно будут затягиваться все записи? Или нет?
PM MAIL WWW ICQ YIM   Вверх
Akella
Дата 25.2.2005, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



OnFilterRecord больше зависит от процессора и объема памяти, т.к. вычисления производятся на компьютере программы. Будь то сервер или клиент
PM MAIL   Вверх
StayAtHome
Дата 26.2.2005, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Домосед
**


Профиль
Группа: Участник
Сообщений: 456
Регистрация: 26.1.2004
Где: Украина

Репутация: нет
Всего: 16



Цитата(dsergey @ 25.2.2005, 10:12)
на компьютере программы

Где-где?
PM MAIL WWW ICQ YIM   Вверх
Sett
Дата 27.2.2005, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 20.12.2004
Где: Подольск

Репутация: нет
Всего: нет



Чё та, я тоже не пойму первое значение фильтрую нормально, при попытке отфильтроваьть второе, не чего не происходит вообще пустой DBGrid, что нужно делать покажите полный код фильтра, как будто он под кнопкой.
Спасибо
PM MAIL WWW ICQ   Вверх
Akella
Дата 28.2.2005, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



StayAtHome, я имел ввиду компьютер, на котором в данный момент выполняется программа (фильтрующая данные).
Добавлено @ 10:36
Sett, причем здесь кнопка?
обрати внимание на это
Код
procedure TfmMain.tZayFilterRecord(DataSet: TDataSet; var Accept: Boolean);

о чём-нибудь говорит?

Код

procedure TfmMain.tZayFilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
if bFilterFilials then Accept := DataSet['ZFilial'] = lcbFilials.KeyValue;
end;

procedure TfmMain.tZayFilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
if DataSet['ZFilial'] = 'филиал' then Accept := true;
end;


это говорит о том, что код
Код
if DataSet['ZFilial'] = 'филиал' then Accept := true;

выполняется в событии OnFolteredRecord, а чтобы это событие сработало нужно вызвать
Код

Table1.Filtered:=true;

Table1.Filter - не обязятельно заполнять.

Это сообщение отредактировал(а) dsergey - 28.2.2005, 10:38
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0822 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.