Навигация по набору данных

Навигационный доступ к данным с помощью механизма BDE

Навигация по набору данных заключается в управлении указателем текущей записи (курсором). Этот указатель определяет запись, с которой будут выполняться такие операции, как редактирование или удаление.

Перемещение по записям

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

- First – на первую запись,

- Next – на следующую запись,

- Last – на последнюю запись,

- Prior – на предыдущую запись,

- MoveBy (Distance: Integer) – на число записей, определяемое параметром Distance.

Пример:

procedure TForm.Button3Click (Sender: TObject);

var s: real;

n: integer;

begin

s:= 0;

Table1.First;

for n:= 1 to Table1.RecordCount do begin

s:= s + Table1.FieldByName ('Salary').AsFloat;

Table1.Next;

end;

Label2.Caption:=FloatToStr (s);

end;

В приведенной процедуре перебираются все записи набора данных Table1, при этом в переменной s накапливается сумма значений, содержащихся в поле Salary. Перебор записей осуществляется с помощью метода Next, вызываемого в цикле. Предварительно с помощью метода First указатель устанавливается на первую запись. После выполнения кода указатель будет установлен на последнюю запись.

Фильтрация записей

Фильтрация – это задание ограничений для записей, отбираемых в набор данных.

В Delphi можно выполнить фильтрацию:

- по выражению,

- по диапазону.

При включении фильтрация действует в дополнение к другим ограничениям, например, SQL-запросу компонента Query.

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

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

Для задания выражения фильтра используется свойство Filter типа String.

Если имя поля содержит пробелы, то его заключают в квадратные скобки, в противном случае квадратные скобки необязательны. Имена переменных в выражении фильтра использовать нельзя.

Пример:

Salary <= 2000

Отбор всех записей, для которых значение поля оклада (Salary) не превышает 2000.

Post = 'Лаборант' OR Post = 'Инженер'

Отбор записей, поле должности (Post) которых содержит значение Лаборант или Инженер.

Для активизации и деактивизации фильтра применяется свойство Filtered типа Boolean.

Параметры фильтрации задаются с помощью свойства FilterOptions:

- foCaseInsensitive – регистр букв не учитывается;

- foNoPartialCompare – выполняется проверка на полное соответствие содержимого поля и значения, заданного для поиска. При задании условия отбора, например, В* следует это значение свойства отключать.

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

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

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

Поиск записей

Поиск в наборах данных

Для поиска записей по полям служат методы Locate и Lookup, причем поля могут быть неиндексированными.

Функция Locate ищет запись с заданными значениями полей. Locate (const KeyFields: String; const KeyValues: Variant; Options: TLocateOptions).

Параметр KeyFields задает список полей, по которым ведется поиск. Поля разделяются точкой с запятой.

Параметр KeyValues указывает значения полей для поиска.

Параметр Options позволяет задать комбинации следующих значений:

- loCaseInsensitive – регистр букв не учитывается,

- loPartialKey –допускается частичное совпадение значений.

Пример поиска по одному полю:

Table1.Locate ('Number', 123, [])

Поиск выполняется по полю Number и ищется первая запись, для которой значением этого поля является число 123. Все параметры поиска отключены.

При поиске по нескольким полям используется функция VarArrayOf.

Пример поиска по нескольким полям:

Table1.Locate ('Name; Post;', VarArrayOf (['П', 'Инженер']), [loCaseInsensitive, loPartialKey])

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

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

Поиск по индексным полям

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

- предназначенные для поиска на точное соответствие – FindKey, SetKey, EditKey, GotoKey,

- допускающие только частичное совпадение – FindNearest, SetNearest, EditNearest, GotoNearest.

Пример поиска на точно соответствие:

procedure TForm1.btnFindClick (Sender: TObject);

begin

Table1.IndexFieldNames:= 'City';

Table1.SetKey;

Table1.FieldByName ('City').AsString:= edtFindCity.Text;

if not Table1.GotoKey

then ShowMessage ('Запись не найдена!');

end;

Приведенная процедура обработки события нажатия кнопки выполняет точный поиск записей по полю города (City).

Сортировка набора данных

Сортировка набора данных Table выполняется автоматически по текущему индексу. При смене индекса происходит автоматическое переупорядочивание записей.

Задать текущий индекс, по которому выполняется сортировка можно с помощью свойств IndexName или IndexFieldNames. Эти свойства являются взаимоисключающими, и установка значения одного из них приводит к автоматической очистке значения другого. В качестве значения свойства IndexName указывается имя индекса, установленное при его создании. При использовании свойства IndexFieldNames указываются имена полей, образующих соответствующий индекс.

Управление направлением сортировки осуществляется с помощью параметра ixDescending текущего индекса.



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: