В приложении DemoJoins отношением "многие-ко-многим" связаны таблицы заказов (Orders) и продавцов (Employee). Таблица заказов уже работает в отношении "один-ко-многим" в качестве подчиненной.

В наборе данных ЕтрТаЫе заданы следующие свойства:

□ свойство MasterSource указывает на компонент EmpSource;

□ свойство MasterFields содержит имя поля EmpNo, по которому осуществляется связь между таблицами. Для подчиненной таблицы поле EmpNo является первичным.

Поиск данных

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

Поиск по индексам

Для организации индексного поиска к набору данных должен быть подключен индекс (свойства IndexName ИЛИ IndexFieldNames).

Метод FindKey проводит поиск записи по заданным в параметре значениям ключевых полей текущего индекса набора данных. В случае успеха курсор набора данных устанавливается на найденной записи, а метод возвращает значение True, в противном случае - False.

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

К Null.

Рассмотрим простейший пример, в котором реализован поиск по вторичному индексу в таблице CUSTOLY.DB демонстрационной базы данных DBDEMOS. Индекс основан на полях LastName и First_Name (рис. 14.3).

В компоненте Tablel, помимо стандартных настроек на таблицу, при помощи свойства IridexName задан и вторичный индекс (его имя Names). Значения для поиска задаются в компонентах Editi и Edit2.

Программирование в Delphi 7

Рис. 14.3. Главная форма проекта DemoFind

I Листинг 14.1. Секция implementation главного модуля Main проекта DemoFind J

implementation {$R *.DFM}

procedure TForml.FormShow(Sender: TObject) ;
begin
try Cust.Open;

except

on E: EDBEngineError do ShowMessage('Ошибка при открытии таблицы');
end;
end;
procedure TForml.FormClose(Sender: TObject;
var Action: TCloseAction) ;
begin Cust.Close;
end;
procedure TForml.FindBtnClick(Sender: TObject);

begin try

if not Cust.FindKeyt[Editl.Text, Edit2.Text]) then ShowMessage(1 Запись не найдена');
except on E: EDatabaseError do ShowMessage('Ошибка поиска');
end;
end;

end.

Набор данных открывается в методе-обработчике FormShow при открытии формы и закрывается в методе-обработчике FormClose. При щелчке на кнопке FindBtn в метод FindKey передаются значения для поиска из компонентов Editl И Edit2.

Поиск в диапазоне

Индексный поиск можно организовать группой методов, подобно созданию диапазонов. Метод setKey переводит набор данных в состояние dsSetKey, затем должно следовать присваивание ключевым полям значений для поиска. Сам поиск осуществляется методом GotoKey:

with Tablel do begin SetKey;
Fields[0].Value := '428';
GotoKey;
end;

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


⇐ Предыдущая страница| |Следующая страница ⇒

Программирование в Delphi 7



Новости за месяц

  • Июнь
    2017
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс