Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.04.2008, 18:13
Аватар для killpretty
killpretty killpretty вне форума
Прохожий
 
Регистрация: 04.11.2007
Сообщения: 33
Репутация: 10
Восклицание Фильтр данных в DbGrid

Плиииз,подскажите,как осуществлять поиск в таблице по первой букве фамилии,например.Необходимо в окне поиска при вводе первой буквы Фамилии таблица выдавала список Фамилий на эту букву..Я нууу просто не знаю..Развожу руками!
Ответить с цитированием
  #2  
Старый 12.04.2008, 18:28
shaman shaman вне форума
Новичок
 
Регистрация: 19.07.2007
Сообщения: 65
Репутация: 5
По умолчанию

Код события OnChange у компонента FilterFamEdit - TEdit (FilterFamEdit - строка поиска)

procedure TStudentForm.FilterFamEditChange(Sender: TObject);
begin
If Length(FilterFamEdit.Text)>0 then
DataModule1.StudentTable.Filtered:=True
else DataModule1.StudentTable.Filtered:=False;
DataModule1.StudentTable.Filter:='Фамилия>'''+Filt erFamEdit.Text+'''';
end;
Ответить с цитированием
  #3  
Старый 12.04.2008, 22:31
Аватар для MegaPiha
MegaPiha MegaPiha вне форума
Активный
 
Регистрация: 24.03.2008
Адрес: Сыктывкар
Сообщения: 227
Репутация: 30
По умолчанию

Цитата:
Сообщение от killpretty
Плиииз,подскажите,как осуществлять поиск в таблице по первой букве фамилии,например.Необходимо в окне поиска при вводе первой буквы Фамилии таблица выдавала список Фамилий на эту букву..Я нууу просто не знаю..Развожу руками!

Можно с помощью Query. Наиболее шустрый метод. Используете компонент Query или ADOQuery, смотря с какой базой работаете.
В событие Edit-а OnKeyUp прописываете
Код:
  s:=edit1.text+'%';
  with Query1 do begin
         Close;
         SQL.Clear;
         SQL.Add('SELECT DISTINCT familia FROM Table');
         SQL.Add('WHERE familia LIKE'+quotedstr(s));
         SQL.Add('ORDER BY familia');
         Open;
  end;
где familia - поле таблицы table. Результат можно выводить в любой DB компонент.

Последний раз редактировалось MegaPiha, 12.04.2008 в 22:34.
Ответить с цитированием
  #4  
Старый 12.04.2008, 22:52
Аватар для Zylex
Zylex Zylex вне форума
Прохожий
 
Регистрация: 06.04.2008
Адрес: Сыктывкар
Сообщения: 33
Репутация: 10
По умолчанию

Цитата:
Сообщение от killpretty
Плиииз,подскажите,как осуществлять поиск в таблице по первой букве фамилии,например.Необходимо в окне поиска при вводе первой буквы Фамилии таблица выдавала список Фамилий на эту букву..Я нууу просто не знаю..Развожу руками!

А вот вам реализация.. для образца.
Вложения
Тип файла: zip familia.zip (16.2 Кбайт, 267 просмотров)
__________________
Программирование - стиль жизни
Ответить с цитированием
  #5  
Старый 13.04.2008, 20:49
Аватар для killpretty
killpretty killpretty вне форума
Прохожий
 
Регистрация: 04.11.2007
Сообщения: 33
Репутация: 10
По умолчанию

Эммм...Проблема в том,что я супер-пупер начинающий программер на Делфи,ниже чайника,я полагаю,и SQL-запросами не баловалась ни разу..Если бы поподробнее кто-нибудь с железными нервами и терпением самаритянина смог объяснить на пальцах,была бы благодарна.Заранее спасибо.
Ответить с цитированием
  #6  
Старый 14.04.2008, 11:20
Аватар для MegaPiha
MegaPiha MegaPiha вне форума
Активный
 
Регистрация: 24.03.2008
Адрес: Сыктывкар
Сообщения: 227
Репутация: 30
По умолчанию

Цитата:
Сообщение от killpretty
Эммм...Проблема в том,что я супер-пупер начинающий программер на Делфи,ниже чайника,я полагаю,и SQL-запросами не баловалась ни разу..Если бы поподробнее кто-нибудь с железными нервами и терпением самаритянина смог объяснить на пальцах,была бы благодарна.Заранее спасибо.
Какой проект вы делаете? И какую базу вы используете (Paradox, Access и т.д.)?
__________________
Тот, кто учится, не размышляя, впадает в заблуждение.
Тот, кто размышляет, не желая учиться, окажется в затруднении.
Ответить с цитированием
  #7  
Старый 14.04.2008, 11:55
xmuriy xmuriy вне форума
Прохожий
 
Регистрация: 12.04.2008
Сообщения: 16
Репутация: 10
По умолчанию

а еще можно вот так

Пусть имеется набор данных table1, с полем fam которое содержит список фамилий сотрудников. Также в приложении имеется окно редактирования EFam в которое будут вводится символы фамилии.Необходимо организовать ускоренный поиск записи по мере ввода фамилии.
В обарботчик события ONchange окна EFam вставляем оператор
Код:
table1.locate('fam',Efam.text,[IoCaseInsensitive,IoPartialKey]);
По меред ввода символов в EFam курсор будет перемещаться на запись, в которой первые символы значения поля Fam будут совподать с введенными. Соответственно в связанном DBGride активная срока будет также перемещаться по записям.
И побоку все SQL запросы.

Последний раз редактировалось xmuriy, 14.04.2008 в 12:03.
Ответить с цитированием
  #8  
Старый 15.04.2008, 13:06
Аватар для killpretty
killpretty killpretty вне форума
Прохожий
 
Регистрация: 04.11.2007
Сообщения: 33
Репутация: 10
По умолчанию

Цитата:
Сообщение от MegaPiha
Какой проект вы делаете? И какую базу вы используете (Paradox, Access и т.д.)?


Делаю диплом по здравпункту..Верне пытаюсь делать.База на Paradox.Осваиваю все сама,потому и очень трудно..
Ответить с цитированием
  #9  
Старый 15.04.2008, 13:25
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
Лампочка

Можно еще и так:
Код:
 with dB_Table do
          begin
          SetKey;
          FieldByName('FIO').Value:=DBEdit1.Text;
          GoToKey;
          dB_Table.Edit;
          end;
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
  #10  
Старый 15.04.2008, 17:13
Аватар для MegaPiha
MegaPiha MegaPiha вне форума
Активный
 
Регистрация: 24.03.2008
Адрес: Сыктывкар
Сообщения: 227
Репутация: 30
По умолчанию

Цитата:
Сообщение от killpretty
Делаю диплом по здравпункту..Верне пытаюсь делать.База на Paradox.Осваиваю все сама,потому и очень трудно..
Какие нибудь попытки, наработки есть?
Опишите задачу, поконкретнее. Какие поля (столбцы) должны быть в таблицах, сколько таблиц? Какие должны быть возможности? По каким полям организовывать поиск?
Для таблиц Paradox используйте компоненты из закладки BDE.
Предлагаю, для начала прочитать основы по созданию баз данных. Например поищите книгу Владимира Гофмана и Анатолия Хоменко "Delphi быстрый старт".
__________________
Тот, кто учится, не размышляя, впадает в заблуждение.
Тот, кто размышляет, не желая учиться, окажется в затруднении.
Ответить с цитированием
  #11  
Старый 16.04.2008, 20:58
Аватар для killpretty
killpretty killpretty вне форума
Прохожий
 
Регистрация: 04.11.2007
Сообщения: 33
Репутация: 10
По умолчанию

Цитата:
Сообщение от MegaPiha
Какие нибудь попытки, наработки есть?
Опишите задачу, поконкретнее. Какие поля (столбцы) должны быть в таблицах, сколько таблиц? Какие должны быть возможности? По каким полям организовывать поиск?
Для таблиц Paradox используйте компоненты из закладки BDE.
Предлагаю, для начала прочитать основы по созданию баз данных. Например поищите книгу Владимира Гофмана и Анатолия Хоменко "Delphi быстрый старт".
Я бы обязательно почитала,если бы было время для этого,но до диплома всего месяца полтора..Многое сделано,но многого и не хватает!Есть таблица с атрибутами:дата,ФИО,диагноз,лечение.Сделать надо для одной таблицы,потом аналогично с другими разберусь сама.Таблица располагается на форме,помимо нее есть DBEdit.Необходимо вводя первые буквы в DBEdit и,например,нажав кнопку поиск,данная таблица фильтровалась,т.е. в ней показывались лишь ФИО с этими начальными буквами.Я уже осуществляла поиск,но проблема в том,что приходится вводить полностью ФИО,только тогда происходит фильтрация данных.Преподавателям не нравится,говорят переделывать иначе...Мучаюсь,ничего не получается
Ответить с цитированием
  #12  
Старый 16.04.2008, 21:26
Аватар для MegaPiha
MegaPiha MegaPiha вне форума
Активный
 
Регистрация: 24.03.2008
Адрес: Сыктывкар
Сообщения: 227
Репутация: 30
По умолчанию

Цитата:
Сообщение от killpretty
Я бы обязательно почитала,если бы было время для этого,но до диплома всего месяца полтора..Многое сделано,но многого и не хватает!Есть таблица с атрибутами:дата,ФИО,диагноз,лечение.Сделать надо для одной таблицы,потом аналогично с другими разберусь сама.Таблица располагается на форме,помимо нее есть DBEdit.Необходимо вводя первые буквы в DBEdit и,например,нажав кнопку поиск,данная таблица фильтровалась,т.е. в ней показывались лишь ФИО с этими начальными буквами.Я уже осуществляла поиск,но проблема в том,что приходится вводить полностью ФИО,только тогда происходит фильтрация данных.Преподавателям не нравится,говорят переделывать иначе...Мучаюсь,ничего не получается
Вам надо использовать не DBEdit а Edit.
Пример фильтрования данных в компоненте Table .
Код:
   Table1.Filtered:=false;
   Table1.Filter:='fam like ' +quotedstr(edit1.Text+'%');
   Table1.Filtered:=true;
__________________
Тот, кто учится, не размышляя, впадает в заблуждение.
Тот, кто размышляет, не желая учиться, окажется в затруднении.
Ответить с цитированием
  #13  
Старый 16.04.2008, 23:48
Аватар для killpretty
killpretty killpretty вне форума
Прохожий
 
Регистрация: 04.11.2007
Сообщения: 33
Репутация: 10
По умолчанию

Цитата:
Сообщение от MegaPiha
Вам надо использовать не DBEdit а Edit.
Пример фильтрования данных в компоненте Table .
Код:
   Table1.Filtered:=false;
   Table1.Filter:='fam like ' +quotedstr(edit1.Text+'%');
   Table1.Filtered:=true;
Хм...я попробовала...Не получается.. Может по незнанию наделала кучу ошибок!Делала,делала!Вот что получилось..

Прописала в Квери:
SELECT * FROM kartabolnih.db
SELECT DISTINCT Fio FROM kartabolnih.db
WHERE Fio LIKE
ORDER BY Fio

В событии Эдита OnKeyUp прописала:
Код:
procedure TForm17.Edit2KeyUp(Sender: TObject;
var Key: Word;
  Shift: TShiftState);
  var   s:string;
begin
  s:='%'+edit2.text+'%'; 
  with Query1 do begin 
         Close;
         SQL.Clear; 
         SQL.Add('SELECT DISTINCT Fio FROM kartabolnih.db'); 
         SQL.Add('WHERE Fio LIKE'+quotedstr(s)); 
         SQL.Add('ORDER BY Fio');
         Open; 
  end;
end; 

Admin: Не забываем про оформление кода!

В итоге,получилось,что прописывать в Эдит прописывает,но ничего не фильтрует Где ошибка моя?

Последний раз редактировалось Admin, 17.04.2008 в 10:18.
Ответить с цитированием
  #14  
Старый 17.04.2008, 02:05
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,480
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

В таком виде вообще должна получать ошибку при переоткрытии запроса (нет пробела после LIKE в строковой константе).
С другой стороны выбранный метот не самый лучший, т.к. требует много времени при большом кол-ве записей в таблице.

Если хочешь фильтровать именно выборку, то лучше сделать так, как сделано в uTorrent.

Бросаешь TEdit куда-нибудь. В нем в OnKeyPress:
Код:
const
  CSQL = 'SELECT DISTINCT Fio FROM kartabolnih.db'#13#10+
             'WHERE Fio LIKE ''%s'''#13#10+
             'ORDER BY Fio';
begin

If Key = #13 Then
  Begin
    Query.Close;
    Query.SQL.Clear;
    Query.SQL.Add(Format(CSQL,['%'+Edit1.Text+'%']));
    Query.Open;
  End;
end;
Admin: Не забываем про оформление кода!

Т.е. получаем, что пользлватель вводит строку поиска, жмет Enter и получает отфильтрованную выборку. Далее можно поиграться с различными переключателями типа "начинается с" и т.д.

Еще один момент. Почитай как отрабатывается LIKE на твоей БД - с учетом регистра или нет (зависит от самой БД). Тогда, возможно надо будет обернуть LIKE в UPPER (для Oracla - WHERE UPPER(FIO) LIKE что-то-там-извне).

Последний раз редактировалось Admin, 17.04.2008 в 10:18.
Ответить с цитированием
  #15  
Старый 17.04.2008, 10:46
Аватар для MegaPiha
MegaPiha MegaPiha вне форума
Активный
 
Регистрация: 24.03.2008
Адрес: Сыктывкар
Сообщения: 227
Репутация: 30
По умолчанию

Цитата:
Сообщение от lmikle
В таком виде вообще должна получать ошибку при переоткрытии запроса (нет пробела после LIKE в строковой константе).
Пробел там не обязателен. Можете проверить.
__________________
Тот, кто учится, не размышляя, впадает в заблуждение.
Тот, кто размышляет, не желая учиться, окажется в затруднении.
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:42.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2019

ВКонтакте   Facebook   Twitter