Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DBGrid и поиск 
:(
    Опции темы
aleks88
Дата 25.1.2012, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Подскажите, как организовать лучше поиск по таблице.
Делаю следующим образом, но при этом, находит только первое совпадение, а хотелось бы, чтобы при 
повторном нажатии на кнопку поиска, эффект был как "искать далее".

Код

String criterion_search = "NAME";
TLocateOptions Opts;
Opts.Clear();
Opts << loPartialKey;


Код взял где-то как пример, как он работает понять не могу...
PM   Вверх
Данкинг
Дата 25.1.2012, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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



А не проще запросом вывести в грид сразу все найденные записи?


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
aleks88
Дата 25.1.2012, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Это я хотел назвать фильтрацией - проще smile
Мне бы хотелось, что бы возможен был поиск, как я описал выше и фильтрация, т.е. когда в ДБГриде остаются строки, удовлетворяющие некому критерию. 

Сделал так

Код

Dataset1->Filtered=true;
Dataset1->Filter = criterion_search + "= '"+Edit1->Text+"'";
Dataset1->Refresh();

criterion_search -  фильтруемое поле
Edit1->Text - искомое значение...

Можно ли каким-либо образом подобно сделать фильтрацию по сложному фильтру, т.е. логическое "и". Пробовал последовательно применять, вторая фильтрация выполняется по всему множеству данных, а не по выборки из первого фильтра...

Это сообщение отредактировал(а) aleks88 - 25.1.2012, 16:32
PM   Вверх
GraNit
Дата 25.6.2012, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Делал поиск по полю с фамилиями, но думаю переделать не сложно и по другим типам полей.
Суть: на форме DBGrid1, и Label2 в строке статуса. Отлавливаем нажатие кнопки, потом смотрим, что нажали, если это буква, то выдаем в Label2, если ESC, то стираем строку, если BACKSPACE то только одну букву... ну и при это постоянно ищем в базе.
вот такое решение:

Код

/* Это процедура ищет введенную фамилию в строке поиска*/
void __fastcall TForm1::DBGrid1KeyPress(TObject *Sender, char &Key)
{
  // Проверим на ввод русской буквы
  // Русские буквы от А(192) до я(255) идут в ряд, только Ё и ё отдельно,
  // но их я не стал проверять. Кодировка WIN1251
  if (((byte)Key) >= 192) // если больше или равно 192 И
      if (((byte)Key) <=255) // меньше или равно 255 , то идем выводить букву и искать.
         // это "защита" от дурака, т.е. если ввели первую букву не заглавную, то программа сделает это сама
         if (Label2->Caption.IsEmpty()) Label2->Caption = Label2->Caption+AnsiUpperCase(&Key)[1];
         // остальные буквы такие какие они есть.
         else Label2->Caption = Label2->Caption+Key;
  // это если нажали BACKSPACE. Требуется стереть последнюю букву
  if (((byte)Key) == 8) Label2->Caption = StrLCopy(Label2->Caption.c_str(),Label2->Caption.c_str(),StrLen(Label2->Caption.c_str())-1);
  // Ну а это сам поиск. Если строка не пуста, то ищем ФИО
  if (!Label2->Caption.IsEmpty() ) DataSource1->DataSet->Locate("NAME",Label2->Caption,TLocateOptions()<<loPartialKey);
  // Здесь стираем строку поиска, если нажат ESC
  if (((byte)Key) == 27)
      if ( !Label2->Caption.IsEmpty() ) Label2->Caption = "";
}

P.S. Конечно же поле должно быть проиндексированно.

Это сообщение отредактировал(а) GraNit - 25.6.2012, 12:22
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C++: Базы данных"
chipset

Данный форум предназначен для обсуждения вопросов прямым образом связанных с C++ и БД. Так, вопросы только по C++ следует задавать в C++:Общие вопросы а вопросы по абстрактным БД в Базах данных или в соответствующих под-форумах.

Благодарим за понимание.


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

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


 




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


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

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