Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как отфильтровать данные, помогите новичку 
:(
    Опции темы
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0639 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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