Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.76/34: Рейтинг темы: голосов - 34, средняя оценка - 4.76
DDim1000
1 / 1 / 0
Регистрация: 17.12.2011
Сообщений: 320
1

Как сделать поиск по всем столбцам в таблице?

29.12.2012, 21:16. Просмотров 6338. Ответов 23
Метки нет (Все метки)

Написал простую программу, которая выводит таблицию из базы данных dbm, сделал поиск в программе, но этот поиск ведется почему-то только в одном столбце "Имя", как сделать так, чтобы поиск был по всем столбцам таблиции? - Фамилия, Имя, Отчество и т.д..
Delphi
1
2
3
4
5
6
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
fs:=fs+key;
dbgrid1.DataSource.DataSet.Locate('Имя', fs, [loPartialKey]);
StatusBar1.Panels.Items[0].Text:='Ищем: '+fs;
end;
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2012, 21:16
Ответы с готовыми решениями:

Как в dbgrid сделать сортировку по столбцам и поиск?
Есть таблица в которой есть столбцы по которым возможна сортировка путем...

Как в делфи после подключения БД Acess Сделать поиск по таблице
Как в делфи после подключения БД Acess Сделать поиск по таблице Добавлено...

Как можно сделать в стандартном DBgrd сортировку по столбцам?
Здравствуйте. Такой вопрос: как можно сделать в стандартном DBgrd сортировку по...

Как сделать удаление по строкам в таблице
Ребят подскажите пожалусто как сделать удаление по строка в таблице БД

как сделать последовательный перебор по записям в таблице?
Уважаемые программисты! Поможите кто может! Мне нужно сделать последовательный...

23
Скандербег
943 / 897 / 299
Регистрация: 07.08.2012
Сообщений: 2,500
29.12.2012, 22:21 2
В Delphi есть справка (help), где, в частности, приводится пример использования метода Locate для поиска по нескольким полям:
Delphi
1
Locate('Company;Contact;Phone', VarArrayOf(['Sight Diver', 'P', '408-431-1000']), [loPartialKey]);
0
DDim1000
1 / 1 / 0
Регистрация: 17.12.2011
Сообщений: 320
30.12.2012, 13:00  [ТС] 3
Цитата Сообщение от Скандербег Посмотреть сообщение
В Delphi есть справка (help), где, в частности, приводится пример использования метода Locate для поиска по нескольким полям:
Delphi
1
Locate('Company;Contact;Phone', VarArrayOf(['Sight Diver', 'P', '408-431-1000']), [loPartialKey]);
Я еще новичок в delphi, поэтому мне сложновато разобраться в справке.

вот так я сделал:
Delphi
1
2
3
fs:=fs+key;
dbgrid1.DataSource.DataSet.Locate('Фамилия;Имя', fs, [loPartialKey]);
StatusBar1.Panels.Items[0].Text:='Ищем: '+fs;
Нажимаю запустить проект, проект запускается, но как только начинаю вводить буквы, выскакивает нижеприведенная ошибка, жму "ОК", у меня выделяется вот эта строка:
Delphi
1
StatusBar1.Panels.Items[0].Text:='Ищем: '+fs;
.
0
Миниатюры
Как сделать поиск по всем столбцам в таблице?  
Скандербег
943 / 897 / 299
Регистрация: 07.08.2012
Сообщений: 2,500
30.12.2012, 13:27 4
Так не пойдет.
Надо в разных компонентах TEdit отдельно ввести: в одном фамилию, в другом имя (в третьем, если надо, что-то другое).
Затем в процедуре, которая запускается по нажатию кнопки (кнопку эту надо разместить на форме и создать процедуру обработки ее события OnClick), выполнить поиск;
Delphi
1
2
3
4
procedure TForm1.Button1Click(Sender: TObject);
begin
  dbgrid1.DataSource.DataSet.Locate('Фамилия;Имя', VarArrayOf([Edit1.Text, Edit2.Text]), [loPartialKey]);
end;
Именно так происходит поиск по нескольким полям.

Поиск по набору - это немного другая история и по двум и более полям ее не делают.
1
DDim1000
1 / 1 / 0
Регистрация: 17.12.2011
Сообщений: 320
30.12.2012, 22:12  [ТС] 5
А можно через форму поиск сделать? Если да, то, что в "ОК" прописать, и как результат увидеть?

Примерно вот так:
0
Миниатюры
Как сделать поиск по всем столбцам в таблице?  
Скандербег
943 / 897 / 299
Регистрация: 07.08.2012
Сообщений: 2,500
30.12.2012, 22:38 6
Можно, но получится громоздко, мало эффективно. Для пользователя такой поиск очень неудобен.
Как правило, TEdit'ы, в которые вводятся тексты для поиска, находится на той же форме, где и DBGrid, в котором отображаются результаты поиска.
0
DDim1000
1 / 1 / 0
Регистрация: 17.12.2011
Сообщений: 320
31.12.2012, 12:08  [ТС] 7
Цитата Сообщение от Скандербег Посмотреть сообщение
Так не пойдет.
Надо в разных компонентах TEdit отдельно ввести: в одном фамилию, в другом имя (в третьем, если надо, что-то другое).
Затем в процедуре, которая запускается по нажатию кнопки (кнопку эту надо разместить на форме и создать процедуру обработки ее события OnClick), выполнить поиск;
Delphi
1
2
3
4
procedure TForm1.Button1Click(Sender: TObject);
begin
  dbgrid1.DataSource.DataSet.Locate('Фамилия;Имя', VarArrayOf([Edit1.Text, Edit2.Text]), [loPartialKey]);
end;
Именно так происходит поиск по нескольким полям.

Поиск по набору - это немного другая история и по двум и более полям ее не делают.
Скажите пожалуйста, я Вас правильно понял, что для каждого столбца таблице нужно на форме разместить по TEdit`у ?
Если да, то как тогда поместить 9 TEdit, или 15 может быть столбцов, на форме?
Или как то можно связать все столбцы в один TEdit?
0
Скандербег
943 / 897 / 299
Регистрация: 07.08.2012
Сообщений: 2,500
31.12.2012, 12:18 8
Понятно, что 15 едитов не размещают на форме.
Если поиск происходит по любой, но одной колонке (а именно так и делают поиск в основном), то достаточно и одного едита.
А управление поиска по колонкам можно сделать либо через RadoButtons, либо по ComboBox, в которых
элементы - это имена полей. Пользователь выбирая какой-либо элемент, тем самым выбирает и
поле, по которому будет происходить поиск.

Таким образом, на форме, в общем случае, максимум будет три компонента:
TEdit для ввода строки поиска;
TRadoButtons или TComboBox для выбора поля поиска;
TButton для запуска процесса поиска.
1
DDim1000
1 / 1 / 0
Регистрация: 17.12.2011
Сообщений: 320
31.12.2012, 15:05  [ТС] 9
Я разместил на Форме TEdit, DBCombaBox и TButton. В свойстве ITems, компонента DBCombaBox, ввел названия столбцов. А сейчас как эти три компонента можно объединить? Как пункты DBCombaBox связать со столбцами таблици? чтоб в выпадающем списке, пункт "Фамилия" относился к столбцу "Фамилия" и т.д.?
0
Миниатюры
Как сделать поиск по всем столбцам в таблице?  
Скандербег
943 / 897 / 299
Регистрация: 07.08.2012
Сообщений: 2,500
31.12.2012, 15:19 10
Delphi
1
2
3
4
procedure TForm1.Button1Click(Sender: TObject);
begin
  dbgrid1.DataSource.DataSet.Locate(ComboBox1.Text, Edit1.Text, [loPartialKey]);
end;
TDBComboBox здесь не нужен, достаточно и TComboBox'а.
0
DDim1000
1 / 1 / 0
Регистрация: 17.12.2011
Сообщений: 320
31.12.2012, 21:55  [ТС] 11
Почему ошибка?:
Delphi
1
dbgrid1.DataSource.DataSet.Locate(Edit1.Text, ComboBox1.Text, [loPartialKey]);
0
Миниатюры
Как сделать поиск по всем столбцам в таблице?  
Скандербег
943 / 897 / 299
Регистрация: 07.08.2012
Сообщений: 2,500
31.12.2012, 22:04 12
Наверное потому что надо поменять местами компоненты:
Delphi
1
dbgrid1.DataSource.DataSet.Locate(ComboBox1.Text, Edit1.Text, [loPartialKey]);
0
DDim1000
1 / 1 / 0
Регистрация: 17.12.2011
Сообщений: 320
31.12.2012, 22:42  [ТС] 13
Цитата Сообщение от Скандербег Посмотреть сообщение
Наверное потому что надо поменять местами компоненты:
Delphi
1
dbgrid1.DataSource.DataSet.Locate(ComboBox1.Text, Edit1.Text, [loPartialKey]);
Поменял местами, но не помогло.....
0
droider
Universal
Эксперт Pascal/Delphi
4405 / 2451 / 765
Регистрация: 04.10.2012
Сообщений: 8,911
01.01.2013, 08:55 14
Не найдено поле с именем "Мамура". Добавьте его.
0
DDim1000
1 / 1 / 0
Регистрация: 17.12.2011
Сообщений: 320
01.01.2013, 13:48  [ТС] 15
Цитата Сообщение от droider Посмотреть сообщение
Не найдено поле с именем "Мамура". Добавьте его.
Что значит, нет поле? Вот посмотрите, у меня в таблице есть столбец "Имя", в котом занесено имя Петр, набираю это имя в поиске, нажимаю найти, и у меня выскакивает эта же ошибка.
А как-то связывать пункты выпадающего меню со столбцами таблицы не нужно?
0
Миниатюры
Как сделать поиск по всем столбцам в таблице?   Как сделать поиск по всем столбцам в таблице?  
droider
Universal
Эксперт Pascal/Delphi
4405 / 2451 / 765
Регистрация: 04.10.2012
Сообщений: 8,911
01.01.2013, 14:36 16
Откуда же берется значение "мамура"?
Цитата Сообщение от DDim1000 Посмотреть сообщение
связывать пункты выпадающего меню со столбцами таблицы не нужно?
не нужно. В ComboBox что у Вас занесено? Покажите список значений.
0
DDim1000
1 / 1 / 0
Регистрация: 17.12.2011
Сообщений: 320
01.01.2013, 16:03  [ТС] 17
Цитата Сообщение от droider Посмотреть сообщение
не нужно. В ComboBox что у Вас занесено? Покажите список значений.
Я в Item ComboBox`a занес названия столбцов, и все.

Фамилия
Имя
Отчество
Телефон
Адрес
ПФамилия
ПИмя
ПТелефон
ПАдрес
0
droider
Universal
Эксперт Pascal/Delphi
4405 / 2451 / 765
Регистрация: 04.10.2012
Сообщений: 8,911
01.01.2013, 18:51 18
По идее все должно работать. В одной из своих программ я делал нечто подобное. Занес в ComboBox точные названия полей, по которым будет вестись поиск, и в событии OnChange (у меня поиск выполнялся сразу при вводе критерия после выбора нужного поля) поля поиска прописал
Delphi
1
2
3
4
5
6
procedure TForm1.FindEditChange(Sender: TObject);
begin
Grid.DataSource.DataSet.Locate(ComboBox1.Text, FindEdit.Text, [loPartialKey, loPartialKey]);
if Length(FindEdit.Text)=0 then
Grid.DataSource.DataSet.First;
end;
Добавлено через 1 минуту
Цитата Сообщение от DDim1000 Посмотреть сообщение
ПФамилия
ПИмя
ПТелефон
ПАдрес
это что за поля?
1
Скандербег
943 / 897 / 299
Регистрация: 07.08.2012
Сообщений: 2,500
01.01.2013, 18:54 19
Но ведь, очевидно (по тексту ошибки), что в первом параметре Locate передается значение строки поиска (Edit1.Text).
Система пытается найти поле, имя которого введено в Edit1.Text. А там не имя поля, а строка поиска.
Т.е. вы НЕ ПОМЕНЯЛИ местами компоненты в вызове Locate.
1
DDim1000
1 / 1 / 0
Регистрация: 17.12.2011
Сообщений: 320
01.01.2013, 19:28  [ТС] 20
Цитата Сообщение от Скандербег Посмотреть сообщение
Но ведь, очевидно (по тексту ошибки), что в первом параметре Locate передается значение строки поиска (Edit1.Text).
Система пытается найти поле, имя которого введено в Edit1.Text. А там не имя поля, а строка поиска.
Т.е. вы НЕ ПОМЕНЯЛИ местами компоненты в вызове Locate.
ОГРОМНОЕ, ОГРОМНОЕ СПАСИБО за помощь, все заработало!!!!!!
0
01.01.2013, 19:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.01.2013, 19:28

Как сделать запрос к таблице созданной на винте?
Я создал таблицу в базе данных, но не на сервере а на своем компе. Пытаюсь...

Как сделать, чтобы счетчик в таблице был по порядку
При добавлении новой записи счетчик присваивает записи нвоый код. как только...

Поиск по всем полям в БД
Как сделать поиск по всем полям в базе данных( DBGrid)


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru