Контрольная работа: Особенности проектирования баз данных
ID_BOOKS,
NAME,
ID_PUBLISHERS,
K_PAGES,
COVER,
TIRAZ,
ID_ABONENT,
DATE_ISSUE
from BOOKS
where
ID_BOOKS = :ID_BOOKS
Аналогично зададим значения свойств двум остальным компонентам IBDataSet.
У каждого компонента DataSource в свойстве Dataset укажем название соответствующего ему компонента IBDataSet.
Создадим три формы для отображения таблиц. На каждую форму поместим компоненты DBGrid и DBNavigator. У компонентов DBGrid и DBNavigator в свойстве DataSource укажем соответствующий компонент DataSource.
Поиск данных
Для поиска данных используется функция
function LocateNext(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean;
где KeyFields – список полей, по которым производится поиск (имена полей разделяются точкой с запятой), KeyValues – список значений, сравниваемых со значениями этих полей (значения разделяются запятой), TLocateOptions – параметры поиска, где loCaselnsensitive означает поиск без учета регистра (заглавные и малые символы), а loPartialKey. – значения полей для поиска даны не полностью. Функция LocateNext позволяет находить несколько записей, удовлетворяющих условиям поиска, для отображения очередной записи следует вызвать функцию ещё раз. Функция возвращает значение логического типа, равного TRUE (ИСТИНА), если найдена подходящая запись, и FALSE (ЛОЖЬ) в противном случае.
На форме отображения и редактирования данных из таблицы BOOKS для поиска разместим следующие компоненты:
· Edit1 – для ввода пользователем значений KeyValues.
· Button1 – для активации поиска.
· Несколько компонентов CheckBox для указания списка полей для поиска, т. е. значения KeyFields.
В процедуре – обработчике события нажатия на кнопку Button1 сначала производится сбор строки списка полей KeyFields в соответствии с указаниями флажков CheckBox. Затем это значение вместе со значением поля Edit1 отправляется в функцию LocateNext через пользовательскую функцию loc(Fields,Values), описанную в модуле Unit2 (в модуле Unit2 описан класс TDataModule2 (форма модуля данных) в котором определён и компонент «BOOKS_DataSet: TIBDataSet;»).
Аналогично в программе организован поиск в таблицах PUBLISHERS и READERS.
Фильтрация данных
Зададим фильтрацию значений в таблице BOOKS.
На форме таблицы BOOKS поместим компоненты CheckBox для того, чтобы пользователь имел возможность включать и выключать фильтр по отдельным полям. Фильтр производится только по тем полям, для которых выбраны соответствующие им переключатели CheckBox, для этого в программе определены логические переменные (в модуле Unit2) для указания, следует ли фильтровать записи по введённому пользователем значению соответствующего поля. Для включения фильтра служит кнопка «Включить фильтр» где производится присвоение переменным (модуля Unit2) введённых значений указанных полей, после чего включается фильтр заданием свойству BOOKS_DataSet.Filtered значения True. После того, как свойству Filtered компонента TIBDataSet будет присвоено значение True то производится переоткрытие набора данных, но при этом выполняется метод OnFilterRecord этого компонента. Процедура – обработчик этого метода определена следующим образом:
procedureTDataModule2.BOOKS_DataSetFilterRecord(DataSet: TDataSet; varAccept: Boolean);
где DataSet соответствующий набор данных. Эта процедура выполняется для каждой записи и если возвращаемый этой процедурой параметр Accept равен True, то текущая запись отображается, в противном случае – нет. Пример фильтра:
if (DataSet['NAME'] <> Name_) thenAccept := False;
где NAME – название поля, Name_ – переменная, значение которой сравнивается со значением этого поля текущей записи.