Продолжаем работу с базами данных. На этот раз, хотел бы рассмотреть фильтрацию данных в БД. Вообще, хотелось бы поговорить, для чего она предназначена, а также способы фильтрации данных, другими словами поиска данных в БД, с использованием технологии ADO.

Как, я уже говорил, на мой взгляд, фильтрация данных – это, грубо говоря, поиск данных. Но фильтрация данных проходит гораздо быстрее, чем обычный поиск по всей БД, с перебором каждой записи.
Давайте в этой статье и рассмотрим, как быстро можно осуществлять поиск данных, даже если БД имеет большой объем.
Ну, как я уже говорил, это фильтрация данных, кроме этого можно поиск организовать с помощью sql-запросов и с помощью функции Locate. Не забываем, что сейчас мы разговариваем про технологию ADO.

Давайте вернемся к нашему проекту, на форме у меня следующие компоненты:

  • TADOConnection
  • TADOQuery
  • TDBGrid
  • TButton
  • TDataSource

Создадим в MS Access произвольную базу данных и таблицу в ней. У меня она получилась, следующей структуры:

Теперь необходимо сделать подключение к нашей БД, как это делать, мы рассматривали в данной статье, а также необходимо связать между собой компоненты. Для этого, выделяем компонент TADOQuery и в свойстве Connection, выбираем компонент TADOConenction. Далее, выделяем компонент TDataSource и в свойстве выбираем компонент TADOQuery. Затем, выделяем компонент TDBGrid и в свойстве DataSet выбираем компонент TDataSource. Все подключение к нашей БД настроено, теперь приступаем к поиску данных.

Первый способ

Фильтрация данных

Ну, тут много говорить не буду, уже итак все сказал, что фильтрация данных — это тот же поиск по определенному условию, который указывается в свойстве Filter, например

procedure TForm1.Button1Click(Sender: TObject);
begin
   ADOQuery1.Filtered:=True;
   ADOQuery1.Filter:='names='+'''Andrey''';
end;

В данном свойстве, указывается поле, которое необходимо фильтровать и условия отбора. Работает достаточно быстро, при большом количестве записей. Не забываем, что его необходимо еще и активировать Filtered:=True

Второй способ

С помощью SQL-запросов

Ну, тут, я много ничего не буду говорить, так как мы много рассматривали подобных примеров, просто выбираем записи, по определенному условию, например:

procedure TForm1.Button2Click(Sender: TObject);
begin
   ADOQuery1.SQL.Clear;
   ADOQuery1.SQL.Add('SELECT * FROM Test WHERE names=''Andrey''');
   ADOQuery1.Active:=True;
end;

Тут будут найдены записи, которые полностью удовлетворяют условию, а чтобы были найдены записи, по начальному совпадению, то необходимо использовать LIKE, например:

procedure TForm1.Button2Click(Sender: TObject);
begin
   ADOQuery1.SQL.Clear;
   ADOQuery1.SQL.Add('SELECT * FROM Test WHERE names LIKE ''%Andr%''');
   ADOQuery1.Active:=True;
end;

Данным способом, будут выбраны все записи, которые начинаются на Andr.

Третий способ

С помощью функции Locate

Есть также, замечательная функция, которая позволяет также находить записи по неполному совпадению, например:

procedure TForm1.Button3Click(Sender: TObject);
begin
   if ADOQuery1.Locate('names','Andr',[loCaseInsensitive,loPartialKey])=True then
    begin
     ShowMessage('True');
    end;
end;

Ну вот такая небольшая заметка, по поиску данных в БД, с использованием ADO. Исходники выкладывать не буду, так как тут итак, думаю, все понятно.


Метки: , , , , , , , ,




К записи “Работа с ADO в Delphi. Часть 7. Фильтрация данных” оставлено комментариев: 28.

  1. Партнер:

    так как тут итак, дума, все понятно. Андрей исправь слова дума на думаю. А то напишут что много ошибок.

  2. zerdalert:

    Интересный урок, а про конвертацию (ADO DBGridEh) Access в Excel расскажешь?

  3. Андрей:

    Locate — это никакая не фильтрация, а поиск.
    А название статьи — фильтрация данных.

    Если говорить о фильтрации — то есть ещё способ:
    событие OnFilterRecord.
    В случае фильтрации, скажем, по вычисляемому полю, без него и не обойдёшься. Но в нём свои минусы — например, непонятно как считать количество отфильтрованных записей.

    • Andrey53:

      я объеденил и поиск и фильтрацию, так как фильтрация — тот же самый поиск по условию

  4. Юра:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    ADOTable1.Filtered:=True;
    ADOTable1.Filter:=ComboBox1.text+Edit1.text;
    end;

    почему неработает ?

  5. Юра:

    в Combobox поля в Edit критерий поиска , както так)

  6. Юра:

    я на admin@devdelphi.ru отправлял)

  7. Владимр:

    Здраствуйте, не могу разобраться как применить параметры к инструкцие «Like». Ошибка:ненайден параметр. может, подскажите или дадите ссылочку на стороний ресурс.
    Заранее благодарю.

    • Andrey53:

      Вы возможно не правильно проставляете количество кавычек, либо же знак процентов, покажите полностью Ваш запрос

      • Владимр:

        DMU.DM.AQ1.SQL.Clear;
        DMU.DM.AQ1.SQL.Add(‘SELECT * FROM [order] WHERE adrees like »%’+':pcr’+»%» ‘);
        DMU.DM.AQ1.Parameters.ParamByName(‘pcr’).Value:=edit1.Text;
        DMU.DM.AQ1.ExecSQL;

        • Andrey53:

          Что это за кавычки такие в запросе? — », и зачем через параметр? можно сразу Edit1.text

          ‘SELECT * FROM order WHERE adrees like %»’+Edit1.text+»’%’

          И что за СУБД у Вас?

  8. Abl:

    Здравствуйте. можете привести простой пример по сортировке по возрастанию и убыванию? может вы видео уроки запищите? уверен народ будет с удовольствием смотреть.

  9. Last_kamikadze:

    помогите пожалуйста почему при запросе:
    ‘SELECT * FROM pacientybase WHERE ФИО LIKE »%Edit3.Text%»’
    выдает пустое поле?

  10. aigera:

    можите подсказать как можно связать две таблицы через button в Ado?
    Очень щчунь надо прошу вас!!!!!!!!!!!!

  11. Сергей:

    По фильтрации данных, вот еще неплохая статья http://devel.comeze.com/index.php?action=filter

  12. Марина:

    Большое спасибо, Андрей!
    Отличные лекции! Очень все доступно и проиллюстрировано.

    В Дельфи давно, но с БД второй день, и благодаря Вам почти все написано.

Оставить комментарий

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*