Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ФИЛЬТР ЗАПИСЕЙ 
:(
    Опции темы
ura5
Дата 10.5.2007, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

Спасибо.
PM MAIL   Вверх
Лена
Дата 10.5.2007, 16:45 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Так:
Код

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

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

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

Это сообщение отредактировал(а) Лена - 10.5.2007, 16:53
PM MAIL   Вверх
fish9370
Дата 10.5.2007, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

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



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


Шустрый
*


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

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



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

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

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

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

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

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

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

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


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


Опытный
**


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

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



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

Это сообщение отредактировал(а) SenkraD - 11.5.2007, 11:22


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
fish9370
Дата 11.5.2007, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
undefined
PM MAIL WWW ICQ   Вверх
ura5
Дата 11.5.2007, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



fish9370!

Вопросы :

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


Я прошу прощения-знания очень слабые по C++Builder
PM MAIL   Вверх
SenkraD
Дата 11.5.2007, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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




--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
fish9370
Дата 11.5.2007, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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..

Это сообщение отредактировал(а) fish9370 - 11.5.2007, 19:35


--------------------
undefined
PM MAIL WWW ICQ   Вверх
ura5
Дата 14.5.2007, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



fish9370!

НЕ ПОЛУЧАЕТСЯ.Как только начинаю вводить в Edit1 ПЕРВУЮ букву-сразу исчезают все записи (фамилии).
В чем дело?
PM MAIL   Вверх
ura5
Дата 14.5.2007, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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;

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

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


Шустрый
*


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

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



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

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

Спасибо.


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


Опытный
**


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

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



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

Это сообщение отредактировал(а) SenkraD - 15.5.2007, 16:11


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
ura5
Дата 15.5.2007, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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




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

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

А получается ,что остаются записи больше 32,но меньше 320.Ерунда.
PM MAIL   Вверх
ura5
Дата 17.5.2007, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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




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

**************************************
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();
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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