Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2007, 09:48   #1
фЁдОр
Форумчанин
 
Аватар для фЁдОр
 
Регистрация: 06.09.2007
Сообщений: 908
По умолчанию Поиск в таблице БД

Здравствуйте, уважаемые программисты!
У меня возникла такая проблема: в ДБГриде я отображаю таблицу "firm", на этойже форме я размещаю Edit1, для поиска названия фирм, на кнопке для поиска я пишу следующий код:
Код HTML:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  Form1.ADOQueFirmRatissDisk.Active:=false;
  Form1.ADOQueFirmRatissDisk.SQL.Clear;
  Form1.ADOQueFirmRatissDisk.SQL.Add('select *');
  Form1.ADOQueFirmRatissDisk.SQL.Add('from firm');
  Form1.ADOQueFirmRatissDisk.SQL.Add('where firm.name like '''+edit1.text+'''');
  Form1.ADOQueFirmRatissDisk.Active:=true;
end;
Если фирма есть, которая вводится в строку для поиска фирм, то в ДБГриде она отображается - все остальные фирмы исчезают, если же фирмы нет, то в ДБГриде ничего нет - пусто. Как вернуть изначальное отбражение всех фирм в ДБГриде, т.е. если в Edit1 пусто и нажать на кнопку для поиска, то нужно, что бы отобразились все фирмы.
И еще такой вопрос: как сделать так, что бы при вводе в Edit1 названия фирмы, в ДБГриде автоматически производилась сортировка и фирма выводилась в первую строку ДБГрида? Надеюсь, что понятно изложил свою мысль.
фЁдОр вне форума Ответить с цитированием
Старый 06.11.2007, 11:29   #2
Nemon
Армия Рассейская
Форумчанин
 
Аватар для Nemon
 
Регистрация: 06.12.2006
Сообщений: 175
По умолчанию

Цитата:
Сообщение от фЁдОр Посмотреть сообщение
Как вернуть изначальное отбражение всех фирм в ДБГриде, т.е. если в Edit1 пусто и нажать на кнопку для поиска, то нужно, что бы отобразились все фирмы.
ну сделай условие
Код:
if Edit1.text:= '' then
begin
  Form1.ADOQueFirmRatissDisk.Active:=false;
  Form1.ADOQueFirmRatissDisk.SQL.Clear;
  Form1.ADOQueFirmRatissDisk.SQL.Add('select *');
  Form1.ADOQueFirmRatissDisk.SQL.Add('from firm');
  Form1.ADOQueFirmRatissDisk.Active:=true;
end
else
  Form1.ADOQueFirmRatissDisk.Active:=false;
  Form1.ADOQueFirmRatissDisk.SQL.Clear;
  Form1.ADOQueFirmRatissDisk.SQL.Add('select *');
  Form1.ADOQueFirmRatissDisk.SQL.Add('from firm');
  Form1.ADOQueFirmRatissDisk.SQL.Add('where firm.name like '''+edit1.text+'''');
  Form1.ADOQueFirmRatissDisk.Active:=true;
end;
Сделаем ночь ярче!!! - Ракетные войска стратегического назначения
Центральный клуб туристов РВСН
Nemon вне форума Ответить с цитированием
Старый 06.11.2007, 12:01   #3
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
И еще такой вопрос: как сделать так, что бы при вводе в Edit1 названия фирмы, в ДБГриде автоматически производилась сортировка и фирма выводилась в первую строку ДБГрида? Надеюсь, что понятно изложил свою мысль.
Эта ваша мысль противоречит логике организованного вами поиска, поскольку все записи, которые будут выбраны, и только они, и будут отображаться в гриде.
Вообще-то, поиск логичнее было бы организовать через функцию Locate. У нее есть опция, позволяющая искать по части содержимого поля.
Если условие поиска будет выполнено, то курсор позиционируется на похожую запись.
mihali4 вне форума Ответить с цитированием
Старый 06.11.2007, 12:11   #4
фЁдОр
Форумчанин
 
Аватар для фЁдОр
 
Регистрация: 06.09.2007
Сообщений: 908
По умолчанию

Спасибо большое, Nemon! Все получилось. Блин, логика совершенно отсутствует.
фЁдОр вне форума Ответить с цитированием
Старый 06.11.2007, 12:27   #5
фЁдОр
Форумчанин
 
Аватар для фЁдОр
 
Регистрация: 06.09.2007
Сообщений: 908
По умолчанию Цитата:

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Эта ваша мысль противоречит логике организованного вами поиска, поскольку все записи, которые будут выбраны, и только они, и будут отображаться в гриде.
Вообще-то, поиск логичнее было бы организовать через функцию Locate. У нее есть опция, позволяющая искать по части содержимого поля.
Если условие поиска будет выполнено, то курсор позиционируется на похожую запись.
mihali4, дело в том, что я хочу, что бы была возможность поиска фирм:
1. при вводе символов в edit1, т.е. наименования фирмы и в это время ДБГрид фильтровался, т.е. в первой строке выводились символы, т.е. фирма, которую пользователь вводит в Edit1
2. пользователь в edit1 вводит название фирмы и по нажатию кнопки в ДБГриде выводится только эта фирма, хотя я согласен, что это будет лишним если будет реализован первый способ.

А что касается по поводу поиска части содержимого поля, то использую знак %-та. Вот пример:
Код HTML:
Form1.ADOQueFirmRatissDisk.Active:=false;
  Form1.ADOQueFirmRatissDisk.SQL.Clear;
  Form1.ADOQueFirmRatissDisk.SQL.Add('select *');
  Form1.ADOQueFirmRatissDisk.SQL.Add('from firm');
  Form1.ADOQueFirmRatissDisk.SQL.Add('where firm.name like ''%'+edit1.text+'%''');
Может быть это и не правильно, но это работает.

Последний раз редактировалось фЁдОр; 06.11.2007 в 12:32.
фЁдОр вне форума Ответить с цитированием
Старый 06.11.2007, 12:56   #6
Nemon
Армия Рассейская
Форумчанин
 
Аватар для Nemon
 
Регистрация: 06.12.2006
Сообщений: 175
По умолчанию

Цитата:
Сообщение от фЁдОр Посмотреть сообщение
Может быть это и не правильно, но это работает.
Зря наезжаешь на Михалыча. Locate действительно очень удобно использовать для поиска
Сделаем ночь ярче!!! - Ракетные войска стратегического назначения
Центральный клуб туристов РВСН
Nemon вне форума Ответить с цитированием
Старый 06.11.2007, 13:14   #7
фЁдОр
Форумчанин
 
Аватар для фЁдОр
 
Регистрация: 06.09.2007
Сообщений: 908
По умолчанию Цитата:

Цитата:
Сообщение от Nemon Посмотреть сообщение
Зря наезжаешь на Михалыча. Locate действительно очень удобно использовать для поиска
Nemon, у меня и в мыслях такого не было. Совсем напротив, я уважаю Михалыча и очень благодарен ему за помощь, так же как и Вам я тоже очень признателен за оказаннюу помощь. Просто в справочнике по SQL'у, который я сейчас использую, был описан метод поиска только "LIKE" и не слова про "Locate", но я давно еще читал в другом справочнике про этот метод, только про него совсем забыл.

Последний раз редактировалось фЁдОр; 06.11.2007 в 13:17.
фЁдОр вне форума Ответить с цитированием
Старый 06.11.2007, 13:25   #8
Rik
Форумчанин
 
Аватар для Rik
 
Регистрация: 28.07.2007
Сообщений: 361
По умолчанию

Цитата:
Сообщение от фЁдОр Посмотреть сообщение
mihali4, дело в том, что я хочу, что бы была возможность поиска фирм:
1. при вводе символов в edit1, т.е. наименования фирмы и в это время ДБГрид фильтровался, т.е. в первой строке выводились символы, т.е. фирма, которую пользователь вводит в Edit1
2. пользователь в edit1 вводит название фирмы и по нажатию кнопки в ДБГриде выводится только эта фирма, хотя я согласен, что это будет лишним если будет реализован первый способ.

А что касается по поводу поиска части содержимого поля, то использую знак %-та. Вот пример:
Код HTML:
Form1.ADOQueFirmRatissDisk.Active:=false;
  Form1.ADOQueFirmRatissDisk.SQL.Clear;
  Form1.ADOQueFirmRatissDisk.SQL.Add('select *');
  Form1.ADOQueFirmRatissDisk.SQL.Add('from firm');
  Form1.ADOQueFirmRatissDisk.SQL.Add('where firm.name like ''%'+edit1.text+'%''');
Может быть это и не правильно, но это работает.
Работать-то работает, но вы тем самым издеваетесь над сервером и сетью. При каждом изменении текста в Edit1 сервер получает новый запрос, компилирует, ищет данные и передает клиенту.
Если не устраивает Locate, должна быть возможность фильтровки локального буфера на стороне клиента. Попробуйте воспользоваться свойствами Filter и Filtered.

Задаем в свойстве ADOQueFirmRatissDisk.SQL: select * from firm
С помощью этого запроса тянем все записи из таблицы Firm на сторону клиента один раз и больше запрос не трогаем.

procedure TForm1.Edit1Change(Sender: TObject);
begin
if Edit1.Text = '' then
ADOQueFirmRatissDisk.Filtered = False
else
begin
ADOQueFirmRatissDisk.Filter := 'NAME=''' + Edit1.Text + '*''';
ADOQueFirmRatissDisk.Filtered := True;
end;

end;
При изменении Edit1.Text запрос будет фильтроваться на стороне клиента в локальном буфере. Если Edit1.Text = 'ЗАО', в гриде вы должны увидеть только строки начинающиеся с ЗАО. Очистите поле Edit1 и вернетесь к исходному виду...

Но лично мне Locate нравится больше...

Последний раз редактировалось Rik; 06.11.2007 в 13:28.
Rik вне форума Ответить с цитированием
Старый 06.11.2007, 14:16   #9
фЁдОр
Форумчанин
 
Аватар для фЁдОр
 
Регистрация: 06.09.2007
Сообщений: 908
По умолчанию

Цитата:
Сообщение от Rik Посмотреть сообщение
Если не устраивает Locate...
Я же не говорю, что меня Locate не устраивает, он вообще вылетел у меня из головы, а справочнике описан только LIKE. Но я не пременно последую Вашему совету, раз все так его хвалят.

Последний раз редактировалось фЁдОр; 06.11.2007 в 14:25.
фЁдОр вне форума Ответить с цитированием
Старый 06.11.2007, 14:24   #10
фЁдОр
Форумчанин
 
Аватар для фЁдОр
 
Регистрация: 06.09.2007
Сообщений: 908
По умолчанию

Большое всем спасибо! Nemon'y, mihali4'y, Rik'y. Извеняйте если, что не так. Я решил сделать поиск только по нажатию кнопки через Locate.
фЁдОр вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск слова в таблице (datagridview) kommunist Общие вопросы .NET 4 11.04.2010 20:38
Поле в таблице s.mag БД в Delphi 7 15.05.2008 18:23
поиск в таблице puma Помощь студентам 3 22.04.2008 23:56
Поиск в таблице Voffka БД в Delphi 1 08.05.2007 01:16
поиск и замена в неиндексированной таблице Dbase Iv Deicider БД в Delphi 2 07.12.2006 23:18