Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/97: Рейтинг темы: голосов - 97, средняя оценка - 4.61
Волшебник
 Аватар для Rapsod
65 / 64 / 7
Регистрация: 21.11.2009
Сообщений: 319

Поиск по нескольким полям (ФИО) методом "Locate"

04.02.2011, 12:13. Показов 19780. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые специалисты!

Подскажите пожалуйста, нужно осуществить поиск по трем полям (ФИО).
Сделал так: (поиск прекрасно работает с именем и фамилией):
C++
1
2
3
4
5
6
7
8
9
10
bool __fastcall Locate (const System::AnsiString KeyFields,
                        const System::Variant &KeyValues,
                        TLocateOptions Options);
 
//----------------------------------- ... -----------------------------------------
 
TLocateOptions SearchOptions;
Variant locvalues[] = {Edit1->Text, Edit2->Text};
Form4->Table1->Locate ("Fam; Name", VarArrayOf (locvalues,1),
                        SearchOptions<<loPartialKey<<loCaseInsensitive);
Но нужно еще ввести поиск по "отчеству", то-есть полностью по ФИО.

Сделал так: (чёт не работает) подскажите в чем моя ошибка
C++
1
2
3
4
TLocateOptions SearchOptions;
Variant locvalues[] = {Edit1->Text, Edit2->Text, Edit3->Text};
Form4->Table1->Locate ("Fam; Name; Otchestvo", VarArrayOf (locvalues,1),
                        SearchOptions<<loPartialKey<<loCaseInsensitive);
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.02.2011, 12:13
Ответы с готовыми решениями:

Поиск по нескольким полям методом Locate
Как сделать чтоб поиск происходил в нескольких полях procedure TForm2.Button3Click(Sender: TObject); begin if not...

Поиск по сайту: не могу разобраться, как делать поиск по нескольким полям
поиск по одному полу осуществляется вот так: SELECT * from tablepart WHERE `marka` LIKE '%&quot; . $search . &quot;%' or `model` LIKE '%&quot;...

Поиск по нескольким полям
авм Добавлено через 6 минут Если не ввести временной интервал отказывается искать в БД Кто поможет разобраться? вот код : ...

18
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
04.02.2011, 12:36
А так работает?
C++
1
2
3
4
TLocateOptions SearchOptions;
Variant locvalues[] = {Edit1->Text, Edit2->Text, Edit3->Text};
Form4->Table1->Locate ("Fam; Name; Otchestvo", VarArrayOf (locvalues,2),
                                                SearchOptions<<loPartialKey<<loCaseInsensitive);
Добавлено через 2 минуты
Цитата Сообщение от Sasha Посмотреть сообщение
А так работает?
C++
1
2
3
4
TLocateOptions SearchOptions;
Variant locvalues[] = {Edit1->Text, Edit2->Text, Edit3->Text};
Form4->Table1->Locate ("Fam; Name; Otchestvo", VarArrayOf (locvalues,2),
                                                SearchOptions<<loPartialKey<<loCaseInsensitive);
А ещё лучше вот так:
C++
1
2
3
4
TLocateOptions SearchOptions;
Variant locvalues[3] = {Edit1->Text, Edit2->Text, Edit3->Text};
Form4->Table1->Locate ("Fam; Name; Otchestvo", VarArrayOf (locvalues,2),
                                                SearchOptions<<loPartialKey<<loCaseInsensitive);
2
Волшебник
 Аватар для Rapsod
65 / 64 / 7
Регистрация: 21.11.2009
Сообщений: 319
04.02.2011, 12:44  [ТС]
Цитата Сообщение от Sasha Посмотреть сообщение
А так работает?
Спасибо Sasha!!!
Все работает!))

Я вчера игрался с этим массивом и меня постоянно выбрасывало с ошибкой, а сегодня все заработало)))
Спасибо!
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
04.02.2011, 12:50
Rapsod, забудьте вообще о существовании этого метода, запросы рулят... да и все равно, рано или поздно вам придется от такого рода кода избавляться (по себе знаю)
1
Волшебник
 Аватар для Rapsod
65 / 64 / 7
Регистрация: 21.11.2009
Сообщений: 319
04.02.2011, 13:16  [ТС]
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
Rapsod, забудьте вообще о существовании этого метода, запросы рулят... да и все равно, рано или поздно вам придется от такого рода кода избавляться (по себе знаю)
Спасибо за ценный совет!!!
Просто я с базами только начал работать...
0
0 / 0 / 0
Регистрация: 05.06.2010
Сообщений: 34
23.06.2011, 12:18
Всем привет. у меня тоже проблема.
Code
1
2
3
4
5
6
7
8
void __fastcall TForm4::Edit1Change(TObject *Sender)
{
Form4->Table1->Filtered=false;
 
Form4->Table1->Filter="(Name= '"+Edit1->Text+"*')";
 
Form4->Table1->Filtered=true;
}
это у меня поиск по 1 столбцу. А как сделать,чтобы он искал по всем столбцам?
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
23.06.2011, 12:43
Delphi
1
забудьте вообще о существовании этого метода, запросы рулят... да и все равно, рано или поздно вам придется от такого рода кода избавляться
Глупости говорите, маэстро ! Очевидно, Вам не приходилось работать с серверными курсорами (к тому же удаленными), где все (!!!) перемещения (даже простая навигация вверх и вниз) работает через запросы - это таааакая тоска постоянно смотреть на часики

Delphi
1
 (по себе знаю)
ЗЫ. Не надо все мерять по себе, мир значительно разнообразнее ! По себе знаю

Добавлено через 17 минут
В одном с Вами согласен абсолютно - ограничивать сервис поиска нахождением только первой записи (locate) - заранее обрекать пользователей на мучения.

Поэтому в этом вопросе всегда придерживаюсь мудрого правила :

Во-первых, тянуть на клиента только ИНТЕРЕСУЮЩУЮ В ДАННЫЙ МОМЕНТ информацию, например за месяц (неделю, день, ..), заранее "предохраняясь" от тормозов, связанных с датасетами из тысяч (а то и миллионов, и такое порно наблюдал) записей. 1000 записей - вот то разумное ограничение, которое способен "асилить" средний пользователь. Обеспечивается фильтрами или условиями выборки (отбора) - как угодно назовите, хоть валенком. Интерфейс указания условий весьма зависит от предмета, например в бухгалтерских программах имеется предустановленный фильтр - учетный период, в складских программах - номер склада и т.д. и фильтр лишь устанавливает дополнительные условия для уменьшения "поля данных".

Во-вторых, должно быть два вида поиска:
- поиск по тек.колонке, причем в обоих направлениях и как с начала, так и с тек.места, ну примерно как в экселе
- поиск в списки, когда по указанному полю (полям) ищутся записи и отображаются в отдельном окне (модальном) - при этом клики на записях в этом окне вызывают поиск и отображение соотв.записи исх.датасета. Штука чрезвычайно удобная в работе, хотя и требующая некоторого терпения и трудозатрат (я так такой код сделал универсальным и вынес это в "системную" библиотеку)

Подитоживая: поиск делается двухуровневым - во-первых фильтрацией, во-вторых собственно поиском

ЗЫ. Термины "Фильтр" и "Фильтрация" в вышесказанном ни в коем случае не следует понимать как использование методов класса TDataSet и потомков Filter, OnFilterRecord, т.е. как "фильтрацию" в страрм, досовском понимании, а только как кляузу Where в соответсвующих запросах.
0
0 / 0 / 0
Регистрация: 05.06.2010
Сообщений: 34
23.06.2011, 13:14
Это вообще возможно? Сделать филтрацию по всем столбцам?я все форумы просмотрел(найти никак не могу
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
23.06.2011, 13:50
Цитата Сообщение от since12 Посмотреть сообщение
Это вообще возможно? Сделать филтрацию по всем столбцам?я все форумы просмотрел(найти никак не могу
Вот пример
C++
1
Form4->Table1->Filter="(Name= '"+Edit1->Text+"*' and  family = '"+Edit2->Text+"*')";
1
0 / 0 / 0
Регистрация: 05.06.2010
Сообщений: 34
23.06.2011, 13:58
Code
1
Form4->Table1->Filter="(Name ='"+Edit1->Text+"*' || ID_PREDMET ='"+Edit1->Text+"*')";
Теперь он вообще не работает.
в чем проблема?
у меня один Edit.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
23.06.2011, 14:15
C++
1
2
3
4
AnsiString s;
s = "Name Like " + QuotedStr(Edit1->Text + "%") + " and \
      ID_PREDMET like "+QuotedStr(Edit1->Text + "%");
Form4->Table1->Filter=s;
Учите SQL и спасетесь !

ЗЫ. Логики, правда не вижу в том, что разные поля сравниваются с одним и тем же - на косячок похоже однако
1
0 / 0 / 0
Регистрация: 05.06.2010
Сообщений: 34
23.06.2011, 14:20
Я таам криво походу написал.
По другому, то мне нужна фильтрация строк, в которых присутствует ('"+Edit1->Text+"*')
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
23.06.2011, 14:25
Звездочка (*) катит только для акцеса и то не уверен, а вообще по всем сиквельным стандартам в Like рулит вилдкарта '%'
1
0 / 0 / 0
Регистрация: 05.06.2010
Сообщений: 34
23.06.2011, 14:30
Code
1
Form4->Table1->Filter="(Name= '"+Edit1->Text+"*')";
Этот код для фильтрации по столбцу NAME.
А мне нужна фильтрация по строкам.
Я Вас плохо понял, о чем Вы
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
23.06.2011, 14:42
Я о том, что звезду Вы используете, вероятно, примерно с той же целю для чего ее используют например в масках имени файла. Так вот, в SQL то же самое выполняется несколько иначе, в частности * воспринимается просто как символ *. Об чем и написал в [13]
0
0 / 0 / 0
Регистрация: 05.06.2010
Сообщений: 34
23.06.2011, 14:43
Цитата Сообщение от MsGuns Посмотреть сообщение
AnsiString s;
s = "Name Like " + QuotedStr(Edit1->Text + "%") + " and \
ID_PREDMET like "+QuotedStr(Edit1->Text + "%");
Form4->Table1->Filter=s;
Так этот код будет фильтровать по строкам?
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
23.06.2011, 14:50
И вместо знака равенства используется LIKE
Например, чтобы выбрать всех Ивановых пишут

Where FAM LIKE 'Иванов %'

а если Ивановых, Иванченковых, Иваницких и т.д., то

Where FAM LIKE 'Иван%'

Добавлено через 2 минуты
А если просто Иванова Иван Иваныча, то
Where FAM='Иванова Иван Иваныча', т.е. используется знак равенства.

ЗЫ. В справке по любому SQL это написано.
ЗЗЫ. Вы спросите зачем Вам SQL ? Затем, что не зная его, Вы будете долго биться как об забор, пытаясь реализовать фильтр через свово TDataSet->Filter

Добавлено через 2 минуты
Delphi
1
Так этот код будет фильтровать по строкам?
Смешной Вы право Представьте, что я Вам позвонил и спросил, что нужно чтобы живот перестал болеть. Вы ответили "пурген". А я через три минуты: так она перестанет хрюкать на весь двор ?
1
0 / 0 / 0
Регистрация: 05.06.2010
Сообщений: 34
23.06.2011, 18:26
Я с Вами вообще запутался и ничего не понял. Пойду дальше гуглить.
Но спасибо

Добавлено через 3 часа 21 минуту
Code
1
2
3
4
5
6
7
8
void __fastcall TForm4::Edit1Change(TObject *Sender)
{
Form4->Table1->Filtered=false;
 
Form4->Table1->Filter="(Name= '"+Edit1->Text+"*')";
 
Form4->Table1->Filtered=true;
}
Я извиняюсь, но помогите довести до ума мой КОД .
Чтобы он фильтровал по строкам.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
24.06.2011, 01:20
Да, тяжелый случай
Тогда вместо Filter (его Вам без SQL не осилить) чисто на си через событие OnFilterRecord
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.06.2011, 01:20
Помогаю со студенческими работами здесь

Поиск по нескольким полям в БД
у меня не получается реализовать поиск по нескольким полям в бд $result = mysql_query (&quot;SELECT id,title, description, text, view,...

Поиск по нескольким полям
Добрый день, столкнулся с дилеммой, не знаю как решить. Суть, делаю поиск по нескольким полям, пишу запрос. SELECT * FROM TABLE WHERE ...

Поиск по нескольким полям
Private Sub cmbFind_Click() Dim StrPoisk As String StrPoisk = &quot;SELECT BasketStats.Дата, BasketStats.Лига, BasketStats.ОТ, BasketStats.,...

Поиск по нескольким полям
Подскажите, пожалуйста, как правильно организовать поиск в бд по нескольким полям? Есть форма, в которую вводятся значения для поиска: ...

Поиск по нескольким полям
Получается, например, я хочу выбрать &quot;Электрика&quot; из выплывающего списка и при нажатии на кнопки хочу чтобы он мне его нашел. Здесь форма...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru