Главная » Delphi » Поиск с помощью методов класса TTable

0

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

Библиотека VCL содержит несколько методов поиска  записей в таблице. При  ра боте  с таблицами dBASE или Paradox Delphi  предполагает, что все используемые для поиска  поля  индексированы. Поиск  в неиндексированных полях  таблиц  SQL сущест венно  менее эффективен, чем в индексированных.

В качестве примера рассмотрим таблицу,  индексированную по первому  полю с чи словым  типом  и по второму  полю  с текстовым типом.  В этом  случае  поиск  записей можно будет осуществлять одним из двух способов: с помощью метода FindKey() или используя пару методов SetKey()..GotoKey().

Метод FindKey()

Метод FindKey() класса TTable позволяет искать  запись, по одному или несколь ким ключевым полям при одном вызове  функции. В качестве параметра методу Find- Key() передается массив типа  array of const, содержащий критерии поиска.  Если поиск  прошел успешно,  то метод  возвращает значение True. Например, следующий оператор осуществит переход к записи в наборе данных, где первое поле  в индексе имеет значение 123, а второе содержит строку Hello:

if not Table1.FindKey([123, ‘Hello’]) then MessageBeep(0);

Если поле не найдено, то метод FindKey() возвращает значение False и компью

тер издает  звуковой сигнал.

Методы SetKey()..GotoKey()

Вызов  метода  SetKey() класса  TTable переводит таблицу  в режим  подготовки по лей для заполнения значениями критерия поиска.  Как только  критерий поиска  установ лен, можно  вызывать метод GotoKey() для осуществления поиска  соответствующий за писи  в направлении сверху вниз.  Используя методы  SetKey()..GotoKey(), предыду щий пример можно было бы переписать следующим образом:

with Table1 do begin

SetKey;

Fields[0].AsInteger := 123;

Fields[1].AsString := ‘Hello';

if not GotoKey then MessageBeep(0);

end;

Ближайшее соответствие

Аналогично работает метод  FindNearest() или  пара  методов SetKey()..Goto- Nearest(), которыми можно  пользоваться для поиска  в таблице значения, наиболее близко  соответствующего критерию поиска.  Для  поиска  первой записи, где значение первого индексированного поля  наиболее близко  (больше или  равно) числу  123, ис пользуйте следующий код:

Table1.FindNearest([123]);

И снова  в качестве аргумента методу FindNearest() передается массив типа  ar- ray of const, содержащий значения полей, по которым выполняется поиск.

Методы  SetKey()..GotoNearest() можно  использовать для поиска  следующим образом:with Table1 do begin

SetKey;

Fields[0].AsInteger := 123;

GotoNearest;

end;

Если поиск  завершится успешно  и свойство KeyExclusive объекта таблицы имеет значение False, то указатель  текущей  записи  будет установлен на первую  из записей, соответствующих критерию  поиска.   Если  свойство  KeyExclusive имеет   значение True, то текущей  станет та запись, которая следует за последней из всех записей, соот ветствующих условию поиска.

CОВЕТ

Если поиск выполняется по индексированному полю таблицы, то предпочтительнее ис- пользовать методы FindKey() и FindNearest(),  а  не  SetKey()..GotoX() —  это уменьшит объем программы и, следовательно, количество возможных ошибок.

Использование индексов

Во всех описанных выше методах  подразумевалось, что поиск  осуществляется с использованием первичного индекса  таблицы. Но если поиск  проводится по вторич ному индексу,  то необходимо поместить его имя в параметр IndexName объекта таб лицы.  Например, если в таблице существует вторичный индекс  по полю Company на зываемый ByCompany, то поиск  записи компании "Unisco" можно  выполнить сле дующим образом:

with Table1 do begin

IndexName := ‘ByCompany';

SetKey;

FieldValues[‘Company’] := ‘Unisco';

GotoKey;

end;

НА ЗАМЕТКУ

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

Диапазоны (range) позволяют отфильтровывать таблицу  так, что представлены бу дут лишь те записи, значения полей  которых находится внутри определенных границ. Диапазоны обрабатываются подобно поиску по ключу, и, как и при  поиске, существу ет несколько способов применения диапазона к выбранной таблице. Можно  исполь зовать  метод  SetRange() или группу методов SetRangeStart(), SetRangeEnd() и ApplyRange().

CОВЕТ

При использовании таблиц dBASE или Paradox, диапазоны применимы только к индек- сированным полям. Применение диапазона к индексированному полю таблиц SQL способно ухудшить эффективность обработки.

Метод SetRange()

Как  и метод  FindKey() или  FindNearest(), метод  SetRange() позволяет вы полнить достаточно сложные действия над таблицей с помощью единственного вы зова этой  функции. В качестве параметров методу SetRange() передаются два масси ва типа array of const. Первый представляет значения полей  начала  диапазона, а второй — значения полей  конца  диапазона. Приведенный ниже  оператор, выполняет фильтрацию записей, у которых значение первого поля  больше  или  равно   10, но меньше  или равно  15:

Table1.SetRange([10], [15]);

Метод ApplyRange()

Использование  метода  установки  диапазона  ApplyRange() предполагает  выпол

нение следующих действий.

1. Вызовите метод SetRangeStart(), а затем  модифицируйте массив свойств Fields[] таблицы, установив в нем начальное значение ключевого поля  (или полей).

2.  Вызовите  метод   SetRangeEnd() и  вновь   модифицируйте  массив   свойств

Fields[], установив конечное значение ключевого поля (или полей).

3.  Вызовите метод ApplyRange() для установки нового фильтра диапазона. Используя диапазоны, предыдущий пример можно переписать следующим образом:

with Table1 do begin

SetRangeStart;

Fields[0].AsInteger := 10;        // Диапазон начинается с 10

SetRangeEnd;

Fields[0].AsInteger := 15;        // Диапазон заканчивается на 15

ApplyRange;

end;

CОВЕТ

Для  фильтрации  записей  везде  где  только  возможно  используйте  метод  Set-Range() — это уменьшит вероятность появления ошибок в программе.

Для удаления установленного с помощью методов ApplyRange() или SetRange() фильтра, и приведения таблицы в исходное состояние следует  вызвать метод  Can- celRange() объекта TTable.

Table1.CancelRange;

Использование модулей данных

Модули данных (data  modules) позволяют расположить все правила (rule) и отноше ния (relationship) базы данных  в одном  месте  для того,  чтобы  обеспечить их совмест ное  использование отдельными проектами, группами  или  организациями. В библио теке VCL модули данных  инкапсулирует класс TDataModule. Компонент этого  классаможно  представить себе  как скрытую  форму,  в которую  помещаются все  используе мые в проекте компоненты доступа к данным.  Создать  экземпляр компонента TData- Module несложно —  в главном  меню  File выберите пункт  New, а затем  в окне  Object Repository — объект Data Module.

Самая  очевидная причина, по  которой предпочтительнее использовать компо нент  TDataModule, нежели помещать компоненты доступа  к данным  в настоящую форму,  заключается в том, что это упрощает доступ к одним  и тем же данным  из не скольких форм  и модулей проекта. В более  сложных ситуациях может  потребовать ся   упорядочить  использование  многочисленных  компонентов  TTable,  TQuery и/или TStoredProc, установить постоянные отношения между компонентами и, возможно, правила, определенные на уровне  поля  (например, минимальные/мак симальные значения или  форматы отображения). В целом,  этот  ассортимент ком понентов доступа к данным  будет отображать бизнес правила всего предприятия. Выполнив множество подобных действий, их вряд  ли захочется повторять вновь  и вновь  для других приложений. Чтобы избежать этого, поместите созданный модуль данных  в хранилище объектов (Object Repository). Это  позволит использовать его многократно. При  проведении работ  группой  разработчиков, хранилище объектов следует разместить на общедоступном сетевом диске — это обеспечит доступ к нему всем разработчикам группы.

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

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии