Учись программированию на C++ Builder бесплатно!

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

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

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

значений.

Методы SetRangeStart и SetRangeEnd устанавливают нижнюю и верхнюю границу диапазона соответственно. Названные методы не имеют параметров и для задания границ диапазона используется просто инструкция присваивания. При этом методы SetRangeStart и SetRangeEnd переводят набор данных в режим dsSetKey.

Для изменения предварительно установленных границ диапазона предназначены методы EditRangeStart и EditRangeEnd, действие которых аналогично действию методов SetRangeStart и SetRangeEnd соответственно. Совместно с этими методами используется свойство KeyExclusive типа bool, которое определяет, как учитывается заданное граничное значение при анализе записей. Если свойство KeyExclusive имеет значение false (по умолчанию), то записи, у которых значения полей фильтрации совпадают с границами диапазона, включаются в состав набора данных, если же свойство имеет значение true, то такие записи в набор данных не попадают. Свойство KeyExclusive действует отдельно для нижней и верхней границы. Значение этого свойства должно устанавливаться сразу после вызова методов EditRangeStart, EditRangeEnd, SetRangeStart и SetRangeEnd.

Вот как в программе устанавливается нижняя граница диапазона и задается фильтрация по диапазону, в котором верхняя граница остается открытой:

void __fastcall TForm1::FilterClick(TObject *Sender)

{

Table1->IndexFieldNames="Стоимость";
Table1->SetRangeStart();
Table1->KeyExclusive = true;

Table1->FieldByName("Стоимость")->AsFloat = StrToFloat(EditFilter->Text);

Table1->ApplyRange();
}

Индекс по полю Стоимость устанавливается текущим. Если в свойстве Edit->Fiiter->Text задать некоторое значение, например 500, то записи, содержащие в поле Стоимость значение 500, не войдут в отфильтрованный набор данных, поскольку свойству KeyExclusive присвоено значение true. Отметим, что инструкция присваивания, выполняемая после вызова метода SetRangeStart, не меняет значение поля текущей записи, а устанавливает нижнюю границу диапазона. Когда одна из границ диапазона не задана (как в примере), то диапазон открыт, т.е. нижняя граница становится равной минимальному возможному, а верхняя максимальному возможному значению этого поля.

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

void __fastcall SetRange(const System::TVarRec* Startvaiues, const int StartValues_Size, const System::TVarRec* EndValues, const int EndValues_Size);

объединяет возможности методов SetRangeStart, SetRangeEnd и ApplyRange. Он позволяет одновременно задать границы диапазона и выполнить фильтрацию. Параметры StartValues и EndValues являются массивами констант и содержат значения для нижней и верхней границы диапазона соответственно. Если фильтрация выполняется по нескольким полям, то граничные значения для этих полей перечисляются в параметрах StartValues и EndValues через запятую. Например:

// Должен быть установлен текущий индекс, построенный по полям имени и дня рождения
Table1->IndexFieldNames="Name;BirthDay";
Table1->SetRange(ARRAYOFCONST(("Петров", "1.1.1945")),
ARRAYOFCONST(("Сидоров", "1.1.1948")));

В набор данных должны попадать записи о сотрудниках с фамилиями в диапазоне петров-сидоров и родившимися в диапазоне дат с по 1.1.1945 по 1.1.1948. Поля, по которым выполняется фильтрация и для значений которых устанавливаются границы диапазона, в явном виде не указываются, а являются полями текущего индекса. Соответствующий текущий индекс (как и показано в примере) должен быть установлен до вызова метода SetRange.

При задании фильтрации по нескольким полям (как в предыдущем примере) в действительности фильтрация происходит только первому из указанных полей.
При вызове метода SetRange ключевое слово ARRAYOFCONST задает макрос, используемый для формирования массива констант.

Для отмены фильтрации, выполненной с помощью методов ApplyRange или SetRange, используется метод CancelRange. Другим вариантом отмены предыдущей фильтрации является задание новых границ диапазона, например, методами SetRangeStart и SetRangeEnd.

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

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

В случае набора данных Query, используя средства SQL, можно отбирать записи по частичному совпадению не только начальных символов строки, но и по вхождению заданных символов в любое место строки.

Поделиться