Базы Данных с нуля
Фильтрация набора данных

Фильтрация набора данных предназначена для отбора записей удовлетворяющих условию установленного фильтра. Delphi позволяет осуществлять два вида фильтрации: фильтрация по выражению и фильтрация по диапазону.

При использовании фильтра по выражению в набор данных попадают записи, удовлетворяющие выражению фильтра. Фильтрация по выражению применима ко всем полям БД, даже к индексированным. Для задания условия фильтра используется свойство Filter. Но, при задании условия фильтра, набор данных не будет содержать записи, удовлетворяющие условию фильтра. Для того чтобы включить режим фильтрации нужно воспользоваться свойством Filtered логического типа. Это свойство "включает" и "выключает" фильтрацию. По умолчанию это свойство имеет значение False и условия фильтра игнорируются.

Фильтр представляют собой строковое выражение, в состав которого входят имена полей, операции сравнения, возможные арифметические и логические операции, круглые и квадратные скобки. Квадратные скобки, в основном, применяются тогда, когда имя поле БД содержит пробелы.

В качестве операторов сравнения используются отношения: < (меньше), > (больше), = (равно), >= (больше или равно), <= (меньше или равно), <> (не равно). В качестве арифметических операций используются: + (сложение), - (вычитание), * (умножение), / (деление). А в качестве логических операторов: AND, OR, NOT, то есть логические И, ИЛИ, НЕ.

Фильтрацию можно проводит также и на этапе разработки приложения через Инспектор объектов. Если выражение фильтра содержит ошибку, то это приводит к возникновению исключительной ситуации. Для дополнительной обработки процесса фильтрации можно использовать событие onFilterRecord.

В качестве параметров фильтрации можно использовать следующие параметры:

  • foCaseInsensitive - Регистр букв не учитывается.
  • foNoPartialCompare - Проверки на полное соответствие содержимого поля.

По умолчанию все параметры отключены. Для того чтобы отобразить все записи набора данных после фильтрации можно установить свойству Filtered значение False, либо в качестве условия фильтра указать пустое значение. Если известны только первые символы значения некоторого поля, то в этом случае нужно указать символ * (звездочка) после значения условия фильтрации. Рассмотрим пример простой фильтрации:

procedure TForm1.ButtonFilterClick(Sender: TObject);
Var Str: String;
begin
 Table1.Filtered:=True;
 Table1.FilterOptions:=[foCaseInsensitive];
 Str:=#39 + 'Москва' + #39;
 Table1.Filter:='Code >= 2 OR Town = ' + Str;
end;

procedure TForm1.ButtonNotFilterClick(Sender: TObject);
begin
 Table1.Filtered:=False;
 Table2.Filter:='';
end;

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

procedure TForm1.Button3Click(Sender: TObject);
Var Field1, Field2, Field3,
    Field4, Field5, Uslovie: String;
begin
 If Edit1.Text <> '' Then Edit1.Text:=Chr(39) + Edit1.Text + Chr(39);
 If Edit2.Text <> '' Then Edit2.Text:=Chr(39) + Edit2.Text + Chr(39);
 If Edit3.Text <> '' Then Edit3.Text:=Chr(39) + Edit3.Text + Chr(39);
 If Edit4.Text <> '' Then Edit4.Text:=Chr(39) + Edit4.Text + Chr(39);
 If Edit5.Text <> '' Then Edit5.Text:=Chr(39) + Edit5.Text + Chr(39);

 If CheckBox1.Checked Then
   Begin
     Field1:='Code';
     Uslovie:=Field1 + '=' + Edit1.Text;
   End;

 If CheckBox2.Checked Then
   Begin
     Field2:='Name';
     Uslovie:=Field2 + '=' + Edit2.Text;
   End;

 If CheckBox3.Checked Then
   Begin
     Field3:='Fam';
     Uslovie:=Field3 + '=' + Edit3.Text;
   End;

 If CheckBox4.Checked Then
   Begin
     Field4:='BirthDay';
     Uslovie:=Field4 + '=' + Edit4.Text;
   End;

 If CheckBox5.Checked Then
   Begin
     Field5:='Town';
     Uslovie:=Field5 + '=' + Edit5.Text;
   End;

 Table1.Filtered:=True;
 Table1.FilterOptions:=[foCaseInsensitive];
 Table1.Filter:=Uslovie;
end;

При использовании фильтрации по диапазону в набор данных попадают те записи, значения которых входят в диапазон заданного значения фильтра. Данный вид фильтрации работает быстрее, потому что производиться только для индексированных полей. При попытке произвести фильтрацию для не индексированного поля возникает исключительная ситуация. Для включения режима фильтрации используется поля метод ApplyRange, а для выключения - метод CancelRange.

Метод SetRangeStart устанавливает нижнюю границу диапазона, а метод SetRangeEnd - верхнюю границу диапазона. При использовании данных методов не нужно указывать никаких параметров, а для задания диапазона используется обычное присваивание. Не менее интересным свойством является свойство KeyExclusive логического типа. Если этому свойству установить значение False, то в набор данных попадут записи, у которых значения совпадают со значениями указанного диапазона, а если установить значение True, то в набор данных такие записи не попадут. Но не нужно забывать, что это свойство действительно отдельно для каждой границы значения указанного диапазона. Если не будет задана нижняя часть диапазона, то она будет равна максимально возможному значению, а если не задана верхняя граница, то она будет равно минимально возможному значению.

procedure TForm1.ButtonFilterClick(Sender: TObject);
begin
 Table1.IndexFieldNames:='Code';
 Table1.SetRangeStart;
 Table1.KeyExclusive:=False;
 Table1.FieldByName('Code').AsInteger:=2;
 Table1.SetRangeEnd;
 Table1.FieldByName('Code').AsInteger:=3;
 Table1.ApplyRange;
end;

procedure TForm1.ButtonNotFilterClick(Sender: TObject);
begin
 Table1.CancelRange;
end;

При желании можно создать фильтрацию по диапазону и в ручную. Для этого нужно явно указать диапазон значений, либо предоставить это пользователю.

procedure TForm1.ButtonFilter1Click(Sender: TObject);
begin
 Table1.Filtered:=True;
 Table1.Filter:='Code >= 1 AND Code <= 3';
end;

procedure TForm1.ButtonFilter2Click(Sender: TObject);
begin
 Table1.Filtered:=True;
 Table1.Filter:='Code >= ' + edtMin.Text + 'AND Code <= ' + edtMax.Text;
end;

Для набора данных Query фильтрация может быть произведена двумя способами: при помощи специального SQL-запроса, либо одноименными методами, как у набора данных Table. Рассмотрим два аналогичных по результату вида фильтрации:

procedure TForm1.ButtonSQLFilter1Click(Sender: TObject);
begin
 Query1.Filtered:=True;
 Query1.Filter:='Code = 3';
end;

procedure TForm1.ButtonSQLFilter2Click(Sender: TObject);
begin
 Query1.Close;
 Query1.SQL.Clear;
 Query1.SQL.Add('SELECT * FROM Base\Base.db WHERE Code=3');
 Query1.Open;
end;

Как видно из примера здесь нет ничего сложного. Нужно обратить внимание на одну из команд SQL-запроса WHERE. Данная команда как раз и отвечает за отбор записей из набора данных, а точнее она задает критерий отбора записей из набора данных. При задании выражения фильтрации оно также должно состоять из имен полей БД, арифметических и логических операций, различных скобок, а также специальных функций.

В SQL-запросе также можно применять сложные критерии отбора записей Базы Данных. При помощи оператора LIKE можно задать шаблон поиска записей для отбора из набора данных. Если известны только первые символы значения некоторого поля, то в этом случае нужно указать символ % (процент) в значении условия фильтрации, означающий неограниченное число символов. Для указания одного неизвестного символа нужно указать символ _ (подчеркивание). Рассмотрим пример, в котором отбираются все записи, в значении поля которых содержится некоторый символ:

procedure TForm1.ButtonSQLFilter1Click(Sender: TObject);
begin
 Query1.Close;
 Query1.SQL.Clear;
 Query1.SQL.Add('SELECT * FROM Base\Base.db WHERE Town LIKE "%М%"');
 Query1.Open;
end;

Для отбора записей с нулевыми значениями в каком-либо поле Базы Данных используется оператор IS NULL. При помощи данного оператора также можно выполнять проверку на присутствие полей, в которых вообще отсутствует какое-либо значение. Рассмотрим пример:

// Выводим записи БД, в которых могут отсутствовать значения
procedure TForm1.ButtonFilterClick(Sender: TObject);
begin
 Query1.Close;
 Query1.SQL.Clear;
 Query1.SQL.Add('SELECT * FROM Base\Base.db WHERE Town IS NULL');
 Query1.Open;

 If Query1.RecordCount > 0 Then ShowMessage('В указанные поля не внесены значения ?');
end;

// Выводим записи, в которых нет пустых значений
procedure TForm1.ButtonFilterClick(Sender: TObject);
begin
 Query1.Close;
 Query1.SQL.Clear;
 Query1.SQL.Add('SELECT * FROM Base\Base.db WHERE Town IS NOT NULL');
 Query1.Open;
end;

Для отбора записей входящих в диапазон заданных значений существует оператор BETWEEN. При помощи данного оператора также можно осуществить фильтрацию набора данных по диапазону.

procedure TForm1.Button3Click(Sender: TObject);
begin
 Query1.Close;
 Query1.SQL.Clear;
 Query1.SQL.Add('SELECT * FROM Base\Base.db');
 Query1.SQL.Add('         WHERE BirthDay BETWEEN "01.04.03" AND "02.10.04"');
 Query1.Open;
end;

Вернуться в оглавление
Вернуться на главную страницу
Hosted by uCoz