Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.067 c
4-1097509885
TeNY
2004-10-11 19:51
2004.11.21
Как установавить саретку в TMemo в нужное положение


11-1081961840
Delphi5.01
2004-04-14 20:57
2004.11.21
Application.ProssesMessage в KOL?


3-1098788193
andr_
2004-10-26 14:56
2004.11.21
Dbgrid


4-1097491005
rainy_2002'
2004-10-11 14:36
2004.11.21
Как получить информацию о пользователе?


14-1099658239
}|{yk
2004-11-05 15:37
2004.11.21
Суперзагадка дня





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский