Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Быстрый поиск в базах данных Builder6


Автор: mirra88 20.7.2011, 17:46
Кто-нибудь знает как в Builder6, в базах данных реализуется быстрый поиск (набираю "А" появляются все записи на эту букву, и т. д.)? Что-то я не нашла в Builder6 подобного элемента..

Автор: Данкинг 20.7.2011, 18:38
Думаю, кроме как выборкой запросом - никак.

Автор: artsb 20.7.2011, 19:16
Либо запросом. Либо выбрать всё и использовать фильтр.

Автор: kin 21.7.2011, 20:33
Делаешь нужный индекс, в обработчике событий клавиатуры используешь методы Seek или Location объекта DataSet (за точность именования не ручаюсь (давно это было...), но суть, думаю, понятна)  по левому краю ключа...

Автор: XPyCT 26.7.2011, 16:10
Когда то реализовал нечто подобное для MSSQL сервер 2005

Код

  void cSearch()
   {
          AnsiString textEdit;
      textEdit = Edit9->Text;

      AdoQueryBase->Close();
      AdoQueryBase->SQL->Clear();
      AdoQueryBase->SQL->Text = "Select *from dbo.tbl_base where Name like '%"+textEdit+"%' or AccountSerial like '%"+textEdit+"%' or Account like '"+textEdit+"%' ";
      AdoQueryBase->Open();
   }


на событие Едита  "Edit9" -  OnChange()  вызываете данную функцию  

Код

//---------------------------------------------------------------------------
void __fastcall TServerForm::Edit9Change(TObject *Sender)
{
cSearch();
}
//---------------------------------------------------------------------------

как то так 

Автор: mirra88 28.7.2011, 19:17
Всем спасибо за помощь. Код XPyCTа мне помог, всё работает, но медленно. Я хотела проверить не будет ли быстрее метод фильтрации, но возникла вот такая проблема. Вот так вот работает:
Код

AnsiString textEdit = Edit1->Text;
 Form1->ADOQuery1->Filter="(Name1=' "+textEdit+" ')";

Но мне надо, чтобы вывелось не только то, что введено в текстовое поле, а всё, что начинается с введённого. Но вот так уже выводит пустую таблицу:
Код

AnsiString textEdit = Edit1->Text;
 Form1->ADOQuery1->Filter="(Name1=' "+textEdit+*+" ')";

С этой * у меня ни с какими сочетаниями кавычек не получается! Хотя теоретически я понимаю, что проблема должна решаться как-то просто. Помогите, пожалуйста 

Автор: artsb 28.7.2011, 20:07
Код

Form1->ADOQuery1->Filter = "(Name1 LIKE '%"+ Edit1->Text + "%')";

% - аналог *. Значит любое количество любых символов.


Цитата(mirra88 @  28.7.2011,  19:17 Найти цитируемый пост)
но медленно. Я хотела проверить не будет ли быстрее метод фильтрации, но возникла вот такая проблема

Естественно, медленно. Каждый раз выполнять запрос это дорогого стоит. Поэтому я вам про фильтр сразу и сказал. Он работает мгновенно.

Добавлено @ 20:09
Кстати, забыл сказать вам нужно обязательно проверять содержимое Edit'а на наличие символа < ' >. Это служебный символ. Его нужно экранировать. Для этого нужно записать два символа подряд.

Автор: mirra88 29.7.2011, 05:22
Большущее спасибо! С таким фильтром всё действительно работает быстро и без проблем!

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