Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/83: Рейтинг темы: голосов - 83, средняя оценка - 4.60
7 / 7 / 0
Регистрация: 22.10.2009
Сообщений: 51

Быстрый поиск и вопрос по locate

18.01.2010, 15:46. Показов 17264. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
1) Как организовать быстрый поиск в делфях, наподобие как в 1С, т.е. при вводе в эдит значения, чтобы в дбгриде оставались строки подпадающие под значение эдита ?

2) Думал использовать locate, вешал его на событие onChange Edit'a вот код:

при котором компилятор начинал ругаться на loPartialKey
Delphi
1
   DataModule1.Table1.Locate('Pole', Edit1.Text,[loPartialKey]);
при котором поиск работает, но ищет только полное совпадение
Delphi
1
   DataModule1.Table1.Locate('Pole', Edit1.Text,[]);
а нужен поиск как в п.1.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.01.2010, 15:46
Ответы с готовыми решениями:

Вопрос по функции locate
Здравствуйте, мне для курсового проекта нужно реализовать в БД авторизацию. Логины и пароли, а также настройки права доступа хранятся в...

Поиск по полю, Locate
Доброго времени суток! Не Выполняется почему то условие(( .. всегда дает редактировать.. Кликая по строке в Dbgrid Открываться...

Поиск методом locate
DataModule2.Table1.Locate('Adresa',Edit1.Text,); подскажите пожалуйста как сделать чтобы можно было найти улицу и при этом не указывать...

25
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
18.01.2010, 15:56
Я бы в этой ситуации использовал свойство Filtered в сочетании с отработчиком OnFilterRecord
При этом в обработчике должно быть приблизительно следующее

Delphi
1
Accept := Pos(AnsiUpperCase(Edit1.Text), AnsiUpperCase(Table1.FieldByName('Pole1').AsString))=1;
В обработчике Edit1.OnChange

Delphi
1
2
Table1.Filtered := false;
Table1.Filtered := true;
1
7 / 7 / 0
Регистрация: 22.10.2009
Сообщений: 51
18.01.2010, 16:08  [ТС]
не понял с событием onChange ?
эти строки так и записать в процедуру onChange?
Delphi
1
2
Table1.Filtered := false; 
Table1.Filtered := true;
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
18.01.2010, 18:01
У компоненты TEdit есть событие OnChange. Создаете обработчик этого события. Он может выглядеть, напрмер, так

Delphi
1
2
3
4
5
procedure TForm1.Edit1Change(Sender: TObject);
begin
  Table1.Filtered := false; 
  Table1.Filtered := true;
end;
Это в предположении, что вы обрабатываете объект Edit1 типа TEdit, расположенный на форме TForm1. При этом при любом изменении Edit1 будет производиться перефильтрация Table1. При фильтации для отбора данных автоматически будет вызываться OnFilterRecord, в котором и сравнивается поле из Table1 и содержимое Edit1
1
7 / 7 / 0
Регистрация: 22.10.2009
Сообщений: 51
19.01.2010, 14:08  [ТС]
вот теперь понял

Добавлено через 19 часов 21 минуту
все работает, но только при очистке Edit'а - DBGrid остается пустой, данные грида не возвращаются на место , рэфрэш, апдейт не помогают
0
1866 / 1186 / 192
Регистрация: 27.03.2009
Сообщений: 4,603
19.01.2010, 14:37
я делал немного по другому. по запросу.типа так при onchange:
Delphi
1
2
if length(edit1.text)=0 then sql.add('select * from table1') else sql.add('select * from table1 there поле like "%'+edit1.text+'%"');
dbgrid1.repaint;
1
7 / 7 / 0
Регистрация: 22.10.2009
Сообщений: 51
19.01.2010, 15:18  [ТС]
а можно как то обойтись без sql-запросов?
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
19.01.2010, 15:41
Life_Master, можно переоткрыть источник данных, который привязан к дбгриду и по идее отображение обновиться
1
1866 / 1186 / 192
Регистрация: 27.03.2009
Сообщений: 4,603
19.01.2010, 15:55
можно и так. только в этом случает будет притармаживать
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
19.01.2010, 18:11
Измени OnFilterRecord

Delphi
1
Accept := (Edit1.Text = '') or (Pos(AnsiUpperCase(Edit1.Text), AnsiUpperCase(Table1.FieldByName('Pole1').AsString))=1);
и будет тебе счастье
1
5 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 256
09.02.2025, 17:21
Цитата Сообщение от SAMZ Посмотреть сообщение
Accept := Pos(AnsiUpperCase(Edit1.Text), AnsiUpperCase(Table1.FieldByName('Pole1' ).AsString))=1;
Поиск происходит начиная с начала Edit-а. А как сделать чтобы поиск был и по фамилии и по имени и по отчеству?
Они есть как и в отдельных полях так и в об одном поле объеденные.
Если ставить три Accept то поиск все равно будет происходить по последнему.
0
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
09.02.2025, 17:31
Цитата Сообщение от Volhv Посмотреть сообщение
А как сделать чтобы поиск был и по фамилии и по имени и по отчеству?
сделать соответствующее условие либо в onfilterrecord, либо в запросе
0
5 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 256
09.02.2025, 17:34
Аватар, какое условие?
0
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
09.02.2025, 17:47
поиска конечно, или там другие какие-то?
0
5 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 256
09.02.2025, 21:08
Аватар, нет. Все точно также поиск по тексту из EDIT-а.
Просто надо сделать что бы поиск был и по имени отдельно и по фамилии отдельно и по отчеству отдельно. То есть что бы искал сходство в трех полях и показывал тоже по всем трем полям а не по последнему.
0
 Аватар для Аватар
5393 / 1465 / 513
Регистрация: 31.05.2012
Сообщений: 5,153
09.02.2025, 21:39
чего там нет если да. тебе нужно чтобы выполнилось одно из трех условий. по одному условию уже нарисовали. точно три таких же, но по разным полям, соединенных операндом OR
0
5 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 256
09.02.2025, 21:55
Цитата Сообщение от Аватар Посмотреть сообщение
соединенных операндом OR
Как?
0
Модератор
 Аватар для D1973
9903 / 6441 / 2454
Регистрация: 21.01.2014
Сообщений: 27,342
Записей в блоге: 3
10.02.2025, 07:15
Цитата Сообщение от Volhv Посмотреть сообщение
Как?
Примерно так:
Delphi
1
2
3
4
var s: String;
...
s := AnsiUpperCase(Trim(Edit1.Text));
Accept := (s = EmptyStr) or (Pos(s, AnsiUpperCase(DataSet['Pole1']))=1) or (Pos(s, AnsiUpperCase(DataSet['Pole2']))=1) or (Pos(s, AnsiUpperCase(DataSet['Pole3']))=1);
Добавлено через 11 минут
 Комментарий модератора 
Volhv, не надо откапывать мертвые темы и пытаться задавать вопросы тем, кто уже несколько лет не заходил на форум. Есть вопрос - создайте свою тему и задайте его.
1
5 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 256
10.02.2025, 12:23
Цитата Сообщение от D1973 Посмотреть сообщение
(s = EmptyStr)
А вот это условие зачем здесь?

Все понял зачем!!!
0
Модератор
 Аватар для D1973
9903 / 6441 / 2454
Регистрация: 21.01.2014
Сообщений: 27,342
Записей в блоге: 3
10.02.2025, 12:30
Затем, чтобы перевывести весь НД в случае, когда в строку ввода ничего не введено.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.02.2025, 12:30
Помогаю со студенческими работами здесь

Поиск методом Locate
Ребята помогите с таким делом: выполняю курсовую работу на тему салон сотовых телефонов ,ну это не важно в прочем то но у меня возникла...

Поиск методом Locate: маски
Делаю игру - города, поиск через локейт. 39 строчка работает нормально, аналогичная, но 62-ая нет, в чем ошибка? Проект компилируется,...

Поиск записей в БД. Метод Locate
Для поиска по базе данных в своем приложении я решил воспользоваться методом Locate. Его описание я нашел в книге Архангельского, вот какой...

ADOTable.Locate, приближенный поиск
Здравствуйте, помогите пожалуйста сделать приближенный поиск. Это значит если нет...

Поиск по TADOTable (не с помощью Locate())
Интересует, есть ли какой-нибудь метод у TADOTable, с помощью которого можно было бы найти все записи по необходимым критериям (к примеру...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru