Форум: "Базы";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];
ВнизПоиск в базе Найти похожие ветки
← →
mavor © (2004-10-19 13:33) [0]Здравствуйте!
Скажите пожайлуста как организовать ТаКоЙ поиск в базе.
При Вводе первой буквы (допустим Фамилии - Петров) в TEdit сразу начинала подбирать Пет....
Всем спасибо
← →
Val © (2004-10-19 13:38) [1]like,findnext,locate...
← →
mavor © (2004-10-19 13:44) [2]а можно хотя бы Пример или URL !?? Спасибо
← →
mavor © (2004-10-19 13:44) [3]Удалено модератором
← →
Sergey13 © (2004-10-19 13:48) [4]2mavor © (19.10.04 13:33)
>При Вводе первой буквы (допустим Фамилии - Петров) в TEdit сразу начинала подбирать Пет....
Т.е. ты ввел "П", а "ет" уже сама программа подставила? 8-)
← →
mavor © (2004-10-19 13:53) [5]нет. В базе не один допустим Петров есть правильно, правильно.
(Петровский, Поглобов :)) и т.д.). При вводе Петро.. он в Сombox сразу выдавал бы список.
← →
RDen (2004-10-19 14:03) [6]Один из вариантов: в OnCreate формы, например, заполнить Сombox всеми значениями фамилий (для удобства выбора Сombox.Sorted := True). Дальше Locate, Filter и.т. Всё, если правильно понял задачу.
з.ы. и TEdit не нужен...
← →
mavor © (2004-10-19 14:07) [7]а пример можно :((
← →
RDen (2004-10-19 14:30) [8]procedure TForm1.FormCreate(Sender: TObject);
begin
Table1.First;
for i:=0 to table1.RecordCount - 1 do
begin
ComboBox1.Items.Add(Table1.FieldByName"FIO").AsString);
Table1.Next;
end;
end;
ComboBox1 заполнен фамилиями и при вводе текста будет выбираться наиболее подходящая строка.
дальше, например, по нажатию Button:
if Table1.Locate("FIO", ComboBox1.Text, [loCaseInsensitive]) Then .....
← →
mavor © (2004-10-19 14:38) [9]Большое спасибо.
← →
MAVOR © (2004-10-20 09:22) [10]В Combox работает. А как организовать в TEdit ???
← →
msguns © (2004-10-20 10:46) [11]Мне очень понравился "поисковик", который лично я позаимствовал у Соловьева (у кого он взял - не говорит, мурзилка !).
Смысл прост. При выборе фичи "Поиск" создается поисковая формочка с едитом для ввода маски поиска и список типа TListBox (для солидности можно прикрутить вместо простого списка стрингрид)., который при создании формы делается невидимым. Комбобокс со списком доступных полей НД, куда по OnCreate загнать тесты титулов колонок грида, отображающего НД. Узер будет выбирать колонку для поиска именно через этот контрол. И еще радиогруппа "Режим поиска" с несколькими пунктами (например, "Поиск по контексту", "Регистрочувствительность", "Полное совпадение" и т.д.) Если узер выбирает по контексту, то при изменении содержимого едита на НД выполняется метод Locate, если поиск не контекстный, а типа по кнопке "Искать" на этой же формочке, то
1. Создается отдельный запрос к данным, отображаемым в гриде с таким же текстом, но с добавлением в группу WHERE предиката, "сложенного" из названия поля, где надо делать поиск и собственно значения из едита.
2. Запрос запускается.
3. По полученному датасету методом While not EOF Do ... Next ..
перебираются записи и 2 поля (ID и содержимого поля поиска)
запоминаются в динамически созданном массиве.
4. Из массива содержимое поля поиска переносится в листбокс, который делается видимым. В результате узер увидит в этом окне все найденные значения поля НД, соответствующие введенному им условию.
5. По клику на листбоксе делается поиск и позиционирование в исходном гриде (листбокс->текущий индекс->массив записей->значение ID->подстановка в соотв.Locate для позиционирования курсора исходного НД)
Такая схема поиска на порядок лучше, чем реализованная по методу "Искать первую/след/пред" хотя бы тем, что видно СКОЛЬКО записей соответствует условию, все они расположены компактно, а не размазаны по "живой" таблице, и очень удобно по этому списку смотреть записи грида, просто перемещаясь по списку.
Если на эту формочку добавить еще фичи сортировки и фильтрации, то получается весьма неплохая муля в принципе для любых НД.
← →
mavor © (2004-10-20 11:37) [12]Вообще здорово было бы, если бы Пример Готовый был (zip,rar :))
← →
-=SS=- © (2004-10-20 11:45) [13]Если по работе с базой данных, я бы написай кратенький SQL запрос (Компонент ТQuery) "selest * from FIO where like "+"%"+Edit1.Text+"%"
Изюменка тут в %
← →
msguns © (2004-10-20 12:02) [14]>mavor © (20.10.04 11:37) [12]
Все мои "примерчики" тяжеловаты будут для пересылки. Во-первых, все проги работают с базами. Т.е. к проге надо еще высылать и GDB (или MDB). Если не проинсталенный IB, значит надо еще и инсталлить. Кроме того, проекты полностью содержат по нескольку десятков форм, связи между которыми не всегда тривиальны и читаются "на лету". Сам же модулек "весит" под полторы тыщи строк кода и опять же весьма непрозрачен в отрыве от других частей (юнитов) проекта. ЧТО же пересылать ?
← →
Sergey13 © (2004-10-20 13:13) [15]2[12] mavor © (20.10.04 11:37)
>Вообще здорово было бы, если бы Пример Готовый был (zip,rar :))
Вообще здорово было бы книжек почитать.
Ты вот разъясни например свой "поиск в базе". Что такое "база" в твоем понимании? Искать можно в таблице. Причем можно искать в уже полученом на клиенте наборе данных - это один поиск, можно искать в таблице на сервере (если к dBase, FoxPro это можно сказать 8-), т.е. в данных которых на клиенте еще нет. Это другой поиск. Для обоих видов поиска тебе все сказали уже в [1].
← →
mavor © (2004-10-20 13:18) [16]эхх..:(( Может где нибудь в Инете есть.Я сам скачаю.
← →
Sergey13 © (2004-10-20 13:27) [17]2[16] mavor © (20.10.04 13:18)
>эхх..:(( Может где нибудь в Инете есть.Я сам скачаю.
ИМХО, лишний трафик. 8-)
← →
msguns © (2004-10-20 13:29) [18]>Sergey13 © (20.10.04 13:13) [15]
>Ты вот разъясни например свой "поиск в базе". Что такое "база" в твоем понимании? Искать можно в таблице
Неправда ваша.. В объектных БД понятие "таблица" как хранилище логически цельных данных отсутствует напрочь. И поиск конкретных данных осуществляется именно "по базе"..
С уважением.
← →
Sergey13 © (2004-10-20 13:34) [19]2[18] msguns © (20.10.04 13:29)
>В объектных БД понятие
Ты считаешь это тот случай? 8-)
← →
msguns © (2004-10-20 13:37) [20]>Sergey13 © (20.10.04 13:34) [19]
>Ты считаешь это тот случай? 8-)
Нет, не считаю. Но приколоться можно ? А заодно себя "умным" показать ?ж))
← →
MAVOR © (2004-10-22 14:08) [21]А всё таки, как можно реализовать через TEdit.
Спасибо.
← →
Sergey13 © (2004-10-22 14:10) [22]2[21] MAVOR © (22.10.04 14:08)
В Галилеи метишь?
А все таки она вертится. 8-)
← →
msguns © (2004-10-22 14:20) [23]Ну на тебе выдранный по-живому "примерчик":
procedure TfrmService.edSampleChange(Sender: TObject);
// Поиск в текущем НД
var
fld: TField;
begin
if (not chbImmidt.Checked) or (TEdit(Sender).Text="") then exit;
with Serv_SourceDS do
if Locate(PFldDefs(FindFieldInList("",cmbColumn.Text))^.DBName,TEdit(Sender).Text,[loPartialKey]) then
// В гриде с ИНД сделать активной колонку поиска
with Serv_DispayControl do
if not (dgRowSelect in Options) then
begin
fld := Serv_SourceDS.FieldByName(PFldDefs(FindFieldInList("",cmbColumn.Text))^.DBName);
SelectedField := fld;
end;
end;
Поле, по которому ищется, определяется через массив записей, который (точнее, только название колонки грида) выбирается узером в комбобоксе
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.034 c