Отправляет email-рассылки с помощью сервиса Sendsay

Web-Мастеринг - с нуля до профи

  Все выпуски  

нет.


Информационный Канал Subscribe.Ru

Познавательное программирование

(comp.soft.prog.urisprog)

Выпуск 23


Здравствуйте, Уважаемые подписчики!

...при выборе языка программирования для определенного программного обеспечения надо знать несколько языков...
- Бьерн Страуструп.


Статья

Базы Данных с нуля

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

Фильтрация набора данных предназначена для отбора записей удовлетворяющих условию установленного фильтра. 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;
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;


Любые комментарии, жалобы, пожелания и сообщения об ошибках настоятельная просьба присылать на e-mail.

Гусев Сергей.
e-mail: satanzone@yandex.ru
site: http://icops.narod.ru



Все вопросы, пожелания и предложения ссылкообмена ведущему рассылки, прошу слать на e-mail: urisff@inbox.ru
Все статьи публикуются здесь только с разрешения (или рекомендации) автора.
Если вы хотите опубликовать здесь свою статью, то сделайте это, переслав её мне. В случае, если вы будете использовать приведённые в этой рассылке материалы, не забудьте сделать ссылку на эту рассылку.

Ведущий рассылки:
Набатников Иван
urisff@inbox.ru
http://newff.narod.ru


http://subscribe.ru/
E-mail: ask@subscribe.ru
Адрес подписки
Отписаться

В избранное