Лабораторная
работа №3
Применение технологии доступа к данным BDE среды программирования Delphi при создании приложения для работы с БД
Цель работы: Изучить механизм доступа приложения к данным
посредством BDE.
Познакомиться с компонентами отображения данных. Изучить основные свойства
компонента отображения данных - Table.
Получить навыки работы при разработке приложений для работы с БД на основе
компонента Table.
Общая архитектура приложения баз данных
Приложение
баз данных, как следует уже из его названия, предназначено для взаимодействия с
некоторым источником данных — базой данных (БД). Взаимодействие подразумевает
получение данных, их представление в определенном формате для просмотра
пользователем, редактирование в соответствии с реализованными в программе алгоритмами
бизнес - логики и возврат обработанных данных обратно в базу данных.
Приложение,
работающее с базами данных должно включать в себя:
Механизм
получения и отправки данных для обеспечения соединения с источником данных.
Он должен "знать", куда обращаться приложению и какой протокол обмена
использовать для обеспечения двунаправленного потока данных.
Механизм
внутреннего представления данных является ядром приложения баз данных. Он
обеспечивает хранение полученных данных в приложении и предоставляет их по
запросу других частей приложения.
Пользовательский
интерфейс обеспечивает просмотр и редактирование данных, а также управление
данными и приложением в целом.
Бизнес-логика
приложения представляет собой набор реализованных в программе алгоритмов
обработки данных.
Механизм доступа приложения к данным
Базовый
механизм доступа приложения к данным создается триадой компонентов:
· компоненты,
инкапсулирующие набор данных (потомки класса TDataSet) –страница BDE;
·
компоненты TDataSource – страница Data Access;
· визуальные компоненты
отображения данных – страница Data Controls.
Схема
взаимодействия этих компонентов в приложении баз данных представлена на рис. 1.
Обзор компонентов,
используемых в BDE для связи с БД.
Установка соединения с БД
Все
управление одиночным соединением с какой-либо базой данных в BDE осуществляется
компонентом Database (страница BDE).
В процессе работы компонент активно использует параметры псевдонимов и
драйверов BDE.
Для
определения базы данных (сервера), с которой приложение устанавливает соединение
при помощи компонента Database, чаще используется свойство AliasName.
Свойства DatabaseName и DriverName предоставляют альтернативный способ создания
соединения.
Если
соединение задано свойством AliasName, то свойство DatabaseName можно
использовать для создания временного псевдонима, который будет доступен только
для компонентов доступа к данным внутри приложения. При щелчке на кнопке списка
доступных псевдонимов свойства DatabaseName в Инспекторе объектов для любого
компонента доступа к данным в списке будет доступен и временный псевдоним
компонента TDatabase.
Например,
при переключении приложения на другую базу данных можно изменить только
значение псевдонима в компоненте TDatabase. Если все компоненты наборов данных
подключены к временному псевдониму компонента TDatabase, то они автоматически
переключатся на новую БД.
Значения
параметров можно задавать как статически, так и динамически во время
выполнения.
Компонент
TDatabase может облегчить подключение к базам данных с регистрацией
пользователей. При регистрации на сервере достаточно задать имя пользователя,
пароль в свойстве Params и установить для свойства LoginPrompt значение False.
Эта комбинация работает как во время выполнения, так и во время разработки.
Компоненты доступа к наборам данных

Рис. 1. Механизм доступа к данным приложения баз
данных
В
основе любого приложения баз данных лежат наборы данных, которые представляют
собой группы записей, переданных из базы данных в приложение для просмотра и
редактирования.
Каждый
набор данных инкапсулирован в специальном компоненте доступа к данным.
Компонент доступа к данным представляет собой "образ" таблицы базы
данных в приложении. При этом, используя одни базовые функции для обслуживания
набора данных, компоненты должны обеспечивать доступ к данным в рамках
различных технологий. Поэтому не удивительно, что разработчики VCL уделили
особое внимание созданию максимально эффективной иерархии классов,
обеспечивающих использование наборов данных (рис.2). Другими словами, под набором
данных понимается группа записей из одной или нескольких таблиц БД,
доступная для компонентов – наборов данных TTable, TQuery,
TStoredProc.
Таким образом, сам набор данных и класс набора
данных является той осью, вокруг которой вращается любая деятельность
приложения баз данных. Пользователь просматривает на экране данные — это
результат использования набора данных. Пользователь решил изменить какое-то
число — он изменит содержимое ячейки набора данных. При закрытии приложение
сохраняет все изменения — это набор данных передается в базу данных для сохранения.
Все
компоненты доступа к данным являются не визуальными. Общее число таких
компонентов в приложении не ограничено.
Класс TBDEDataSet
.
Механизм доступа к BDE инкапсулирован в базовом классе TBDEDataSet. Поэтому в
процессе программирования у вас не будет необходимости использовать функции BDE
напрямую. Почти все, что можно сделать путем прямого обращения, можно сделать и
через компоненты — это проще и надежнее. Этот класс является потомком класса
TDataSet, он обеспечивает работоспособность важнейших механизмов набора данных
за счет обращения к функциям BDE, отвечая за такие важнейшие операции, как
чтение данных и сохранение изменений в базе данных, навигация по записям набора
данных, фильтрация.
Компонент
доступа к данным является основой приложения баз данных. На основе выбранной
таблицы БД он создает набор данных и позволяет эффективно управлять им. В
процессе работы такой компонент тесно взаимодействует с функциями
соответствующей технологии доступа к данным.

Рис.
2. Иерархия
классов, обеспечивающих функционирование набора данных
Набор
компонентов, представленный на рис.2 для
каждой из представленных технологий доступа к данным примерно одинаков. Везде
есть компонент, инкапсулирующий табличные функции - TTable, компонент запроса
SQL - TQuery и компонент хранимой процедуры - TStoredProc. И хотя все они имеют
разных ближайших предков, тем не менее, функциональность подобных компонентов в
различных технологиях почти одинакова. Для работы с источниками данных при
посредстве BDE в Delphi имеется специальный набор компонентов, расположенных на
странице BDE Палитры компонентов.
Компонент
таблицы
Компонент
таблицы обеспечивает доступ к таблице базы данных целиком, создавая набор
данных, структура полей которого полностью повторяет таблицу БД. За счет этого
компонент прост в настройке и обладает многими дополнительными функциями,
которые обеспечивают применение табличных индексов.
После
соединения с источником данных необходимо задать имя таблицы в свойстве
Если
соединение с источником данных настроено правильно, имя таблицы можно выбрать
из выпадающего списка свойства TableName.
Преимуществом
табличного компонента является использование индексов, которые ускоряют работу
с таблицей. Все индексы, созданные в базе данных для таблицы, автоматически
загружаются в компонент. Их параметры доступны через свойство
property
IndexDefs: TIndexDefs;
свойства Active, Open, Close
В
практике программирования работа с таблицами целиком используется не так часто.
А при работе с серверами баз данных, промежуточное ПО используемых технологий
доступа к данным, все равно транслирует запрос на получение табличного набора
данных в простейший запрос SQL, например:
SELECT
* FROM Orders
В
такой ситуации применение табличных компонентов становится менее эффективным,
чем использование запросов.
Подключение набора данных
С
каждым компонентом доступа к данным может быть связан как минимум один компонент
TDataSource, который расположен на странице Data Access Палитры
компонентов. В его обязанности входит соединение набора данных с визуальными
компонентами отображения данных. Компонент TDataSource обеспечивает передачу в
эти компоненты текущих значений полей из набора данных и возврат в него
сделанных изменений.
Еще
одна функция компонента TDataSource заключается в синхронизации поведения
компонентов отображения данных с состоянием набора данных. Например, если набор
данных не активен, то компонент TDataSource обеспечивает удаление данных из
компонентов отображения данных и их перевод в неактивное состояние. Или, если
набор данных работает в режиме "только для чтения", то компонент
TDataSource обязан передать в компоненты отображения данных запрещение на
изменение данных.
С
одним компонентом TDataSource могут быть связаны несколько визуальных
компонентов отображения данных.
При
открытии набора данных компонент обеспечивает передачу в набор данных записей
из требуемой таблицы БД. Курсор набора данных устанавливается на первую запись.
Компонент TDataSource организует передачу в компоненты отображения данных
значений необходимых полей из текущей записи. При перемещении по записям набора
данных текущие значения полей в компонентах отображения данных автоматически
обновляются.
Классификация компонентов отображения
данных
Компоненты отображения данных играют важную роль при создании
интерфейсов приложений баз данных. Разнообразие предлагаемых элементов
управления позволяет решать любые задачи по организации взаимодействия
пользователя с базой данных. Все они взаимодействуют с набором данных через
компонент TDataSource.
Отображение
данных обеспечивает достаточно представительный набор компонентов VCL Delphi.
Многие из них унаследованы от компонентов, инкапсулирующих стандартные элементы
управления. Как уже говорилось выше, для связи с набором данных эти компоненты
используют компонент TDataSource. Механизмы управления данными реализованы в
компонентах наборов данных и активно взаимодействуют с компонентами отображения
данных.
Все компоненты отображения данных можно разделить на группы по
нескольким критериям (рис. 3).

Рис.
3. Классификация компонентов отображения данных
Ввиду
общности решаемых задач, все компоненты отображения данных имеют несколько
важных общих свойств, которые представлены в табл. 1.
Таблица 1. Общие свойства компонентов
отображения данных
|
Объявление
|
Описание
|
|
property
DataField: string; |
Поле
связанного с компонентом набора данных |
|
property
DataSource: TDataSource; |
Связываемый с
компонентом компонент TDataSource |
|
property
Field: Tfield; |
Обеспечивает
доступ к классу TField, который соответствует полю набора данных, заданному
свойством DataField |
|
property
Readonly: Boolean; |
Управляет
работой режима "только для чтения" |
Табличное представление данных
Компонент TDBGrid
Этот
компонент инкапсулирует двумерную таблицу, в которой строки представляют собой
записи, а столбцы — поля набора данных.
Компонент
TDBGrid является потомком классов TDBCustomGrid и TCustomGrid.
В
компоненте TDBGrid можно отображать произвольное подмножество полей
используемого набора данных, но число записей ограничить нельзя — в компоненте
всегда присутствуют все записи связанного набора данных.
Требуемый
набор полей можно составить при помощи специального Редактора столбцов, который открывается при двойном щелчке на
компоненте, перенесенном на форму.
В
работе компонента TDBGrid важную роль играет класс TColumn, который
инкапсулирует свойства колонки или столбца сетки. Его основным назначением
является правильное отображение данных из поля набора данных, связанного с этой
колонкой. Поэтому объект колонки обладает свойствами и методами, которые
позволяют произвольным образом задавать параметры отображения данных (цвет,
шрифт, ширину и т. д.).
Новая
колонка добавляется при помощи кнопки Редактора столбцов Add New, после
этого ее название появляется в списке колонок. Для выбранной в списке колонки,
доступные для редактирования свойства появляются в Инспекторе объектов. Колонки
в списке также можно редактировать, удалять, менять местами.
Настройка
параметров компонента TDBGrid, от которых зависит его внешний вид и некоторые
функции, осуществляется при помощи свойства Options.
За
отображение заголовка колонки отвечает свойство Title, представляющее собой
ссылку на экземпляр объекта TColumnTitie. Здесь можно задать текст заголовка,
параметры шрифта текста заголовка и цвет фона заголовка. По умолчанию текст
заголовка берется из свойства DispiayLabel объекта TField .
Для
каждой колонки можно создать список, который разворачивается при щелчке на
кнопке в активной ячейке колонки. Выбранное в списке значение автоматически
заносится в ячейку. Для реализации этой возможности применяется свойство PickList.
Доступ
к колонкам осуществляется при помощи свойства Items. Нумерация колонок начинается с
нуля.
Все
данные из существующих колонок можно сохранить в файле или потоке при помощи
методов SaveToFile и SaveToStream,
а затем загрузить их обратно методами LoadFromFile и LoadFromStream.
Компонент TDBCtrlGrid
Компонент
TDBCtrlGrid внешне напоминает компонент TDBGrid, но никак не связан с классом
TCustomDBGrid, а наследуется напрямую от класса TWinControl.
Этот
компонент позволяет отображать данные в строках в произвольной форме. Компонент
представляет собой набор панелей, каждая из которых служит платформой для
размещения данных отдельной записи набора данных. На панель можно переносить
только те компоненты отображения данных, которые показывают значение одного
поля для единственной записи набора данных. Нельзя использовать
компоненты TDBGrid, TDBCtrlGrid, TDBRichEdit, TDBListBox, TDBRadioGroup,
TDBLookupListBox.
С
каждым таким компонентом можно связать нужное поле набора данных. При открытии
набора данных в компоненте TDBCtrlGrid на каждой новой панели создается набор
компонентов отображения данных, аналогичный тому, который был создан на одной из
панелей во время разработки.
Ни
один из компонентов отображения данных не имеет встроенных средств для создания
и удаления записей целиком.
Для
решения указанных задач предназначен компонент TDBNavigator, который
представляет собой совокупность управляющих кнопок, выполняет операции
навигации по набору данных и модификации записей целиком.
Компонент
TDBNavigator при помощи свойства DataSource связывается с компонентом
TDataSource и через него с набором данных. Такая схема позволяет обеспечить
изменение текущих значений полей сразу во всех связанных с TDataSource
компонентах отображения данных.

Рис.
4. Назначение кнопок компонента TDBNavigator
Компонент
TDBNavigator содержит набор кнопок, каждая из которых отвечает за выполнение
одной операции над набором данных. Всего имеется 10 кнопок, разработчик может
оставить в наборе любое количество кнопок в любом сочетании. Видимостью кнопок
управляет свойство VisibleButtons:
nbFirst —
перемещение на первую запись набора данных;
nbPrior —
перемещение на предыдущую запись набора данных;
nbNext —
перемещение на следующую запись набора данных;
nbLast —
перемещение на последнюю запись набора данных;
nblnsert —
вставка новой записи в текущей позиции набора данных;
nbDelete —
удаление текущей записи, курсор перемешается на следующую запись;
nbEdit — набор
данных переводится в режим редактирования;
nbPost — в базу
данных переносятся все изменения в текущей записи;
nbcancel — все
изменения в текущей записи отменяются;
nbRefresh —
восстанавливаются первоначальные значения текущей записи, сделанные после
последнего переноса изменений в базу данных.
Самой
критичной к возможной потере данных вследствие ошибки является операция
удаления записи, поэтому при помощи свойства СonfirmDelete можно включить
механизм контроля удаления. При каждом удалении записи нужно будет дать
подтверждение выполняемой операции.
Нажатие
любой кнопки можно эмулировать программно при помощи метода BtnClick.
В
случае необходимости выполнения дополнительных действий при щелчке на любой
кнопке можно воспользоваться обработчиками событий BeforeAction и OnClick, в которых параметр
Button определяет нажатую кнопку.
Представление отдельных полей
Большинство
компонентов отображения данных предназначено для представления данных из
отдельных полей. Все они имеют свойство DataField, которое указывает на
требуемое поле набора данных.
В
зависимости от типа данных поля могут использоваться различные компоненты. Для
большинства стандартных полей используются компоненты TDBText, TDBEdit,
TDBComboBox, TDBListBox.
Данные
в формате Memo отображаются компонентами TDBMemo и TDBRichEdit.
Для
показа изображений предназначен компонент TDBImage.
Компонент TDBText
Представляет
собой статический текст, который отображает текущее значение некоторого поля
связанного набора данных. При этом данные можно просматривать в режиме
"только для чтения".
Непосредственным
предком компонента является класс TCustomLabel, поэтому он очень похож на
компонент TLabel.
Компонент TDBEdit
Компонент
представляет собой стандартный однострочный текстовый редактор, в котором
отображаются и изменяются данные из поля связанного набора данных.
Прямой
предок компонента — класс TCustomMaskEdit, который также является прямым
предком компонента TEdit.
Компонент
может осуществлять проверку редактируемых данных по заданной для поля маске. В
компоненте можно использовать буфер обмена.
Компонент TDBCheckBox
Компонент
представляет собой почти полный аналог обычного флажка (компонент TCheckBox) и
предназначен для отображения и редактирования любых данных, которые могут иметь
только два значения. Это может быть логический тип данных или любые строковые
значения, но поле может принимать значения только из двух строк.
Компонент TDBRadioGroup
Компонент
представляет собой стандартную группу переключателей, состояние которых зависит
от значений поля связанного набора данных. В поле можно передавать
фиксированные значения, связанные с отдельными переключателями в группе.
Компонент TDBListBox
Компонент
отображает текущее значение связанного с ним поля набора данных и позволяет
изменить его на любое фиксированное из списка. Функционально компонент ничем не
отличается от компонента TListBox. Значение поля должно совпадать с одним из
элементов списка. Специальных методов компонент не содержит.
Компонент TDBComboBox
Компонент
отображает текущее значение связанного с ним поля набора данных в строке
редактирования, при этом значение поля должно совпадать с одним из элементов
разворачивающегося списка. Текущее значение можно изменить на любое
фиксированное из списка компонента. Функционально компонент ничем не отличается
от компонента TDBCombовох, представляющего собой комбинированный список.
Компонент
может работать в пяти различных стилях, которые определяются свойством Style.
Специальных методов компонент не содержит.
Компонент
представляет собой обычное поле редактирования, к которому подключается поле с
типом данных Memo или BLOB. Основное его преимущество — возможность
одновременного просмотра и редактирования нескольких строк переменной длины.
Компонент
предназначен для просмотра изображений, хранящихся в базах данных в графическом
формате.
Редактировать
изображения можно только в каком-либо графическом редакторе, перенося исходное
и измененное изображение при помощи буфера обмена. Это делается средствами
операционной системы пользователем или программно при помощи методов
CopyToClipboard, CutToClipboard, PasteFromClipboard.
Визуализация
изображения осуществляется при помощи свойства Picture, которое представляет
собой экземпляр класса TPicture.
Также
можно полностью заменить существующее изображение или сохранить новое в новой
записи набора данных. Для этого используются методы свойства Picture.
Свойство
AutoDisplay позволяет управлять процессом загрузки новых изображений из набора
данных в компонент. При значении True любое новое значение поля автоматически
отображается в компоненте. При значении False новое значение появляется только
после двойного щелчка на компоненте или после нажатия клавиши <Enter> при
активном компоненте.
Компонент
предоставляет возможности полноценного текстового редактора для просмотра и
изменения текстовых данных, хранящихся в связанном поле набора данных. Поле
должно содержать информацию о форматировании текста.
Внешне
компонент ничем не отличается от поля редактирования, поэтому о реализации
доступа к гораздо более богатым возможностям редактора через интерфейс
пользователя должен позаботиться разработчик. Для этого можно использовать
дополнительные элементы управления.
Графическое представление данных
Для
представления данных из некоторого набора данных в виде графиков различных
видов предназначен компонент TDBChart. В нем можно одновременно показывать
графики для нескольких полей данных. Графики строятся на основе всех имеющихся
в наборе данных значений полей. Функционально компонент ничем не отличается от
компонента TChart.
Настройка
параметров компонента осуществляется специальным редактором, который можно
открыть двойным щелчком на перенесенном на форму компоненте.
Рассмотрим
подробно процесс подключения к компоненту TDBChart набора данных и построение
графиков.
Основой
любого графика в компоненте TDBChart является так называемая серия, свойства
которой представлены классом TChartSeries. Для того чтобы
построить график значений некоторого поля набора данных, необходимо выполнить
следующие действия, большинство из которых выполняется в специализированном
редакторе компонента.
1.
Создать новую серию и определить ее тип.
2.
Задать для серии набор данных.
3.
Связать с осями координат нужные поля набора данных и, в зависимости от типа
серии, задать дополнительные параметры.
4.
Открыть набор данных.
Редактор
имеет две главные страницы — Chart и Series. Страница Chart содержит
многостраничный блокнот и предназначена для настройки параметров самого
графика. Страница Series также содержит многостраничный блокнот и
используется для настройки серий значений данных.
Для
создания новой серии необходимо в редакторе перейти на главную страницу Chart,
а на ней открыть страницу Series (рис. 5). На этой странице нужно
щелкнуть на кнопке Add, а затем в появившемся диалоге выбрать тип серии.
После этого в списке на странице Series появляется строка новой серии.
Здесь можно переопределить тип, цвет и видимость серии, щелкнув на
соответствующей зоне строки.
Все
остальные страницы блокнота на главной странице Chart предназначены для
настройки параметров графика.
Теперь
необходимо перейти на главную страницу Series и на ней из списка
названий серий выбрать необходимую. После этого на странице Data Source из
списка выбирается строка DataSet. Далее в появившемся списке DataSet выбирается
нужный набор данных.

Рис.
5. Специализированный редактор компонента TDBChart
Список
X позволяет выбрать поле набора данных, значения которого будут последовательно
откладываться по оси абсцисс. Список Y позволяет выбрать поле набора данных,
значения которого будут отложены по оси ординат. Соответствие между значениями
полей по двум осям определяется принадлежностью к одной записи набора данных.
Выбор поля в списке Labels привязывает его значения в виде меток к оси
абсцисс.
Теперь
осталось только открыть набор данных и компонент TDBChart построит график.
Аналогичным
образом на этот же компонент можно поместить и другие графики.
Модуль данных
Для
размещения компонентов доступа к данным в приложении баз данных желательно
использовать специальную "форму" — модуль данных (класс TDataModule).
Модуль данных не имеет ничего общего с обычной формой приложения, его
непосредственным предком является класс TComponent. В модуле данных можно
размещать только невизуальные компоненты. Модуль данных доступен разработчику,
как и любой другой модуль проекта, на этапе разработки. Пользователь приложения
не может увидеть модуль данных во время выполнения.
Для
создания модуля данных можно воспользоваться командой New пункта меню File.
Для
обращения компонентов доступа к данным, расположенным в модуле данных, из
других модулей проекта необходимо включить имя модуля в секцию uses:
unit InterfaceModule;
...
implementation
uses DataModule;
...
DataModule.Tablel.Open;
...
Рекомендуемый порядок
действий для отображения данных в приложении
1. Создать новый
проект.
2. Создать
модуль данных
3. Установить
соединение с источником данных.
4. Затем на форму
нового проекта необходимо перенести компонент, инкапсулирующий набор данных, и
выполнить следующие действия. Следующую последовательность действий рассмотрим
для компонента TTable,
инкапсулирующего функции таблицы:
а) Подключить компонент к базе данных.
б) Подключить к компоненту таблицу
БД. (свойство TableName). После выполнения действий этапа 3 в списке этого
свойства должны появиться имена всех доступных в подключенной базе данных
таблиц. После выбора имени таблицы в свойстве TableName компонент оказывается
связанным с ней.
в) Переименовать компонент. Это не
обязательное действие. Тем не менее, в любых случаях желательно присваивать
компонентам доступа к данным осмысленные имена, соответствующие названиям
подключенных таблиц. Обычно название компонента копирует название таблицы.
г) Активизировать связь между
компонентом и таблицей БД. Для этого используется свойство Active. Если в
Инспекторе объектов присвоить этому свойству значение True, то связь
активизируется. Эту операцию можно выполнить и в исходном коде приложения, с
помощью метода Open,
который открывает набор данных, и метода Close, закрывающего его.
5.
Настройка компонента TDataSource
На следующем
этапе разработки приложения баз данных необходимо перенести на форму и
настроить компонент TDataSource. Он обеспечивает взаимодействие набора данных с
компонентами отображения данных. Чаще всего одному набору данных соответствует
один компонент TDataSource, хотя их может быть несколько.
Для настройки
свойств компонента необходимо выполнить следующие действия.
а) Связать набор данных и компонент
TDataSource (свойство DataSet). Это указатель на экземпляр компонента доступа к
данным. В списке этого свойства в Инспекторе объектов перечислены все доступные
компоненты наборов данных.
б) Переименовать компонент.
6. На последнем
этапе создания приложения баз данных необходимо разработать пользовательский
интерфейс на основе компонентов отображения данных. Эти компоненты
предназначены специально для решения задач просмотра и редактирования данных. Для
каждого визуального компонента отображения данных необходимо выполнить
следующие операции:
а) Связать компонент отображения
данных и компонент TDataSource (свойство Datasource, которое должно указывать
на экземпляр требуемого компонента TDataSource). Один компонент отображения
данных можно связать только с одним компонентом TDataSource.
б) Задать поле данных (свойство DataField
типа TFields определяет имя поля связанного набора данных). Этот этап
применяется только для компонентов, отображающих единственное поле.
в) Подключить компонент TDBNavigator.
Дополнительные возможности
Установка соединения
с таблицей базы данных и разрыв соединения
Чтобы исключить
неоправданное поддержание связи с базой данных, которое занимает ресурсы, а при
работе в сети мешает доступу к базе данных других пользователей, во всех
таблицах сначала должно быть установлено Active=false,
а затем, при событии формы OnCreate,
эти свойства могут быть установлены в true, а при событии OnDestroy эти свойства опять должны быть установлены в false.
Свойства полей
Упорядочивание данных
При отображении
данных, записи в таблице упорядочены по полю первичного ключа, что не всегда
отвечает требованиям пользователя (или разработчика). Чтобы изменить порядок
отображаемых данных, можно использовать индексы, созданные для таблицы на этапе
разработки базы данных. Для этого используются свойства компонента Table, отображаемые в
Инспекторе объектов IndexName
(содержит выпадающий список имен индексов, созданных для таблицы) и IndexFieldName (содержит
выпадающий список комбинаций полей индексов, созданных для таблицы).
Редактор Полей
При добавлении
в список Редактора Поля имен полей таблицы автоматически создается специальные
объекты со своими свойствами, методами и событиями – объекты-поля.
Вызов Редактора
полей осуществляется двойным щелчком на компоненте Table. Команда контекстного меню РП Add fields открывает окно,
содержащее список всех полей таблицы, связанной с компонентом Table. В этом окне необходимо выбрать
интересующие поля для добавления их в окно Редактора Полей. Выбранные поля
будут соответствовать колонкам таблицы, причем РП позволяет изменять
последовательность их расположения при отображении. При выделении в списке
отдельного поля в Инспекторе объектов отображаются свойства этого поля, причем
каждое поле – это объект, класс которого зависит от типа поля. Все классы, в
свою очередь, являются производными от базового класса полей TField.
Перенос полей из редактора на
форму может быть выполнен
автоматически из РП. Перетащить на форму выделенные в РП поля, при этом на
форме автоматически будут созданы компоненты, отображающие данные каждого поля
и снабжены метками, указанными в свойстве DisplayLabel. При этом на форме автоматически появляется источник
данных DataSource и
устанавливается связь между ним и компонентом Table, а также связи между компонентами
отображения с ним.
Ограничение вводимых значений
1 способ. Выделить
в Редакторе Полей нужное поле и установить с помощью свойств MinValue и MaxValue допустимые пределы вводимых в
поле значений. При нарушении этих пределов будет генерироваться исключение EDatabaseError, которое
должно перехватываться в приложении, чтобы выдать пользователю пояснение на
русском языке.
2 способ. Использовать свойство CustomConstraint (позволяет написать ограничение
на значение поля в виде: имя_поля<макс.доп.значение and имя_поля > мин.доп.значение) ConstraintErrorMessage (содержит строку текста, который показывается в случае
нарушения ограничения при вводе). Этот способ может быть применен не только к
числовым полям.
3 способ.
Свойство Constraints
компонента Table. Здесь
в специальном окне могут быть перечислены все ограничения ввода данных для
отдельной таблицы. Каждое из них представляет собой отдельный объект, свойства
которого отображаются в Инспекторе Объектов. Свойство ErrorMessage определяет строку текста,
которая предъявляется пользователю в случае нарушения ограничений.
4 способ. Использовать
обработчик события поля OnValidate,
которое возникает перед записью введенного значения поля в буфер текущей записи.
Вычисляемые поля
Вызвать
Редактор Полей. Открыть окно добавления нового поля командой New. В разделе FieldProperties указать имя поля (Name), тип данных (Type), размер (Size). В разделе Field type выбрать Calculated. В Инспекторе
Объектов для нового поля задать свойство DisplayLabel (отображаемое имя). Затем в обработчике события OnCalcFields (возникает
каждый раз при обновлении значений вычисляемых полей) компонента Table написать
оператор:
Имя_поля.Value:=выражение
Например, для вычисления возраста
могут быть использованы операторы
…
DecodeDate(Date,Year,Manth,Day)
Table1Age.Value:=Year-Table1Year_b.Value
…,
где Year – переменная, содержащая текущий год, возвращаемый
процедурой DecodeDate, Table1Year_b – имя поля, содержащего год рождения.
Фильтрация данных
Задается свойствами компонента Table: Filter (строка, содержащая определенные
ограничения на значения полей), Filtered
(включает/выключает использование фильтра). Свойство FilterOptions позволяет с помощью опций:
foNoPartialCompare - запретить или разрешить частичное совпадение при сравнении (при
разрешении в шаблоне можно использовать символ - заменитель произвольного
количества любых символов -*);
foCaseInsensitive - сделать сравнение нечувствительным к
регистру.
При записи шаблонов можно использовать
операции отношения и логические операции.
Использование словарей атрибутов полей
Создание нового
словаря осуществляется с помощью программы SQL Explorer. Команда Dictionary
- New открывает
диалоговое окно создания нового словаря, в котором необходимо указать: имя
словаря (DictionaryName);
выбрать базу данных (Database),
для которой необходимо создать словарь и имя таблицы (Table Name), в которой будет
сохраняться словарь (словарь по умолчанию сохраняется в виде таблицы Paradox). После этого, в открывшемся
окне, для установки связи словаря с таблицами баз данных, выполнить команду: Dictionary – Import From Database и выбрать из
выпадающего списка псевдоним базы данных. Для задания атрибутов полей лучше
воспользоваться Редактором Полей. После установки атрибутов полей в Инспекторе
Объектов, необходимо записать все атрибуты выделенных в Редакторе полей, для
этого в контекстном меню выбрать команду Save Attributes as. Имеющееся в словаре множество атрибутов
с указанными при их сохранении именами, могут быть использованы в приложении
автоматически при добавлении списка всех полей таблицы в Редактор Полей.
Команда Dictionary – Select позволяет открыть один из
зарегистрированных словарей, чтобы использовать его в любом приложении.
Команда Dictionary – Register позволяет зарегистрировать в
системе ранее созданную таблицу словаря.
Связь головной и вспомогательной таблицы
Две таблицы
могут быть связаны друг с другом по ключу. Одна из этих таблиц является
головной (master), а
другая – вспомогательной, детализирующей (detail).Нам необходимо добиться, чтобы пользователь, перемещаясь
по одной таблице, видел значение из другой таблице, в котором значение поля
ключа совпадает со значением поля ключа в текущей записи первой таблицы. Для
реализации этого процесса в первую очередь необходимо разместить на форме 2
комплекта средств отображения, а на модуле - компоненты Table и DataSource для каждой из таблиц:
§
разорвать связь с базой данных для таблицы,
используемой как вспомогательная;
§
в свойстве MasterSource компонента Table вспомогательной таблицы установить имя головной таблицы;
§
открыть редактор связей полей (Field Link Designer) с помощью свойства MasterFields компонента Table; В окне этого редактора
отображаются имена только индексированных полей.
§
выделить в окне Master Fields, содержащем поля
головной таблицы, а в окне Detail Field,
содержащем поля вспомогательной таблицы, поле ключа и нажать кнопку Add.Если ключ составной, то
операцию необходимо повторить для всех полей ключа.
§
восстановить связь с базой данных.
Поля синхронного просмотра
Значения поля
просмотра получаются в результате просмотра другой таблицы. Эти поля содержат
данные только для чтения.
§
для таблицы, в которой необходимо создать поле
просмотра вызвать Редактор Полей и создать новое поле: New Field.
§
указать имя и тип создаваемого поля и указать
тип создаваемого поля Field Type
–Lookup.
§
Key Fields
– ключевое поле вспомогательной таблицы;
§
Lookup Keys
– ключевое поле головной таблицы;
§
Dataset
– имя компонента Table
головной таблицы;
§
Result Field
– просматриваемое поле головной таблицы.
Свойство созданного поля
просмотра LookupCache
определяет, будут ли значения просматриваемого поля кэшироваться (true), лучше использовать в
том случае, если просматриваемая таблица измеряется редко.
Для отображения
значений полей просмотра предусмотрены специальные компоненты DBLookupListBox (список) и DBLookupComboBox (выпадающий
список). Для отображения значений просматриваемых полей достаточно установить
свойства DataSource
(соответствующее таблице, имеющей поле просмотра) и DataField (имя просматриваемого поля).
Диаграмма модуля данных
Разработка
модуля данных осуществляется при совместном использовании окна Дерева Объектов
и страницы диаграмм (Diagram)
Редактора Кода путем перетаскивания на страницу диаграмм объектов из окна Object TreeView (вершины сессии,
псевдонима, таблиц и источников данных). На полученной диаграмме отображаются
связи между компонентами. Диаграмма может быть использована для быстрого
открытия Редактора Полей, SQL Explorer
и др.с помощью контекстного меню. Существует также возможность удаления или добавления связей с
помощью соответствующих кнопок панели инструментов. Между тем диаграмма модуля
является хорошим инструментов документации связей между элементами, но
проектировать лучше с помощью простого
инструментария: Инспекторов объектов и Редактора Полей.
Для
создания структуры (модели, диаграммы) данных, с которой работает приложение,
можно воспользоваться возможностями, предоставляемыми страницей Diagram Редактора
кода. Любой элемент из иерархического дерева компонентов модуля данных можно
перенести на страницу диаграммы и задать связи между ними.
При
помощи управляющих кнопок можно задавать между элементами диаграммы отношения
синхронного просмотра и главный/подчиненный. При этом производится
автоматическая настройка свойств соответствующих компонентов.
Задание к лабораторной работе:
Задание А.
Разработка
простого приложения средствами DataBase Form Wizard
1. после запуска Delphi удалить Form1 из проекта
Project/Remove from Project
2.
открыть окно, автоматизирующее процесс создания
приложения Database/ Form Wizard, далее, следуя
указаниям мастера, на каждом шаге заполнять сведения:
- Алиас – Имя_файла.
3.
познакомиться с компонентами, расположенными на модуле данных и форме с помощью
окна Инспектор объектов
4. проделать
действия, описанные выше, для создания форм с горизонтальным расположением
данных и в виде таблице, отмечая для себя способы размещения отображаемой
информации и компоненты, используемые
для отображения данных разных типов.
5. закрыть
проект без сохранения
Задание Б.
1. Продумать
интерфейс создаваемого приложения, предусмотрев
возможность демонстрации различных возможностей расположения
отображаемой информации и набора компонентов визуализации данных (форма,
использующая как можно больше визуальных компонент отображения отдельного поля
набора данных, таблица, TDBCtrlGrid
– таблица, каждая запись которой отображается в виде формы и т. д.).
2. Создать
модуль данных, разместив на нем компоненты доступа к базе данных и к наборам
данных: Table
Для возможности подключения формы к модулю
данных в раздел Uses
модуля формы необходимо добавить Unit1.
3. Разработать
приложение для работы с БД с обязательной реализацией следующих функций:
отображение данных с использованием различных компонентов, ввод и
редактирование данных, навигация по наборам данных, графическое отображение
данных.
4. Сделать
невидимыми поля первичного ключа, установив для них свойство Visible в false.
5. Реализовать
в приложении демонстрацию дополнительных возможностей, описанных выше.
6. Разработать
диаграмму модуля приложения.
Содержание отчета:
1.
Модуль данных приложения.
2.
Главная форма приложения.
3.
Диаграмма модуля приложения.
4.
Описание реализованных в приложении дополнительных
возможностей.
Контрольные вопросы:
1. Для
чего предназначено приложение БД?
2. Что
включает в себя приложение, работающее с БД?
3. Перечислите
компоненты механизма доступа приложения к данным.
4. Установка
соединения с БД.
5. Компоненты
доступа к наборам данных. Их отличия.
6. Подключение
набора данных.
7. Классификация
компонентов отображения данных
8. Табличное
представление данных.
9. Как
осуществляется навигация по набору данных?
10. С помощью
каких компонентов можно представить данные в виде отдельных полей?
11. Компоненты
графического представление данных.
12. Раскройте
понятие модуля данных. Для чего он используется?
13. Перечислите
порядок действий, необходимых для отображения данных в приложении.
14. Что
представляет собой редактор полей?
15. Какие
действия необходимо выполнить, чтобы исключить неоправданное поддержание связи
с базой данных, которое занимает ресурсы, а при работе в сети мешает доступу к
базе данных других пользователей?
16. Опишите 4
способа ограничения вводимых в поля значений.
17. Что
представляют собой вычисляемые поля?
18. Каким
образом производится фильтрация данных?
19. Использование
словарей атрибутов полей
20. Раскройте
понятие «поля синхронного просмотра».
21. Опишите
процесс построения диаграммы модуля данных.