C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Поиск ADO, поиск по слову в записях
alexisun
Отправлено: 15.04.2005, 04:19


Ученик-кочегар

Группа: Участник
Сообщений: 6



Необходимо осуществить поиск в Таблице по слову, чтобы перемещалось на строку с этими словами:
TLocateOptions SearchOptions;
ADODataSet1->Locate
("name_razdel",Edit1->Text,SearchOptions loPartialKey loCaseInsensitive);
Данная функция ищет только полное совпадение либо если слово совпадает с началом строки.
Помогите кто может))))
olegenty
Отправлено: 15.04.2005, 06:44


Ветеран

Группа: Модератор
Сообщений: 2412



на ум приходит только полный перебор записей с поиском подстроки в строке...
AVC
Отправлено: 15.04.2005, 08:18


Ветеран

Группа: Модератор
Сообщений: 1583



Обсуждалось уже не раз.
Собственный переносимый код закрывает эту проблему очень надолго.
full_lamer
Отправлено: 15.04.2005, 08:32


Машинист паровоза

Группа: Участник
Сообщений: 225



есть мнение: попытайтесь сделать это новым запросом. конечно получиться новая выборка, но на безрыбьи и рак рыба... с использованием оператора LIKE.
** alexisun
Отправлено: 15.04.2005, 16:15


Не зарегистрирован







а вы знаете этот переносимый код или дайте ссылочку пожалуйста
avc*
Отправлено: 15.04.2005, 16:52


Не зарегистрирован







Собственный имеется ввиду написанный вами.
Свой код я уже приводил — поищите на этом форуме. Но он переносим ДЛЯ МЕНЯ.
Идея элементарна
for (Top; !Eof; Next) Сравнить значение поля с шаблоном
Остальное — антураж.
Borr
Отправлено: 20.04.2005, 07:18


Не зарегистрирован







Самый простой способ SQL запросом
"SELECT * FROM MAIN WHERE FIO LIKE \'%"+Edit1->Text+"%\'" здесь знак процента как раз то что вам нужно
olegenty
Отправлено: 20.04.2005, 08:15


Ветеран

Группа: Модератор
Сообщений: 2412



2 Borr — внимательней прочти задание. не стоит задача отфильтровать данные с сервера, стоит задача спозиционировать запись на первую, удовлетворяющую маске.

кстати, это, по-моему, может делать DBGridEh :-) Ctrl + F — и будет вам счастье (только что вспомнил). но, приусловии, что НД — клиентский.
Borr
Отправлено: 20.04.2005, 10:05


Ученик-кочегар

Группа: Участник
Сообщений: 14



Объясняю свою идею. Грузить все записи в StringGrid
Сделать тот запрос который я показал
И сравнить строки запроса и StrinGrid'a по ключевому полю или Locate'om
olegenty
Отправлено: 20.04.2005, 11:27


Ветеран

Группа: Модератор
Сообщений: 2412



я уже привёл рабочий пример, реализуемый всего-лишь настройкой свойств TDBGridEh. проверил — работает на ура и быстро.
xim
Отправлено: 20.04.2005, 17:48


Станционный диспетчер

Группа: Участник
Сообщений: 143



Где-то согласен с Borr (правда все зависит от платформы)
QUOTE
Самый простой способ SQL запросом
"SELECT * FROM MAIN WHERE FIO LIKE \'%"+Edit1->Text+"%\'" здесь знак процента как раз то что вам нужно


Для MSSQL:
CODE

"SELECT TOP 1 :pk_fld1,:pk_fld2 ..."
"FROM MAIN"
"WHERE FIO LIKE \'%"+Edit1->Text+"%\'"


Для Oracle:
CODE

"SELECT :pk_fld1,:pk_fld2 ..."
"FROM MAIN"
"WHERE FIO LIKE \'%"+Edit1->Text+"%\'"
"AND ROWNUM=1"
"ORDER BY FIO;"


Далее Locate по out-параметрам pk_fld1, pk_fld2 (нужное значение PK или какого-нибудь уникального индекса).

Или описать процедуру получение значения Primary Key на сервере (SP, UDF)

Вернуться в Работа с базами данных в C++Builder