воскресенье, 25 декабря 2011 г.

Фильтрация записей-Фильтрация данных


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

Фильтрация по выражению

При фильтрации по выражению набор данных ограничивается записями, удовлетворяющими фильтру, задающему условия отбора записей. Поскольку в процессе отбора просматриваются все записи таблицы, фильтрация по выражению эффективна пр небольшом количестве записей.
Для определения выражения фильтра используется свойство Filter типа String. выражение фильтра представляет собой конструкцию, в состав которой могут входить следующие элементы:
- имена полей таблиц;
- литералы;
- операции сравнения;
- арифметические операции;
- логические операции;
- круглые и квадратные скобки.
Если имя поля содержит пробелы, то его заключают в квадратные скобки, в противном случае квадратные скобки не нужны.
Литерал представляет собой значение, заданное явно (например, число, строка или символ).
Операции сравнения представляют собой  обычные для языка Pascal отношения <,>,=,<=,>= и <>.
Арифметическими являются операции +, -, * и / (сложение, вычитание, умножение, деление).
В качестве логических операций можно использовать AND, OR и NOT (логическое умножение, сложение и отрицание соответственно).
Круглые скобки применяются для изменения порядка выполнения арифметических и логических операций.
Для активации и деактивации фильтра используется свойство Filtered типа Boolean. По умолчанию это свойство имеет значение False (фильтрация не подходит). При установке свойстве Filtered значения True фильтрация включается, и в набор данных отбираются те данные, которые удовлетворяют фильтру, записанному в свойстве Filter. Если выражение фильтра не задано, то в набор данных попадают все записи.
Параметры фильтрации можно задать с помощью свойств FilterOptions типа TFilterOptions. Это свойство принадлежит к множественному типу и может принимать комбинации двух значений:
- foCaseIntensitive - регистр букв не учитывается. Например, при наличии этого значения для выражения фильтра Avtor='Автомат' в поле Avtor, например, могут содержаться слова Автомат, АВТОМАТ или автомат, которые будут восприниматься как одинаковые.
- foNoPartialCompare - выполняется проверка на полное соответствие содержимого поля и значение, заданного для поиска. Обычно применяется для строк. Если известны только первые символы или символ строки, то нужно указать их в выражении фильтра, заменив остальные символы символом "*" и выключив значение FoNoPartialCompare.
По умолчанию все фильтры выключены и свойство FilterOptions имеет значение [].
Рассмотрим в качестве примера обработки событий формы, использующей фильтрацию записей набора данных по выражению. Вид формы представлен на рисунке 1.

Для создания выражений фильтра используются редакторы Edit. Компонент Edit1 и Edit2 предназначены для задания выражения при фильтрации.
На форму помещаются две кнопки Button. При нажатии кнопки Button3 с заголовком "Фильтровать" фильтр активируется путем присваивания значения True свойству Filtered набора данных. При активизации фильтра происходит отбор записей, которые удовлетворяют заданному в выражениях условию. При нажатии на кнопку Button4 с заголовком "Отменить" показываются все записи, фильтр при этом отключается.
Ниже представлены программные коды (обработчики событий) модуля формы, предназначенные для фильтрации:

procedure TForm3.Button3Click(Sender: TObject);
begin
if RadioButton1.Checked then
begin
DataModule2.TTovar.FilterOptions:=[];
DataModule2.TTovar.Filter:='Naim='''+Edit1.Text+'*''';
DataModule2.TTovar.Filtered:=True;
beep;
end;
if RadioButton2.Checked then
begin
DataModule2.TTovar.FilterOptions:=[];
DataModule2.TTovar.Filter:='Uhet_zena='''+Edit2.Text+'''';
DataModule2.TTovar.Filtered:=True;
beep;
end;
end;
procedure TForm3.Button4Click(Sender: TObject);
begin
DataModule2.TTovar.Filtered:=false;
end;

Фильтрация по диапазону

При фильтрации по диапазону в набор данных данных будут включены те записи, значение полей которых соответствуют заданному диапазону. Таким образом, условием фильтрации является выражение вида:
значение > нижней границы AND значение < верхней границы

в которой вместо операций сравнения <и> могут указываться операции <= и >=. Такая фильтрация применяется к набору данных Table.
Достоинством фильтрации по диапазону является высокая скорость обработки записей. В отличи от фильтрации по выражению, когда последовательно просматриваются все записи таблицы, фильтрация по диапазону ведется индексно-последовательным методом, поэтому этот способ фильтрации применим только для индексных полей. Индекс поля, диапазон которого задан в качестве критерия для отбора записей, должен быть установлен как текущий с помощью свойства IndexName или IndexFieldNames.

Рассмотрим в качестве примера обработчики событий формы, использующей фильтрацию записей набора данных по выражению. Вид формы приведён на рисунке 2.

Для задания выражений фильтра используются редакторы Edit. Компонент Edit2 предназначен для задания выражения при фильтрации по подгруппе станка, компоненты Edit3 и Edit4 задают соответственно минимальную и максимальную границу значения поля D_max.
На форму помещаются две кнопки Button. При нажатии кнопки Button11 с заголовком “Фильтровать” фильтр активизируется путём присваивания значения True свойству Filtered набора данных. При активизации фильтра происходит отбор записей, которые удовлетворяют заданному в выражениях условию. При нажатии кнопки Button12 с заголовком “Отменить” показываются все записи, фильтр при этом отключается.
Ниже приведены программные коды (обработчики событий) модуля формы Form3, предназначенные для фильтрации:
Procedure TForm3.Button11Click(Sender:TObject);
begin
if RadioButton1.Checked then
begin
Table1.FilterOptions:=[foCaseInsensitive];
Table1.Filter:=’Podgrup=’”+edit2.text+’*’”;
Table1.Filtered:=True;
beep;
end;
if RadioButton2.Checked then
begin
Table1.Filter:=’max_d>=’+edit3.text+’AND max_d<=’+edit4.text;
Table1.Filtered:=True;
beep;
end;
            end;

Комментариев нет:

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