Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > ФИЛЬТР ЗАПИСЕЙ


Автор: ura5 10.5.2007, 16:28
Помогите мне с фильтром.
Необходимо ,чтобы в окне при наборе,например,фамилии все записи фильтровались ВИЗУАЛЬНО при этом ,т.е. в начале было ,например,20 записей ,потом по мере того как набираем фамилию ,количество записей уменьшалось и в итоге осталась одна или 2 записи с нужной фамилией.

Связь - через ADO.

Спасибо.

Автор: Лена 10.5.2007, 16:45
Так:
Код

void __fastcall TForm1::Edit1Change(TObject *Sender)
{
 TLocateOptions SOptions;
 DataModule2->ClientDataSet1->Locate("имя_поля", Edit1->Text, SOptions<<loCaseInsensitive<<loPartialKey);
}

Заменить связку DataModule2->ClientDataSet1 на свою и поставить нужное имя поля.

P.S.
Поспешила, не правильно написала. Это просто установка курсора на нужную фамилию...

Автор: fish9370 10.5.2007, 21:48
Код

DataSource1->DataSet->Filter="Street='"+Edit4->Text+"*'";
DataSource1->DataSet->Filtered=true;

Автор: ura5 11.5.2007, 11:14
Лена!
Спасибо,но у меня такой вариант есть.Мне надо такой поиск по фамилии,чтобы при этом постепенно при наборе фамилии уменьшалось количество всех фамилий ,пока не дойдешь до нужной.

Например, собираешься найти человека по фамилии ИВАНОВ.

-Только набрал первую букву этой фамилии "И" -при этом остались из всех фамилий только те,которые начинаются  именно на эту букву "И".

-Набираешь 2-ю букву "В"-при этом остаются из всех ранее отобранных только те,которые начинаютя 
на "ИВ'. Здесь будут такие фамилии,например:
ИВАНОВ,ИВАЩЕНКО,ИВОЛГИН  и т.д.

-Набираешь 3-ю букву "А"-при этом остаются из всех ранее отобранных только те,которые начинаютя 
на "ИВА'. Здесь будут такие фамилии,например:
ИВАНОВ,ИВАЩЕНКО

и т.д.,пока не останется фамилия "ИВАНОВ".
****************
Я не знаю  как осуществить такой поиск

Как вы мне предлагали-то просто указатель перемещается по фамилиям, но при этом не происходит фильтрация т.е. остальные записи присутствуют.

Кто знает,как это сделать-прошу помочь
Спасибо.


 

Автор: SenkraD 11.5.2007, 11:19
1. Используй запросы
2.  while(...->Locate(...))
     {
          // Что делай з записями
     }
3. На событие OnChange твоего Edit'a меняй критерии фильтра и применяй новый фильтр. Ну или там где ты критерии вводиш

Автор: fish9370 11.5.2007, 12:20
Юра, я извиняюсь, Вы мой пост вообще видели?

Автор: ura5 11.5.2007, 13:45
fish9370!

Вопросы :

1.Что это за "Street"   ?
2. *'--это что такое     ?


Я прошу прощения-знания очень слабые по C++Builder

Автор: SenkraD 11.5.2007, 13:49
1. Улица в переводе - человек бросил пример со своей программы я полагаю
2. Любое количество любых символов

тоесть фильтрирует по улице


Автор: fish9370 11.5.2007, 19:20
SenkraD, спасибо..

ura5, дело в том, что у TTable есть такое свойство - Filter, по шаблону записанному в него можно отфильтровать таблицу.. синтаксис примерно такой:

<название поля>='<шаблон>'

шаблон может включать символ множественной подстановки *
фильтр вступает в силу как только свойство Filtered выставленно в true.. 

возвращаемся к задаче..

чтобы добиться того эффекта, что тебе требуется, нужно обрабатывать событие OnChange.. в обработчике которого нужно прописать..

Код

void __fastcall TForm1::Edit1Change(TObject *Sender)
{
         DataSource1->DataSet->Filter="Name='"+Edit1->Text+"*'";  //фильтрация по полю Name 
         DataSource1->DataSet->Filtered=true;
}



так же можно фильтровать запросами к базе типа:

Код

"Select * from table1 where Name like '" + Edit1->Text +"%'"     //обрати внимание на апострофы, они важны

но при этом нагрузка ляжет целиком на сеть и сервер..

Добавлено @ 19:31
а вообще этот метод хорошь лишь на маленьких таблицах на таблицах с тысячью записей фильтр начнет тормозить, что приведет к большому неудобству, возможно есть смысл сделать фильтр по нажатию Enter..

Автор: ura5 14.5.2007, 14:06
fish9370!

НЕ ПОЛУЧАЕТСЯ.Как только начинаю вводить в Edit1 ПЕРВУЮ букву-сразу исчезают все записи (фамилии).
В чем дело?

Автор: ura5 14.5.2007, 15:48
fish9370!

1.НЕ ПОЛУЧАЕТСЯ с помощью события .Как только начинаю вводить в Edit1 ПЕРВУЮ букву-сразу исчезают все записи (фамилии).
В чем дело? 

2.SQL-запрос ДЛЯ фильтра .
"Select * from table1 where Name like '" + Edit1->Text +"%'"     //обрати внимание на апострофы, они важны

  ГДЕ ЕГО ПОДКЛЮЧИТЬ?
****************************** мой код *******************

M_Lsab->ADOQueryLsab->SQL->LoadFromFile("SQL/Lsab2.sql");
Str1 = M_Lsab->ADOQueryLsab->SQL->Text;
//Выбираем куда грузить набор данных из таблицы
M_Lsab->DataSourceLsab->DataSet = M_Lsab->ADOQueryLsab;
//Связываем возвращаемый набор данных и визуальные компоненты
DBGrid1->DataSource = M_Lsab->DataSourceLsab;
DBNavigatorSprLsab->DataSource = M_Lsab->DataSourceLsab; 

**************
Lsab2.sql

select vid,kss,fio from telephone.sstel
***************
В событии 
void __fastcall TTel1::Edit1Change(TObject *Sender)
{
M_Lsab->DataSourceLsab->DataSet->Filter="FIO='"+Edit1->Text+"*'"; M_Lsab->DataSourceLsab->DataSet->Filtered=true;

}
************* все ***********

Автор: ura5 15.5.2007, 15:46
Помогите с фильтром!
******************
DataSource1->DataSet->Filter=Scol+ " like '"+Edit1->Text+ "*' ";     //проходит для символьных полей
DataSource1->DataSet->Filtered=true;
******************
Scol-это название поля

Вопрос: Почему фильтр устанавливается только для символьных полей,а для числовых он не проходит?
Почему? Как установить фильтр для числового поля?

Спасибо.


Автор: SenkraD 15.5.2007, 16:09
ura5, для числовых полей используй числовые операции (<, >, <> и так далее) или же создай вычысляемое поле в которое пиши текстовое представление числового поля  и уже делай фильтр по этому полю.

Автор: ura5 15.5.2007, 16:29

DataSource1->DataSet->Filter="KSS >="+ Edit1->Text+ " AND KSS <=" + Edit1->Text+ "0 ";

Написала пример для фильтра для числового поля.
Работает совсем не так,как надо.
Надо,чтобы при наборе цифры 3 - фильтровались все записи с начальной цифрой 3.
Потом набираю (например) цифру 2-фильтровались (оставались) все записи с цифрами 32.

А получается ,что остаются записи больше 32,но меньше 320.Ерунда.

Автор: ura5 17.5.2007, 11:36

Привожу пример кода для ФИЛЬТРА для символьных и числовых полей:

**************************************
Stroka1 = ADOQuery1->SQL->Text;//текст SQL-запроса
SCol=DBGrid1->Columns->Items[N]->FieldName;
**************************************
void __fastcall TTel1::Edit1Change(TObject *Sender)
{
SctSQ(ADOQuery1,Stroka1+" and UPPER(" + SCol+") LIKE UPPER('"+Edit1->Text+"%')");
}
********************
void TM_Lsab::SctSQ(TADOQuery* ADOQuery1,String File)
{// Выбор запроса select для отображения таблицы

ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Text=File;
ADOQuery1->Open();
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)