ИНЖЕНЕРНОЕ ГРУНТОВЕДЕНИЕ
Begin
Использование в приложениях модуля данных
Приложение с одной формой
Создание приложения
Изменение структуры таблицы
Просмотр списка подчиненных таблиц
Задание таблицы для выбора значений
Задание языкового драйвера
Задание паролей
Задание ссылочной целостности
Задание ограничений на значения полей
Задание индексов
Задание индекса сводится к определению
§ состава полей;
§ параметров;
§ имени.
Эти элементы устанавливаются или изменяются при выполнении операций создания, изменения и удаления индекса.
Для выполнения операций, связанных с заданием индексов, необходимо выбрать пункт Secondary Indexes(Вторичные индексы) комбинированного списка, при этом под списком появляются кнопки Define(Определить) и Modify(Изменить), список индексов и кнопка Erase(Удалить). В списке индексов выводятся имена созданных индексов, на рис. 5.2 это индекс indName.
Напомним, что для таблиц Paradox индекс также называют вторичным индексом.
Создание нового индекса начинается с нажатия кнопки Define,являющейся всегда доступной. Это приводит к появлению окна Define Secondary Index(Задание вторичного индекса), в котором задаются состав полей и параметры индекса (рис. 5.5).
В списке Fieldsокна выводятся имена всех полей таблицы, включая и те, которые нельзя включать в состав индекса, например, графическое поле или поле комментария. В списке Indexed Fields(Индексные поля) содержатся поля, которые включаются в состав создаваемого индекса. Перемещение полей между списками выполняется выделением нужного поля (полей) и нажатием расположенных между списками кнопок с изображением горизонтальных стрелок. Имена полей, которые нельзя включать в состав индекса, выделяются в левом списке серым цветом. Поле не может быть повторно включено в состав индекса, если оно уже выбрано и находится в правом списке.
Замечание
При работе с записями индексные поля обрабатываются в порядке следования этих полей в составе индекса. Это нужно учитывать при указании порядка полей в индексе.
Рис. 5.5. Окно задания индекса
Изменить порядок следования полей в индексе можно с помощью кнопок с изображением вертикальных стрелок, имеющих общее название Change order(Изменение порядка). Для перемещения поля (полей) необходимо его (их) выделить и нажать нужную кнопку.
Переключатели, расположенные в нижней части окна задания индекса, позволяют указать следующие параметры индекса:
§ Unique— индекс требует для составляющих его полей уникальных значений;
§ Maintained— если таблица открыта, индекс автоматически не модифицируется;
§ Case sensitive— для полей строкового типа учитывается регистр символов;
§ Descending— сортировка выполняется в порядке убывания значений.
Так как для таблиц dBase нет ключей, то для них использование параметра Uniqueявляется единственной возможностью обеспечить уникальность записей на физическом уровне (уровне организации таблицы), не прибегая к программированию.
После задания состава индексных полей и нажатия кнопки ОК появляется окно Save Index As,в котором указывается имя индекса (рис. 5.6). Для удобства обращения к индексу в его имя можно включить имена полей, указав какой-нибудь префикс, например ind. Нежелательно образовывать имя индекса только из имен полей, т. к. для таблиц Paradox подобная система именования используется при автоматическом образовании имен для обозначения ссылочной целостности между таблицами. После повторного нажатия ОК сформированный индекс добавляется к таблице, и его имя появляется в списке индексов.
Рис. 5.6. Задание имени индекса
Созданный индекс можно изменить, определив новый состав полей, параметров и имени индекса. Изменение индекса не отличается от процесса его создания. После выделения индекса в списке и нажатия кнопки Modifyснова открывается окно задания индекса (рис. 5.5). При нажатии кнопки ОК появляется окно сохранения индекса (рис. 5.6), содержащее имя изменяемого индекса, которое можно исправить или оставить прежним.
Для удаления индекса его нужно выделить в списке индексов и нажать кнопку Erase. Врезультате индекс удаляется без предупреждающих сообщений.
Кнопки Modifyи Eraseдоступны, только если индекс выбран в списке.
Задание ограничений на значения полей заключается в указании для полей:
- требования обязательного ввода значения;
- минимального значения;
§ максимального значения;
§ значения по умолчанию;
§ маски ввода.
Замечание
Установленные ограничения задаются на физическом уровне (уровне таблицы) и действуют для любых программ, выполняющих операции с таблицей: как для систем типа Database Desktop, так и для приложений, создаваемых в Delphi. Дополнительно к этим ограничениям или вместо них в приложении можно также задать программные ограничения.
Для выполнения операций, связанных с заданием ограничений на значения полей, нужно выбрать пункт Validity Checks (Проверка значений) комбинированного списка Table Properties(рис. 5.2), при этом под списком появляются переключатель Required Field(Обязательное поле), поля редактирования Minimum Value, Maximum Value,Default Value, Picture (Маска ввода) и кнопка Assist (Помощь). Переключатель и поля редактирования отображают установки для поля таблицы, которое выбрано в списке (курсор находится в строке этого поля).
Требование обязательного ввода значения означает, что поле не может быть пустым (иметь значение Null). Это требование действует при добавлении к таблице новой записи. До того как изменения в таблице будут подтверждены, поле должно получить какое-либо непустое значение, в противном случае генерируется ошибка. Ошибка может также возникнуть при редактировании записи, когда будет удалено старое значение поля и не присвоено новое.
Данное требование удобно использовать для так называемых обязательных полей таблиц, например, для поля фамилии в таблице сотрудников организации. Отметим, что обязательность ввода значения не действует на автоинкрементное поле, которое и без того является обязательным и автоматически заполняемым.
Для указания обязательности ввода значения в поле необходимо установить флаг Required Field,который по умолчанию выключен.
Для полей некоторых типов, в первую очередь числовых, денежных, строковых и даты, иногда удобно задавать диапазон возможных значений, а также значение по умолчанию. Диапазон определяется минимально и максимально возможными значениями, которые вводятся в полях редактирования Minimum Valueи Maximum Value.После их задания выход значения поля за указанные границы не допускается при вводе и редактировании любым способом.
Значение поля по умолчанию указывается в редакторе Default Value.Это значение устанавливается при добавлении новой записи, если при этом для поля не указано какое-либо значение.
Отметим, что задание диапазона и значений по умолчанию возможно не для всех полей, например, они не определяются для графического поля и поля комментария. Для этих полей соответствующее поле редактирования блокируется.
В строке редактирования Pictureможно задать маску (шаблон) для ввода значения поля. Ввод по маске поддерживается, например, для таких типов полей, как числовой или строковый. Его удобно использовать для ввода информации определенных форматов, например, телефонных номеров или почтовых индексов.
Для маски используются следующие символы:
§ # — цифра;
§ ? — любая буква (регистр не учитывается);
§ & — любая буква (преобразуется к верхнему регистру);
§ - — любая буква (преобразуется к нижнему регистру);
§ @ — любой символ;
§ ! — любой символ (преобразуется к верхнему регистру);
§ ; — за этим символом следует буквенный символ;
§ — число повторов следующего символа;
§ [abc]или {а,b,с} — любой из приведенных символов (а, b, или с), значения
перечисляются через запятую без пробелов.
Маску можно ввести в строке Pictureвручную или использовать для этого окно Picture Assistance, вызываемое нажатием кнопки Assist (рис. 5.7).
Рис. 5.7. Окно формирования маски
Указанное окно помогает ввести, выбрать или откорректировать маску, а также проверить ее функционирование.
Список Sample picturesсодержит образцы масок, которые выбираются нажатием кнопки Use. Выбранная маска помещается в поле редактирования Pictureи доступна для изменения. Для модификации списка образцов масок служат кнопки Add to list и Delete from list:первая добавляет к списку маску, содержащуюся в поле Picture,а вторая удаляет из списка выбранную маску.
Проверка синтаксиса маски выполняется по нажатию кнопки Verify Syntax,результат проверки выводится в информационном поле. Кнопка Restore Original(Вернуть исходную) служит для восстановления начального (т. е. до начала редактирования) значения маски.
Функционирование маски можно проверить, введя в строку редактирования Sample valueзначение поля таблицы. По нажатию кнопки Test Valueвыполняется проверка введенного значения, результат проверки выводится в информационной панели.
Понятие ссылочной целостности относится к связанным таблицам и проявляется в следующих вариантах взаимодействия таблиц:
§ запрещается изменение поля связи или удаление записи главной таблицы,
если для нее имеются записи в подчиненной таблице;
§ при удалении записи в главной таблице автоматически удаляются соответствующие ей записи в подчиненной таблице (каскадное удаление).
Для выполнения операций, связанных с заданием ссылочной целостности, необходимо выбрать пункт Referential Integrityкомбинированного списка Table Properties(рис. 5.2). При этом, как и в случае задания индексов, появляются кнопки Define, Modify, Eraseи список, в котором выводятся имена созданных условий ссылочной целостности.
Условие ссылочной целостности задается для подчиненной таблицы и определяется следующими элементами:
§ полями связи подчиненной таблицы;
§ именем главной таблицы;
§ полями связи главной таблицы;
§ параметрами.
Разработчик может создать, изменить или удалить условие ссылочной целостности.
Для задания условия ссылочной целостности нужно нажать кнопку Define,после чего появляется окно Referential Integrity(рис. 5.8).
Всписке Fieldsследует выбрать поле связи и нажатием кнопки со стрелкой вправо перевести его в список Child Fields(Дочерние поля). Если полей связи несколько, то эти действия выполняются для каждого из них. Кнопка со стрелкой влево удаляет выбранное поле из списка полей связи.
В списке Tableуказывается главная таблица, имена таблиц выбираются из рабочего каталога программы Database Desktop (каталог, определенный как Working Directory, его задание описано в лекции 6). После выбора таблицы и нажатия кнопки со стрелкой влево (рядом со списком таблиц) в список Parent's keyавтоматически заносятся ключевые поля главной таблицы.
Рис. 5.8.Задание условия ссылочной целостности
Замечание
Главная таблица должна быть закрыта и не использоваться другими программами, включая Database Desktop. В противном случае при попытке сохранить структуру таблицы возникает ошибка.
Параметры ссылочной целостности выбираются переключателями. Группа Update rules(Правила изменения) определяет вид взаимодействия таблиц при изменениях в главной таблице. Переключатель Cascade устанавливает режим каскадного удаления записей в подчиненной таблице при удалении соответствующей записи главной таблицы. Переключатель Prohibitустанавливает режим запрещения изменения поля связи или удаления записи главной таблицы, для которой имеются записи в подчиненной таблице.
Переключатель Strict referential Integrity(Жесткая ссылочная целостность) устанавливает защиту таблиц от модификации с использованием ранних версий программы Database Desktop (под DOS), которые не поддерживают ссылочную целостность.
После установки нужных флагов и нажатия кнопки ОК появляется окно Save Referential Integrity As,в котором указывается имя условия (рис. 5.5). Напомним, что для таблиц Paradox условия ссылочной целостности именуются. Для удобства обращения к условию в его имя можно включить имена полей и таблиц, задав при этом некоторый префикс, например, ri. После нажатия ОК сформированное условие ссылочной целостности добавляется к таблице, и его имя появляется в списке условий.
Замечание
Условия ссылочной целостности задаются на физическом уровне и действуют для любых программ, выполняющих операции с таблицей: как для программ типа Database Desktop, так и для приложений, создаваемых в Delphi.
Рис. 5.5. Задание имени для условия ссылочной целостности
Созданное условие ссылочной целостности можно изменить, определив новый состав полей и новые значения параметров. Изменение условия ссылочной целостности не отличается от процесса его создания: после выделения имени условия в списке и нажатия кнопки Modify открывается окно определения ссылочной целостности (рис. 5.8). При нажатии кнопки ОК измененное условие ссылочной целостности сохраняется под тем же именем.
Для удаления условия ссылочной целостности нужно выделить его в списке и нажать кнопку Erase. Удаление производится без выдачи предупреждающих сообщений.
Кнопки Modify и Erase доступны только, если выбрано условие в списке.
Пароль позволяет задать права доступа пользователей (приложений) к таблице. Если для таблицы установлен пароль, то он будет автоматически запрашиваться при каждой попытке открытия таблицы.
Замечание
Пароль действует на физическом уровне и его действие распространяется на все программы, выполняющие доступ к таблице: как на программы типа Database Desktop, так и на создаваемые приложения Delphi.
Для выполнения операций, связанных с заданием пароля, нужно выбрать строку Password Security в комбинированном списке Table Properties окна определения структуры таблицы (см. рис. 5.2). При этом под списком появляются кнопки Define и Modify. Нажатие кнопки Define вызывает окно Password Security (рис. 5.10), в котором задается пароль.
Рис. 5.10.Задание главного пароля
Пароль таблицы вводится два раза — в полях Master password (Главный пароль) и Verify master password (Подтвердить главный пароль). При нажатии кнопки ОК оба значения сверяются, и при их совпадении пароль принимается. Когда пароль определен, кнопка Defineблокируется и становится доступной кнопка Modify изменения пароля. Ее нажатие снова вызывает окно задания пароля (рис. 5.10), в котором появляются кнопки Change и Delete, а поля редактирования заблокированы.
Нажатием кнопки Delete пароль удаляется, после чего его можно ввести заново. Если в качестве значения пароля указана пустая строка, то пароль для таблицы не задан. Нажатием кнопки Change поля редактирования разблокируются и значение пароля можно изменить (в обоих полях). При этом название кнопки Change изменяется на Revert (Возврат), и ее повторное нажатие возвращает значение пароля, которое было до начала редактирования.
Рассмотренный пароль считается главным паролем, который предоставляет пользователю полные права доступа к таблице, включая изменение записей и структуры таблицы, в том числе смену пароля. Кроме главного пароля, можно задать для таблицы дополнительные пароли, устанавливающие пользователю ограниченные права доступа к таблице. Для задания дополнительных паролей нажатием кнопки Auxiliary Passwords вызывается одноименное окно (рис. 5.11).
Рис. 5.11. Задание дополнительных паролей
В списке Passwordsвыводятся действующие дополнительные пароли. Группа переключателей Table rightsопределяет для пароля права доступа к таблице в целом. Они могут быть следующими:
§ All— полные права, включая изменение записей и структуры таблицы;
§ Insert & delete— разрешены вставка и удаление, а также редактирование записей,
запрещено изменение структуры таблицы;
§ Date entry— разрешены редактирование и вставка записей, запрещены изменение
структуры таблицы и удаление записей;
§ Update— разрешены только просмотр (чтение) записей и редактирование
неключевых полей;
§ Read only— разрешен только просмотр (чтение) записей.
Права доступа к таблице действуют на все ее поля, кроме того, для каждого поля можно установить отдельные права доступа, не зависящие от прав доступа к другим полям. Права доступа к полям выводятся слева от имени поля в списке Fields rightsи содержат следующие позиции:
§ All— чтение и изменение значения поля;
§ Read only— только чтение значения поля;
§ None— доступ к полю запрещен.
Смена права доступа к полю выполняется выбором поля в списке и нажатием кнопки Fields rights,при котором право циклически устанавливается очередным значением списка (All, Read onlyи None).
Создание пароля начинается нажатием кнопки New,после чего его имя указывается в поле редактирования Current password(Текущий пароль) и устанавливаются права доступа к таблице и ее полям. Нажатие кнопки Addзаносит пароль в список дополнительных паролей.
Нажатие кнопки Changeпереводит выбранный в списке пароль в режим редактирования, при этом появляются кнопки Accept(Подтвердить) и Revert,а также разблокируется кнопка Delete.В процессе редактирования пароль можно изменить, удалить или оставить без изменений. После смены имени пароля и права доступа внесенные изменения утверждаются нажатием кнопки Accept.Для выхода из режима редактирования и возврата к прежним установкам пароля необходимо нажать кнопку Revert.Удаляется пароль нажатием кнопки Delete.
Отметим, что из приложения паролями можно управлять с помощью методов компонента session. Управление паролями заключается в их добавлении и удалении:
процедура AddPassword (const Password: string) добавляет новый пароль, заданный параметром Password;
процедура RemovePassword (const Password: String) удаляет указанный пароль;
процедура RemoveAllPasswords — удаляет все пароли.
Для задания языкового драйвера нужно выбрать пункт Table Language(Язык таблицы) комбинированного списка Table Propertiesокна определения структуры таблицы (см. рис. 5.2). При этом под списком становится доступной кнопка Modify,открывающая окно Table Language(рис. 5.12). Под языком таблицы понимается языковой драйвер, используемый для этой таблицы. Вполе списка Languageотображается текущий драйвер.
Рис. 5.12. Выбор языкового драйвера
В списке можно выбрать драйвер нужного языка, для русского языка это драйвер Pdox ansi Cyrillic, который корректно отображает символы русского алфавита и выполняет с ними операции сортировки.
По умолчанию языковой драйвер определяется установками процессора баз данных BDE, поэтому целесообразно установить его (параметр langdriver) в нужное значение, например, с помощью программы Administrator BDE. Параметры BDE и вопросы, связанные с их настройкой, рассматриваются в лекции 6.
Часто возникает ситуация, когда в поле должны заноситься значения из какого-либо набора, который может формироваться различными способами. Одним из часто используемых является вариант, когда эти значения содержатся в поле другой таблицы, а совокупность значений всех записей этого поля образует набор допустимых значений.
Для полей некоторых типов, например, строкового, числового или даты, можно определить некоторую таблицу (таблицу выбора), поля которой будут использоваться для формирования набора допустимых значений. Если для поля задана таблица выбора, то в него можно ввести только значение, содержащееся в таблице выбора (в указанном поле любой записи). Задание таблицы выбора гарантирует, что в поле не будет введено недопустимое значение.
Действие набора допустимых значений распространяется также на редактирование записей таблицы программным способом: при попытке присвоить полю недопустимое значение генерируется исключительная ситуация.
Замечание
При вводе строковых значений учитывается регистр букв, поэтому, например, водитель и водитель являются разными значениями.
В любом случае допустимым является пустое значение (Null), если, конечно, не задано ограничение, что поле не может быть пустым.
Для выполнения операций, связанных с полями выбора, предназначен пункт Table Lookup(Таблица выбора) комбинированного списка Table Propertiesокна определения структуры таблицы (см. рис. 5.2). При этом под списком становится доступной кнопка Define,нажатие которой открывает окно Table Lookup(рис. 5.13).
В Списке Fieldsвыводятся имена всех полей таблицы, при этом имена полей, которые не допускают создание таблицы выбора, выделены серым цветом (например, поле автоинкрементного типа).
Рис. 5.13. Окно задания таблицы выбора
Имя поля, для которого задается таблица выбора, отображается в области Fieldname, для его указания следует выделить в списке Fieldsнужную строку и нажать кнопку с изображением стрелки вправо. Если указать другое поле и нажать кнопку, то имя этого поля перейдет в область Field nameи заменит имя предыдущего поля.
В списке Lookup tableзадается таблица выбора, имя которой (имя главного файла) появляется в поле редактирования над списком. В списке Drive (or Alias)задается диск или псевдоним, которые определяют расположение таблица выбора. Название каталога, таблицы которого содержатся в списке Lookup table,отображается справа от названия списка Drive (or Alias).Таблицу также можно задать в окне Select File,вызываемом нажатием кнопки Browse(Просмотр).
После задания таблицы выбора нажатие кнопки с изображением стрелки влево переводит имя первого ее поля, значения которого будут использованы для формирования набора допустимых значений, в область Lookup field(Поле выбора). Типы полей обеих таблиц должны совпадать, в противном случае в информационной панели выдается сообщение об ошибке.
С помощью группы переключателей Lookup type(Тип выбора) можно задать способ взаимодействия обеих таблиц. Если включен переключатель Just current field(Только текущее поле), то таблица выбора задается только для поля, указанного в области Field name.Переключатель All corresponding fieldsназначает таблицу выбора не только указанному полю, но и всем соответствующим полям. Имена и типы этих полей должны совпадать с соответствующими полями таблицы выбора.
Группа переключателей Lookup access(Доступ к таблице выбора) определяет, каким образом пользователем используются значения из таблицы выбора.
Если включен переключатель Fill no help(Вставка без помощи), то при редактировании поля, для которого определена таблица выбора, пользователь должен знать допустимые значения этого поля. При этом термин "выбор" не совсем точно отражает взаимосвязь полей таблиц, т. к. пользователю не предлагается список возможных значений, из которых он может выбрать нужное ему. Пользователь сам вводит значение в поле, при этом на уровне таблицы выполняется проверка, является ли это значение допустимым. Если значение отсутствует в указанном поле таблицы выбора, то оно не принимается.
В этом случае может помочь отображение рядом с редактируемой таблицей таблицы выбора, например, как показано на рис. 5.14.
Рис. 5.14. Функционирование поля, для которого задана таблица выбора
В приведенном на этом рисунке примере в окне программы Database Desktop таблица Personnel содержит данные о сотрудниках организации, в ней определены поля кода (P_Сode), фамилии (P_Name), должности (P_Position), оклады (P_Salary) и примечания (P_Note). В строковое поле должности можно вводить только допустимое название должности. Перечень всех должностей содержится в единственном поле Position таблицы Position. Для предотвращения ввода в таблицу Personnel неправильных значений ее полю P_Position назначена таблица выбора Positionи ее поле Position. В таблице Personnel для первых трех сотрудников введены должности, имеющиеся в таблице Position. Попытка задать для четвертого сотрудника должность Бухгалтер блокируется, т. к. эта должность не является разрешенной для ввода. При необходимости эту должность сначала нужно ввести в таблицу Position, после чего она станет доступной также и для таблицы Personnel.
Установка переключателя Help and fill(Помощь и вставка) позволяет не только ввести значение в поле, как описано выше, но и действительно выбрать значение из списка. Список, сформированный на основании значений поля (полей) таблицы выбора (рис. 5.15), появляется при нажатии комбинации клавиш <Ctгl>+<Пробел> в редактируемом поле. После выбора нужного значения и нажатия кнопки ОК оно заносится в поле.
Рис. 5.15. Список выбора
Замечание
Из таблицы выбора могут быть удалены значения. Если эти значения содержатся в полях таблицы, использующей таблицу выбора, то при переходе в режим ее редактирования возникает ошибка. При использовании программы типа Database Desktop таблицу нельзя вывести из режима редактирования, пока все ее значения не приведены в соответствие с новыми значениями таблицы выбора. При доступе к таблице, использующей значения, которые удалены из таблицы выбора, во время выполнения приложения генерируется исключительная ситуация.
После задания для поля таблицы выбора в окне определения структуры таблицы (см. рис. 5.2) появляются кнопки Modifyи Erase,а также список, в котором отображается имя этой таблицы.
Нажатие кнопки Modifyвновь открывает окно задания таблицы выбора, в котором можно ввести новые данные. Кнопка Eraseслужит для отмены использования таблицы выбора и связанных с ней ограничений на значения поля.
Отметим, что объекты поля типа TFieid наборов данных Tablе и Query, а также компонент DBGrid позволяют определить для поля список выбора, который также дает возможность пользователю выбирать значения при редактировании. Они задаются на программном уровне, и их действие распространяется только на свое приложение. Определение и использование подобных списков выбора рассмотрено в главах 17 и 18.
Таблица, связанная с другими таблицами, является либо главной, либо подчиненной. Выше мы рассмотрели задание ссылочной целостности для подчиненной таблицы. Для главной таблицы можно просмотреть список подчиненных таблиц, отображаемый при выборе пункта Dependent Table(Подчиненная таблица) все того же комбинированного списка Table Properties(см. рис. 5.2). Этот список содержит имена всех таблиц, имеющих условия ссылочной целостности с участием данной таблицы.
Структуру существующей таблицы можно изменить, выполнив команду Table/Restructure...после предварительного выбора таблицы в окне программы Database Desktop. В результате открывается окно определения структуры таблицы, и дальнейшие действия не отличаются от действий, выполняемых при создании таблицы.
Замечание
При изменении структуры таблицы с ней не должны работать другие приложения, в том числе Delphi. Поэтому предварительно необходимо закрыть Delphi или приложение, в котором компоненты Table связаны с перестраиваемой таблицей. Другим вариантом является отключение активности компонентов Table, связанных с перестраиваемой таблицей, для чего свойству Active этих компонентов через Инспектор объектов устанавливается значение False.
Переименование таблицы следует выполнять из среды программы Database Desktop, а не из среды Windows, например, с помощью Проводника. Для этого при работе со структурой таблицы можно нажать кнопку Save as... и задать новое имя таблицы. В результате в указанном каталоге диска появятся все необходимые файлы таблицы. При этом старая таблица также сохраняется. Информация о названии таблицы используется внутри ее файлов, поэтому простое переименование всех файлов таблицы приведет к ошибке при попытке доступа к ней.
Если необходимо просто ознакомиться со структурой таблицы, то выполняется команда Table/Into Structure.... Врезультате появляется окно определения структуры таблицы, но элементы, с помощью которых в структуру таблицы могут быть внесены изменения, заблокированы. Просмотр структуры возможен также для таблицы, с которой связаны другие приложения.
Дляпримера рассмотрим создание приложения, позволяющего перемещаться по записям таблицы БД, просматривать и редактировать поля, удалять записи из таблицы, а также вставлять новые. Файл проекта приложения обычно не требует от разработчика выполнения каких-либо действий. Поэтому при создании приложения главной задачей является конструирование форм, в простейшем случае — одной формы.
Вид формы приложения на этапе проектирования показан на рис. 5.16, где на форме размещены компоненты Tablel, DataSourcel, DBGridl и DBNavigatorl.
Компонент Tablel обеспечивает взаимодействие с таблицей БД. Для связи с требуемой таблицей нужно установить соответствующее значение свойствам DataBaseName, указывающему путь к БД, и TableName, указывающему имя таблицы. После задания таблицы для открытия набора данных свойству Active должно быть установлено значение True.
Рис. 5.16. Форма приложения для работы с БД
Замечание
Значение True свойству Active нужно устанавливать после задания таблицы БД, т. е. после установки нужных значений свойств DataBaseName и TableName.
Имя таблицы лучше выбирать из раскрывающегося списка в поле значения свойства TableName. Если путь к БД (свойство DataBaseName) задан правильно, то в этом списке отображаются главные файлы всех доступных таблиц.
В рассматриваемом приложении использована таблица клиентов, входящая в состав поставляемых с Delphi примеров, ее главный файл — clients.dbf. Файлы этой и других таблиц примеров находятся в каталоге, путь к которому указывает псевдоним dbdemos.
Компонент DataSource1является промежуточным звеном между компонентом Table1, соединенным с реальной таблицей БД, и визуальными компонентами DBGrid1 и DBNavigatorl, с помощью которых пользователь взаимодействует с этой таблицей. На компонент Table1, с которым связан компонент DataSourcel, указывает свойство DataSet последнего.
Компонент DBGridl отображает содержимое таблицы БД в виде сетки, в которой столбцы соответствуют полям, а строки — записям таблицы. По умолчанию пользователь может просматривать и редактировать данные. Компонент DBNavigatorl позволяет пользователю осуществлять перемещение по таблице, редактировать, вставлять и удалять записи. Компоненты DBGridl и DBNavigatorl связываются со своим источником данных — компонентом DataSourcel — через свойства DataSource.
Взаимосвязь компонентов приложения и таблицы БД и используемые при этом свойства компонентов показаны на рис. 5.17.
При разработке приложения значения всех свойств компонентов можно задать с помощью Инспектора объектов. При этом требуемые значения либо непосредственно вводятся в поле, либо выбираются из раскрывающихся списков. В последнем случае приложение создается с помощью мыши и не требует набора каких-либо символов с клавиатуры. В табл. 5.1 приведены компоненты, используемые для работы с таблицей БД, основные свойства и их значения.
Рис. 5.17.Взаимосвязь компонентов приложения и таблицы БД
Таблица 5.1
Значения свойств компонентов
Компонент | Свойства | Значения |
Tablel | DataBaseName TableName Active | dbdemos clients.dbf true |
DataSourcel | DataSet | Tablel |
DBGridl | DataSource | DataSourcel |
DBNavigatorl | DataSource | DataSourcel |
Рис. 5.18. Окно Database Form Wizard
В дальнейшем при организации приложений предполагается, что названные компоненты связаны между собой именно таким образом, и свойства, с помощью которых эта связь осуществляется, не рассматриваются.
Для автоматизации процесса создания формы, использующей компоненты для операций с БД, можно вызвать Database Form Wizard(Мастер форм баз данных), показанный на рис. 5.18. Этот Мастер расположен на странице BusinessХранилища объектов.
Мастер позволяет создавать формы для работы с отдельной таблицей и со связанными таблицами, при этом можно использовать наборы данных Table или Query.
При конструировании формы невизуальные компоненты, используемые для доступа к данным, такие как Datasource или Table, размещаются на форме, но при выполнении приложения эти компоненты не видны. Поэтому их можно размещать в любом удобном месте формы, выступающей для них контейнером — модулем. Кроме того, для размещения невизуальных компонентов, через которые осуществляется доступ к данным, предназначен специальный объект — модуль данных.
Существует три типа модуля данных:
§ простой модуль данных;
§ удаленный модуль данных;
§ Web-модуль.
Ниже рассматривается простой модуль данных, который представлен объектом DataModule. Использование удаленного модуля данных и Web-модуля изучается при рассмотрении трехуровневых приложений и публикации БД в Интернете.
Если применяется простой модуль данных, то взаимосвязь компонентов приложения и таблицы БД имеет вид, показанный на рис. 5.15.
Рис. 5.15. Взаимосвязь компонентов приложения и таблицы БД
при использовании модуля данных
Модуль данных, как и форма, является контейнером для своих невизуальных компонентов, и для него создается модуль кода с расширением PAS. Добавление модуля данных к проекту выполняется командой File/New/DataModuleглавного меню Delphi. В окне модуля компоненты размещаются таким же образом, как и на форме (рис. 5.20). При выборе объекта в Инспекторе объектов отображаются его свойства, значения которых можно просматривать и изменять.
Рис. 5.20. Модуль данных
При обращении к содержащимся в модуле данных компонентам для них указывается составное имя, в которое, кроме имени компонента, входит также имя модуля данных. Составное имя имеет формат
<Имя модуля данных>.<Имя компонента>
Ниже приводится пример кода, в котором осуществляется обращение к компонентам модуля данных.
procedure TForml.FormCreate(Sender: TObject);
DataModule2.Tablel.DatabaseName: ='dbdemos' ;
DataModule2.Tablel.TableName: ='clients.dbf' ;
DataModule2.DataSourcel.DataSet:=DataModule2.Tablel;
DBGridl.DataSource:=DataModule2.DataSourcel;
DBNavigatorl.DataSource:=DataModule2.DataSourcel;
DataModule2.Tablel.Active:=true;
end;
Для компонентов выполняется установка значений свойств, связывающих между собой эти компоненты и таблицу БД. Значения свойств устанавливаются динамически в процессе выполнения приложения, для чего использован обработчик события создания главной формы приложения. В составных именах компонентов доступа к данным, которыми являются источник данных DataSourcelи набор данных Tablel, указывается имя модуля данных DataModule2.
Чтобы обеспечить возможность доступа к компонентам модуля данных в модуле формы, в список uses раздела implementation необходимо включить ссылку на модуль данных:
uses unit2;
Ссылкуна другой модуль можно написать самостоятельно, но Delphiдает возможность вставить ее автоматически. Привыборе команды File/Use Unit...появляется диалоговое окно Use Unit(рис. 5.21). После выбора нужного модуля и нажатия кнопки ОК он добавляется в список.
Рис. 5.21. Окно выбора модуля
Если ссылка на требуемый модуль отсутствует, но в коде используется имя модуля данных, то при компиляции приложения появляется диалоговое окно Information(рис. 5.22). В нем сообщается о том, что форма ссылается на другую форму, объявленную в модуле, отсутствующем в списке uses формы. Для автоматического добавления модуля в список достаточно нажать кнопку Yes.
Рис. 5.22. Диалог добавления модуля в список uses
Помимо компонентов доступа к данным, которыми являются session, Database, Table, Query, storedProc, BatchMove и др., в модуле данных можно размещать также невизуальные компоненты, не имеющие прямого отношения к БД, например, ImageList, OpenDialog или Timer.
Замечание
При работе с модулем данных в Палитре компонентов доступны только неви-зуальные компоненты.
Модуль данных позволяет:
§ отделить управление БД от обработки данных;
§ создать модуль, совместно используемый несколькими приложениями.
Основным назначением модуля данных является централизованное хранение компонентов доступа к данным, а также кода для этих компонентов, в частности, обработчиков событий. В модуле данных удобно размещать код, выполняющий управление БД, например, реализацию бизнес-правил.
Использование простого модуля данных несколькими приложениями позволяет ускорить разработку приложений, т. к. готовый модуль данных впоследствии можно включать в новые приложения. Кроме того, управление БД через общий модуль дает возможность определить для всех пользователей одинаковые режимы и правила работы с базой, а также делает более простым изменение этих режимов и правил.
Однако для небольших приложений использование простого модуля данных не всегда оправдано, т. к. может затруднить, а не облегчить разработку приложения.
Удаленный модуль данных предназначен для работы с удаленными БД в трехуровневой архитектуре "клиент-сервер" и используется для создания сервера приложения — промежуточного уровня между приложением и сервером БД. Удаленный модуль данных будет рассмотрен в теме 3.
Web-модуль предназначен для работы с БД в сети Интернет и является посредником между браузером (программой просмотра Web-документов) и сервером БД. Использование Web-модуля будет рассмотрено в теме 4.