Курс «Базы данных» Разработчики курса: Иваньчева Татьяна Александровна, доцент, ВКИ НГУ, Иванчева Наталья Александровна, ст.преподаватель, ФИТ НГУ Содержание ГЛАВА 1. БАЗЫ ДАННЫХ. СИСТЕМЫ УПРАВЛЕНИЯ БАЗАМИ ДАННЫХ (СУБД) ........................................................................................................................................... 6 ОБЗОР СУБД ............................................................................................................................... 6 ОСНОВНЫЕ ФУНКЦИИ СУБД ...................................................................................................... 7 Управление данными во внешней памяти ........................................................................... 7 Управление буферами оперативной памяти ...................................................................... 7 Управление транзакциями .................................................................................................... 8 Журнализация и восстановление базы данных после сбоев .............................................. 8 Поддержка языков баз данных ............................................................................................ 8 КОНТРОЛЬНЫЕ ВОПРОСЫ............................................................................................................. 9 ГЛАВА 2. МОДЕЛИ ДАННЫХ ................................................................................................ 9 ИЕРАРХИЧЕСКАЯ МОДЕЛЬ ДАННЫХ............................................................................................. 9 СЕТЕВАЯ МОДЕЛЬ ДАННЫХ....................................................................................................... 11 ДОСТОИНСТВА И НЕДОСТАТКИ РАННИХ МОДЕЛЕЙ ................................................................... 13 ОБЪЕКТНАЯ МОДЕЛЬ ................................................................................................................. 13 КОНТРОЛЬНЫЕ ВОПРОСЫ........................................................................................................... 14 ГЛАВА 3. РЕЛЯЦИОННАЯ МОДЕЛЬ ................................................................................. 14 ОСНОВНЫЕ ПОНЯТИЯ И ОГРАНИЧЕНИЯ РЕЛЯЦИОННОЙ МОДЕЛИ .............................................. 14 МАТЕМАТИЧЕСКОЕ ОПРЕДЕЛЕНИЕ ОТНОШЕНИЯ. РЕЛЯЦИОННАЯ АЛГЕБРА .............................. 15 КОНТРОЛЬНЫЕ ВОПРОСЫ........................................................................................................... 18 ГЛАВА 4. ВОПРОСЫ ПРОЕКТИРОВАНИЯ РЕЛЯЦИОННЫХ БАЗ ДАННЫХ ....... 18 ЦЕЛИ ПРОЕКТИРОВАНИЯ БАЗЫ ДАННЫХ. ЭТАПЫ ПРОЕКТИРОВАНИЯ ....................................... 18 ВОПРОСЫ И ЗАДАНИЯ ................................................................................................................ 21 НОРМАЛИЗАЦИЯ. 1,2,3 НОРМАЛЬНЫЕ ФОРМЫ .......................................................................... 21 ВОПРОСЫ И ЗАДАНИЯ ................................................................................................................ 24 ГЛАВА 5. СЕМАНТИЧЕСКАЯ МОДЕЛЬ ДАННЫХ ....................................................... 25 ER-МОДЕЛЬ ПРЕДМЕТНОЙ ОБЛАСТИ ......................................................................................... 25 ЧИТАТЕЛЬ................................................................................................................................. 25 ОПЕРАЦИИ НАД СУЩНОСТЯМИ ................................................................................................. 27 ПОРЯДОК ПОСТРОЕНИЯ ER-МОДЕЛИ И ПОСТРОЕНИЕ РЕЛЯЦИОННОЙ СХЕМЫ БАЗЫ ДАННЫХ ИЗ ER-МОДЕЛИ ............................................................................................................................... 27 ПРИМЕР ПОСТРОЕНИЯ ER- МОДЕЛИ .......................................................................................... 28 КОНТРОЛЬНЫЕ ВОПРОСЫ........................................................................................................... 29 ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ ............................................................................. 29 1 ГЛАВА 6. РАЗРАБОТКА ПОЛЬЗОВАТЕЛЬСКИХ ПРИЛОЖЕНИЙ В СРЕДЕ СУБД MS ACCESS ................................................................................................................................ 29 ОБЪЕКТЫ БАЗЫ ДАННЫХ ........................................................................................................... 29 ВОПРОСЫ И ЗАДАНИЯ ................................................................................................................ 31 ТАБЛИЦЫ. СХЕМА ДАННЫХ ...................................................................................................... 32 ВВОД ДАННЫХ В ТАБЛИЦУ ........................................................................................................ 34 ВОПРОСЫ И ЗАДАНИЯ ................................................................................................................ 37 ФОРМЫ. ТИПЫ ФОРМ. ЭЛЕМЕНТЫ УПРАВЛЕНИЯ ...................................................................... 38 СОЗДАНИЕ ФОРМЫ С ПОМОЩЬЮ КОНСТРУКТОРА ..................................................................... 39 ВОПРОСЫ И ЗАДАНИЯ ................................................................................................................ 43 ЗАПРОСЫ. МАКРОСЫ. ОТЧЕТЫ .................................................................................................. 43 Основы SQL .......................................................................................................................... 43 СОЗДАНИЕ ВЛОЖЕННЫХ (ПОДЧИНЕННЫХ) ЗАПРОСОВ .............................................................. 46 ОБНОВЛЕНИЕ ЗАПИСЕЙ .............................................................................................................. 47 ВОПРОСЫ И ЗАДАНИЯ ................................................................................................................ 48 ЗАПРОСЫ QBE. МАСТЕР ЗАПРОСОВ ......................................................................................... 48 ВОПРОСЫ И ЗАДАНИЯ ................................................................................................................ 51 ВОПРОСЫ И ЗАДАНИЯ ................................................................................................................ 59 ИТОГОВЫЙ ЗАПРОС .................................................................................................................... 59 ПЕРЕКРЕСТНЫЙ ЗАПРОС ............................................................................................................ 61 ВОПРОСЫ И ЗАДАНИЯ ................................................................................................................ 62 ПОСТРОЕНИЕ ФОРМ НА ОСНОВЕ ЗАПРОСА ................................................................................. 63 МАКРОСЫ .................................................................................................................................. 68 ОТЧЕТЫ ...................................................................................................................................... 73 РАЗРАБОТКА ПРИЛОЖЕНИЯ........................................................................................................ 81 ГЛАВА 7. РАЗРАБОТКА ПРИЛОЖЕНИЙ В СРЕДЕ DELPHI ....................................... 86 ОСНОВНЫЕ ЭТАПЫ РАЗРАБОТКИ ИНФОРМАЦИОННОГО ПРИЛОЖЕНИЯ...................................... 86 РАЗРАБОТКА ИНФОРМАЦИОННОГО ПРИЛОЖЕНИЯ НА ПРИМЕРЕ «ПРИЕМНАЯ КОМИССИЯ ВУЗА» ....................................................................................................................................... 87 ОСОБЕННОСТИ ПРОГРАММНОГО СРЕДСТВА DELPHI .................................................................. 89 СРЕДА РАЗРАБОТКИ ................................................................................................................... 90 КОНТРОЛЬНЫЕ ВОПРОСЫ........................................................................................................... 94 ПЕРВОЕ ПРИЛОЖЕНИЕ В DELPHI ................................................................................................ 94 ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ ............................................................................. 97 КНОПКИ ..................................................................................................................................... 98 ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ ............................................................................. 99 ПОЛЕ РЕДАКТИРОВАНИЯ ........................................................................................................... 99 ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ ........................................................................... 101 КОНТРОЛЬНЫЕ ВОПРОСЫ......................................................................................................... 101 ОСНОВНЫЕ ПОНЯТИЯ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ(ООП) .......... 101 ОСНОВНЫЕ ПРИНЦИПЫ ООП .................................................................................................. 102 КОНТРОЛЬНЫЕ ВОПРОСЫ......................................................................................................... 103 СПИСКИ ................................................................................................................................... 104 ЗАВИСИМЫЕ ПЕРЕКЛЮЧАТЕЛИ. КОМПОНЕНТЫ RADIOBUTTON, RADIOGROUP ...................... 107 ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ ........................................................................... 109 ФУНКЦИЯ MESSAGEDLG ......................................................................................................... 110 ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ ............................................................................ 111 ГЛАВНОЕ МЕНЮ ПРИЛОЖЕНИЯ. КОМПОНЕНТ MAINMANU ..................................................... 112 ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ ............................................................................ 113 КНОПОЧНАЯ ПАНЕЛЬ. КОМПОНЕНТ TOOLBAR ........................................................................ 114 ОБЛАСТЬ РЕДАКТИРОВАНИЯ. КОМПОНЕНТ MEMO .................................................................. 115 2 КОНТЕКСТНОЕ МЕНЮ. КОМПОНЕНТ POPUPMENU................................................................... 116 ДИАЛОГОВЫЕ ОКНА WINDOWS................................................................................................ 116 ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ ............................................................................ 118 ПОНЯТИЕ ПРОЕКТА. СТРУКТУРА ПРОЕКТА .............................................................................. 118 ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ ............................................................................ 121 ФОРМА ..................................................................................................................................... 121 ДОБАВЛЕНИЕ ФОРМЫ К ПРОЕКТУ ........................................................................................... 121 СТРУКТУРА МОДУЛЯ PASCAL .................................................................................................. 122 КАК ОТКРЫТЬ ФОРМУ .............................................................................................................. 123 ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ ............................................................................ 123 СПОСОБНОСТЬ ФОРМ ССЫЛАТЬСЯ ДРУГ НА ДРУГА ................................................................. 124 ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ ............................................................................ 125 ПРОСМОТР ФОРМ И АССОЦИИРОВАННЫХ С НИМИ МОДУЛЕЙ.................................................. 125 ОСНОВНЫЕ СВОЙСТВА, МЕТОДЫ И СОБЫТИЯ ФОРМЫ ............................................................ 125 МЕНЕДЖЕР ПРОЕКТОВ ............................................................................................................. 127 ОПЦИИ ПРОЕКТА ...................................................................................................................... 128 УПPАВЛЕНИЕ ПPОЕКТАМИ ....................................................................................................... 130 КОМПИЛЯЦИЯ И СБОРКА ПРОЕКТА .......................................................................................... 131 ВЫПОЛНЕНИЕ И ОТЛАДКА ПРОЕКТА ........................................................................................ 131 ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ ........................................................................... 132 КОНТРОЛЬНЫЕ ВОПРОСЫ......................................................................................................... 132 ГЛАВА 8. РАБОТА С БАЗАМИ ДАННЫХ В DELPHI.................................................... 133 СОЗДАНИЕ БАЗЫ ДАННЫХ В INTERBASE .................................................................................. 133 ПСЕВДОНИМЫ. УТИЛИТА DATABASE EXPLORER .................................................................... 135 ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ ............................................................................ 139 ПЕРВОЕ ПРИЛОЖЕНИЕ ДЛЯ РАБОТЫ С БАЗАМИ ДАННЫХ ......................................................... 141 ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ ............................................................................ 142 ИСПОЛЬЗОВАНИЕ КОМПОНЕНТА TDATABASE ......................................................................... 143 ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ ............................................................................ 145 МОДУЛИ ДАННЫХ .................................................................................................................... 145 ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ ............................................................................ 145 РАБОТА С ТАБЛИЦЕЙ ................................................................................................................ 146 Открытие и закрытие таблицы ..................................................................................... 146 ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ ............................................................................ 146 Перемещение по записям таблицы .................................................................................. 146 Положение в таблице ....................................................................................................... 147 Работа с записями в таблице .......................................................................................... 147 ДОСТУП К ПОЛЯМ ТАБЛИЦЫ. КОМПОНЕНТ TFIELD ................................................................. 149 РЕДАКТОР ПОЛЕЙ ..................................................................................................................... 150 ОСНОВНЫЕ СВОЙСТВА КОМПОНЕНТА TFIELD ........................................................................ 153 ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ ............................................................................ 154 ПРОГРАММНЫЙ ДОСТУП К ПОЛЯМ ТАБЛИЦЫ .......................................................................... 154 ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ ............................................................................ 155 СОРТИРОВКА И ПОИСК В ТАБЛИЦАХ ........................................................................................ 157 ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ ............................................................................ 158 ДИАПАЗОНЫ ............................................................................................................................ 158 ФИЛЬТРЫ ................................................................................................................................. 159 СОЗДАНИЕ СВЯЗИ ТИПА "ГЛАВНАЯ–ПОДЧИНЕННАЯ" МЕЖДУ ДВУМЯ ТАБЛИЦАМИ ................ 159 ДРУГИЕ МЕТОДЫ КОМПОНЕНТА TTABLE ................................................................................ 161 ИСПОЛЬЗОВАНИЕ SQL В ПРИЛОЖЕНИЯХ. КОМПОНЕНТ TQUERY ........................................... 162 ДИНАМИЧЕСКИЕ И СТАТИЧЕСКИЕ SQL-ПРЕДЛОЖЕНИЯ ......................................................... 162 3 ВОЗМОЖНОСТЬ ИЗМЕНЕНИЯ ДАННЫХ БАЗОВОЙ ТАБЛИЦЫ ЧЕРЕЗ ЗАПРОС .............................. 166 КОМПОНЕНТЫ УПРАВЛЕНИЯ ДАННЫМИ .................................................................................. 166 Компонент TDBText .......................................................................................................... 166 Задание для самостоятельной работы .......................................................................... 167 Компонент TDBEdit .......................................................................................................... 167 Задание для самостоятельной работы .......................................................................... 167 Компонент TDBGrid ......................................................................................................... 167 Компонент TDBNavigator................................................................................................. 168 Задание для самостоятельной работы .......................................................................... 168 Компонент TDBImage ....................................................................................................... 170 Компонент TDBComboBox ............................................................................................... 171 Компонент TDBListBox..................................................................................................... 171 Задание для самостоятельной работы .......................................................................... 172 Компонент TDBRadioGroup ............................................................................................. 172 Задание для самостоятельной работы .......................................................................... 173 Компонент TDBCheckBox................................................................................................. 173 Компонент TDBLookupComboBox .................................................................................. 174 Компонент TDBLookupListBox......................................................................................... 175 Задание для самостоятельной работы .......................................................................... 175 Глава 1. Базы данных. Системы управления базами данных (СУБД) Первоначально компьютер предназначался для решения вычислительных задач. Проблема автоматизации расчетов была очень актуальна. Само название «компьютер» происходит от английского глагола – to compute, что означает – вычислять. С развитием внешних запоминающих устройств стало возможным хранить и обрабатывать с помощью компьютеров большие объемы информации. Компьютерами заинтересовались бизнесмены, банковские служащие, экономисты, медицинские работники, работники других сфер, профессиональная деятельность которых тесно связана с обработкой информации. В настоящее время благодаря огромным возможностям компьютеров, связанным с хранением и обработкой больших массивов информации, компьютер применяется буквально во всех сферах человеческой деятельности: для решения широкого круга задач в экономике, промышленности, менеджменте, медицине, банковской сфере, управлении и т.д. Задачи, связанные с хранением и обработкой информации принято называть информационными. Таких задач очень много. Это системы резервирования билетов, банковские системы, бухгалтерские и учетные системы, системы планирования и управления, обработка наблюдений и т.д. Результатом решения таких задач является создание информационных систем. Информационные системы имеют дело с базами данных. Данные, которые необходимо хранить и обрабатывать, принято называть базой данных. Можно дать такое определение база данных – это набор взаимосвязанных данных о некоторой предметной области, которые имеют определенную структуру и постоянно хранятся в памяти компьютера. Для управления такими данными было разработано специальное программное обеспечение, которое получило название СУБД – система управления базами данных. Само появление СУБД явилось шагом революционным. По значимости его можно сравнить с появлением первых компиляторов. Не сразу стало понятно, что для решения самых разнообразных задач из разных предметных областей необходим некоторый программный слой, который отвечает только за хранение данных на внешних устройствах и позволяет этими данными манипулировать. Но современные СУБД предоставляют пользователям значительно большие возможности. 4 Система управления базами данных (СУБД) – это комплекс программных и языковых средств, необходимых для создания баз данных, поддержания их в актуальном состоянии и организации поиска в них необходимой информации. Первые СУБД, поддерживающие организацию и ведение баз данных, появились в конце 60-х годов. Использование СУБД обеспечивает лучшее управление данными, более совершенную организацию файлов и более простое обращение к ним по сравнению с обычными способами хранения информации. Обзор СУБД Мир современных СУБД весьма обширен. СУБД можно различать по компаниямразработчикам, которые их произвели, по моделям данных, которые они используют, по производительности и мощности, по комплексу услуг, которые они предоставляют пользователям. Рассмотрим классификацию СУБД по возможностям работы в сети. Соответственно, можно различить так называемые настольные СУБД, которые не рассчитаны для работы в сети и промышленные СУБД или серверы баз данных, которые предназначены для работы в многопользовательской сетевой среде(рис. 1.1.). Виды СУБД Многопользовательские СУБД(серверы баз данных): Oracle, MS SQL Server, Informix, Sybase, Interbase,. Настольные СУБД: Paradox, FoxPro, dBase, Clipper, Access и т.д. Рис. 1.1 Настольные СУБД изначально предназначались для работы одного пользователя за одним компьютером. Они могут работать в сети, но при увеличении количества пользователей их производительность резко падает. Это СУБД хорошего качества, предназначенные для работы с небольшими централизованными базами данных. К ним относятся такие СУБД, как Access, ForPro, Paradox и т.д. Средства СУБД Access и FoxPro могут быть использованы для создания клиентской части приложений для серверов баз данных. Многопользовательские СУБД или серверы баз данных это очень мощные профессиональные СУБД, изначально предназначенные для работы большого количества пользователей в сети с одними и теми же данными. При этом сами данными могут быть распределены по разным узлам сети. К серверам баз данных относятся: Oracle, MS SQL Server, Informix, Interbase, mySQL и т.д. Так, например, СУБД Oracle способна поддерживать одновременно работу до 5000 пользователей, а объем базы данных, обслуживаемой этой СУБД, может достигать нескольких терабайт. Для сравнения максимальный объем базы данных Interbase всего лишь около 20 Гигабайт. Основные функции СУБД Несмотря на различие СУБД можно выделить их основные функции: 5 Управление данными во внешней памяти; Управление буферами оперативной памяти; Управление транзакциями; Журнализация и восстановление базы данных после сбоев; Поддержка языков баз данных. Управление данными во внешней памяти Эта функция СУБД призвана обеспечить необходимые структуры внешней памяти как для хранения данных, непосредственно входящих в базу данных, так и для служебных целей. Как это делается, пользователь не должен знать, он экранируется от этого, так как все заботы берет на себя СУБД. Управление буферами оперативной памяти Обмен данными между центральным процессором и внешней памятью все еще остается очень медленным. Поэтому, если за каждой записью обращаться к магнитному диску, то скорость работы СУБД будет очень низкой. Практически единственным способом увеличения скорости обмена с внешними устройствами является буферизация данных в оперативной памяти (далее – ОП). Обычно той буферизации, которую дает операционная система недостаточно, и СУБД имеют и поддерживают свой собственный набор буферов ОП с собственной дисциплиной их замены. Управление транзакциями Транзакция – это последовательность операций над базой данных, которая рассматривается СУБД как единое целое. Понятие транзакции необходимо для поддержания логической целостности базы данных. Каждая транзакция начинается при целостном состоянии базы данных и оставляет это состояние целостным после своего завершения. Если транзакция успешно выполняется, то новое состояние базы данных фиксируется во внешней памяти, иначе ни одно из изменений никак не отразится в состоянии БД (базы данных). Транзакция может рассматриваться как минимальная единица активности пользователя по отношению к СУБД. Это понятие очень важно в многопользовательских СУБД, когда с БД параллельно работает несколько человек. В этом случае рассматриваются серии или смеси транзакций. Журнализация и восстановление базы данных после сбоев Одним из требований к СУБД является надежное хранение данных во внешней памяти. Надежность СУБД – это способность восстановить последнее целостное состояние базы данных после любого аппаратного или программного сбоя. Аппаратные сбои бывают мягкие (внезапное выключение или остановка компьютера) и жесткие (потеря информации на носителях внешней памяти). Программный сбой – это аварийное завершение работы СУБД или прикладной программы. Программный сбой эквивалентен мягкому аппаратному сбою. Для восстановления БД нужно хранить избыточную информацию, причем та информация, которая используется для восстановления, должна храниться особенно надежно. 6 Наиболее распространенным способом поддержания такой избыточности информации является ведение журнала изменений БД. Журнал – это особая часть базы данных, не доступная пользователям СУБД и поддерживаемая с особой тщательностью, в которую поступают записи обо всех изменениях основной части БД. Кроме того, может вестись полная архивная копия базы данных. Журнал и архивная копия используются для восстановления БД после жесткого сбоя. При мягких сбоях достаточно одного журнала изменений БД. Поддержка языков баз данных Для работы с БД используются специальные языки – языки баз данных. В современных СУБД обычно поддерживается единый интегрированный язык, включающий все необходимые средства для работы с базой данных, начиная от ее создания до реализации пользовательского интерфейса. Для реляционных СУБД, о которых речь впереди, таким языков является язык SQL. Основные понятия и ключевые слова: информационная система, база данных, СУБД, настольная СУБД, сервер баз данных, функции СУБД. Контрольные вопросы 1. 2. 3. 4. 5. Что такое базы данных? Для чего используется СУБД? Какие возможности предоставляет пользователю настольная СУБД? Какие возможности предоставляют серверы базы данных? Перечислите и кратко охарактеризовать основные функции СУБД Глава 2. Модели данных Как ранее было сказано, база данных это набор взаимосвязанных данных, имеющих определенную структуру. Структура базы данных тесно связано понятием модели данных. С помощью модели данных могут быть представлены объекты предметной области и взаимосвязи между ними. Модель данных – это совокупность структур данных и операций их обработки. Каждая СУБД поддерживает ту или иную модель данных. Модель задает: 1. основную структурную единицу, т.е. определяет логическую структуру данных (так называемая структурная часть модели); 2. набор операций для манипулирования этими структурами (манипуляционная часть); 3. ограничения целостности (целостная часть). Под ограничениями целостности понимается набор ограничительных правил, накладываемых на данные базы данных. База данных обладает свойством целостности, если при любых манипуляциях с данными эти ограничения сохраняются. Понятие модели данных возникло не сразу. Теоретически оно оформилось с появлением реляционной модели данных. По способу организации данных СУБД основываются на использовании четырех основных видах моделей: Иерархическая Сетевая Реляционная 7 Объектная Исторически первыми появились иерархическая и сетевая модели, это так называемые ранние модели. Реляционная модель появилась позже. На сегодняшний день она является доминирующей на рынке СУБД, хотя в последнее время появляются и получают все большее распространение так называемые постреляционные (послереляционные) модели, которые используют объектный подход для организации данных. Иерархическая модель данных Иерархическая модель данных (ИБД) была исторически первой структурой БД, видимо, из-за того, что древовидные иерархические структуры широко используются в повседневной человеческой деятельности. Это всевозможные классификаторы, ускоряющие поиск требуемой информации, иерархические функциональные структуры управления. Иерархическая модель является естественной структурой для представления информационных объектов, связанных иерархическими отношениями часть - целое, род вид, начальник - подчинённый. Объекты, связанные иерархическими отношениями, образуют дерево (ориентированный связный граф), у которого одна вершина не имеет входящих дуг (корень дерева), а все остальные вершины имеют по одной входящей дуге. Вершины дерева - это объекты, а дуги - это иерархические связи между ними. Тип связи в этой модели один-ко-многим (1:М). Наиболее известной иерархической СУБД до сих пор остается IMS фирмы IBM, которая появилась в 1968. Иерархическая модель данных использует представление данных в виде деревьев. Основной структурной единицей иерархической модели данных является дерево. Дерево это связный неориентированный граф, который не содержит циклов (петель) из замкнутых путей. Граф, как известно, состоит их набора вершин и дуг. Вершина используется для представления сущностей реального мира. Сущность – это объект реального мира, информацию о котором необходимо хранить в базе данных. Дуга – для представления связей между сущностями. При реализации вершины представляются таблицами. Например, рассмотрим предметную область «Университет». В данной предметной области просматриваются следующие сущности: Факультет, Преподаватели, Группы, Студенты. Данные сущности будут представлены вершинами графа, а связи между ними будут представлены дугами. Обычно при работе с деревом выделяют конкретную вершину, которую определяют как корень дерева, и рассматривают ее особо: в нее не заходит ни одно ребро. В этом случае дерево становится ориентированным. Листья – это вершины, которые не имеют поддеревьев. Тип дерева – задает структуру дерева. Экземпляр дерева – дерево, структура которого строится строго в соответствии со своим типом дерева. Для иерархической модели данных важным является то, что никакой потомок (узел в дереве) не может иметь более одного предка(узла дерева). Таким образом, иерархическая база данных состоит из упорядоченного набора нескольких экземпляров одного типа дерева. Например, в структуре учебного заведения можно выделить основные сущности, которые изображены в виде вершин графа и дуг, отображающих связи между ними (рис. 2.1.): : Факультет 8 Преподаватели Группы Рис. 2.1. Тип дерева Каждая вершина графа представляется в виде таблицы. На следующем рисунке для каждой вершины приведен тип записи. Таким образом, тип дерева будет иметь следующий вид (рис. 2.2.). Название факультета | ФИО декана | тел деканата| номер комнаты деканата ФИО преподавателя| Адрес| Уч степень Номер группы| Курс| ФИО куратора Номер зачетки| ФИО студента| Адрес| Телефон Рис. 2.2. Тип дерева, с указанием типа записи в каждом узле В соответствии с данным типом дерева можно создать конкретные экземпляры деревьев. Приведем примеры типовых операторов манипулирования ИБД: Найти указанное дерево; Перейти от одного дерева к другому; Перейти от одной записи к другой внутри дерева (например, от группы к ее первому студенту); Перейти от одной записи к другой в порядке обхода иерархии (например, обход всех студентов); Вставить новую запись в указанную позицию; Удалить текущую запись. Ограничения целостности: в ИБД поддерживается целостность ссылок между предками и потомками. Основное правило – никакой потомок не может существовать без своего предка и у каждого потомка только один предок. Сетевая модель данных Отличие сетевой модели данных (СБД) от иерархической заключается в том, что в сетевой структуре любой элемент данных может быть связан с любым другим, т.е. сетевая 9 модель есть расширение иерархической модели, в которой каждый потомок может иметь любое количество предков. Типичным представителем СУБД, использующей сетевую модель, является IDMS компании Collinet Software Inc. Архитектура системы основана на предложениях Комитета по языкам программирования CODASYL. В дальнейшем будем пользоваться терминологией принятой в CODASYL. Сетевая модель, так же как и иерархическая, использует графовое и табличное представление. Основная конструкция сетевой модели данных CODASYL – набор. Набор – это поименованное двухуровневое дерево, которое реализует связь между записями двух типов: владельцем набора и членом набора (рис. 2.3.). Разрешаются только связи один ко многим. Владелец набора Набор Член набора Рис. 2.3. Основные свойства набора: Набор имеет имя; В каждом наборе только один владелец; В каждом наборе 0,1 или несколько членов; Набор существует, если только существует запись-владелец; Экземпляр записи может входить только в один экземпляр набора данного типа; В общем случае каждый набор – это вход в БД. С помощью наборов можно строить многоуровневые деревья и простые сетевые структуры. Так как роль записи жестко не фиксируется, то в одном наборе она может быть членом, а в другом владельцем. В сетевых моделях реальных СУБД запись может иметь любую структуру, например простую линейную, как в реляционных СУБД, либо более сложную, включая массивы, повторяющиеся группы. Например, на данном рисунке 2.4. представлены два набора, владельцем обоих набором является Преподаватель. Владелец набора Преподаватель Читает лекции Работает на Дисциплина Кафедра Рис. 2.4. 1 0 Наборы члены Примеры типичных операторов манипулирования для СБД: Найти конкретную запись в наборе однотипных записей, например Дисциплину, которую читает Преподаватель; Перейти от предка (владельца) к первому потомку(члену) по некоторой связи; Перейти к следующему потомку по некоторой связи; Перейти от предка к потомку по некоторой связи; Создать новую запись; Удалить запись; Изменить запись; Включить связь; Исключить связь; Переставить запись в другую связь. Ограничения целостности: поддержка целостности по ссылкам. Например, если удаляется какая-то запись, то должен быть удален и соответствующий экземпляр типа связи. Достоинства и недостатки ранних моделей Сильные места ранних СУБД: Простота (для ИБД) и высокая гибкость (для СБД) средств представления информации; Развитые средства управления данными во внешней памяти на низком уровне; Возможность построения вручную эффективных прикладных систем; Возможность экономии памяти из-за высокой гибкости структур. Недостатки: Слишком сложный язык манипулирования, которым сложно пользоваться; Фактически необходимы знания о физической организации; Их логика перегружена деталями организации доступа к БД. Прикладные системы зависят от этой организации; Объектная модель По оценкам специалистов, примерно 99% мирового рынка баз данных занимают ныне реляционные СУБД. Вместе с тем в последние годы четко обозначилась тенденция развития СУБД в объектном направлении. Объектная модель данных, интегрируя все возможности реляционной модели, обладает рядом существенных преимуществ по сравнению с последней. Эти преимущества заключаются, прежде всего, в способности естественным образом интегрировать в рамках единого информационного массива разнородные данные. Среди других преимуществ можно выделить возможность создания информационных моделей разнообразных трудно формализуемых предметных областей реального мира, а также существенного повышения аналитических возможностей банков данных, реализованных на основе объектной модели. Названные функции позволяют использовать эти банки данных в качестве хранилищ исходной информации в составе 1 1 экспертных систем и систем поддержки принятия решений. Учитывая преимущества объектной технологии, разработчики наделяют сейчас старые реляционные СУБД (Informix, DB2, Oracle) некоторыми объектными свойствами. Но объектноориентированные СУБД, если их создатели не хотят ставить своих клиентов перед необходимостью ломать все до основания и начинать заново, нередко имеют под собой реляционную машину данных и расписывают объекты по отношениям. Объектная модель в последнее время активно развивается и распространяется, тем более что, как отмечалось выше, она отнюдь не противоречит реляционной модели данных, а дополняет и развивает последнюю (точнее сказать — реляционная модель является частным случаем объектной формы представления данных). Механизмы конвертации данных дают возможность переводить информацию из реляционной структуры в объектную и наоборот, позволяя тем самым использовать в новой структуре созданные ранее массивы информации. Основные преимущества объектной модели данных сводятся к следующему. 1. Возможность описывать в рамках единого информационного поля объекты, имеющие разнородную внутреннюю структуру и состав элементов. 2. Установление сложных многоуровневых отношений между информационными объектами, в том числе типа “один к одному”, “один ко многим”, “многие к одному” и “многие ко многим”. 3. “Вложение” объектов друг в друга, выделение общих свойств объектов на верхних уровнях и учет индивидуальных качеств и свойств объектов на нижних уровнях иерархии. 4. Возможность хранить в едином банке данных структурированную информацию и неформализованные данные. Ключевой идеей объектного подхода является тесная связь программного кода и данных, с которыми он работает. Возникает понятие объекта, который представляет собой объединение программного кода и данных. Объекты строятся строго в соответствии с шаблонами, которые задаются с помощью классов. Таким образом, основными структурными единицами объектной модели являются классы и объекты. Класс – это тип, в соответствии с которым строятся конкретные экземпляры объектов. Объект – это экземпляр конкретного класса. Объект состоит из данных и программного кода. В последнее время появляется все больше объектных и объектно-ориентированных СУБД, таких как Versant, Jasmine, ODB-Jupiter, Caché и др., которые приобретают все большую популярность и признание. Основные понятия и ключевые слова: модель данных, ограничения целостности, иерархическая модель данных, тип дерева, экземпляр дерева, сущность, сетевая модель данных, набор, объектная модель данных, класс, объект. Контрольные вопросы Что задает модель данных? Что такое ограничения целостности? Какие модели данных Вам известны? Основная структурная единица иерархической модели данных. Набор операторов манипулирования для ИБД. Приведите пример иерархической модели данных. 5. Основная структурная единица сетевой модели данных. Набор операторов манипулирования для СБД. Приведите пример сетевой модели данных. 1. 2. 3. 4. 1 2 6. Основные структурные единицы объектной модели данных. Преимущества объектной модели данных. Глава 3. Реляционная модель Основные понятия и ограничения реляционной модели Реляционная модель описывается следующими понятиями и ограничениями. Данные хранятся в виде таблиц. Таблица – это структура, которая состоит из заголовка и тела. Заголовок таблицы представляет, из каких столбцов (атрибутов) состоит таблица. Тело таблицы составляет набор неупорядоченных записей или строк. Поле таблицы - это значение, лежащее на пересечении строки и столбца. Термины реляционной модели: Отношение - реляционная таблица. (Relation – отношение). Кортеж - запись в таблице. Домен - множество значений, которые может принимать атрибут (или все встречающихся в столбце таблицы значения атрибута). Степень отношения - число столбцов или атрибутов таблицы. Мощность отношения - число строк или записей таблицы. Внутренние ограничения реляционной модели данных. Любая модель данных имеет свои внутренние ограничения. Это правила, которым должны отвечать данные, представленные с использованием данной модели. Внутренние ограничения реляционной модели требуют, чтобы: 1. В таблице каждая запись была уникальна (отсутствовали повторяющиеся записи). 2. Отсутствовало избыточное дублирование данных. 3.Число отношений в модели было оптимальным. Главное правило реляционной модели – каждый факт хранится в одном месте. Математическое определение отношения. Реляционная алгебра Реляционная модель данных - это модель таблиц. Она базируется на математическом понятии отношения. Математическое отношение - это множество, выражающее соответствие между двумя и более множествами. Множество - это собрание правильно идентифицированных объектов, удовлетворяющих условию принадлежности. Пусть даны N множеств D1,D2,..DN. Тогда R есть отношение над этими множествами, если R - есть множество упорядоченных n-кортежей вида <d1,d2,..dn>, где d1- элемент из D1,d2- элемент из D2 и т.д. Число столбцов в отношении - есть степень отношения. Число строк - есть мощность отношения. Реляционная база данных - это совокупность отношений (таблиц). Множество операторов высокого уровня, применение которых к отношениям приводит к генерации новых отношений, называется реляционной алгеброй. Основные операции реляционной алгебры: объединение, разность, декартово произведение, проекция, селекция. Рассмотрим основные операции реляционной алгебры на примере отношений 1 3 R(A,B,C) A B C a b c d a f c b d и S(D,E,F). A B C b g a d f a 1.Объединение (R U S). Объединение отношений R и S - это множество кортежей, которые принадлежат R или S или им обоим. Оператор применяется только к отношениям с одинаковыми заголовками, т.е. имеющим одинаковое количество атрибутов, причем соответствующие атрибуты определены на одних и тех же доменах. Результирующее отношение: A B C a b c d a f c b d b g a 2.Разность (R - S). Разностью отношений R и S называется множество кортежей, принадлежащих R и не принадлежащих S. Оператор применяется только к отношениям с одинаковыми заголовками. Результирующее отношение: A B C a b c c d b 3.Декартово произведение (RxS) 1 4 Пусть R и S отношения арности к1 и к2 соответственно. Тогда декартово произведение отношений (RxS) есть множество кортежей арности к1+к2 первые к1 компонент которых образуют кортежи, принадлежащие R и последние к2 принадлежащие S. Результирующее отношение: A a a d d c c B b b a a b b C c c f f d d D b d b d b d E g a g a g a F a f a f a f 4. Проекция При выполнении операции проекция образуется новое отношение, которое составляют столбцы исходного отношения, по которым выполняется проекция. В операторе столбцы могут быть заданы их именами или номерами. Согласно ограничениям реляционной модели данных, если при выполнении этой операции образуются повторяющиеся кортежи, то в результирующее отношение они включаются в единственном экземпляре. Например: выполнить проекцию отношения R по столбцам 1,3 1,3 (R) или A,C (R). Результирующее отношение: A C a c d f c d 5. Селекция Пусть F-формула, образованная a) операндами, являющимися константами или номерами компонентов отношения; б) арифметическими операторами сравнения: <,>,<=,>=,!= в) логическими операторами и(^), или(v), нет(┐) тогда F (R) есть множество кортежей, принадлежащих R, удовлетворяющих условию, заданному формулой F. Например, построить селекцию отношения R по формуле: 2=b, т.е, выбрать все строки, значение второго столбца в которых равно b. 2=b (R) есть отношение A B C a b c c d b 1 5 Операции реляционной алгебры отношений реализуются в СУБД посредством механизма запросов. Так, в любом запросе на выборку данных применяется операция проекции. Например, есть таблица Книги(НомерКниги, Автор,Название,Цена) В запросе требуется вывести столбцы Автор и Название. Это значит, что надо построить проекцию таблицы Книги по столбцам Автор и Название или Автор,Название (Книги) или на SQL: SELECT Книги.Автор, Книги.Название FROM Книги Задание условия на выборку данных реализует в запросе операцию селекции. Формула, которая содержит условие отбора, реализована оператором WHERE SELECT Книги.Автор, Книги.Название FROM Книги WHERE (((Книги.Автор) Like "[В]*")); Основные понятия и ключевые слова: реляционная модель, отношение, атрибут, кортеж, домен, степень отношения, мощность отношения, объединение, разность, декартово произведение, селекция, проекция, декартово произведение. Контрольные вопросы 1. Перечислить и дать определения основных понятий реляционной модели данных: отношение, атрибут, кортеж, домен, степень отношения, мощность отношения. 2. Внутренние ограничения реляционной модели данных. 3. Перечислить и кратко охарактеризовать основные операции реляционной алгебры. Глава 4. Вопросы проектирования реляционных баз данных Цели проектирования базы данных. Этапы проектирования Прежде чем использовать конкретную СУБД в качестве инструмента для создания базы данных, необходимо выполнить проектирование концептуальной схемы базы данных в соответствии с правилами той модели данных, которую поддерживает данная СУБД. Рассмотрим процесс проектирования реляционной модели базы данных. В процессе проектирования базы данных необходимо: 1. Обеспечить возможность хранения в базе всех данных, необходимых для решения поставленных задач. 2. Разработать структуры данных с учетом внутренних ограничений модели данных, поддерживаемой конкретной СУБД. Этапы работ Для достижения первой цели необходимо выполнить следующие этапы работ: 1 6 1. Обозначить круг задач, для решения которых создается база данных. 2. Определить перечень информационных объектов, характеристики которых понадобятся при решении поставленных задач и должны будут храниться в базе. 3. Определить, какие именно характеристики или атрибуты информационных объектов будут иметь значение при решении поставленных задач. 4. Составить списки характеристик (атрибутов) информационных объектов. Для достижения второй цели необходимо разместить данные в структурах, соответствующих внутренним ограничениям модели данных, поддерживаемой выбранной СУБД. В случае выбора СУБД MS Access, основанной на реляционной модели данных, эти структуры – реляционные таблицы. Пример. Требуется разработать базу данных для предметной области Библиотека. Этапы работ. 1. Задачи, для решения которых создается база данных. 1. Учет всех книг, поступающих и хранимых в библиотеке. 2. Учет всех читателей, пользующихся библиотекой. 3. Учет всех операций обмена (выдачи и возврата) книг. 4. Поиск книги по какой-то ее характеристике (жанр, автор, название, год издания). 5. Поиск данных читателя. 6. Определение книг, пользующихся повышенным спросом. 7. Определение задолжников. 2. Перечень информационных объектов, характеристики которых понадобятся при решении поставленных задач и будут храниться в базе. Книги Жанры Читатели Обмен книг 3. Списки атрибуты выделенных информационных объектов, которые будут иметь значение при решении поставленных задач и которые надо хранить в базе. Книги(Номер_книги, Автор, Название, Код_жанра, Год_издания, Издательство, Цена) Жанр(Код_жанра, Название_жанра, описание_жанра) Читатель(Номер_билета, ФИО, Адрес, Телефон, Дата рождения, Пол) Обмен_книг (Номер_операции, Номер_книги, Номер_билета,Дата выдачи,Дата возврата) Приведение данных предметной области в соответствие требованиям модели данных, поддерживаемой конкретной СУБД 1.Уникальность записи в таблице. Первичный ключ отношения. Внешний ключ. Внутренним ограничением или требованием, которое предъявляет к данным реляционная модель, является уникальность(неповторимость) каждой записи в каждой таблице. Каждая запись описывает конкретный экземпляр информационного обьекта и 1 7 должна иметь идентификатор, по которому ее можно отличить от других записей таблицы. В качестве такого идентификатора должен быть выбран один из атрибутов или совокупность атрибутов. (Например, номер билета для таблицы Читатель). Атрибут (набор атрибутов), значение которого служит для однозначной идентификации записи в таблице, называется первичный ключ отношения. Для каждой таблицы обязательно определяется первичный ключ. Роль уникального идентификатора в описании информационных обьектов предметной области Библиотека играют атрибуты Номер_книги, Код_жанра, Номер_билета, Номер_операции). Это простые, не составные, первичные ключи. Иногда для идентификации экземпляра объекта недостаточно ключа, состоящего из одного атрибута. Например, в колледже есть несколько компьютерных классов. В каждом классе стоит 9 компьютеров. Каждый компьютер имеет индивидуальный номер от 1 до 9. Определить конкретный компьютер только по этому номеру в колледже нельзя, так как номера повторяются в каждом классе. Для уникальной идентификации компьютера требуется знать номер класса+номер машины. Эти атрибуты и являются первичным ключом отношения, хранящего информацию о компьютерах. В данном случае первичный ключ составной. Другая важная роль первичного ключа состоит в том, что он служит для связывания таблиц. Например, в таблице Жанр есть атрибут Код_жанра. Он играет роль первичного ключа. В таблице Книги тоже есть атрибут Код_жанра. В этой таблице он является внешним ключом. Он пришел извне. Из таблицы Жанр. Если мы свяжем таблицы Книги и Жанр по этому атрибуту, из конкретной записи таблицы Книги возьмем значение атрибута код_жанра и найдем это значение в таблице Жанры, то узнаем название и описание данного жанра. Что нам дает такая связь? Она позволяет не перегружать таблицу Книги излишними подробностями о другом информационном обьекте (именно о жанре), но позволяет быстро эти подробности узнать, по значению атрибута-связки. Таблица Жанр в данном случае называется родительской, а таблица Книги – дочерней, так как в нее мигрирует атрибут первичного ключа из таблицы Жанр. Важное правило! Атрибуты, по которым связываются таблицы, обязательно должны быть одинакового типа данных, чтобы связь состоялась. Нельзя связывать числовой атрибут с текстовым, но только с числовым. 2. Отсутствие избыточности данных в таблицах. Другая важная роль первичного ключа состоит в том, что именно на основании зависимости от него других, не ключевых атрибутов производится удаление из таблиц избыточных данных. Почему вредны избыточные данные? Не только потому, что избыточные данные перегружают таблицы и физические носители информации (жесткие диски и т.п.). Избыточность порождает ошибки в процессе манипулирования данными, а именно при выполнении операций добавления, удаления или редактирования записей. Для того, чтобы понять, как может возникнуть ошибка, уточним, что такое избыточные данные. Данные могут просто дублироваться и могут избыточно дублироваться. Рассмотрим таблицу: Студент Иванов Петров Сидоров Куратор Орлов Орлов Соколов Телефон куратора 222 222 333 1 8 В таблице дублируются фамилия куратора (Орлов) и телефон куратора(222). Имеет ли место избыточность? Избыточные данные – это данные, удаление которых не ведет к потере информации. Если мы удалим фамилию куратора в какой-либо записи, мы потеряем информацию о том, кто является куратором у конкретного студента. Следовательно, эти данные не являются избыточными. Далее. Телефон можно узнать и из первой записи таблицы, и из второй. Значит ли это, что из какой-то записи эти данные можно удалить? Если в одной из записей убрать информацию о телефоне, возникнет противоречие. Из одной записи будет следовать, что телефон у куратора есть и он такой, а из другой записи - что телефона нет вообще. Фактически, такое противоречие - это тоже потеря данных. В то же время оставить структуру таблицы прежней нельзя, т.к. она заключает в себе возможность возникновения ошибки. Если изменится телефон и это изменение будет внесено не во все записи, то данные снова станут противоречивы. Так операции удаления и исправления данных в ситуации избыточности могут породить ошибку. А если потребуется удалять не отдельные значения, а записи? Например, студент Иванов получил все двойки и был отчислен. Мы удалили запись. Та же участь постигла и Петрова. Мы опять удалили запись. Что получилось в результате? Из таблицы исчезли данные о кураторе! Стремясь удалить данные об отчисленных студентах, мы удалили данные о кураторе и потеряли информацию. Следовательно, структура рассматриваемой таблицы не является верной, она не отвечает внутренним ограничениям реляционной модели. Поэтому попытка манипулирования данными таблицы приводит к возникновению аномалий (ошибок). Таблицу следует декомпозировать, чтобы исключить избыточность, порождающую ошибку, а именно разделить на две таблицы следующим образом: Студент Иванов Петров Сидоров Куратор Орлов Орлов Соколов Куратор Соколов Орлов Телефон куратора 333 222 Структура полученных в результате декомпозиции таблиц верна. Каждый факт хранится в одном месте и данные не дублируются. Избыточности нет. Удаление данных не приведет к потере информации и изменение данных не породит ошибку. Обе таблицы при необходимости легко связать по общему атрибуту Куратор. Процесс декомпозиции отношений с целью исключения избыточности называется нормализацией. В процессе изменения структуры таблица последовательно приводится к конкретной нормальной форме. Вопросы и задания 1. Почему важно учитывать требования реляционной проектировании структур данных? 2. Что такое операции манипулирования данными? 3. Что такое аномалии манипулирования данными? 1 9 модели при 4. Какие данные являются избыточными? 5. Почему нельзя хранить в таблицах избыточные данные? 6. Каким образом можно исключить избыточные данные из таблиц? 7. Что такое первичный ключ отношения? 8. Что такое внешний ключ отношения? 9. Что такое уникальный идентификатор записи? 10. Для чего нужно однозначно идентифицировать каждую запись? 11. Может ли атрибут первичного ключа отношения иметь одинаковые значения в разных записях? 12. Что такое «нормализация»? 13. Для чего нужно нормализовать отношения? Нормализация. 1,2,3 нормальные формы Процесс декомпозиции отношений с целью исключения избыточных данных называется нормализацией. В процессе нормализации таблицы последовательно приводятся сначала к первой, затем ко второй, затем к третьей нормальной форме. Всего известны 5 нормальных форм. Для того чтобы процесс нормализации считать достаточным необходимо привести таблицы к 3-й нормальной форме. 1 нормальная форма. Отношение (таблица) находится в первой нормальной форме, если значение каждого атрибута в каждом поле имеет атомарное значение, то есть оно неделимо, не список, нет вложенности значений. 2 нормальная форма. Отношение находится во второй нормальной форме, если оно уже находится в первой нормальной форме и все не ключевые атрибуты функционально полно зависят от первичного ключа, То есть полностью им определяются. От всего ключа, если ключ составной. Если в отношении есть атрибуты, которые зависят от части первичного ключа, то они выносятся в отдельную таблицу и им сопоставляется часть ключа, от которой они зависят. Например. Номер Номер класса машины ФИО администратора класса Телефон администратора класса Тип процессора Наличие жесткого диска Таблица находится в 1 НФ, так как значение каждого атрибута в каждом поле атомарно. В данной таблице первичный ключ составной. Это совокупность атрибутов Номер машины+Номер класса. Атрибуты ФИО администратора класса и Телефон администра-тора класса зависят только от части ключа - от атрибута Номер класса. Поэтому для приведения таблицы ко 2-й нормальной форме ее надо декомпозировать следующим образом: Номер класса Номер машины Тип процессора Наличие жесткого диска 2 0 Номер класса ФИО администратора класса Телефон администратора класса Полученные в результате декомпозиции таблицы можно связать по атрибуту Номер класса. 3 нормальная форма. Отношение находится в третьей нормальной форме, если оно уже находится во второй, и в нем отсутствуют транзитивные зависимости между атрибутами. Поясним, что такое транзитивная зависимость между атрибутами. Если А зависит от В (В->А), а С зависит от А (А->C), то С зависит от В транзитивно (В->А->C). Для исключения транзитивной зависимости атрибуты, которые зависят от первичного ключа транзитивно нужно вынести в отдельную таблицу и сопоставить им атрибут, через который они зависят. Например. Номер класса Номер машины Тип процессора Фирма-производитель процессора Телефон фирмы-производителя Процессора Наличие жесткого диска В данной таблице атрибуты Фирма-производитель процессора и Телефон фирмыпроиз-водителя Процессора зависят от первичного ключа транзитивно через атрибут Тип процессора. Для приведения таблицы к 3 НФ декомпозируем следующим образом: Номер класса Номер Тип машин процессор ы а Тип процессора Фирма-производитель процессора Наличие жесткого диска Телефон фирмыпроиз-водителя Процессора После того, как процесс проектирования концептуальной модели данных завершен, можно приступать к использованию конкретной реляционной СУБД для создания базы данных. Выводы: В целом процесс проектирования концептуальной модели данных можно представить в виде последовательности действий: В исследуемой предметной области определяются информационные объекты, значимые с точки зрения поставленных задач. Каждый информационный объект описывается набором атрибутов и данные о нем помещаются в отдельную таблицу. При этом каждому экземпляру объекта соответствует запись в таблице, а каждому атрибуту – поле в записи. В каждом поле таблицы должно храниться конкретное атомарное значение. Для каждой 2 1 таблицы определяется атрибут или набор атрибутов первичного ключа. Такая таблица (отношение) находится в 1-й нормальной форме. Из каждого отношения в новое отношение удаляются элементы данных (атрибуты), зависящие от отдельных компонентов первичного ключа, и в новом отношении им сопоставляется компонент ключа исходного отношения, от которого они зависят. Таким образом отношения приводятся ко второй нормальной форме. Из каждого отношения в новое отношение выносятся атрибуты, которые в исходном отношении зависят от первичного ключа транзитивно, через какой-то атрибут. Таким образом отношения приводятся к третьей нормальной форме. Каждое из полученных отношений описывается по форме: <Мнемоничное имя>(<атрибут, являющийся первичным ключом>,<атрибут>,....<атрибут>) при этом первичный ключ идет в списке атрибутов первым и подчеркивается. Полученные в результате нормализации отношения связываются по общим атрибутам. Основные понятия и ключевые слова: первичный ключ, внешний ключ, избыточные данные, нормализация, нормальная форма, аномалии. Вопросы и задания Что такое нормальная форма? Сколько существует нормальных форм? Перечислите известные вам нормальные формы? Для чего требуется проводить нормализацию отношений? Какова роль атрибута (атрибутов) первичного ключа в процессе нормализации? 6. Что такое первая нормальная форма? 7. Что такое вторая нормальная форма? 8. Какие действия нужно выполнить, чтобы привести отношение к первой нормальной форме? 9. Какие действия нужно выполнить, чтобы привести отношение ко второй нормальной форме? 10. Что такое третья нормальная форма? 11. Какие действия нужно выполнить, чтобы привести отношение к третьей нормальной форме? 12. Перечислите последовательность действий при нормализации отношений. 1. 2. 3. 4. 5. Задание 1 Определите цифрами слева последовательность действий при проектировании базы данных. Определить перечень информационных объектов, характеристики которых понадобятся при решении поставленных задач и будут храниться в базе. Составить списки характеристик (атрибутов) информационных объектов. 2 2 Обозначить круг задач, для решения которых создается база данных. Определить, какие именно характеристики или атрибуты информационных обьектов будут иметь значение при решении поставленных задач. Глава 5. Семантическая модель данных Модель ER - “сущность-связь”. Назначение ER-модели. Основные понятия ERмодели. Трансформация ER- модели в реляционную модель. Реляционная модель данных (РМД) достаточна для моделирования многих предметных областей. Но она имеет и свои недостатки: 1) В РМД нет достаточных средств для представления смысла (семантики) предметной области. 2) В РМД нет средств для представления зависимостей между данными (отношениями) 3) Для многих приложений не достаточно представления данных в виде плоских таблиц 4) РМД не предлагает никакого аппарата для разделения сущностей и связей. Указанные недостатки привели к созданию семантических моделей данных(СМД). На практике СМД используются на первой стадии проектирования БД. При этом в терминах СМД описывается концептуальная (понятийная) схема БД, которая затем преобразуется к реляционной или другой схеме. Этот процесс описан соответствующими методиками. ER-модель предметной области Одной из наиболее популярных СМД является модель «сущность-связь» (entityrelationship) или ER-модель, предложенная Ченом в 1976 г. Она основана на графических диаграммах, включающих небольшое число разнообразных компонентов. ER-модели получили распространение в CASE-системах, поддерживающих проектирование РБД. Основными понятиями ER-модели являются сущность, связь, атрибут. Сущность это реальный или абстрактный объект, информация о котором должна сохраняться. В ER-модели задается в виде прямоугольника с именем сущности ( рис 5.1.). ЧИТАТЕЛЬ Иванов Петров Сидоров Рис. 5.1. Сущность ЧИТАТЕЛИ Имя сущности это тип объекта. Для наглядности имя сопровождается конкретными примерами, экземплярами сущности. Экземпляры должны быть различаться друг от друга. Это требование аналогично требованию отсутствия кортежей дубликатов в реляционной модели данных. 2 3 Связь – графически изображаемая ассоциация между двумя сущностями. Связь всегда бинарная, т.е. связывает две сущности или сущность между собой. В последнем случае связь называется рекурсивной. Связь имеет два конца. На каждом конце указывается: имя связи; степень связи, сколько экземпляров сущности связывается; обязательность связи, т.е. любой ли экземпляр сущности должен участвовать в связи. Обязательный конец связи изображается сплошной линией, необязательный конец – прерывистой. Примеры ER-схем приведены на рис 5.2. имеет Билет Пассажир для а) Работает в Отдел Сотрудник Состоит из б) Рис. 5.2. Примеры ER-схем В месте стыковки связи с сущностью используется трехточечный вход в прямоугольник сущности, если в связи могут участвовать несколько экземпляров сущности или одиночный, если один экземпляр. Лаконичная трактовка диаграммы а: каждый билет предназначен для одного и только одного пассажира, каждый пассажир может иметь 0 или более билетов. Трактовку диаграммы б предлагается сделать самостоятельно. Пример рекурсивной связи приведен на рисунке 5.3. ЧЕЛОВЕК Сын Отец Рис. 5.3. Рекурсивная связь Трактовка связи следующая: каждый человек является сыном другого человека. У одного отца может быть 0 или более сыновей. Пример еще одной интересной схемы приведен на рис. 5.4. Рис. 5.4. Атрибут сущности – это свойство сущности, служит для уточнения, классификации, идентификации, числовой характеристики или выражения состояния сущности. Имена атрибутов пишутся под именем сущности строчными буквами. 2 4 Существует три типа свойств: Ключевые свойства позволяют различать экземпляры сущности. Дифференциальные свойства содержат смысл сущности, то, что отличает сущность от другой сущности. Валентные свойства используются для связи с другими сущностями. Операции над сущностями Различают три основных типа абстрагирования и соответственно три вида операций над сущностями: агрегация, обобщение, ассоциация. Соответственно обратные логические операции над сущностями - это декомпозиция, специализация и индивидуализация. Агрегация – это метод абстрагирования, при котором сущность-агрегат связана с другими сущностями, как целое связано с частями. Декомпозиция – это деление сложной сущности на компоненты, операция обратная агрегации. Свойства агрегата – это совокупность свойств компонентов. Обычно составные части агрегата имеют совершенно разный набор свойств. Например, сущности КАФЕДРЫ, СТУДЕНТЫ, АУДИТОРИИ, СОТРУДНИКИ являются компонентами сущности УНИВЕРСИТЕТ. УНИВЕРСИТЕТ представляет собой сущность-агрегат. Обобщение – это метод абстрагирования, при котором обобщенная сущность связана с другими сущностями отношением “род-вид”. Специализация – операция обратная обобщению. Например, обобщенная сущность – УЧАЩИЕСЯ может быть разделено на категории СТУДЕНТЫ, ШКОЛЬНИКИ, АСПИРАНТЫ. Обобщенная сущность ПРЕДМЕТЫ может быть разделена на категории ОБЯЗАТЕЛЬНЫЕ, ФАКУЛЬТАТИВЫ. Категории обычно имеют много общих свойств, но некоторые свойства у них различны. Свойства обобщенной сущности представляют собой перечень общих свойств категорий, но могут включать и дополнительные свойства по сравнению с исходными, чаще всего это такие свойства, как Среднее значение, Сумма и т.п. На ER-диаграмме категории изображаются треугольниками, а обобщенное понятие – прямоугольником, который соединен с категориями связями типа "является видом…( is kind of..)" . Ассоциация – это такая логическая операция, которая устанавливает связи между конкретными экземплярами сущностей. Индивидуализация – это независимое рассмотрение связанных ассоциацией сущностей. Обычно ассоциативные связи возникают в ходе реальных экономических процессов (бизнес - процессов). Например, ПОСТАВЩИКИ связаны с ПОСТАВКАМИ ТОВАРОВ, ПРОДАЖИ ТОВАРОВ связаны с ТОВАРАМИ, ПОКУПКИ ТОВАРОВ связаны с КЛИЕНТАМИ и т.д. Порядок построения ER-модели и построение реляционной схемы базы данных из ER-модели ER - модели широко применяются как при ручном, так и при автоматизированном проектировании баз данных. При этом в некоторых системах, например, в системе IDEF, отсутствуют сложные понятия (агрегаты, ассоциации, обобщенные понятия), они заменяются связями. В разных системах применяются различные обозначения мощности связей и классов членства (обязательности связи) и т.д. Приведем рекомендуемый порядок построения ER-модели: 1) В каждом внешнем представлении (пользовательском) выявить сущности и их свойства, исходя из анализа предметной области. Их должно быть не более 6-7 в каждом пользовательском представлении. 2 5 Обозначить сущности именами, которые должны быть краткими, отражать смысл и быть привычными для пользователя. 3) Выбрать ключевое свойство (свойства). Если такого нет, то вводят условное свойство “Порядковый №”. 4) Выявить связи между сущностями. 5) Найти общие свойства сущностей (обобщение); 6) Рассмотреть все пары сущностей и определить ассоциативные связи; 7) Определить степень каждой связи. 8) Записать формулы расчета, связывающие вычисляемые свойства. 9) Объединить модели, построенные для разных внешних (пользовательских) представлений. Объединение ведут по 2-4 модели за один шаг, получая более сложные объекты и устраняя противоречия (например, разные наименования одних свойств и одинаковые - для разных сущностей). Задача построения модели предметной области осложняется тем обстоятельством, что деление информации на свойства, сущности и связи условно, и один и тот же элемент информации можно описать по-разному. Например, информацию о преподавателе можно рассматривать как сущность, а можно и как свойство сущности ДИСЦИПЛИНА; любую ассоциированную сущность можно рассматривать как связь между несколькими сущностями. Принятие конкретного решения зависит от специфики предметной области и применяемых средств автоматизации проектирования. На основе созданной ER-схемы строится реляционная модель базы данных. Порядок построения реляционной модели из ER-схемы следующий: 1. Каждая простая сущность отображается в таблицу, при этом имя сущности становится именем таблицы. 2. Каждый атрибут сущности становится столбцом таблицы с тем же именем, при этом выбирается более точный формат значения атрибута. Ключевые свойства преобразуются в первичные ключи таблицы. 3. Столбцы, соответствующие необязательным атрибутам могут содержать неопределенные значения, обязательные столбцы не могут. 4. Если в соответствующие ключевые свойства входят связи, к числу столбцов первичного ключа добавляется копия ключевого свойства сущности, находящейся на дальнем конце связи. 5. Связи один-ко-одному, один-ко-многим преобразуются во внешние ключи. Делается копия уникального идентификатора с конца связи «один», которая мигрирует в таблицу на конце связи «много», где и становится внешним ключом. 2) Пример построения ER- модели Например, требуется разработать информационную систему «Справочное аптек города», которая позволяет получать справки о наличии лекарств в аптеках города. Сначала создадим ER-модель данной предметной области, затем отобразим созданную модель в реляционную базу данных. Выделим сущности. Их две, это АПТЕКА и ЛЕКАРСТВО. Выделим свойства каждой сущности. У сущности АПТЕКИ имеются следующие свойства: номер аптеки, адрес, телефон. У сущности ЛЕКАРСТВА свойства: название лекарства, описание лекарства. Сущности связаны между собой, так как это показано на рис. 5.5. Приведены свойства каждой сущности и звездочкой помечено ключевое свойство у каждой сущности. АПТЕКА * Номер аптеки Адрес Телефон имеет 2 6 ЛЕКАРСТВО *Номер лекарства Название Описание находится в Рис. 5.5 Трактовка ER-схемы: в АПТЕКЕ имеется 0 или более лекарств. В свою очередь ЛЕКАРСТВО находится в одной или нескольких аптеках. Иными словами между данными сущностями связь типа много-ко-многим. Отобразим данную ER модель в реляционную базу данных. Каждая сущность отображается в реляционную таблицу. Таким образом, получаем две таблицы – АПТЕКИ и ЛЕКАРСТВА. Связь много-ко-многим в реляционной модели должна быть преобразована в связь один-ко-многим путем добавления еще одной таблицы, которую назовем РАЗМЕЩЕНИЕ ЛЕКАРСТВ В АПТЕКАХ. Первичный ключ таблицы АПТЕКИ мигрирует в таблицу РАЗМЕЩЕНИЕ ЛЕКАРСТВ В АПТЕКАХ и становится там внешним ключом, ссылающимся на первичный ключ таблицы АПТЕКИ. Первичный ключ таблицы ЛЕКАРСТВО мигрирует в таблицу РАЗМЕЩЕНИЕ ЛЕКАРСТВ В АПТЕКАХ и становится там внешним ключом, ссылающимся на первичный ключ таблицы ЛЕКАРСТВА. Таким образом, получаем следующую реляционную схему базы данных: АПТЕКА *Номер аптеки Адрес телефон 1 ∞ РАЗМЕЩЕНИЕ ЛЕКАРСТВ *Номер аптеки *Номер лекарства Количество Цена ЛЕКАРСТВО *Номер лекарства Название Описание ∞ 1 Основные понятия и ключевые слова: семантическая модель, ER-модель, сущность, экземпляр сущности, связь, атрибут сущности, агрегация, обобщение, ассоциация, агрегация, обобщение, ассоциация. Контрольные вопросы 1. 2. 3. 4. 5. Перечислить недостатки реляционной модели данных. Основные понятия ER-модели. Привести пример ER-схемы. Какие Вы знаете операции над сущностями. Привести примеры. Каков порядок построения ER-модели. Каков порядок преобразования ER-модели в реляционную базу данных. Задания для самостоятельной работы 1. Построить ER-схему и на ее основании реляционную базу данных для предметной области поставки товаров в магазин. 2. Построить ER-схему и на ее основании реляционную базу данных для предметной области ШКОЛА, при этом требуется хранить информацию о школьниках, преподавателях, предметах, оценках. 3. Предложить свою предметную область и для нее построить ER-схему и на ее основании реляционную базу данных. 2 7 Глава 6. Разработка пользовательских приложений в среде СУБД MS Access Объекты базы данных База данных MS Access включает объекты следующих видов: 1. Таблицы. Хранят собственно данные. 2. Формы. Посредством форм можно вносить данные в базу или просматривать и редактировать данные. Кнопочные формы могут использоваться в качестве меню. Запросы. С помощью запросов можно манипулировать данными таблиц (добавлять, удалять, изменять данные), выбирать данные по условию, создавать новые таблицы. 4 4. Отчеты. Представляют данные базы в формате текстовых файлов. 5. Макросы. Последовательность команд на встроенном макроязыке для управления данными и приложением. 6. Модули. Программы на встроенном языке Access Basic (диалект языка Visual Basic). Создание и сохранение файла базы данных Действия: 1. Выбрать последовательно Пуск-Программы-MS Access и запустить СУБД. 2. Выбрать меню Файл-Создать базу данных-Новая база данных и затем в окне сохранения файла указать на каком устройстве, в каком каталоге, с каким именем будет хранится файл базы с расширением .mdb. 2 8 Открытие базы данных Действия: 1. Запустить MS Access. 2. Выбрать меню Файл-Открыть базу данных. В окне открытия файла выбрать устройство, папку и указать имя файла базы данных. Окно базы данных Окно базы данных появляется на экране сразу после создания или открытия файла .mdb. В левой части оно содержит набор вкладок по числу типов объектов, составляющих базу данных. Вкладки располагаются сверху вниз в форме списка. Для работы с объектами конкретного типа следует щелкнуть мышкой по соответствующей вкладке. Справа появится список объектов данного типа. Общие правила работы с объектами базы данных При работе с объектами любого типа (таблицами, формами, запросами и т.д.) т.е. в окне базы доступны 3 кнопки Открыть Конструктор Создать. С помощью этих кнопок можно активизировать имеющийся объект (Открыть), изменить существующий объект (Конструктор), создать новый обьект (Создать). Встроенные Мастера Ассess имеет большой набор встроенных программ (Мастеров), при помощи которых можно создавать те или иные обьекты – таблицы, формы, элементы управления форм, запросы, отчеты и т.д. Использование мастеров освобождает разработчика от необходимости написания кода, весьма ускоряет процесс разработки приложения и делает СУБД доступной даже начинающему пользователю. Панели инструментов MS Access имеет несколько панелей инструментов. Из меню Вид-Панели инструментов можно вывести на экран необходимую панель. Панель инструментов – это набор графических кнопок, позволяющих производить то или иное действие: Открытие и сохранение файла, установку цвета, типа и размера шрифта, выравнивание текста и т.д. Ключевыми кнопками на панели инструментов можно назвать следующие: - кнопку переключения режима работы с объектами. Она располагается в левом верхнем углу под пунктом меню Файл и имеет вид зеленого треугольника с карандашом; - кнопку открытия линейки инструментов. Она имеет вид скрещенных молоточков и доступна только в режиме Конструктор; - кнопка с изображением волшебной палочки (включение мастеров и вызов построителя выражений); - кнопка с изображением трех точек (вызов построителя выражений); Вопросы и задания 1. 2. 3. 4. 5. 6. Назовите расширение файла базы данных MS Access. Какие объекты включает база данных MS Access? Для чего предназначены объекты Таблицы? Для чего предназначены объекты Формы? Для чего предназначены объекты Запросы? Как создать файл базы данных MS Access? 2 9 7. Как сохранить файл базы данных MS Access? 8. Как открыть существующий файл базы данных MS Access? 9. Перечислите основные режимы работы с объектами базы данных. 10. В каком режиме можно создать новый объект базы данных? 11. В каком режиме можно изменить существующий объект базы данных? 12. При помощи какой кнопки на панели инструментов можно изменять режим работы с объектом базы данных? 13. Создайте новый файл базы данных. 14. Сохраните созданный файл базы данных в специально отведенном для этого каталоге на диске. 15. Откройте файл базы данных Борей и внимательно изучите, из каких объектов состоит эта база данных. Таблицы. Схема данных Создание таблицы Для работы с таблицами необходимо переключиться во вкладку Таблицы в окне банка данных. Создание таблицы начинается с описания ее структуры. Действия: 1. Во вкладке таблицы щелкнуть по кнопке Создать и выбрать в меню режим Конструктор. Откроется таблица вида: Имя поля Код города Город Тип данных Счетчик Текстовый Описание Каждая строка в этой таблице предназначения для описания поля создаваемой таблицы. Например, создается таблица Города, которая содержит 2 поля (2 атрибута): Код города и Город. Поля описываются последовательно каждое в отдельной строке. При этом обязательно указывается имя поля и тип данных поля. Колонка Описание является необязательной. MS Access имеет встроенный Help(помощь ), в котором подробно описаны правила создания имен полей и типы данных. Вызвать Help можно по клавише F1. Тип данных поля выбирается в соответствии с данными, которые будут храниться в поле. Типы данных Access Тип данных Текстовый Описание Текст или комбинация букв и цифр, или числа как набор цифр, над которыми не предполагается производить вычисления. Например, номер телефона.. 3 0 Длина До 255 символов или длина, устанавливаемая в свойстве Размер поля Поле Memo Большие обьемы текста или комбинации букв и цифр. До 65,535 символов. Если хранится только текст и числа, тогда размер поля ограничивается только размерами базы данных Числовой Числовые данные, используемые в математических расчетах. 1, 2, 4, 8 или 16 байт в зависимости от значения свойства Размер поля. Дата/Время Значения Даты и времени от 100 до 9999. 8 байт. Денежный Денежные величины и числовые данные, используемые в расчетах, включая данные до 4 знака после десятичной точки. 15 знаков до и 4 знака после десятичной точки. 8 байт. Счетчик Поле автоматического заполнения значениями последовательности с возрастанием следующего значения на 1 или случайными уникальными значениями. Данные в столбце не могут обновляться. 4 байта. Логический Поле может содержать одно из двух значений (Да/Нет, Истина/Ложь, Включено/Выключено). 1 бит. Поле обьекта OLE Содержит обьект (такой как До 1 гигабайта эл.таблица Microsoft Excel , документ (ограничивается доступным Microsoft Word, графику, звук или дисковым пространством) другие двоичные данные ) связанный или внедренный в таблицу Microsoft Access. Гиперссылка Текст или комбинация текста и цифр, Каждая из 3-х частей образующая адрес гиперссылки. гиперссылки может содержать до 2048 символов. Рекомендации: для атрибутов первичного ключа рекомендуется выбирать тип данных Счетчик. Этот тип данных автоматически генерирует новое значение поля для каждой новой строки таблицы и гарантирует неповторимость(уникальность) очередного значения. Например, Код города в таблице Город. Всякий раз значение этого атрибута система будет генерировать сама и это будет каждый раз новое значение. Тип данных Счетчик – соответствует типу Числовой Длинное целое. Таблицы в базе данных связаны между собой по ключевым атрибутам. Атрибуты, по которым связываются таблицы, обязательно должны быть одного типа данных. Если первичный ключ родительской (независимой)таблицы имеет тип данных Счетчик, то внешний ключ дочерней (зависимой) таблицы, по которому устанавливается связь, должен быть типа Числовой Длинное целое, иначе система выдаст ошибку и 3 1 связывания не произойдет. При выборе конкретного типа данных в нижней части экрана появляется дополнительное окно уточнения типа. Так, если для атрибута выбран тип данных Дата/Время, то в нижнем окне можно будет в строке Формат поля установить формат Даты. Например, выбрать Краткий формат, и тогда дата будет отображаться в виде дд.мм.гг. Ввод данных в таблицу Данные в таблицу можно вводить непосредственно, открыв таблицу, или создать и использовать для этого форму ввода. Ввод данных в таблицу без использования формы Чтобы открыть таблицу для ввода данных, нужно - Выбрать таблицу в окне банка данных на вкладке Таблицы. - Дважды щелкнуть мышью по имени таблицы или по кнопке Открыть. - Ввести данные в столбцы и строки. Сортировка данных в столбцах таблицы При работе с таблицей в режиме ввода данных данные в столбцах можно упорядочить, используя кнопки на панели инструментов А/Я или выбрать меню Записи/Сортировка. Упорядочение можно произвести по возрастанию или по убыванию значений в 3 2 столбце. Поиск данных В столбце таблицы можно произвести поиск необходимых данных. Для этого нужно щелкнуть по значку с изображением бинокля на панели инструментов или выбрать меню Правка/Найти. Фильтрация данных На данные в таблице можно наложить фильтр. Для этого нужно щелкнуть по значку с изображением воронки на панели инструментов или выбрать меню Записи/Фильтр. Схема данных Как уже говорилось, база данных обычно состоит из нескольких таблиц, структура которых определяется в процессе проектирования. Таблицы ссылаются друг на друга (или связываются) по атрибутам первичного и внешнего ключей. При создании базы данных в среде СУБД эти связи устанавливаются при помощи режима Сервис/Схема данных. Действия при создании схемы данных выбрать меню Сервис/Схема данных добавить таблицы в схему, выбрав их в окне Добавить таблицу и щелкнув по кнопке Добавить - связать таблицы по ключевым атрибутам.(мышкой перетащить ключевой атрибут из одной таблицы в другую и наложить на связываемый атрибут) задать правила ссылочной целостности данных. Обеспечение ссылочной целостности базы данных позволяет предотвратить следующие ошибочные ситуации: - - добавление в связанную таблицу записей со значением атрибута-связки, которое отсутствует в "родительской" таблице; - удаление из "родительской" таблицы записей, со значением атрибута-связки, на которое есть ссылка в "родительской" таблице. 3 3 Пример описания данных на языке СУБД МS Access Наша БД включает таблицы: Книги(Номер_книги, Автор, Название, Код_жанра, Год_издания, Издательство, Цена) Жанр(Код_жанра, Название_жанра, описание_жанра) Читатель(Номер_билета, ФИО, Адрес, Телефон, Дата рождения, Пол) Обмен_книг (Номер_операции, Номер_книги, Номер_билета,Дата выдачи,Дата возврата) Это логическая модель БД. Она абстрактна и не имеет привязки к конкретной СУБД. Опишем физическую модель той же БД. То есть опишем ее структуру на языке описания данных СУБД MS Access. Таблица Книги Имя поля Тип данных Размер поля Формат поля Номер_книги Автор Название Код_жанра Год_издания Издательство Цена Счетчик Текстовый Текстовый Числовой Числовой Текстовый Денежный Длинное целое 50 100 Длинное целое Целое 70 - Денежный 3 4 Таблица Жанр Имя поля Код жанра Жанр Тип данных Счетчик Текстовый Размер поля Длинное целое 50 Формат поля Имя поля Номер_билета ФИО Адрес Телефон Дата рождения Тип данных Счетчик Текстовый Текстовый Текстовый Дата/время Размер поля Длинное целое 100 100 10 - Формат поля Пол Текстовый 1 Имя поля Номер_операции Номер_книги Номер_билета Дата выдачи Тип данных Счетчик Числовой Числовой Дата/время Размер поля Длинное целое Длинное целое Длинное целое - Дата возврата Дата/время - Таблица Читатель Краткий формат даты Обмен_книг Формат поля Краткий формат даты Краткий формат даты Вопросы и задания Как создать новую таблицу? Объясните механизм описания структуры таблицы. Перечислите типы данных таблицы Access. Опишите каждый тип данных, приведите примеры. В чем особенность типа данных Счетчик. Для каких атрибутов удобно использовать этот тип данных? 6. Является ли атрибут типа данных Счетчик числовым? 7. Что такое Схема данных? 8. Как открыть окно схемы данных? 9. Как добавить (удалить) таблицу в схему данных? 10. Как связать две таблицы? 11. Можно ли связать две таблицы по атрибутам, которые имеют разный тип данных? 12. Что такое ссылочная целостность базы данных? 13. Можно ли не связывать отношения правилами ссылочной целостности данных? 14. Откройте схему данных базы данных Борей и посмотрите, по каким правилам связаны таблицы. Подумайте и ответьте, можно ли изменить параметры связей таблиц и что при этом изменится при работе с данными? Какие возникнут новые 1. 2. 3. 4. 5. 3 5 возможности и какие появятся ограничения? Формы. Типы форм. Элементы управления Формы – это объекты, которые используются для того, чтобы: - вводить данные в таблицу; - просматривать данные одной или нескольких таблиц; представлять меню приложения; выполнять другие функции. Виды форм - В зависимости от назначения можно строить формы разного вида: табличные; ленточные; в столбце; сложные, содержащие вложенные формы; формы меню; вспомогательные формы. Свойства формы Все объекты базы данных, в том числе и формы, имеют набор свойств. Изменяя значения свойств объекта, можно модифицировать объект. Для того, чтобы получить доступ к просмотру и редактированию свойств объекта, нужно открыть объект в режиме Конструктор, щелкнуть правой кнопкой мыши и выбрать в меню пункт Свойства. Свойства можно просматривать по группам или все списком. Свойство Источник данных Одним из наиболее важных является свойство формы Источник данных. Источником данных для формы может являться таблица или запрос. И тогда в форму можно вывести данные таблицы или запроса. Источник данных можно и не задавать, например, при создании формы меню. Автоформа в столбец Это вид формы обычно используется для ввода данных в таблицу. В форме отображается одна текущая запись таблицы. Форма имеет линейку скроллинга, позволяющую перемещаться по записям таблицы и создавать новую запись. Форма создается с помощью Мастера. Мастер размещает в форме все поля из таблицы-источника данных в столбец. Действия при создании формы: - во вкладке Формы щелкнуть по кнопке Создать - выбрать в меню Автоформа: в столбец - указать источник данных (таблицу или запрос) - сохранить форму, дав ей уникальное имя. 3 6 Автоформа ленточная Это вид формы обычно используется для просмотра данных таблицы или запроса. Форма позволяет просматривать одновременно несколько записей таблицы. Форма имеет линейку скроллинга, позволяющую перемещаться по записям таблицы и создавать новую запись. Форма создается с помощью Мастера. Мастер размещает в форме все поля из источника данных в виде таблицы. Действия при создании формы: - во вкладке Формы щелкнуть по кнопке Создать - выбрать в меню Автоформа: ленточная - указать источник данных (таблицу или запрос) - сохранить форму, дав ей уникальное имя. Автоформа табличная Так же, как и ленточная табличная форма обычно используется для просмотра данных таблицы или запроса. Форма позволяет просматривать одновременно несколько записей таблицы. Форма имеет линейку скроллинга, позволяющую перемещаться по записям таблицы и создавать новую запись. Форма создается с помощью Мастера. Мастер размещает в форме все поля из источника данных в виде таблицы. Действия при создании формы: - во вкладке Формы щелкнуть по кнопке Создать - выбрать в меню Автоформа: табличная - указать источник данных (таблицу или запрос) - сохранить форму, дав ей уникальное имя. Создание формы с помощью Конструктора Создание формы в режиме Конструктор позволяет проектировать макет формы “вручную”. С помощью меню Вид/Cписок полей можно высветить список полей источника данных и размещать поля в форме мышкой. Изменяя значения свойств формы, можно ее модифицировать. Элементы управления формы При помощи мастеров можно автоматически создать основную часть формы, ее каркас. Затем форму можно обогатить, добавив элементы управления. Линейка инструментов включается при помощи кнопки с изображением скрещенных молоточков. Каждому элементу управления соответствует своя кнопка на линейке инструментов и своя программа-Мастер, посредством которого создается экземпляр элемента. В таблице представлены некоторые элементы управления и их назначение: Элемент Указатель (стрелка) Мастера (волшебная палочка) Надпись Поле Поле со списком Список Назначение Выбор объектов Включение программ-мастеров Создание подписей Поле для ввода и отображения данных Создание списков на основе данных таблиц или фиксированного набора значений Создание списков на основе 3 7 Переключатель Рисунок Группа переключателей Свободная рамка объекта Присоединенная рамка объекта Флажок Вкладка Кнопка фиксированного набора значений Элемент управления, связанный с логическим полем Вставка рисунка Группа объектов, представляющая набор альтернативных значений Отображение свободного объекта Отображение набора рисунков Элемент управления, связанный с логическим полем Создание в форме вкладок Выполнение процедур или макросов Общий механизм создания элемента управления 1. 2. 3. 4. Выбрать элемент, щелкнув по его кнопке на линейке инструментов. Мышкой обозначить место в форме или отчете, где требуется разместить элемент. Ответить на вопросы программы-мастера, создающей элемент управления. При необходимости выполнить форматирование объекта (установить тип шрифта, цвет, размер и др.)посредством кнопок форматирования, расположенных под линейкой меню Access или изменив свойства объекта через меню свойств (выход в меню по правой кнопке мыши). Объект при этом необходимо сначала выделить. Автоформы обычно также обогащают элементами управления после создания. Как правило, в такие формы добавляют кнопки создания новой записи, поля атрибутов внешнего ключа заменяют на элементы управления поле со списком, добавляют заголовок формы, рисунки. Создание форм для ввода данных Создадим форму ввода данных для таблицы Жанр. 1. 2. 3. 4. Создадим Автоформу: в столбец. Укажем таблицу Жанр в качестве источника данных. Переключимся в режим Конструктор. Создадим кнопку добавления новой записи. Сохраним форму. Создадим форму ввода данных для таблицы Книги. 1. Создадим Автоформу: в столбец. Укажем таблицу Книги в качестве источника данных. 2. Переключимся в режим Конструктор. 3. Создадим кнопку добавления новой записи. 4. Удалим поле Код_жанра. 5. Создадим поле со списком вместо поля Код_жанра. 6. Сохраним форму. 3 8 Создадим форму ввода данных для таблицы Читатели. Создадим Автоформу: в столбец. Укажем таблицу Читатель в качестве источника данных. Переключимся в режим Конструктор. Создадим кнопку добавления новой записи. Удалим поле Пол. Создадим элемент управления Фрейм вместо поля Пол. В списке возможных значений зададим 2 значения: Женский, Мужской. Зададим режим сохранения выбранного значения в поле Пол таблицы Читатель. Выберем внешний вид элемента управления. Сохраним форму. Создадим форму ввода данных для таблицы Обмен книг. Создадим Автоформу: в столбец. Укажем таблицу Обмен книг в качестве источника данных. Переключимся в режим Конструктор. Создадим кнопку добавления новой записи. Удалим поля Код_книги и Номер_билета. Создадим поле со списком вместо поля Код_книги. Зададим режим сохранения атрибута Код-книги, возвращаемого элементом управления, в поле Код_книги таблицы Обмен. 3 9 Создадим поле со списком вместо поля Номер_билета. Зададим режим сохранения атрибута Номер_билета, возвращаемого элементом управления, в поле Код_билета таблицы Обмен. Сохраним форму. Создание форм для просмотра данных Создадим форму просмотра данных для таблицы Жанр. 5. Создадим Автоформу: ленточная. Укажем таблицу Жанр в качестве источника данных. 6. Переключимся в режим Конструктор. 7. Создадим кнопку добавления новой записи. 8. Сохраним форму. Создадим форму просмотра данных для таблицы Читатели. 1. 2. Создадим Автоформу: ленточная. Укажем таблицу Читатель в качестве источника данных. Сохраним форму. Таблицы Книги и Обмен книг являются зависимыми. Для просмотра полной 4 0 информации из этих таблиц в виде, удобном для пользователя, необходимы данные из других таблиц. Для просмотра данных таблицы Книги необходимы данные таблицы Жанр, а для просмотра данных таблицы Обмен книг необходимы данные таблиц Книги и Читатели. Поэтому формы для просмотра данных таблиц Книги и Обмен книг лучше создавать не на основе этих таблиц, а на основе запросов. Запросы позволяют объединять данные нескольких таблиц. Вопросы и задания Что такое формы? Для чего предназначены формы? Содержит ли форма данные? Какие виды форм можно создавать при помощи мастеров MS Access? Какой вид формы обычно используют для ввода данных в таблицы? Какой вид формы обычно используют для просмотра данных таблиц? Какие действия нужно выполнить, чтобы создать форму? Что такое источник данных? Какие обьекты Access могут выступать в качестве источника данных? 9. Можно ли создавать формы без указания источника данных? Для чего обычно служат такие формы? 10. Откройте базу данных Борей и назовите тип каждой формы, входящей в эту базу данных. 11. Исследуйте формы Главная кнопочная форма, Сотрудники, Типы, Телефоны клиентов. Назовите тип каждой формы, укажите источники данных для этих формы, какие элементы управления включают эти формы. 1. 2. 3. 4. 5. 6. 7. 8. Запросы. Макросы. Отчеты Основы SQL Запросы – один из видов объектов, входящих в состав базы данных MS Access. В окне базы данных имеется соответствующая вкладка, открывающая доступ к объектам этого вида. Запрос – это механизм, позволяющий производить манипуляции с данными таблиц. Посредством запросов можно добавлять, удалять, изменять данные таблиц, создавать новые таблицы, производить выборку данных из таблиц по некоторому условию и т.д. Существует специальный структурированный язык запросов Structured Query Language (SQL), который является стандартом языка для работы с базами данных. Различные СУБД поддерживают различные модификации (диалекты) этого языка. Посредством инструкций SQL выполняются действия с данными таблиц. СУБД MS Access Имеет встроенный Построитель запросов – Мастер, посредством которого можно строить так называемые графические запросы по образцу graphical Query by Example (graphical QBE). Запрос, построенный в среде QBE можно увидеть на языке SQL, и пользователь может использовать эту возможность для изучения SQL. 4 1 Инструкция SELECT Важную роль в языке SQL выполняет инструкция SELECT, посредством которой производится выборка данных. Результатом выполнения инструкции SELECT является множество записей, удовлетворяющих условиям, заданным инструкцией. Формат инструкции: SELECT [ALL| DISTINCT|DISTINCTROW] список_выбора FROM имена_таблиц [WHERE критерий_отбора] [ORDER BY критерий_столбца [ASC|DESC]] SELECT – инструкция «выбрать» список_выбора – список полей, которые включаются в результирующее множество,разделяются запятыми. ALL| DISTINCT|DISTINCTROW – необязательные аргументы, определяющие способ обработки строк ALL - включить все строки DISTINCT - исключить повторящиеяся записи DISTINCTROW - эквивалент DISTINCT FROM имена_таблиц - из каких таблиц. Имена таблиц через запятую. WHERE критерий_отбора - задает выражение, являющееся условием для отбора записей ORDER BY критерий_столбца - задает правило упорядочения записей в результирующем множестве ASC|DESC - задает порядок сортировки ( по возрастанию|по убыванию) Например: Выбрать фамилии и телефоны читателей, фамилии которых начинаются на букву «А», упорядочить по фамилиям SELECT [ФИО], [Телефон] FROM Читатели WHERE [ФИО] Like “A*” ORDER BY [ФИО]; Использование статистических функций SQL При помощи SQL можно построить запросы для подведения итогов, расчета средних значений или вычисления статистических данных для групп записей. Для этого в инструкцию SQL требуется включить предложение GROUP BY. Чтобы ограничить число записей, обрабатываемых в операции GROUP BY, служит необязательный аргумент HAVING. Синтаксис: SELECT [ALL| DISTINCT|DISTINCTROW] Статистическая функция(имя_поля) AS псевдоним [, список_выбора ] FROM имена_таблиц [WHERE критерий_отбора] GROUP BY критерий группировки [HAVING групповой_критерий] [ORDER BY критерий_столбца ] выражение AS псевдоним - определяет подпись столбца 4 2 GROUP BY критерий группировки - определяет столбец, на основе которого выполняется группировка [HAVING групповой_критерий] - определяет критерий, который накладывается на значения столбца Статистическая функция(имя_поля). Операция выполняется по окончании группировки. Например: Рассчитать суммарную стоимость доставки почтовых отправлений по областям для России в заданном интервале дат отправления и вывести записи, в которых стоимость доставки превышает значение 75 SELECT ОбластьПолучателя, SUM(СтоимостьДоставки) AS ОбщаяСумма FROM Заказы WHERE СтранаПолучателя=”Россия” AND ДатаРазмещения BETWEEN #01/05/02# AND #01/09/02# GROUP BY ОбластьПолучателя HAVING СтоимостьДоставки>75 ORDER BY SUM(СтоимостьДоставки) DESC; Создание соединений с помощью SQL Часто запрос строится на базе не одной, а нескольких таблиц. Для соединения таблиц в инструкцию SELECT добавляется выражение JOIN_ON, в котором указывается присоединяемая таблица и отношение между полями, на котором основана связь. Синтаксис: SELECT [ALL| DISTINCT|DISTINCTROW] список_выбора FROM имена_таблиц INNER JOIN таблица_соединения ON критерий соединения [INNER JOIN таблица_соединения ON критерий соединения] [WHERE критерий_отбора] [ORDER BY критерий_столбца ] где имя_таблицы INNER JOIN таблица_соединения ON критерий соединения - описывает отношение связи между таблицами. Каждая из участвующих в соединении таблиц должна быть перечислена в списке таблиц до и после ключевого слова JOIN. INNER - определяет тип соединения, может быть заменено предложением WHERE. Например: SELECT DISTINCTROW Заказы.КодЗаказа,Заказы.КодКлиента, [Заказано].КодТовара, [Заказано].Количество FROM Заказы INNER JOIN [Заказано] ON Заказы.КодЗаказа=[Заказано].КодЗаказа ORDER BY Заказы.КодЗаказа; 4 3 В данном примере связываются таблицы Заказано и Заказы. Атрибутом-связкой является КодЗаказа. Тот же пример с использованием WHERE выглядит так: SELECT DISTINCTROW Заказы.КодЗаказа,Заказы.КодКлиента, [Заказано].КодТовара, [Заказано].Количество FROM Заказы,[Заказано] WHERE Заказы.КодЗаказа=[Заказано].КодЗаказа ORDER BY Заказы.КодЗаказа; Создание вложенных (подчиненных) запросов Вложенным(подчиненным) называется запрос, который обрабатывает результирующее множество другого запроса. При создании таких запросов аргументом инструкции SELECT становится другая инструкция SELECT. То есть один запрос как бы вкладывается в другой. Синтаксис: SELECT список_полей FROM список таблиц WHERE [имя_таблицы.]имя_поля IN SELECT инструкция_выбора GROUP BY критерий группировки [HAVING групповой_критерий] [ORDER BY критерий_столбца ] Например: вывести данные о клиентах, разместивших заказы в определенном интервале дат. SELECT DISTINCTROW Клиенты.ОбращатьсяК,Клиенты.Название, Клиенты.Должность, Клиенты.Телефон FROM Клиенты WHERE Клиенты.КодКлиента IN (SELECT DISTINCTROW Заказы.КодКлиента FROM Заказы WHERE Заказы.Дата BETWEEN #4/5/02# AND #4/9/02#; Создание запросов на изменение данных Команды INSERT, DELETE, UPDATE языка SQL позволяют производить действия над данными. Добавление записей При помощи команды INSERT можно создавать запросы на добавление записей. Синтаксис: INSERT INTO таблица_приемник SELECT [ALL|DISTINCT||DISTINCTROW] список_выбора FROM таблица_источник [WHERE критерий_добавления] 4 4 Например: добавить в таблицу КлиентыМосква записи из таблицы Клиенты, в которых значение поля Город=”Москва” INSERT INTO КлиентыМосква SELECT * FROM Клиенты WHERE Клиенты.Город=”Москва”; Удаление записей При помощи команды DELETE можно создавать запросы на удаление записей. Синтаксис: DELETE FROM имя_таблицы [WHERE критерий_удаления] Например: удалить из Город=”Москва” таблицы Клиенты, записи в которых значение поля DELETE FROM Клиенты WHERE Клиенты.Город=”Москва”; Чтобы удалить все записи из таблицы не нужно указывать WHERE. Обновление записей При помощи команды UPDATE можно создавать запросы на обновление записей. Синтаксис: UPDATE имя_таблицы SET имя_поля=значение [,имя_поля=значение] [WHERE критерий_обновления] Например: изменить название города “Ленинград” на “Санкт-Петербург” UPDATE Клиенты SET Клиенты.Город=“Санкт-Петербург” WHERE Клиенты.Город=“Ленинград”; Создание новой таблицы Запрос на создание новой таблицы можно создать при помощи команды SELECT. Синтаксис: SELECT [ALL| DISTINCT|DISTINCTROW] список_выбора INTO новая_таблица FROM исходная таблица 4 5 WHERE критерий_отбора Например: сохранить в новой таблице данные обо всех клиентах из Санкт-Петербурга. SELECT * INTO КлиентыСанктПетербурга FROM Клиенты WHERE Клиенты.Город=“Санкт-Петербург”; Вопросы и задания 1. Что такое язык SQL и для чего он предназначен? 2. При помощи какой инструкции SQL можно производить выборку данных? 3. Для чего используется предложение FROM? 4. Для чего используется предложение ORDER BY? 5. Для чего используется предложение WHERE? 6. Что такое статистические функции SQL? 7. При помощи какой инструкции SQL можно производить обновление данных? 8. Как можно создать новую таблицу на языке SQL? 9. Как можно выполнить группирование данных в запросе? 10. Как можно упорядочить данные запроса? 11. Напишите инструкцию SQL для выборки всех книг жанра «детектив”. 12. Напишите инструкцию SQL для подсчета количества книг в библиотеке. 13. Напишите инструкцию SQL для добавления записи в таблицу Читатели” 14. Напишите инструкцию SQL для выборки всех читателей, фамилия которых начинается на букву «Д». Запросы QBE. Мастер запросов Создание нового запроса Для создания нового запроса нужно открыть вкладку Запросы в окне базы данных и щелкнуть по кнопке Создать/Конструктор. В окне Добавление таблицы выбрать таблицы и добавить их в окно Построителя запроса. 4 6 Построитель запросов QBE В верхней части окна построителя запросов располагаются образы таблиц, которые выбрал для работы пользователь. Атрибуты из таблиц можно выбирать мышкой и перетаскивать в нижнюю часть окна для формирования структуры результирующей таблицы. В нижней части окна расположена табличка для задания параметров запроса. Ее вид зависит от типа запроса. Запрос на выборку данных При построении запроса на выборку табличка внизу следующим образом: окна будет выглядеть Первая строка таблички Поле: задает структуру результирующей таблицы. Сюда переносятся имена атрибутов из исходных таблиц. Во второй строке Имя таблицы: отображается имя таблицы, из которой переносится атрибут. Третья строка Сортировка: позволяет задать сортировку результирующей таблицы по какому-то атрибуту. Четвертая строка Вывод на экран: позволяет отменить вывод на экран какого-то Столбца результирующей таблицы. Следующие несколько строк позволяют задать Условие отбора записей. 4 7 Способы задания условия отбора 1.Непосредственное задание конкретного значения. Например, в столбце Жанр в строке Условие отбора ввести значение «детектив». В результате выполнения запроса на экране будут видны только те записи из таблицы книг, которые относятся к жанру «детектив». 2.Построение в строке Условие отбора выражений с использованием специальных операторов Between, In, Like. Оператор Between – задает диапазон допустимых значений атрибута. Например: выражение в строке Условие отбора в поле Цена: Between 150 And 500 указание выбрать все книги, цена которых колеблется от 150 до 500 руб. Оператор In – задает список допустимых значений атрибута. Например: выражение в строке Условие отбора в поле Жанр: In(«детектив», «сказки») - указывает выбрать все книги, которые относятся к жанрам детектив и сказки. Оператор Like – задает шаблон для выбора записей в конкретном поле. Например: выражение в строке Условие отбора в поле Автор: Like [A*] - указывает выбрать все книги, фамилии авторов которых начинаются с символа А. Условие отбора может быть задано одновременно по нескольким полям таблицы. 4 8 Выполнение запроса Для того, чтобы выполнить запрос, нужно щелкнуть мышкой по кнопке с изображением красного восклицательного знака. Кнопка расположена в верхней части экрана под линейкой меню. Сохранение запроса При закрытии окна Построителя запроса система сохраняет запрос и предлагает в специальном окне задать его имя. Редактирование запроса Для изменения существующего запроса нужно выделить его в окне базы данных во вкладке запросы и щелкнуть мышкой по кнопке Конструктор. В процессе редактирования запроса эта кнопка доступна в левом верхнем углу экрана под линейкой меню. Она имеет вид зеленого треугольника с карандашом. При помощи этой копки можно быстро переключать из режима редактирования объекта в режим просмотра. При работе с запросами, по ней можно выбрать режим SQL – режим просмотра запроса QBE на языке SQL. Вопросы и задания Что такое запрос? Для чего предназначены запросы? Какой специальный язык существует для работы с данными таблиц? Как создать новый запрос при помощи Построителя запросов? Как сохранить запрос? Как запустить запрос на выполнение? Что такое запрос на выборку данных? Как организовано окно Построителя запросов? Как сформировать структуру виртуальной таблицы, которая получится в результате выполнения запроса на выборку данных? 10. Как определить видимые поля в результирующей таблице? 11. Как упорядочить данные результирующей таблицы? 12. Как сформировать условие отбора записей в результирующей таблице? 13. Обьясните, как используются операторы Between, In, Like при построении условия отбора записей. 14. Создайте запрос на выборку записей из таблицы Книга, в которых значение поля Цена находится в диапазоне от 150 до 300 рублей. Используйте оператор Between. 15. Создайте запрос на выборку записей из таблицы Книга, в которых значением поля Жанр является «детектив» или «фантастика». Используйте оператор In. 16. Создайте запрос на выборку записей из таблицы Книга, в которых значение поля Автор начинается на букву «А» является «детектив» или «фантастика». Используйте оператор Like. 1. 2. 3. 4. 5. 6. 7. 8. 9. Виды запросов При работе с построителем запросов можно определить вид запроса, который строится. Это делается с помощью меню Запрос в верхней части экрана. При выборе определенного вида запроса меняется вид окна Построителя запросов. По умолчанию строится запрос на выборку. Запрос на обновление данных 4 9 Создание запроса: На вкладке Запросы щелкнуть по кнопке Создать/Конструктор. Добавить таблицу в которой нужно обновить данные. Преобразовать запрос в запрос на обновление: выбрать меню Запрос/Обновление. В Построителе запросов в строку Поле: перенести поле, значения в котором подлежат обновлению. В строке Обновление: построить выражение определяющее алгоритм обновления данных. Например: В таблице Книги требуется увеличить цену всех книг в два раза. Действия: 1. На вкладке Запросы щелкнуть по кнопке Создать/Конструктор. 2. Добавить таблицу Книги. 3. Преобразовать запрос в запрос на обновление: выбрать меню Запрос/Обновление. 4. В Построителе запросов в строку Поле: перенести поле Цена. 5. В строке Обновление: построить выражение определяющее алгоритм обновления данных: = [Книги]![Цена] * 2 Запрос на языке SQL: UPDATE Книги SET Книги.Цена = [Книги]![Цена]*2; Выражения Выражения являются основным средством выполнения многих операций MS Access. Выражение представляет собой комбинацию символов — идентификаторов, операторов и значений — дающую определенный результат. 5 0 Например, следующее выражение позволяет вывести в элементе управления в форме или отчете сумму значений полей «СуммаЗаказа» и «СтоимостьДоставки» : = [СуммаЗаказа] + [СтоимостьДоставки] Элементы выражений Выражения состоят из следующих элементов: - Операторы. Арифметические (+,-,*,/), сравнения (>,<,=,<>),логические (And,Or,Not), специальные (Between,In,Like), оператор конкатенации (&). - Константы. Постоянные значения, вводимые пользователем. - Идентификаторы. Это имена объектов MS Access, таких, как поля таблиц, элементы управления и так далее. А также постоянные именованные константы: True, False,Yes,No,Null. - Функции. В MS Access насчитывается около полутора сотен функций. Они сгруппированы по назначению. Например, функции работы с датой и временем: Date, Time, Now и т.д. Именование объектов МS Access.Идентификаторыъ Идентификатор – это имя объекта. Каждый объект MS Access (база данных, таблица, поле, элемент управления и т.д.)имеет идентифицирующее его имя. Каждый обьект MS Access принадлежит к какому-то семейству или классу объектов. Идентификатор объекта строится по правилу: Имя_семейства![Имя объекта]![Имя свойства] Например: Forms![Книги]![Автор] Например, идентификатор поля Адрес в таблице Клиент: Клиент!Адрес Если идентификатор содержит пробел, то он заключается в квадратные скобки. Например: Клиент![Код клиента] При обращения к свойству объекта в качестве разделителя используется обычно точка: Клиенты.Адрес Построитель выражений Это специальная программа-Мастер, которая вызывается по щелчку мышью по кнопке с изображением волшебной палочки и многоточия. Построитель выражений в специальных окнах предоставляет доступ ко всем объектам и функциям базы данных. Мышью можно выбирать нужный элемент выражения – оператор, функцию или идентификатор и быстро создавать выражения. Рассмотрим элементы окна Построителя выражений. 5 1 ЗДЕСЬ СТРОИТСЯ Само выражение В верхнем окошке строится само выражение. Ниже расположены кнопки для выбора операторов. В нижнем левом окошке можно выбрать семейство объектов, открыть его щелчком мыши и выбрать объект. Например, таблицу Книги. В среднем нижнем окошке отобразится перечень элементов, составляющих данный объект. В данном случае, список полей таблицы. В случае формы, например, отобразится список полей и элементов управления, входящих в форму. В нижнем правом окошке отображается слово Значение для выбора элемента объекта, а в случае работы со встроенными функциями в нем отображается список функций категории, выбранной в среднем окошке. Всегда лучше использовать Построитель Выражений вместо того, чтобы писать идентификатор объекта или функцию «вручную». Это избавляет от многих ошибок. Встроенные функции MS Access Как уже говорилось, MS Access располагает значительным набором встроенных функций. В зависимости от назначения они разделяются на категории. (См. приложение Встроенные функции) Создание в запросе вычисляемого поля Иногда в результате запроса есть необходимость получать значения, вычисляемые на основе данных таблиц. Например, требуется рассчитать стоимость книг при условии увеличения ее 2 раза, но при этом данные таблицы не изменять. То есть требуется получить результирующую таблицу вида: 5 2 Название книги Автор Цена Новая цена Поле Новая цена является вычисляемым. Действия при создании запроса: На вкладке Запросы щелкнуть по кнопке Создать/Конструктор. Добавить таблицу Книги. Перенести мышкой в строку Поле атрибуты Название книги, Автор, Цена. Установить курсор в строке Поле на свободный столбец. В Построителе запросов построить выражение, определяющее алгоритм обновления данных: = [Книги]![Цена] * 2 Установить новую подпись для созданного вычисляемого поля, выбрав пункт меню Вид/Свойства, и на вкладке Общие выбрать Подпись и внести Новая цена. Сохранить запрос. Запрос на языке SQL: SELECT Книги.Автор, Выражение1 FROM Книги; Книги.Название, Книги.Цена, [Книги]![Цена]*2 AS Параметрический запрос Выше мы рассмотрели, как задавать условие отбора записей в запросе статически, на этапе проектирования запроса. Иногда удобнее бывает условие отбора задавать динамически, в процессе выполнения запроса. Для этого необходимо создать запрос с использованием параметра или параметрический запрос. Например, необходимо создать запрос для того, чтобы пользователь мог выбирать книги какого-то жанра и при этом жанр можно было бы задавать при открытии запроса. Действия: 1. На вкладке Запросы щелкнуть по кнопке Создать/Конструктор. 2. Добавить таблицы Книги и Жанры. 3. Перенести мышкой в строку Поле атрибуты Название книги, Автор, Жанр. 4. Преобразовать запрос в параметрический: выбрать меню Запрос/Параметрический. 5. В строке Условие отбора в квадратных скобках записать имя параметра:[Укажите жанр] 6. Сохранить запрос. 5 3 5 4 При выполнении запроса на экране появится окно с заголовком Введите значение параметра. После ввода значения (например, «детектив») нужно щелкнуть по кнопке Ok. Система выведет на экран только записи, удовлетворяющие введенному условия, т.е. книги жанра «детектив». Запрос на языке SQL: SELECT Книги.Автор, Книги.Название, Жанр.Жанр FROM Жанр INNER JOIN Книги ON Жанр.[Код жанра] = Книги.[Код жанра] WHERE (((Жанр.Жанр)=[ Укажите жанр])); Использование в запросе встроенных функций MS Access При создании вычисляемых полей или условия отбора в запросе можно использовать встроенные функции MS Access. Перечень встроенных функций по категориям можно увидеть в окне Построителя выражений, открыв семейство Функции/Встроенные функции. Например: требуется построить запрос, позволяющий определить, какие книги выдавались в конкретный месяц конкретного года. Действия: 1. 2. 3. 4. На вкладке Запросы щелкнуть по кнопке Создать/Конструктор. Добавить таблицы Книги, Обмен. Перенести мышкой в строку Поле атрибуты Название книги, Автор, Дата выдачи. Установить курсор в строке Поле на свободный столбец. 5 5 5. Открыть Построитель запросов. 6. Построить выражение с использованием встроенной функции Year из категории Дата/Время, которая возвращает целочисленное значение года от заданной даты: Year([Обмен]![Дата выдачи] ) 7. В следующем свободном столбце аналогично построить выражение с использованием встроенной функции Month из категории Дата/Время, которая возвращает целочисленное значение месяца от заданной даты: Month([Обмен]![Дата выдачи] ). 8. Преобразовать запрос в параметрический. 7. В строке Условие отбора в столбце, который вернет значения Года, в квадратных скобках записать имя параметра:[Укажите год]. 8. Аналогично в строке Условие отбора в столбце, который вернет значения Месяц, в квадратных скобках записать имя параметра:[Укажите месяц]. 9. Установить новые подписи для созданных вычисляемых полей соответственно Год и Месяц (пункт меню Вид/Свойства/Подпись на вкладке Общие). 10. Сохранить запрос. Запрос на языке SQL: SELECT Книги.Автор, Книги.Название, Обмен.[Дата выдачи], Year([Обмен]![Дата выдачи]) AS Выражение1, Month([Обмен]![Дата выдачи]) AS Выражение2 FROM Читатель INNER JOIN (Книги INNER JOIN Обмен ON Книги.[Код книги] = Обмен.[Код книги]) ON Читатель.[Номер билета] = Обмен.[Номер билета] WHERE (((Year([Обмен]![Дата выдачи]))=[Укажите год]) AND ((Month([Обмен]![Дата выдачи]))=[Укажите месяц])); 5 6 Вопросы и задания 1. Постройте запрос с использованием вычисляемого поля, при помощи которого можно было бы узнать, сколько дней прошло с момента выдачи до момента возврата книги для каждой записи таблицы Обмен книг. 2. Постройте запрос, при помощи которого можно было определить всех задолжников, то есть читателей, которые держали книгу сверх установленного срока 10 дней. 3. Постройте параметрический запрос, который позволил бы определить всех задолжников, которые держали книгу сверх установленного срока. Срок, в течение которого читатель может держать книгу, библиотекарь вводит сам, при выполнении запроса. 4. Постройте параметрический запрос, который позволил бы определить все книги по году издания. Итоговый запрос Итоговые запросы позволять производить различные расчеты по данным базы. Пример 1. Требуется определить количество книг в библиотеке по жанрам. Действия: 9. На вкладке Запросы щелкнуть по кнопке Создать/Конструктор. 10. Добавить таблицы Книги и Жанры. 11. Перенести мышкой в строку Поле атрибуты Жанр,Код книги. 12. Преобразовать запрос в итоговый: щелкнуть по кнопке и изображением знака сигма. 13. В строке Групповая операция установить для столбца Жанр режим Группировка, Для столбца Код книги групповую операцию Сount. 14. Сохранить запрос c именем Итоговый запрос 1. На языке SQL: SELECT Жанр.Жанр, Count(Книги.[Код книги]) AS [Count-Код книги] FROM Жанр INNER JOIN Книги ON Жанр.[Код жанра] = Книги.[Код жанра] GROUP BY Жанр.Жанр; 5 7 Пример 2. Требуется определить суммарную стоимость всех книг в библиотеке. Действия: На вкладке Запросы щелкнуть по кнопке Создать/Конструктор. Добавить таблицу Книги. Перенести мышкой в строку Поле атрибут Цена. Преобразовать запрос в итоговый: щелкнуть по кнопке с изображением знака сигма. 5. В строке Групповая операция выбрать для столбца Цена групповую операцию Sum. 6. Сохранить запрос c именем Итоговый запрос 2. 1. 2. 3. 4. На языке SQL; SELECT Sum(Книги.Цена) AS [Sum-Цена] FROM Книги; 5 8 Перекрестный запрос С помощью перекрестного запроса можно создать сводную таблицу итогов по данным базы. Например, требуется определить сколько книг и какого жанра брали конкретные читатели. Действия: На вкладке Запросы щелкнуть по кнопке Создать/Конструктор. Добавить таблицы Жанры,Книги, обмен, Читатели. Перенести мышкой в строку Поле атрибуты Жанр, ФИО,Код книги. Преобразовать запрос в перекрестный: выбрать в меню Запрос/Перекрестный. В строке Групповая операция выбрать для столбцов Жанр и ФИО режим группировка, для столбца Код книги групповую операцию Count. В строке Перекрестная таблица выбрать для столбца режим Заголовки столбцов, для столбца ФИО Заголовки строк, для столбца Код книги – режим Значение. Сохранить запрос c именем Перекрестный запрос. На языке SQL: TRANSFORM Count(Обмен.[Код книги]) AS [Count-Код книги] SELECT Читатель.ФИО 5 9 FROM Читатель INNER JOIN ((Жанр INNER JOIN Книги ON Жанр.[Код жанра] = Книги.[Код жанра]) INNER JOIN Обмен ON Книги.[Код книги] = Обмен.[Код книги]) ON Читатель.[Номер билета] = Обмен.[Номер билета] GROUP BY Читатель.ФИО PIVOT Жанр.Жанр; Результаты выполнения запроса система представит в виде таблицы. Вопросы и задания 1. Создайте базу данных согласно следующей схеме данных: Товар(Код_товара, Название_товара, Цена) Продавец(Код_продавца, ФИО,Телефон) Продажа(Код_продажи, Дата продажи, Код_товара,Количество,Код_продавца) 2. Создайте формы для ввода данных и введите данные в таблицы. В таблице Товар должно быть не менее 6 записей, В таблице Продавец – не менее 3 записей, в таблице Продажи – не менее 15 записей. 3. Создайте итоговые и перекрестные запросы для следующих расчетов: - на какую сумму продано всего всех товаров всеми продавцами, - на какую сумму продано всех товаров всеми продавцами за конкретную дату, - на какую сумму продано каждого товаров всеми продавцами, - на какую сумму продано каждого товара конкретным продавцов, 6 0 - на какую сумму продано конкретного товара всеми продавцами за конкретную дату, на какую сумму продано конкретного товара конкретным продавцов в установленную дату, какое количество каждого товара продано за конкретный месяц конкретного года какое количество каждого товара продано каждым продавцов за весь период. какое количество каждого товара продано каждым продавцов за установленный период. Построение форм на основе запроса Как правило, пользователю требуется видеть данные не одной, а нескольких таблиц, то есть данные, которые можно получить в результате выполнения запроса. На основе запросов можно построить формы различного вида. Для этого при создании формы в окне Источник данных нужно выбрать из списка требуемый запрос. Формы типа ленточная и в столбец, рассмотренные выше, построенные на базе запроса, выглядят так же, как и построенные на базе таблиц. Интерес представляют другие виды форм. А именно вложенные формы. В этих формах данные можно просматривать по группам. Например, книги по жанрам, квартиры по районам, лошадей по породам и т. д. Мастер форм может построить на основе запроса форму, которая содержит несколько уровней вложенности. Например, можно просматривать квартиры по районам и выбрав квартиру и установив курсор, можно тут же увидеть все операции купли/продажи, которые совершались с этой квартирой. Для создания такой формы сначала нужно разработать соответствующий запрос. При выполнении запроса пользователь увидит обычную таблицу. А вот форма на основе такого запроса представит информацию более компактно и удобно для пользователя. Пример: требуется создать форму для просмотра журнала выдачи книг по жанрам. Действия: Сначала построим запрос. При этом требуется поля в запросе расположить определенным образом в порядке следования групп вложенности. Первый уровень группирования данных – по жанрам, второй уровень – по книгам, третий – по операциям обмена книг. 1. На вкладке Запросы щелкнуть по кнопке Создать/Конструктор. 2. Добавить таблицы Жанры, Книги, Обмен, Читатели. 3. Перенести мышкой в строку Поле атрибуты в следующем порядке Жанр, Автор, Название, Год издания, ФИО, Дата выдачи, Дата возврата. 6 1 4. Сохранить запрос с именем Для вложенной формы. При выполнении запроса данные предстанут в виде таблицы. Теперь построим форму на базе этого запроса. Действия: 1. Во вкладке Формы выбрать режим Построение формы с помощью мастера. 2. В окне Мастера выбрать в качестве источника данных запрос Для вложенной формы. 3. По кнопке >> Перенести все поля из левого окна Доступные поля в правое Выбранные поля. 4. Двигаться по кнопке Далее до режима задания имен форм. 5. Задать имена форм по уровням вложенности: Журнал обмена, Перечень книг, Операции обмена. 6 2 6. По кнопке Готово завершить процесс создания формы. Форма будет иметь вид: 6 3 Очень удобно при работе при выборке данных по некоторому условию использовать следующий прием. - Условие для отбора данных задавать при помощи элементов управления отдельной формы, - в запросе в строке Условие отбора соответствующего столбца указать элемент управления формы, с помощью которого задается условие для отбора записей. Например: требуется делать выборку книг по жанру. Действия: 1. Создать форму без указания источника данных. 2. В форме создать элемент управления поле со списком с именем ПолеСоСписком0 на базе таблицы Жанры. 3. Сохранить форму с именем Отбор книг по жанру. 4. Создать запрос на выборку на базе таблиц Жанры и Книги, содержащий поля Код жанра, Жанр, Автор, Название, Год издания. 5. В строке условие отбора в поле Код жанра с помощью построителя выражений задать имя элемента ПолеСоСписком0 формы Отбор книг по жанру. 6. Сохранить запрос с именем Список книг жанра. 7. Открыть форму Отбор книг по жанру в режиме Конструктор. 8. Добавить элемент управления Кнопка. В диалоге с Мастером кнопок задать категорию кнопки Разное, действие Выполнить запрос, указать имя запроса Список книг жанра. 6 4 9. Сохранить форму. В дальнейшем легко просматривать книги по жанрам, выбирая жанр из списка в форме Отбор книг по жанру. 6 5 Макросы Макроязык MS Access имеет встроенный макроязык, который включает набор макрокоманд, достаточный для программирования алгоритмически несложных действий пользователя. Например, открытие форм, отчетов, запросов, установка фильтров на записи и т.д. Последовательность макрокоманд называется макросом. Макросам, как типу обьектов, отведена одна из вкладок окна базы данных. Создание нового макроса Для того, чтобы создать новый макрос, нужно в окне базы данных выбрать вкладку Макросы и щелкнуть по кнопке Создать. Открывается окно редактора макросов. Редактор макросов Окно редактора макросов имеет вид: 6 6 Каждой макрокоманде в редакторе отводится одна строка. Строка состоит из 4-х полей. Обязательным является только поле Макрокоманда. Поле Имя Макроса В поле Имя макроса можно задать имя, которое объединит последующие строки макрокоманд в единое целое – макрос. В одном макросе можно объединить целую группу макросов. Если в макрос вложен только один макрос, столбец Имя макроса не используется. И вложенный макрос вызывается по имени основного макроса. Если макрос объединяет группу макросов, используется столбец Имя макроса и в нем каждому вложенному макросу сопоставлено имя. Вызов вложенного макроса производится по формуле Имя основного макроса. Имя вложенного макроса. Например: Макрос1.Печать. Поле Условие В поле Условие можно задать выражение, при условии истинности которого будет выполнена макрокоманда. Например, условие выбора первого элемента из группы переключателей [КнопкиАлфавита]=1. Поле Макрокоманда В этом поле производится выбор макрокоманды из списка, который открывается в поле по стрелке справа. Например, можно выбрать макрокоманду ОткрытьФорму. 6 7 В нижней части экране при выборе макрокоманды появляются поля, при помощи которых можно задать аргументы макрокоманды. Например, имя формы, режим открытия окна и т.д. Поле Примечания Служит для записи примечаний. Вызов макроса на выполнение Запустить макрос на выполнение можно, щелкнув по его имени в окне базы данных или по кнопке Открыть. Но часто макросы связывают с некоторым объектом в форме и назначают на какое-то событие объекта. Например, с объектом Кнопка в форме в связи с событием Щелчок мыши. Связывание макроса с объектом Можно назначить выполнение макроса объекту в связи с некоторым событием. Например, требуется при открытии формы Книги выводить в окне предупреждающее сообщение. Действия. 1. Открыть форму Книги в режиме конструктор. 2. Установить курсор вне области серых клеток и, щелкнув правой кнопкой мыши, открыть окно свойств формы. 3. Выбрать вкладку События и событие Открытие. 4. Если макрос уже создан, нужно его назначить на данное событие, выбрав по стрелке из списка. 5. Если макрос еще не создан, нужно щелкнуть по кнопке с изображением многоточия справа от стрелки выбора. 6. В окне Построителя выбрать Макросы и Ok. 7. Сохранить макрос с именем Макрос2. 8. В редакторе макросов написать макрос, состоящий из одной макрокоманды Сообщение . В окне параметров макрокоманды можно задать: Сообщение Сигнал Тип Заголовок Будьте внимательны при вводе данных! Да Предупреждающее! Совет 6 8 При открытии формы будет раздаваться звуковой сигнал, и на экран будет выводиться информационное сообщение. Аналогично можно связать макрос с кнопкой в форме и т.д. Это очень простой пример макроса. Рассмотрим более интересный случай: связывание макроса с группой переключателей в ленточной форме. Пусть требуется в форме для просмотра списков читателей создать группу переключателей, соответствующих буквам алфавита, при помощи которых можно было бы выводить на экран группы читателей по начальной букве Фамилии. Например, список всех читателей, фамилия которых начинается на букву «и». Этап 1. В ленточной форме, созданной на базе таблицы Читатели, построим элемент управления Группа переключателей. Действия: 1. Открыть форму Список читателей в режим конструктор. 2. Щелкнуть мышкой по заголовку области формы Примечания. 3. Выбрать элемент управления Группа переключателей и создать группу переключателей по числу букв русского алфавита + 1. При вводе очередного переключателя в группе нужно задать его подпись (очередную букву алфавита), а мастер сопоставит ему порядковый номер. Таким образом, первый элемент в группе будет иметь номер 1 и подпись «А» , предпоследний элемент номер 29 и подпись «Я», а последний элемент - подпись Все, и номер 29 (для вывода всех записей). 6 9 4. Важно запомнить имя созданной Группы переключателей, так как именно оно будет фигурировать в макросе. Имя нашей группы ОтборЧитателей. Этап 2. Создание макроса. Действия: 1. Переключиться во вкладку Макросы и щелкнуть по кнопке Создать. 2. Первую строку макроса используем в качестве комментария. Поэтому в столбце Примечания пишем: Макрос для формы Список Читателей. 3. Создадим вложенный макрос Кнопки. Это имя запишем в столбце Имя макроса. 4. В этой же строке в столбце Условие запишем условие выбора первого переключателя в группе ОтборЧитателей (условие вывода на экран всех читателей, фамилия которых начинается на «А»): [Отбор Читателей]=1. 5. В столбце Макрокоманда выбираем по стрелке макрокоманду ПрименитьФильтр. 6. В нижней части окна задаем параметры макрокоманды: Имя фильтра Условие отбора [ФИО] Like [A]* 7. В столбце примечания указываем символ «А». 8. Аналогично создаем макрокоманды для переключателей с номерами 2-28. 9. В следующей строке создадим макрокоманду для переключателя с номером 29. В столбце Условие запишем условие: [Отбор Читателей]=29. В столбце Макрокоманда зададим Показать ВсеЗаписи Этап 3 Связывание макроса с элементом управления Группа переключателей. 7 0 Откроем форму Список читателей в режиме конструктор. Выберем элемент управления Группа переключателей Отбор Читателей. По правой кнопке мыши в контекстном меню выберем Свойства. установим курсор на свойство После обновления и по стрелке назначим макрос Читатели.Кнопки. 5. Сохраним форму. 1. 2. 3. 4. Теперь мы можем, используя элемент управления Группа переключателей, просматривать читателей, фамилии которых начинаются на какую-то букву. Отчеты Отчеты являются важной частью приложений, созданных в среде СУБД. Данные, хранимые в базе, и результаты расчетов, производимых над данными, обычно выводятся пользователем в виде отчетов. Отчет является конечным продуктом работы приложения, и, часто, вся база данных создается для того, чтобы иметь возможность в нужный момент получить отчет. Как и в форме, в отчете выводятся данные из таблиц и запросов базы данных, но в отличие от форм, отчеты трудно просматривать на экране. В предлагаемом СУБД формате листа А4 практически невозможно рассмотреть содержание отчета, а при увеличении 7 1 остается видна только часть отчета. Поэтому отчеты предполагается выводить только на печать. Но перед печатью можно посмотреть отчет в режиме предварительного просмотра или в режиме Конструктор, чтобы внести правки. Типы отчетов В среде MS Access можно создать следующие виды отчетов: отчет в одну колонку, отчет ленточный, отчет-диаграмма, отчет групповой/итоговый, почтовые наклейки. Отчет в одну колонку По виду этот тип отчета напоминает одноколонную форму для ввода данных. Только в отчете данные выводятся в виде списка поле за полем запись за записью. Этот вид отчета не особенно популярен и редко используется. Отчет ленточный Данные выводятся так же, как и в ленточной форме. Для каждого поля отводится столбец. Отчет-диаграмма Строится, как правило, на базе запроса. Представляет данные запроса в виде диаграммы. Отчет групповой/итоговый При создании отчета этого вида записи объединяются в группы, и для каждой группы рассчитываются итоговые значения, которые и выводятся в отчете. Почтовые наклейки Используя отчеты этого вида можно создавать почтовые наклейки. Отчет выводится в виде этикеток заданного формата, в которых размещается информация из таблиц по заданной схеме. При этом в одной строке этикетки можно вывести данные нескольких полей. Создание отчетов Все перечисленные типы отчетов можно создавать при помощи специальной программы-мастера, в диалоге с которой пользователь строит макет отчета. Вначале пользователь должен выбрать запрос или таблицу, данные которых нужно отобразить в отчете. Например, в отчете требуется отобразить хронику выдачи книг таким образом, чтобы данные были сгруппированы по жанрам книг, а внутри группы по каждой книге была выведена информация о том, кто, когда эту книгу брал и когда ее вернул. Действия: Воспользуемся запросом, который мы построили ранее и назвали Для вложенной формы. Запрос включает поля из таблиц Жанры, Книги, Обмен, Читатели и имеет структуру: Жанры.Жанр, Книги.Автор, Книги.Название, Книги.Год издания, Читатели.ФИО, Обмен.Дата выдачи, Обмен.Дата возврата. Переключимся на вкладку Отчеты и выберем режим Создание отчета с помощью мастера. В окне мастера отчетов в поле Таблицы и запросы установим запрос Для вложенной 7 2 формы. И все поля из этого запроса перенесем из области Доступные поля в область Выбранные поля по кнопке с двумя стрелками. 3. Щелкнем по кнопке Далее и в следующем окне увидим способ группировки данных, предлагаемый мастером. Этот способ определяется структурой запроса, в котором мы сначала расположили поле жанр – это первый уровень группировки данных, затем атрибуты из таблицы Книги – это второй уровень группировки и затем атрибуты из таблиц Читатели и Обмен. Далее в диалоге с Мастером нам остается определить порядок сортировки данных внутри каждой группы данных и задать вид макета отчета и ориентацию (книжная или альбомная). В результате Мастер построит отчет с соответствии с поставленной перед нами задачей и выведем на экран для предварительного просмотра. Печать отчета Отчет можно вывести на печать. Для этого нужно в режиме предварительного просмотра (итоговая фаза работы Мастера отчета или режим Открыть в окне базы данных) выбрать меню Файл/Печать. Отправка отчета по электронной почте Отчета можно отправить по электронной почте вложенным файлом в письме. Для этого нужно в режиме предварительного просмотра выбрать меню Файл/Отправить/Сообщение как вложение, выбрать тип файла (обычно Rich Text Format) и указать адрес. 7 3 7 4 7 5 Аналогично можно создавать отчеты другого типа. Например, почтовые этикетки или отчет-диаграмму. Создание отчета-диаграммы Например, нам требуется создать отчет-диаграмму, на котором должно быть отображено соотношение книг в библиотеке по жанрам. Действия: 1. Используем построенный ранее запрос, который мы назвали Итоговый 1. Запрос показывает нам, сколько книг каждого жанра имеется в библиотеке. 2. На вкладке Отчеты щелкнем по кнопке Создать, выберем Мастер диаграмм и укажем источник данных – Итоговый запрос 1. 3. В Окне Создание диаграмм выберем оба поля запроса для отображения данных. 4. Выберем тип диаграммы Обьемная круговая. 5. Определим заголовок диаграммы Соотношение книг в библиотеке по жанрам. 6. Сохраним Отчет с именем Соотношение книг в библиотеке по жанрам. Форматирование диаграммы Вид объекта Диаграмма, который внедряется в отчет, может быть изменен и улучшен последующим форматированием. Для этого нужно открыть Отчет-диаграмму в режиме Конструктор, дважды щелкнуть мышью по объекту диаграмме и затем отредактировать каждый элемент. Редактирование легенды диаграммы При помощи мыши можно изменить размер, форму и местоположение легенды на диаграмме. Можно перенести легенду вниз, вправо, влево или вверх. Редактирование рядов данных Можно установить подписи для рядов данных. Для этого в Конструкторе нужно выделить обьект диаграмму и установив курсор на собственно диаграмму, в меню по правой кнопке мыши выбрать пункт Формат рядов данных. На вкладке Подписи данных можно выбрать способ подписи значений: доля, значение, категория, категория и доля. В нашем примере мы выберем подпись данных в долях, чтобы узнать процентное соотношение книг по жанрам. 7 6 Отчет Почтовые этикетки Этот вид отчета также удобно создавать, используя мастер отчетов. Отчет может использоваться для создания почтовых этикеток. Запрос для этого типа должен содержать данные, помещаемые на конверт для почтового отправления. Например, такие поля таблиц как ФИО, Индекс, Город, Улица, Номер дома, Номер квартиры. Если в базе данных предполагается создавать отчеты в виде почтовых этикеток, то лучше заранее подумать о том структуры таблицы, хранящей данные адреса, должна быть соответствующей. То есть, данные адреса лучше расположить, используя не одно, а несколько полей таблицы. Отдельно поле Город, отдельно поле Индекс и т.д. Отчет типа Почтовые этикетки в нашей базе данных хранится под именем Наклейки_Читатель. 7 7 7 8 Разработка приложения Этапы разработки приложения Приложение для работы с базой данных должно быть хорошо структурировано. Пользователь должен иметь возможность легко ориентироваться в структуре приложения, чтобы быстро выходить на нужный режим работы с данными. Так как база данных часто состоит из большого количества таблиц, приложение содержит очень много объектов: форм, отчетов, запросов и режимов работы с ними. Необходимо организовать все режимы работы с данными в четкую иерархию и отобразить эту иерархию в системе кнопочных форм меню. Чтобы при создании приложения возникало меньше ошибок и, соответственно, исправлений и путаницы, разработку приложения лучше проводить поэтапно в следующем порядке: 1. Разработать концептуальную модель данных (логическую схему БД). 2. Описать данные на языке описания данных СУБД (в данном случае MS Access). 3. В среде СУБД создать таблицы (на уровне описания структуры без ввода данных). 4. Создать схему данных, установить связи и описать правила ссылочной целостности между таблицами. 5. Создать формы для ввода данных для каждой таблицы (удобнее Автоформы). 6. Во всех формах поля атрибутов внешнего ключа заменить на элементы управления ПолеСоСписком. 7. Внести данные посредством форм ввода сначала в независимые (родительские) таблицы, затем в остальные таблицы. 8. Определить, какие запросы потребуется создать для работы с данными. 9. Создать необходимые запросы. 10. Создать необходимые формы и отчеты на базе запросов. 11. Создать вспомогательные формы, например, для поиска данных. 12. Связать посредством кнопок и макросов формы, реализующие отдельные режимы работы с данными. 13. Сгруппировать логически режимы работы с данными. 14. Разработать структуру приложения. 15. Разработать кнопочные формы меню в соответствии с определенной ранее структурой приложения. 16. Подключить посредством макросов режимы, отдельные формы и отчеты к кнопочным формам меню. 17. Создать макрос с именем Autoexec для открытия Главной кнопочной формы в момент запуска приложения. Пример приложения Пособие.mdb Опишем поэтапный процесс разработки приложения «Библиотека» в соответствии со схемой, описанной выше. 7 9 для предметной области 1. Концептуальная модель данных выглядит следующим образом: Жанр(Код_жанра, Жанр) Книги(Код_книги, Автор, Название, Код_жанра, Год_издания, Цена) Читатель(Номер_билета, ФИО, Адрес, Телефон, Дата рождения, Пол) Обмен_книг (Код записи, Код_книги, Номер_билета,Дата выдачи,Дата возврата) 2. Cтруктуры таблиц на языке описания данных MS Access следующие: Жанр(Код_жанра, Жанр) Код жанра Жанр Счетчик Текстовый Книги(Код_книги, Автор, Название, Код_жанра, Год_издания, Цена) Код книги Автор Название Код жанра Год издания Цена Счетчик Текстовый Текстовый Числовой Числовой Денежный Читатель(Номер_билета, ФИО, Адрес, Телефон, Дата рождения, Пол, Фото) Номер билета ФИО Адрес Телефон Дата рождения Пол Фото Счетчик Текстовый Текстовый Числовой Дата/Время Текстовый Поле обьекта OLE Обмен_книг (Код записи, Номер_книги, Номер_билета,Дата выдачи,Дата возврата) Код записи Код книги Номер билета Дата выдачи Дата возврата Счетчик Числовой Числовой Дата/Время Дата/Время 3. В среде СУБД создать таблицы и описать их структуру 4. Создать схему данных, установить связи и описать правила ссылочной целостности между таблицами. 8 0 5. Создать формы для ввода данных для каждой таблицы (удобнее Автоформы). См. Пособие.mdb, формы Жанр, Книги, Обмен, Регистрация читателя. Во всех формах для ввода данных для удобства созданы кнопки для создания новой записи. Кнопки созданы с использованием Мастера кнопок. 6. Во всех формах поля атрибутов внешнего ключа заменены на элементы управления ПолеСоСписком. В форме Книги элемент управления ПолеСоСписком создан вместо поля КодЖанра на базе таблицы Жанры., в форме Обмен книг вместо полей Код книги и номер билета. В форме Читатель вместо поля Пол создан элемент Группа переключателей. 7. Данные посредством форм ввода внесены сначала в независимые (родительские) таблицы Жанр и Читатель, затем в таблицы Книги и Обмен. 8. В зависимости от характера работы пользователя с данными составлен перечень необходимых запросов. 8 1 9. Для работы с данными базы создан ряд некоторые из них: Форма Хроника выдачи книг Задолжники Карточка читателя Книги по жанрам И .т.д. форм на базе этих запросов. Вот Запрос Для вложенной формы Задолжники Карточка читателя Книги по жанрам 10. В приложении на базе запросов созданы отчеты Отчет Отчет о выдаче книг Соотношение книг в библиотеке по жанрам (отчет-диаграмма) Наклейки читатель Запрос Хроника выдачи книг Итоговый запрос 1 Читатель (таблица) 8 2 11. В приложение включены вспомогательные формы, например, для поиска данных. Это формы Отбор книг по жанру, Поиск читателя по фамилии, Поиск книги. В этих формах используется следующий прием. Создается элемент управления полеСоСписком на базе таблицы справочника (например, Жанры) и кнопка, которая открывает форму для просмотра данных в режиме для отобранных записей. Критерий отбора – значение, которое возвращает элемент управления. 12. Посредством кнопок и макросов связаны формы, реализующие отдельные режимы работы с данными. Порядок разработки отдельного режима для работы с данными может быть следующий: - создается запрос, выдающий виртуальную таблицу необходимой структуры, - на базе этого запроса строится форма. - создается вспомогательная форма, содержащая элемент управления для определения условия отбора записей. 13. Логически сгруппированы режимы работы с данными. Необходимо продумать, как в приложении будут сгруппированы режимы работы с данными. Они могут быть, например, привязаны к информационным обьектам. Так, в одну логическую группу можно обьединить все режимы, связанные с обьектом книга: - регистрация новой книги, - просмотр всех книг по жанрам - поиск книги по названию и т. д. 14. Разработана структура приложения. Логические группы работы с данными необходимо связать воедино. В результате получим единую структуру приложения. В нее можно внести изменения и перестановки, если это будет способствовать ее улучшению. 15. Разработаны кнопочные формы меню в соответствии со структурой приложения. При создании кнопочных форм не нужно указывать источник данных. Разрабатывать кнопочные формы удобно, используя механизмы копирования и вставки обьектов. Сначала можно создать форму-шаблон и включить в нее следующие элементы управления: - Поле Подпись, - Кнопки. Кнопки следует создавать, отключив элемент управления Мастера. В этом случае создается кнопка,с которой система не связывает никакое действие. Сначала создается одна кнопка, потом она копируется в буфер и затем по пункту меню Правка/Вставить вставляется несколько раз. В этом случае кнопки в форме будут иметь одинаковый размер и вид. Форму шаблон можно сохранить с именем Главное меню. Затем в буфер копируется уже сама форма-шаблон. И затем она несколько раз вставляется в приложение с другими именами. В нашем случае так созданы формы Меню читатели, Меню книги и Меню обмен. Затем каждая форма редактируется. Меняется подпись на форме и подписи на кнопках. В формы могут быть добавлены уже посредством Мастера кнопки для закрытия формы и картинки. 16. Подключены посредством макросов режимы, отдельные формы и отчеты к 8 3 кнопочным формам меню. В нашем приложении используются очень простые макросы. Как правило, это макрос с макрокомандой ОткрытьФорму. Очень удобно объединить все макросы, относящиеся к одной логической группе обработки данных , в единый макрос. В нашем приложении почти все макросы объединены в Макросе 4. Удобно сначала написать все необходимые макросы, а затем, открывая формы в режиме конструктор и переходя от кнопки к кнопке, назначать нужный макрос на событие кнопки. 17. Создан макрос с именем Autoexec для открытия Главной кнопочной формы в момент запуска приложения. Завершением разработки приложения будет создание макроса с именем Autoexec. Этот макрос запустится в момент открытия файла Пособие.mdb. На экране появится форма Главное меню. Глава 7. Разработка приложений в среде Delphi Основные этапы разработки информационного приложения Разработка информационных приложений является непростой задачей, она требует достаточного опыта и знаний. Разработка приложения состоит из нескольких основных этапов: 1. Анализ требований к приложению. 2. Проектирование приложения. 3. Реализация. Первый этап называется «Анализ требований к приложению». Прежде, чем приступить к программированию, нужно четко понять, какие функции будут выполняться данным приложением. На этом этапе разрабатывается спецификация требований к приложению, для решения следующих задач: 1. определение пользователей системы; 2. задание функциональных требований к системе, т.е. какие функции, будет выполнять данное приложение в интересах пользователей; 3. установление границ системы, т.е. что приложение точно будет делать и чего оно делать не должно; 4. описание процессов взаимодействия между приложением и внешним пользователем; 5. задание единого языка описания системы, используемого заказчиком и группой программистов. Спецификация требований к системе формулируется в виде коротких четких предложений, определяющих функции системы. Второй этап – проектирование приложения. На данном этапе на основе спецификации требований к системе проектируются структуры данных и пользовательский интерфейс приложения. Результатом этапа является: 1. спроектированная структура базы данных; 2. спроектированный интерфейс пользователя; 3. архитектура приложения. 8 4 На основе ER-модели создается физическая база данных на компьютере. Проектирование интерфейса пользователя – это проектирование внешнего вида приложения, т.е. того, что пользователь видит на экране: внешний вид форм и структура отчетов. Требованиями к интерфейсу являются удобство, эргономичность, дизайн. Третий этап – это реализация приложения, т.е. собственно кодирование и тестирование. На данном этапе программист определяется с выбором программных средств, выполняет кодирование и отладку приложения. Разработка информационного приложения на примере «Приемная комиссия ВУЗа» Рассмотрим процесс разработки несложного информационного приложения на примере «Приемная комиссия ВУЗа». Постановка задачи: Разработать автоматизированную систему «Приемная комиссия», которой может пользоваться любой ВУЗ независимо от специализации. Цель системы: автоматизация Приемной комиссии ВУЗа. Краткое описание приложения. В ВУЗе несколько факультетов, на факультеты поступают абитуриенты, каждый на свой факультет. Вся информация о проведении вступительных испытаний должна сохраняться в базе данных. По требованию пользователя должны выдаваться различные запросы, например: информация о конкретном абитуриенте, число поступающих на тот или иной факультет, ведомости вступительных экзаменов, экзаменационный лист абитуриента, сводные отчеты и т.д. Приложение должно быть установлено в сети, причем сотрудник факультетской приемной комиссии имеет доступ только к информации о своем факультете. Анализ требований к приложению. На данном этапе четко определяются требования к приложению, т.е. какие функции приложение будет выполнять, а какие – нет. Общие требования к приложению. Приложение должно обеспечить: - Хранение информации об абитуриентах (добавление, удаление, изменение, просмотр, поиск). - Хранение информации о факультетах (добавление, удаление, изменение, просмотр, поиск). - Хранение информация об экзаменах на каждом конкретном факультете. - Хранение информации о результатах испытаний. - Выдача информации о результатах испытаний в виде форм или отчетов по абитуриенту, факультету, экзамену. Определим пользователей нашего приложения. Нашим приложением могут пользоваться: 1. Администратор базы данных; 2. Сотрудник приемной комиссии факультета. Определим функции, выполняемые приложением в интересах каждого из пользователей. Функции Администратора: 1. создание и корректировка информации о пользователях системы; 2. ведение информации о факультетах, только администратор может добавлять, удалять, изменять информацию о факультете; 3. просмотр всей информации в базе данных с возможностью корректировки; 4. выдача прав на данные. 8 5 Функции сотрудника «Приемной комиссии»: 1. Регистрация в системе; 2. Работа с информацией об абитуриентах (добавление, удаление, изменение, просмотр, поиск) только своего факультета; 3. Работа с информацией об экзаменах на факультете; 4. Работа с информацией о приемных испытаниях на факультете; 5. Выдача отчетов, ведомостей, сводных ведомостей в виде печатных документов. Следующий этап - проектирование системы. На этом этапе необходимо разработать структуры данных и прототипы интерфейса пользователя. Для разработки структуры данных построим ER-модель предметной области. Выделим следующие сущности: ФАКУЛЬТЕТ ЭКЗАМЕН АБИТУРИЕНТ ПОЛЬЗОВАТЕЛЬ У сущностей можно выделить следующие свойства, они указаны в скобках: ФАКУЛЬТЕТ (*Номер факультета, Название факультета, телефон деканата, ФИО декана) ЭКЗАМЕН (*Номер экзамена, Название экзамена, Название факультета, Дата проведения) АБИТУРИЕНТ (*№ экзаменационного листа, Фамилия, Имя, Отчество, Адрес, Пол, Название факультета, Фото) ПОЛЬЗОВАТЕЛЬ (*Номер пользователя, Фамилия, Имя, Отчество, должность, Факультет, Пароль, Логическое имя) Экзамены связаны с факультетами, на каждом факультете свой набор экзаменов. Абитуриенты связаны с факультетами, каждый абитуриент поступает на конкретный факультет, на каждый факультет может поступать несколько абитуриентов. Результаты испытаний связаны с абитуриентами и экзаменами. На основе вышесказанного можно построить следующую ER-модель предметной области: Экзамен Факультет поступает на проводится на принимает Абитуриент сдает Работает на Пользователь Рис. 7.1. Отобразим ER-модель в реляционную базу данных. Обратите внимание, что связь много-ко-многим между таблицами АБИТУРИЕНТ и ЭКЗАМЕН преобразована в связь один-ко-многим путем добавления еще одной таблицы – РЕЗУЛЬТАТЫ ИСПЫТАНИЙ. Получим таблицы следующей структуры: 8 6 ФАКУЛЬТЕТ (*Номер факультета, Название факультета, телефон деканата, ФИО декана) ЭКЗАМЕН (*Номер экзамена, Номер факультета, Название экзамена, Дата проведения) АБИТУРИЕНТ (*Номер экзаменационного листа, Фамилия, Имя, Отчество, Адрес, Пол, Номер факультета, Фото) РЕЗУЛЬТАТЫ ИСПЫТАНИЙ (*Порядковый номер, Номер абитуриента, Номер экзамена, Оценка) ПОЛЬЗОВАТЕЛЬ (*Номер, пользователя, Фамилия, Имя, Отчество, Должность, Факультет, Пароль, Логическое имя) Где звездочками(*) отмечены первичные ключи. Далее следует определиться с архитектурой приложения. Наше приложение должно работать в сети, когда с нескольких рабочих станций ведется работа с одной и той же базой данных, т.е. наше приложение будет выполнено в архитектуре клиент-сервер, при этом клиентская часть будет реализовывать интерфейс с пользователем, а серверная – работу с базой данных. Так как наше приложение рассчитано на двух пользователей: администратора и сотрудника «Приемной комиссии» и для каждого пользователя приложение реализует свой набор функций, то здесь возможны два варианта: 1. можно создать одно приложение, которое настраивается на соответствующего пользователя; 2. создать два отдельных приложения, каждое из которых автоматизирует функции конкретного пользователя. В этом случае мы получим уже систему двух автоматизированных рабочих мест (АРМ): АРМ администратора и АРМ сотрудника «Приемной комиссии». Для разработки интерфейса пользователя следует создать прототипы экранных форм и отчетов. Следует согласовать созданные формы с пользователем. Этап реализации. На этом этапе определяемся с выбором программных средств. Для разработки серверной части приложения мы будем использовать сервер баз данных Interbase. Так как мы разрабатываем Windows-интерфейс, то для разработки клиентской части приложений прекрасно подойдет программное средство Delphi. Для того, чтобы научиться создавать интерфейс с помощью средств Delphi необходимо изучить основные интерфейсные компоненты Delphi и компоненты для работы с базами данных, чем мы и займемся в дальнейшем. Предполагается, что читатель знаком с основами языка Паскаль. Особенности программного средства Delphi Средство Delphi компании Borland является популярным и многими любимым программным средством разработки широкого класса Windows-приложений. Визуальная среда разработки, объектно-ориентированная модель компонентов, большой набор готовых компонентов делают процесс программирования высокопроизводительным, а само программирование превращают в увлекательное занятие. Почему программный продукт Delphi получил такое название? Дельфы – это древнегреческий город на берегу Коринфского залива. Название города связано с именем бога мудрости и покровителя искусств Аполлона. Согласно мифу, главное святилище Аполлона находилось в Дельфах. Его жрицы-севиллы изрекали тем, кто к ним обращался, пророчества – оракулы. Руководитель исследовательской группы по разработке системы 8 7 Delphi Чак Язджевски вспоминает: «Имя Delphi было предложено Денни Торпом во время одной мозговой атаки. Мы хотели, чтобы в имени отражались уникальные способности продукта к работе с базами данных, и Delphi как нельзя лучше перекликалось с таким заслуженным именем в этой области, как Oracle, по крайней мере, для тех, кому сочетание: «дельфийский оракул» о чем-то говорит…». Delphi является прекрасным программным средством для разработки приложений для баз данных. Delphi имеет масштабируемое ядро управления данными, которое обеспечивает доступ не только к локальным базам данных, расположенным на том же компьютере, но и к удаленным серверам баз данных. Среда разработки Что понимается под средой разработки? Как правило, это набор инструментов, облегчающих программисту работу по созданию программы. К таким инструментам, как правило, относятся: 1. текстовый редактор, именно в нем мы будем писать программу, изменять ее, сохранять в файле, возможно, составлять ее из готовых фрагментов программного кода. 2. компилятор, это встроенная в среду разработки программа, которая переводит текст программы с языка понятного человеку на язык понятный компьютеру. 3. отладчик, это также встроенная в среду разработки программа, которая помогает искать ошибки в программе. Дело в том, что человеку свойственно ошибаться, особенно когда речь идет о программе большого объема. Писать программу без ошибок не может никто, да в этом и нет необходимости. Так вот отладчик позволяет, например, приостановить выполнение программы и проверить содержимое переменных памяти, таким образом можно выявить ошибку. С помощью отладчика можно проследить последовательность выполнения операторов программы и таким образом также выявить ошибку. Среда разработки Delphi называется интегрированной (Integrated Development Environment – IDE), т.к. состоит из нескольких взаимосвязанных элементов. На экране мы видим несколько независимо перемещаемых окон. Давайте рассмотрим назначение этих окон (рис. 7.2.). 8 8 Окно TreeView Главное окно приложения Инспектор объектов Рис. 7.2. Среда разработки Delphi В верхней части окна располагается главное окно. Главное окно включает горизонтальную линейку меню с выпадающими подменю, кнопочную панель быстрого доступа, палитру компонентов. Через главное меню и выпадающие подменю реализованы все функции Delphi. Кнопочная панель располагается слева непосредственно под линейкой меню и обеспечивает быстрый доступ к основным функциям Delphi. Кнопочную панель можно настраивать, т.е. менять набор кнопок по своему усмотрению. Палитра компонентов располагается справа от кнопочной панели и содержит компоненты, это основные «строительные блоки», используя которые можно быстро создавать приложения. Так как компонентов много, они объединены в группы по функциям, каждая группа располагается на своей вкладке. Например, на вкладке Standart располагаются стандартные интерфейсные компоненты Windows, т.е. элементы, используемые для организации взаимодействия (интерфейса) с пользователем, такие как кнопка, список, меню, радиокнопка и т.д. А на вкладке Data Control располагаются компоненты для работы с базами данных. В левом нижнем углу экрана располагается Инспектор объектов (Object Inspector). Как следует из названия, Инспектор позволяет работать с объектами. Объект доступен нам через набор свойств и набор событий. Свойства можно очень просто изменять с помощью Инспектора объектов. Также объект имеет набор готовых событий, которые позволяют нам задать его реакцию на то или иное происшествие в системе, например, нажатие кнопки, открытие окна, потерю фокуса ввода и т.д. Именно с помощью Инспектора объектов можно быстро настраивать свойства (состояние) компонентов приложения и определять поведение объекта при наступлении определенных событий. 8 9 Рис. 7.3. Инспектор объектов. Вкладка «Properties» Окно Инспектора объектов содержит две вкладки: Property и Events. Вкладка Properties (рис. 7.3.) позволяет задавать свойства (состояние) объекта, для этого вкладка поделена на две части, слева имя свойства, справа его значение. Вкладка Events (рис. 7.4.) также поделена на две части: слева названия событий, справа можно задать так называемый обработчик события, это программный код, который будет выполняться при наступлении события. Рис. 7.4. Инспектор объектов. Вкладка «Events» На экране также появляется окно Object TreeView (рис. 7.5.), которое содержит иерархию компонент текущего окна. 9 0 Рис. 7.5. Окно Object TreeView Справа от Инспектора объектов располагается главное окно приложения, это так называемая форма. Именно форма используется для организации взаимодействия с пользователем, именно на форме будут располагаться интерфейсные компоненты, с помощью которых ведется диалог с пользователем. Приложение может состоять из нескольких форм. На самом деле с формой связаны два окна. Первое это графическое представление формы (рис. 7.6.). В этом окне будут располагаться интерфейсные компоненты. Рис. 7.6. Окно формы С каждой формой связан модуль на Pascal, который содержит программный код приложения (рис. 7.7.). Именно там будут находиться так называемые обработчики событий, т.е. реакция приложения на события в системе. 9 1 Рис. 7.7. Модуль на Pascal Мы перечислили далеко не все компоненты, которые входят в состав интегрированной среды разработки. Мы будем осваивать компоненты среды по мере нашего дальнейшего продвижения. Контрольные вопросы 1. Что такое приложение? 2. Перечислите основные особенности Delphi как среды быстрой разработки приложений. 3. Что такое среда разработки? Из каких основных элементов она состоит? 4. Как среда разработки помогает нам при создании приложений? 5. Перечислите основные компоненты среды разработки Delphi. 6. Что такое Инспектор объектов? 7. Что такое форма? Первое приложение в Delphi После краткого знакомства со средой разработки Delphi давайте попытаемся создать несложное приложение в Delphi. Предполагается, что читатель знаком с основами языка Pascal. Традиционным для новичков является приложение «Здравствуй, мир!». Поясню, что будет уметь наше приложение. На экран будет выведено окно (форма), в котором будет выведен текст: «Здравствуй, мир!». Пока все. Но этот несложный пример позволит нам поработать с компонентами, к тому же именно с помощью этого примера мы увидим достоинства Delphi как среды быстрой разработки. Нам не потребуется писать ни строчки кода. Итак, начнем. Для вывода текста в окне будем использовать компонент Delphi с именем Label, который располагается на вкладке Standart палитры компонентов. 9 2 Пока что мы не знаем, что такое компонент и объект, но для разработки нашего приложения нам достаточно понимать, что компонент это некий шаблон в соответствии с которым можно создавать разные экземпляры однотипных объектов с одинаковым набором свойств, а объект это нечто доступное нам через набор готовых свойств и методов. Свойства объекта можно легко менять либо с помощью Инспектора объектов, либо программным путем. Компоненты бывают двух видов: визуальные (т.е. видимые) и не визуальные ( т.е. невидимые). Для работы с объектами нужно уметь: - размещать их в форме; - перемещать их; - изменять размер; - изменять свойства с помощью Инспектора объектов; - удалять из окна. Для того, чтобы решить нашу задачу разместим компонент Label на форме. Для этого выделим компонент в палитре компонентов (рис. 7.8.) и щелкнем в области формы, в том месте, где хотим его разместить, как это показано на рис. 7.9. Label Рис.7.8. Палитра компонентов Рис. 7.9. Компоненты на форме Можно создать несколько экземпляров типа TLabel, например, объекты с именами: Label1, Label2, Label3 и т.д. Для решения нашей задачи достаточно разместить один объект: Label1. Для перемещения объекта в другое место текущего окна (формы), нужно зацепить объект левой кнопкой мыши, перетащить его в новое место и бросить. Для изменения параметров объекта, т.е. либо изменения размера, либо изменения свойств объекта, нужно его выделить. Для этого нужно щелкнуть левой кнопкой мыши на объекте до появления размерных маркеров. Размерные маркеры позволяют изменять размер объекта (рис. 7.10). 9 3 Рис. 7.10. Изменение размеров объектов При выделении объекта Инспектор объектов отображает свойства выделенного объекта формы. Для работы с объектами достаточно хорошо изучить их свойства. Давайте рассмотрим основные свойства объекта Label1 (рис. 7.11). Рис. 7.11. Свойства объекта Label1 Свойства объекта располагаются на вкладке «Properties» и, как вы, должно быть, заметили, свойств довольно много. Свойства упорядочены в алфавитном порядке, это облегчит нашу жизнь, кроме того, нет необходимости знать все свойства, можно для начала изучить только основные. Названия свойств настолько хорошо продуманы, что при минимальном знании английского языка нетрудно догадаться какую функциональную нагрузку несет то или иное свойство. Самым важным свойством, которое имеют все объекты, является свойство Name, именно это свойство позволяет ссылаться на объект в программе. Так как это свойство присуще всем объектам, при рассмотрении свойств больше не будем его упоминать. В табл. 7.1. приведены наиболее часто используемые свойства объекта типа TLabel. Более подробную информацию по свойству можно получить с помощью, так называемой, контекстной подсказки, для этого необходимо установить курсор на значение свойства и нажать клавишу F1. Свойство Caption Align Таблица 7.1. Свойства класса TLabel Описание Задает текст, отображаемый объектом. Задает выравнивание объекта относительно формы (окна), может принимать следующие значения: alBottom – объект заполняет нижнюю часть окна, независимо от размера окна; alLeft – объект заполняет левую часть окна; alNone – нет выравнивания; 9 4 Alignment AutoSize Layout Font Color Transparent WordWrap Visible alClient – объект заполняет все окно; alRight – заполняет правую часть окна; alTop – заполняет верхнюю часть окна. Задает выравнивание текста относительно рамки объекта, может при нимать следующие значения: taCenter – текст выровнен по центру; taLeftJustufy - текст выровнен по левому краю; taRightJustify - текст выровнен по правому краю. Объект(рамка) автоматически растягивается по размеру текста. Задает, как текст выравнивается по вертикали. Может принимать следующие значения: tlTop – прижат к верхнему краю tlCenter – выровнен по центру tlBottom – прижат к нижнему краю Задает тип шрифта, размер шрифта и цвет символов. Задает цвет фона Если равен True, то фон прозрачен. Позволяет получить многострочный текст. Если значение свойства равно true, текст, который не помещается в рамку объекта, будет переноситься на другую строку по пробелам. В случае False объект невидим. Теперь нетрудно выполнить нашу задачу, для этого достаточно с помощью Инспектора объектов задать свойство Caption, которое будет содержать текст, выводимый в окне. Можно так же задать свойства Font и Color. Итак, приложение создано. Теперь можно запустить его на выполнение. Для этого нужно либо выполнить меню Run, подменю Run (в дальнейшем будем это обозначать таким образом: Run|Run), либо нажать горячую клавишу F9. Также можно воспользоваться быстрой кнопкой Run (F9) кнопочной панели. Вы, наверное, обратили внимание на то, что при создании этого приложения мы не написали ни строчки программного кода. Это произошло потому, что мы использовали готовую компоненту, которая все за нас сделала. Мы только научились манипулировать ею через набор ее свойств. Также вы не могли не заметить, что внешний вид приложения на этапе разработки мало чем отличается от внешнего вида приложения на этапе выполнения. Вот в этом как раз и состоит визуальность разработки: уже на этапе разработки многое можно увидеть. Созданное приложение следует сохранить. Как вы вскоре увидите, исходный код приложения хранится в нескольких файлах, поэтому для сохранения следует использовать меню «File|Save all…», чтобы не потерять файлы. Рекомендуется исходный код каждого приложения хранить в отдельной папке. А теперь, когда мы научились основным приемам работы с компонентами, попробуйте выполнить несколько простых упражнений, используя свойства компонента TLabel. Задания для самостоятельной работы 1. 2. В верхней части формы вывести текст «Моя первая программа на Delphi», этот текст заполняет верхнюю часть окна, выводится крупным шрифтом, красными буквами на белом фоне, выровнен по центру окна по горизонтали и вертикали. Вывести текст стихотворения и красиво его оформить: «Буря мглою небо кроет 9 5 Вихри снежные крутя, То как зверь она завоет, То заплачет как дитя» 3. Создать многострочный текст с помощью одного элемента типа Label и красиво его оформить. Подсказка: используйте свойства Autosize и WordWrap.Текст: БУЯН — райский остров в Восточном море, подобен Атлантиде, Макарийскому острову. На острове Буяне сосредоточены все могучие силы весенних гроз, все мифические олицетворения громов, ветров и бури; на этом же острове восседают и дева Зоря, и Перун. Кнопки Следующий интерфейсный элемент, с которым мы познакомимся это кнопка. В Delphi используются несколько видов кнопок. Как правило, при нажатии на кнопку что-то происходит, например, выполняется некоторый программный код. Также кнопки могут использоваться для выбора из нескольких вариантов, это так называемые радио кнопки. Для наших экспериментов давайте создадим новое приложение с помощью меню File| New| Application. Сначала рассмотрим кнопки, при нажатии на которые что-то происходит. Таких кнопок несколько в Delphi. Самая простая кнопка – это кнопка с подписью Button, располагается она на вкладке Standart. На вкладке Additional располагаются две кнопки: кнопка с картинкой SpeedButton и кнопка с картинкой и подписью - BitBtn. Несмотря на то, что кнопки разные, они имеют много общих свойств. Наиболее важные свойства кнопок перечислены в табл. 7.2. Свойство Caption Font Glyph Таблица 7.2. Основные свойства класса TButton Описание Задает подпись на кнопке Задает тип шрифта для подписи на кнопке Позволяет загрузить картинку, набор картинок можно найти в папке: C:\Program Files\Common Files\Borland Shared\Images\Buttons Чтобы при нажатии на кнопку что-то происходило, необходимо задать программный код, который выполняется при наступлении некоторого события. Дело в том, что Windows это событийно-управляемая среда, в которой все происходит по событиям. Что такое событие? Это некоторое происшествие в системе. К таким происшествиям относятся, например, такие события как: нажатие на кнопку, открытие окна, закрытие окна, двойное нажатие на кнопку и т. д. С каждым объектом связывается определенный набор событий. Эти события можно увидеть в Инспекторе объектов, на вкладке «Events». Для кнопки самыми важными событиями являются: OnClick – одинарное нажатие на кнопку, OnDblClick – двойное нажатие. Поместим кнопку Button в область формы, с помощью вкладки «Events» Инспектора объектов получим доступ к событию OnClick . Для этого выполним двойной щелчок на значении события (рис. 7.12). Для данного события система автоматически формирует каркас обработчика события (рис. 7.13). Обработчик события это процедура на Pascal, которая запускается автоматически при выполнении события. Пусть, например, при нажатии на кнопку выдается сообщение пользователю в окне, это можно сделать с помощью встроенной процедуры ShowMessage. В качестве параметра процедуре передается строка сообщения. Итак, процедура обработки события выглядит следующим образом: 9 6 procedure TForm1.BitBtn1Click(Sender: TObject); begin ShowMessage(‘Это простая кнопка’); end; Запустите полученное приложение на выполнение и посмотрите, что у вас получилось. Значение события Рис. 7.12. События кнопки Рис. 7.13. Каркас обработчика события OnClick Задания для самостоятельной работы 1. В этом же приложении создайте кнопку с картинкой SpeedButton, загрузите картинку с помощью свойства кнопки Glyph. Создайте обработчик события OnClick, который выдает сообщение пользователю с помощью процедуры ShowMessage. 2. Аналогичное задание выполните для кнопки BitBtn. Поле редактирования Если пользователю вашей программы потребуется ввести информацию, как он сможет это сделать? Для этого используется компонент TEdit палитры компонентов Delphi, который располагается на вкладке Standart. Поместите компонент TEdit в область формы. Давайте рассмотрим его самые важные свойства, которые приведены в табл. 7.3. 9 7 Свойство Name Text AutoSelect AutoSize BorderStyle Color Font Enable PasswordChar ReadOnly Visible Таблица 7.3. Основные свойства класса TEdit Описание Имя объекта Символьная строка, содержащая то, что ввел пользователь Если True, то автоматически выделять поле контрастным цветом при получении им фокуса ввода True, при изменении шрифта объект растягивается по размеру текста Стиль границы. Задает цвет фона. Задает цвет символов и шрифт Если False, то объект недоступен для ввода Задает символ, маскирующий ввод Если True, то ввод запрещен, если False – ввод разрешен Если true, то объект видим, если false, то объект невидим Выполним простое упражнение: то, что пользователь вводит в поле TEdit, отображается в форме с помощью компонента TLabel. Для этого поместим компоненты TEdit и TLabel и TButton в область формы, как на рис. 7.14. Поле редактирования Edit1 Рис. 7.14. Вид формы Компонент Label2 будет отображать то, что введено в поле Edit1. Для этого необходимо уметь программно изменять свойства объектов. Т.е. необходимо программно изменить свойство Caption объекта Label1 и присвоить ему значение свойства Text объекта Edit1. Для программного доступа к свойствам объектов используется следующий синтаксис: <Имя объекта>.<Имя свойства>:=<Значение> Таким образом, код будет иметь вид: Label2.Caption:=Edit1.Text; Кроме того, результат ввода можно отобразить с помощью функции ShowMessage: ShowMessage(‘ Вы ввели ‘+Edit1.Text); Для запуска обоих видов программного кода можно выбрать любое из следующих событий: событие OnExit (На выходе) объекта Edit1 событие OnClick (одинарный щелчок) объекта Button1. Так как готовые компоненты есть классы, и каждый раз, когда вы размещаете компонент в области формы, создается экземпляр соответствующего класса, т.е. объект, считаем полезным, прежде чем продолжить освоение готовых интерфейсных компонентов Delphi, познакомиться с тем, как они устроены. Так как Delphi является объектноориентированной средой разработки приложений, все компоненты Delphi строятся в 9 8 соответствии с принципами объектно-ориентированного программирования (ООП) пришло время познакомиться с основами ООП. Задания для самостоятельной работы Модифицировать предыдущее задание следующим образом: 1. Замаскировать ввод в поле Edit1 с помощью *(звездочки), используя свойство PasswordChar. 2. Запретить ввод в поле Edit1. Контрольные вопросы 1. Что такое компонент? Что такое объект? 2. Как создать новое приложение? 3. Как написать текст в окне? 4. С помощью какого компонента можно ввести информацию с клавиатуры? 5. Для чего используются кнопки? 6. С какими типами кнопок вы познакомились? Чем они отличаются? 7. Как задать подпись на кнопке? 8. Как задать картинку для кнопки с картинкой? 9. Что такое событие? 10. Что такое обработчик события? 11. Какие события кнопки вам известны? 12. Как выполнить приложение? 13. Как сохранить приложение? Основные понятия объектно-ориентированного программирования(ООП) В настоящее время большое распространение получила технология объектноориентированного программирования, у истоков которой стоят такие известные специалисты как Гради Буч, признанный эксперт в этой области. Этот подход к программированию возник, когда появилось понимание того, что программный код тесно связан с теми данными, которые он обрабатывает. Кроме того, упаковка программного кода в объекты, позволяет посмотреть на программу не как на совокупность программного кода, в виде процедур, функций, и данных, а как на взаимодействие различных объектов, каждый из которых представляет собой совокупность программного кода и данных. Такое понимание программы ближе к представлению предметной области в виде объектов реального мира. Ключевыми понятиями этой технологии являются понятия объекта и класса. Под классом понимается некая совокупность объектов реального мира, обладающих общими свойствами и общим поведением. Например, класс «Собаки» - объединяет вообще всех собак. Класс «Книги» - объединяет все книги. Класс «Студенты» - объединяет вообще всех студентов. Класс «Планеты» - объединяет все планеты, например, солнечной системы. Объект представляет собой конкретный экземпляр какого-либо класса, например, собака «Шарик» является объектом класса «Собаки», книга «Три мушкетера» - это объект класса «Книги», а студент Иванов Вася является объектом класса «Студенты», планета «Земля» - объект класса «Планеты». При описании класса задаются свойства объектов класса и их поведение. Свойства могут задавать внешний вид объекта, его состояние и описываются как данные. 9 9 Поведение объектов задается с помощью программного кода. При этом разные объекты класса могут иметь разные свойства, но одно и то же поведение. Например, разные планеты солнечной системы могут иметь разное положение на экране, разную окраску, разный размер, но движутся они по одним и тем же законам. Основные принципы ООП Объект это нечто, что объединяет в себе данные и программный код. Данные реализованы в виде свойств объекта, программный код это методы объекта. Данные у разных объектов могут различаться, но методы у объектов одного класса едины. Класс это шаблон, тип, в соответствии с которым строятся конкретные экземпляры объектов класса. Данные объекта должны быть защищены своими методами, т.е. доступ к данным объекта должен осуществляться только через методы объекта. Это первый принцип объектно-ориентрованного программирования, который называется – инкапсуляция. Т.е. данные объекта находятся как бы в капсуле из методов объекта. Этот принцип часто называют сокрытие данных. Можно создавать наследников класса, при этом наследуются все свойства и методы предка и добавляются свои свойства и методы. Этот принцип носит название – наследование. Это очень мощный принцип, который позволяет не изобретать велосипед, а взять все, что нужно у предка и добавить новое. Третий принцип ООП называется – полиморфизм ( поли – много, морф – форма), можно перевести как разнообразие. Этот принцип означает, что родственные объекты могут выполнять схожие по смыслу действия разными способами. Т.е. у потомков поведение уже может быть изменено. Иногда этот принцип называют сокрытие реализации, т.е. за одним и тем же заголовком метода, реализующего поведение объекта, скрывается разная реализация метода у предка и у потомка. Чтобы было понятно, рассмотрим такой пример. У класса «Транспортное средство» есть метод «Двигаться». Наследниками этого класса являются классы «Автомобиль», «Самолет» и «Пароход». Наследники наследуют у предка все, в том числе и метод «Двигаться». Для класса «Самолет» двигаться означает летать, для класса «Пароход» двигаться означает плыть, для «Автомобиля» двигаться означает ехать. Поэтому в каждом классе наследнике метод «Двигаться» получит свою реализацию (рис. 7.15.) Транспортное средство Автомобиль Самолет Пароход Рис. 7.15. После этого небольшого введения в идеологию объектно-ориентированного программирования, рассмотрим, как она реализованы в Delphi. Классом в Delphi называется объектный тип, который может иметь в своем составе поля, методы и свойства. В соответствии с типом, описываемым классом, строятся конкретные экземпляры объектов. Поле объекта полностью аналогично полю записи (тип данных record), методы объекта описываются с помощью процедур и функций. С помощью понятия «свойство»(property) в Delphi реализован принцип инкапсуляции. Свойство это поле и связанные с ним два метода, один из которых позволяет читать из поля, другой писать в поле. То, что мы видим в Инспекторе объектов, т.е. свойство – это 1 0 0 поле, защищенное своими методами. Т.е. каждый раз, когда мы пытаемся писать в поле, работает метод, который проверяет, а что мы собственно собрались туда записать. При чтении из поля так же работает метод, который, например, позволяет представить значение поля в удобном для нас виде. Приведем пример описания класса в Delphi: type TStar = class(TObject) private x,y:integer; col:TColor; // цвет rp:integer; // радиус планеты public constructor Create(x1,y1:integer; col1:TColor; rp1:integer); procedure draw; virtual; procedure move; virtual; abstract; procedure clean; virtual; abstract; end; Ключевое слово type – задает описание класса. TStar – это имя класса. В Delphi имя класса принято начинать с буквы T, что означает type. Ключевое слово class – говорит о том, что описываемый тип – это класс. В скобках задается имя класса, от которого наследуется данный класс. В Delphi все классы являются наследниками класса Tobject, т.е. класс TObject является общим предком всех объектов в Delphi. Поэтому записи TStar = class(TObject) и TStar = class – равнозначны. Ключевое слово private – задает скрытые части класса. Доступ к скрытым частям возможен только в рамках данной программной единицы, т.е. того модуля, где содержится описанный класс. Все методы класса описаны как public(общедоступные), т.е. видимые другими классами. Ключевое слово virtual, которое используется при описании методов, говорит о том, что данный метод является виртуальным, т.е. этот метод получит другую реализацию у потомков. Ключевое слово abstract, которое задается при описании методов Clean и Move, говорит о том, что данный метод является абстрактным, т.е. он только объявлен, но не имеет реализации, реализация появится у потомков. Метод класса Constructor позволяет создать экземпляр класса, т.е. объект, и заполнить значениями его поля. На вход методу поступают значения, которые должны быть присвоены его полям. Для дальнейшего освоения готовых интерфейсных компонентов Windows полученных знаний нам достаточно, поэтому продолжим изучение компонентов. Контрольные вопросы Что такое класс? Что такое объект? Из каких основных элементов состоит объект в Delphi? Чем поля объекта отличаются от полей записи? Что такое свойство и чем оно отличается от поля? Как реализованы методы объектов в Delphi? Перечислите основные принципы объектно-ориентированного программирования. 7. Что такое инкапсуляция? Как в Delphi реализована инкапсуляция? 1. 2. 3. 4. 5. 6. 1 0 1 8. Что такое наследование? Какой объект в Delphi является общим предком всех объектов? 9. Что такое полиморфизм? Списки Delphi предлагает два вида списков: Прокручиваемый список – ListBox; Выпадающий список – ComboBox. Оба вида списков располагаются на вкладке Standart. Списки имеют много общих свойств и методов, но отличаются внешним видом, кроме того, список ComboBox является полем редактирования со списком, т.е. он объединяет возможности редактирования и выбора из списка. Ниже перечислены основные свойства списков (табл. 7.4). Свойство Align BorderStyle Color Columns Ctl3D ExtendedSelect MultiSelect Selected ItemIndex Items Text Style Таблица 7.4. Основные свойства классов TListBox и TComboBox Описание Выравнивание внутри формы ( для ListBox). Стиль границы ( для ListBox). Цвет фона. Число столбцов в списке ( для ListBox). Придать трехмерный вид. Только для ListBox, определяет, можно ли выбрать несколько последовательно расположенных элементов. Работает совместно со свойством MultiSelect. С помощью клавиш Shift – смежные выделения; Ctrl – несмежные выделения. Только для ListBox; разрешены ли выделения нескольких элементов. Массив, позволяющий определить, какие элементы списка выбраны. Содержит порядковый номер выделенного элемента списка, нумерация с нуля. Объект типа TString, массив строк, содержащий элементы списка, имеет свои методы для работы со списком Только для TComboBox, содержит текст, введенный пользователем, позволяет задавать элемент, который первоначально будет видим в списке. Задает стиль списка. Может принимать одно из следующих значений: DropDownList – для ComboBox, в список нельзя вводить новые значения; Standart – нормальный строковый, все строки одинаковой высоты; OwnerDrawFixed – каждый элемент имеет высоту, определенную свойством ItemHeight; OwnerDrawVariable – элементы списка могут иметь переменную высоту. Самое важное при работе со списком – это задание элементов списка и определение элемента, выбранного пользователем. Для задания элементов списка можно использовать 1 0 2 свойство Items, доступ к которому можно получить с помощью Инспектора объектов (рис. 7.16). Рис. 7.16. Свойство Items списка Для ввода значений в это свойство необходимо щелкнуть на трех точках, при этом открывается окно редактора свойств (String List Editor), в котором и вводятся значения списка, по одному на каждой строчке (рис. 7.17.): Рис. 7.17. Окно редактора свойств Для определения выбранного элемента используется свойство ItemIndex, которое содержит номер выбранного элемента, нумерация с нуля. Для демонстрации работы списка выполним следующее упражнение: в форме создадим список, содержащий названия времен года: зима, весна, лето, осень. С помощью функции ShowMessage отобразим выбор пользователя. Вид формы изображен на рис. 7.18: 1 0 3 Рис. 7.18. Вид формы По кнопке «Ввод» работает обработчик: procedure TForm1.Button1Click(Sender: TObject); begin case ComboBox1.ItemIndex of 0: ShowMessage ('Зима'); 1: ShowMessage ('Весна'); 2: ShowMessage ('Лето'); 3: ShowMessage ('Осень'); end; end; Свойство Items у обоих видов списков является объектом типа TString со своими свойствами и методами. Иными словами, Items это символьный массив с набором методов, позволяющим работать со строками списка, т.е. добавлять, удалять, вставлять строки и т.д. Набор основных методов класса TString приведен в табл. 7.5. Метод Add(const S: string): Integer Insert(Index: Integer; const S: string); Delete(Index: Integer) Exchange(Index1, Index2: Integer) Clear Таблица 7.5. Методы класса TString Описание Добавить строку, передаваемую в качестве входного параметра, в конец списка Вставить строку S в позицию, задаваемую параметром Index. Нумерация строк начинается с нуля. Удалить строку, позиция которой указана в параметре Index Поменять местами два элемента списка, позиции которых указаны параметрами Index1 и Index2 Очистить список Заполнение списков данными часто удобно производить на этапе выполнения программы программным путем. Для демонстрации этого рассмотрим несложное приложение, назовем его «Работа со списками». Это приложение позволит программным путем изменять список ListBox. Внешний вид приложения может быть, например, таким как на рис. 7.19. 1 0 4 ListBox1 Рис. 7.19. В поле Edit1:TEdit будет вводиться значение нового элемента списка. По кнопке «Добавить» - введенный элемент добавляется в конец списка. По кнопке «Вставить» элемент вставляется перед текущей позицией курсора. По кнопке «Удалить» - удаляется элемент, на котором установлен курсор. По кнопке «Очистить» - все элементы списка удаляются. Используя методы объекта Items списка, напишем программный код на события OnClick кнопок. Для кнопки «Добавить» программный код будет иметь вид: ListBox1.Items.Add(Edit1.Text); Для кнопки «Вставить» программный код будет иметь вид: ListBox1.Items.Insert(ListBox1.ItemIndex, Edit1.Text); Здесь первый параметр задает порядковый номер элемента, перед которым вставляется элемент, второй параметр – задает этот элемент. Для кнопки «Удалить» программный код будет иметь вид: ListBox1.Items.Delete(ListBox1.ItemIndex); Для кнопки «Очистить» программный код будет иметь вид: ListBox1.Items.Clear; Зависимые переключатели. Компоненты RadioButton, RadioGroup Кнопка переключателя может находиться в одном из двух состояний: включено или выключено. Будучи помещенными в контейнер, зависимые переключатели используются для выбора одной опции из нескольких взаимоисключающих, т.е. при включении одной кнопки, другие автоматически выключаются. Таким образом, во включенном состоянии всегда находится одна кнопка. Поэтому они объединяются в группу. Контейнером называется элемент, который используется для группировки других элементов. Например, контейнером может быть форма или компонент GroupBox. На вкладке Standart находятся два компонента, которые позволяют создавать зависимые переключатели: RadioButton и RadioGroup. Компонент RadioButton позволяет создать один переключатель. Свойства приведены в табл. 7.6. 1 0 5 Свойство Caption Checked Таблица 7.6 .Основные свойства класса TRadioButton Описание Подпись кнопки. Если True, то кнопка находится во включенном состоянии Компонент RadioGroup представляет собой группу радиокнопок. Только одна кнопка в группе может находиться во включенном состоянии. Основные свойства компонента RadioGroup приведены в табл.7.7. Свойство Caption Columns Items ItemIndex Таблица 7.7. Основные свойства компонента класса TRadioGroup Описание Подпись группы Число колонок в группе Массив, содержащий названия кнопок в группе Номер выбранного элемента, нумерация с нуля Для демонстрации работ RadioButton выполним несложное упражнение. Поместим компонент GroupBox в область формы, поместим два компонента RadioButton в GroupBox, т.е. GroupBox является для них контейнером. Зададим подпись всей группы, это свойство Caption объекта GroupBox1, равной «Выбрать пол» и подписи кнопок: «мужской», «женский». С помощью ShowMessage отобразим выбор пользователя. Форма имеет следующий вид (рис. 7.20). Рис. 7.20. Вид формы Как вы видите, в контейнере GroupBox1 кнопки типа RadioButton работают как зависимые переключатели. На событие OnClick кнопки «Что Вы выбрали?» напишем обработчик: procedure TForm1.Button1Click(Sender: TObject); begin if Radiobutton1.Checked then ShowMessage('Men'); if Radiobutton2.Checked then ShowMessage('Woman'); end; Для демонстрации работы RadioGroup выполним следующее упражнение: создадим группу переключателей с названиями цветов. При выборе пользователем кнопки с цветом форма меняет свой цвет на выбранный. Поместим компонент RadioGroup в область 1 0 6 формы, с помощью свойства Caption зададим название группы, с помощью свойства Items зададим названия кнопок. Вид формы на рис. 7.21. Рис. 7.21. Вид формы На событие OnClick компонента RadioGroup напишем обработчик: procedure TForm1.RadioGroup1Click(Sender: TObject); begin case RadioGroup1.ItemIndex of 0: color:=clWhite; 1: color:=clBlue; 2: color:=clRed; end; end; Обратите внимание, при задании свойства формы вместо того, чтобы писать: Form1.Color, мы пишем – Color, т.е. не задаем имя объекта. В этом случае система полагает, что имеется ввиду свойство текущего окна. Задания для самостоятельной работы 1. Разработать простой калькулятор на четыре арифметических операции. Внешний вид окна изображен на рис. 7.22. 2. Рис. 7.22. Разработать кнопочный калькулятор, подобный тому, что в Windows, внешний вид окна может быть, например, таким (рис. 7.23). 1 0 7 Рис. 7.23. Функция MessageDlg При удалении элемента необходимо спросить у пользователя подтверждения на удаление элемента. Для этого будем использовать встроенную функцию MessageDlg, которая позволяет выводить в окне сообщение пользователю и получать от пользователя ответ. Внешний вид окна приведен на рис. 7.24. Рис. 7.24. Заголовок функции имеет следующий вид: function MessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Word; Как видно из заголовка функция имеет четыре входных параметра: Msg – задает текст сообщения; DlgType – задает тип сообщения, фактически задает пиктограмму (картинку) в окне; Buttons – задает набор кнопок в окне; HelpCtx – используется для задания файла помощи. Для параметра DlgType возможны следующие варианты (табл. 7.8). Значение mtWarning MtError mtInformation mtConfirmation MtCustom Таблица 7.8. Значения параметра DlgType Описание Задает пиктограмму с изображением желтого восклицательного знака Задает пиктограмму с изображением красного стоп-сигнала Задает пиктограмму с изображением голубой буквы i с точкой Задает пиктограмму с изображением зеленого знака вопроса Не содержит пиктограммы 1 0 8 Для задания кнопок, как правило, используются следующие константы (табл. 7.9.). Таблица 7.9. Константы для задания кнопок в окне Значение mbYesNoCancel mbOKCancel mbAbortRetryIgnore Описание Три кнопки “Yes”, “No”, “Cancel” Две кнопки “Ok” и “Cancel” Три кнопки “Abort”, “Retry”, “Ignore” Для определения возвращаемого функцией значения используются константы (табл. 7.10). Таблица 7.10. Константы для определения выбранной кнопки Выбранная кнопка Возвращаемое значение mbOK mrOk mbYes mrYes mbNo mrNo mbCancel mrCancel mbAbort mrAbort mbRetry mrRetry mbIgnore mrIgnore Давайте изменим программный код на событие кнопки «Удалить» примера предыдущего пункта, добавив использование функции MessageDlg. Программный код будет иметь такой вид: if MessageDlg('Вы уверены?', mtConfirmation, mbOkCancel, 0) = mrOk then ListBox1.Items.Delete(ListBox1.ItemIndex); Теперь, в случае если пользователь ошибочно нажмет на кнопку «Удалить», удаление будет произведено, если только пользователь его подтвердит. Задание для самостоятельной работы 1. 2. Создать прокручиваемый список с возможностью множественного выделения элементов. Отобразить выбор пользователя с помощью функции ShowMessage. Даны два прокручиваемых списка. По кнопкам организовать перемещение элементов из одного списка в другой. По кнопке «>» выделенный элемент левого списка переносится в конец правого списка. По кнопке «<», наоборот, выделенный элемент правого списка переносится в конец левого списка. По кнопке «>>» все элементы левого списка переносятся в конец правого списка, соответственно по кнопке «<<» - все элементы правого списка переносятся в конец левого списка, как показано на рис. 7.25. 1 0 9 Рис. 7.25. Главное меню приложения. Компонент MainManu Главное меню приложения, как правило, располагается в верхней части окна. Для создания главного меню приложения используется компонент MainMenu, который располагается на вкладке Standart панели инструментов. Для задания элементов меню используется встроенный построитель меню, который открывается при двойном щелчке на компоненте MainMenu. Внешний вид построителя приведен на рис. 7.26. Рис. 7.26. Окно построителя меню Работа с построителем меню очень проста. Выделяем нужный пункт меню нажатием мыши. Инспектор объектов отображает свойства этого элемента. Свойство caption позволяет задать названия пунктов меню. Для создания новых пунктов меню необходимо использовать стрелки управления курсором. Разделительная линия, делящая пункты меню на секции, создается заданием свойства caption равным значению ‘-‘ (минус). В построителе меню по правой кнопке мыши можно задать подменю (Create SubMenu), добавить(Insert) или удалить (Delete) пункт меню, как показано на рис. 7.27. 1 1 0 Рис. 7.27. С каждым пунктом меню связано событие OnClick, которое позволяет задать программный код, который будет выполняться при выборе данного пункта меню. Задание для самостоятельной работы Для приложения «Работа со списками», рассмотренного в пункте «Списки» создать меню, следующего вида (рис. 7.28.). Рис. 7.28. На каждый пункт меню назначить готовый обработчик, путем выбора готового обработчика из списка уже написанных обработчиков, как показано на рис. 7.29. 1 1 1 Рис. 7.29. Кнопочная панель. Компонент ToolBar Компонент ToolBar, находящийся на вкладке Win32 палитры компонентов, позволяет создать очень полезный элемент – кнопочную панель. Поместим элемент в область формы в уже разработанное нами приложение «Работа со списками». По умолчанию компонент всегда располагается непосредственно под главным меню. С помощью его свойств можно задать другое расположение кнопочной панели. Для создания кнопок щелкнем правой кнопкой мыши на кнопочной панели. Пункт «New Button» - позволяет создать новую кнопку, «New Separator» - разделитель кнопок. Например, для нашего приложения создадим четыре кнопки подряд и одну последнюю кнопку после разделителя, как показано на рис. 7.30. Рис. 7.30 Необходимо снабдить кнопки картинками. Для этого будем использовать компонент ImageList, который располагается на той же самой вкладке Win32. Поместим его в область формы. Объект ImageList1:TImageList – это набор картинок. Для добавления картинок в набор выполним двойной щелчок на компоненте ImageList1. В диалоге, который вы видите на рис. 7.31, по кнопке “Add” картинки будут добавляться в набор. 1 1 2 Рис. 7.31. Большое количество разнообразных картинок находится в папке: C:\Program File\Common Files\Borland Shared\Images. Для того, чтобы картинки набора отображались на соответствующих кнопках кнопочной панели необходимо связать свойства двух объектов ToolBar1 и ImageList1 заданием свойства Images объекта ToolBar1. Теперь осталось для каждой кнопки кнопочной панели задать всплывающую подсказку. Для этого используются два свойства кнопки: свойство Hint – содержит текст всплывающей подсказки, свойство ShowHint должно быть равным true. На каждую кнопку нужно назначить обработчик события OnClick. Для этого не нужно писать новые обработчики, можно использовать готовые обработчики событий так, как это было показано в предыдущем пункте. По что у нас должно получиться изображено на рис. 7.32. Рис. 7.32. Область редактирования. Компонент Memo Область редактирования (Memo) используется для редактирования длинных строк или объемных текстовых документов. Компонент располагается на вкладке Standart палитры компонентов. Основным свойством этого компонента является свойство Lines:TString уже знакомого нам класса TString, которое имеет набор методов, позволяю1 1 3 щих загружать текстовый документ из файла и выгружать его в файл. Методы класса TString приведены в табл. 7.11. Таблица 7.11. Методы класса TString Метод Описание Add Добавить строку Insert Вставить строку Delete Удалить строку LoadFromFile Загрузить текст из файла в Memo, в качестве параметра методу передается путь к файлу. SaveToFile Сохранить текст Memo в файле, в качестве параметра методу передается путь к файлу. Основные методы компонента Memo приведены в табл. 7.12. Метод Clear CopyToClipBoard CutToClipBoard PasteFromClipBoard Таблица 7.12. Методы класса TMemo Описание Удалить все строки из Memo. Копировать выделенный текст во внутренний буфер Windows. Вырезать выделенный текст во внутренний буфер Windows. Вставить выделенный текст из внутреннего буфера Windows. Контекстное меню. Компонент PopupMenu Компонент PopupMenu, находящийся на вкладке Standart палитры компонентов, позволяет создать контекстное меню, т.е. меню, которое открывается по правой кнопке мыши. Двойной щелчок на компоненте открывает встроенный построитель меню, очень похожий та построитель меню для компонента MainMenu. Названия пунктов меню также вводятся в свойство caption. Связь контекстного меню с соответствующим интерфейсным элементом, например, областью редактирования Memo, выполняется через свойство PopupMenu интерфейсного элемента. Например, создадим несложное приложение, которое позволяет по нажатию правой кнопки мыши на области редактирования загружать файлы в Memo и сохранять содержимое Memo в файлах. Для этого поместим в область формы следующие объекты Memo1:TMemo и PopupMenu1:TPopupMenu. Свяжем их через свойство PopupMenu объекта Memo1. С помощью встроенного построителя меню зададим названия пунктов контекстного меню: «Загрузить файл», «Сохранить в файле». На пункт меню «Загрузить файл» напишем следующий обработчик: Memo1.Lines.LoadFromFile(‘D:\Temp\d1.txt’); На пункт меню «Сохранить в файле» напишем следующий обработчик: Memo1.Lines.SaveToFile(‘D:\Temp\d1.txt’); Недостатком этого приложения является отсутствие возможности выбрать файл в диалоге при его загрузке и возможность задать в диалоге папку и имя файла при его сохранении. Для этого следует использовать стандартные диалоговые окна Windows для открытия и сохранения файла. Такую возможность предоставляют компоненты, расположенные на вкладке Dialogs. Диалоговые окна Windows 1 1 4 На вкладке Dialogs располагается набор компонентов, реализующий стандартные диалоговые окна Windows. Основные компоненты приведены в табл. 7.13. Таблица 7.13. Компоненты, реализующие диалоговые окна Windows Название компонента Описание OpenDialog Диалог открытия файла SaveDialog Диалог сохранения файла FontDialog Диалог задания шрифта ColorDialog Диалог задания цвета FindDialog Диалог задания параметров поиска в файле PrinterSetupDialog Диалог задания установок принтера PrintDialog Диалог задания печати Рассмотрим более подробно диалоги OpenDialog и SaveDialog, FontDialog и ColorDialog (табл. 7.14). Свойство FileName Filter InitialDir Title Таблица 7.14. Основные свойства OpenDialog и SaveDialog Описание Имя файла, в случае OpenDialog – это имя файла выбранного пользователем, в случае SaveDialog – это имя, под которым файл следует сохранить Фильтр позволяет увидеть только файлы определенного типа в окне диалога, путем задания расширения файлов. Например, только текстовые с расширением *.txt. Позволяет задать начальный директорий для диалога Заголовок окна диалога Для компонента FontDialog основным свойством является свойство Font, в котором будет находиться шрифт, выбранный пользователем. Для компонента ColorDialog основным свойством является свойство color, которое будет содержать цвет, выбранный пользователем. Основным методом для всех этих видов компонентов является метод Execite, который выводит диалог на экран и возвращает истину, если пользователь выбрал кнопку «Открыть» или «Сохранить» в окне диалога, и ложь, если пользователь выбрал кнопку «Отмена» в окне диалога. Теперь, вооружившись этим знанием, улучшим приложение, созданное в предыдущем пункте «Контекстное меню. Компонент PopupMenu». Для этого поместим в область формы компоненты вкладки Dialogs: OpenDialog – для открытия файла в диалоге, SaveDialog – для сохранения файла в диалоге, ColorDialog – для выбора цвета области редактирования Memo, FontDialog – для выбора шрифта текста, загруженного в область Memo. Внешний вид окна на этапе проектирования может быть таким, как изображено на рис. 7.33. 1 1 5 Рис. 7.33. В контекстном меню создадим следующие пункты меню: «Открыть файл», «Сохранить файл», «Изменить шрифт», «Изменить цвет». При выборе пункта меню «Открыть файл» работает программный код: if OpenDialog1.Execute then Memo1.Lines.LoadFromFile(OpenDialog1.FileName); При выборе пункта меню «Открыть файл» работает программный код: if SaveDialog1.Execute then Memo1.Lines.SaveToFile(SaveDialog1.FileName); При выборе пункта меню «Изменить шрифт» работает программный код: if FontDialog1.Execute then Memo1.Font:=FontDialog1.Font; При выборе пункта меню «Изменить цвет» работает программный код: if ColorDialog1.Execute then Memo1.Color:=ColorDialog1.Color; Итак, подведем итог проделанной работы. Мы познакомились с навыками работы в среде Delphi, создали несколько простых приложений, познакомились с компонентами, их свойствами, событиями. Задание для самостоятельной работы Создать приложение, реализующее возможности простого текстового редактора по работе с текстовыми файлами: создание файла, открытие файла, сохранение файла, сохранение с другим именем, изменение шрифта, изменение цвета фона, и др. Снабдить редактор главным меню, кнопочной панелью, реализующей основные функции текстового редактора. Понятие проекта. Структура проекта Если вы загляните в папку, в которой хранится исходный код вашего приложения, вы увидите довольно много файлов. Эти файлы необходимы для того, чтобы работало 1 1 6 ваше приложение. Именно поэтому мы советовали вам все файлы сохранять в одной папке, чтобы не потерять ни один файл. Набор файлов, который хранит исходный код вашего приложения, называется проектом. На основе файлов проекта создается выполнимый файл (*.exe). Давайте рассмотрим, из каких основных файлов состоит проект. Структура проекта изображена на рис. 7.34. Файлы форм ( *.dfm) Проект Выполнимый файл (*.exe) ( * .dpr) Модуль Pascal ( *.pas) Опции проекта (*.dof) Ресурсы проекта (*.res) 7.34. Структура проекта Где файлы с расширением: *.dfm – содержат графическое представление формы; *.pas – модули Pascal; *.res – хранит ресурсы проекта; *.dof – хранит опции проекта. Проект может содержать несколько форм, с каждой формой связаны два файла – с расширениями dfm и pas. Файл с расширением dfm – хранит графическое представление формы, именно сюда вы помещаете интерфейсные элемента, такие как кнопки, списки, поля редактирования. Файл с расширением pas – является модулем Pascal, именно там хранится программный код, связанный с формой, например обработчики событий формы. При этом каждому файлу dfm обязан соответствовать файл pas. Обратное – неверно, т.е. модуль может не иметь связанной с ним формы, файла dfm. С каждым проектом связан один файл с расширением dof, в котором хранятся опции проекта. А вот ресурсных файлов res может быть, вообще говоря, несколько, но, как правило, с каждым проектом связан один файл ресурсов, который хранит иконки, картинки, рисунки вашего приложения. В своей папке вы обнаружите также файлы с расширением dcu. Эти файлы являются результатом компиляции модулей Pascal, они создаются каждый раз, когда компилируется проект. Значит, их хранение не является обязательным и они могут быть удалены. Также можно не хранить файлы, расширение которых начинается со знака "~", например ~dfm, ~pas. Это файлы отката текстового редактора. Этими файлами можно воспользоваться, если испорчены основные файлы. С каждым проектом связан один файл с расширением cfg – это файл конфигурации проекта. Программа на Паскале, которая запускает приложение на выполнение, часто также называется проектом и хранится в файле с расширением *.dpr. Для доступа к этому файлу выполним меню Project | View Source (рис. 7.35.). 1 1 7 Рис. 7.35. Окно проекта в Delphi program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.RES} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. Рассмотрим структуру программы. Ключевое слово program задает имя проекта (программы). Ключевое слово uses позволяет подключить к проекту формы и модули. А вот {$R *.RES} – это не комментарий, это опция компилятора, которая подключает к проекту ресурсный файл. Между операторами begin .. end располагается основной текст программы. Для каждого приложения создается глобальный объект Application. Этот объект отсутствует в палитре компонентов, недоступен он и на этапе разработки приложения. Но некоторые из его общедоступных (public) свойств могут быть установлены во время проектирования в диалоге задания опций проекта на страницах Forms и Application. Метод Initialize – это первый метод, вызываемый для любого Delphi-приложения. Он инициализирует объект Application. Метод CreateForm – загружает очередную форму в оперативную память. Проект Delphi обычно состоит из нескольких вызовов метода CreateForm по количеству самозагружаемых (auto-create) форм. Приложение может создавать форму динамически во время выполнения с помощью того же метода CreateForm, но это не всегда требуется. По умолчанию первая созданная форма становится главной формой приложения. 1 1 8 Метод Run запускает приложение на выполнение и передает управление главной форме. Задание для самостоятельной работы 1. 2. 3. 4. 5. 6. 7. 8. Создайте новое приложение в Delphi Сохраните его в отдельной папке Откройте папку и посмотрите, из каких файлов она состоит Измените приложение, например, добавьте несколько любых компонентов на форму Сохраните приложение Откройте папку и посмотрите, из каких файлов она состоит Удалите ненужные файлы, т.е. такие которые не повлияют на работоспособность приложения Запустите приложение на выполнение и убедитесь в его работоспособности. Форма Приложение может состоять из нескольких форм. Форма – это основной элемент интерфейса пользователя, который обеспечивает наиболее удобный вид представления, просмотра, редактирования данных и управления ходом выполнения приложения. С точки зрения пользователя, форма – это просто окно, посредством которого программа общается с пользователем. С точки зрения разработчика, форма – это объект класса TForm. С каждой формой связаны два файла: файл dfm – содержит графическое представление формы, файл pas – содержит ассоциированный с формой модуль Паскаля. Добавление формы к проекту Добавление формы к проекту осуществляется либо через меню File | New | Form, либо с помощью быстрой кнопки New Form кнопочной панели (рис. 7.36.). New Form Toggle Form\Unit Рис. 7.36. При этом открывается окно новой формы. Модуль новой формы добавляется в строку Uses файла проекта – dpr. Чтобы запомнить форму как часть проекта, сохраните ее в папке, где хранятся все файлы вашего приложения, с помощью меню File | Save. Как мы уже говорили, с каждой формой связаны два файла: в одном находится графическое представление формы, другой содержит модуль Pascal, связанный с формой. Каждый из этих файлов открывается в своем окне. Для переключения между окнами используются кнопка кнопочной панели Toggle Form\Unit или клавиша F12. 1 1 9 Структура модуля Pascal Модули введены в Turbo Pascal начиная с версии 4.0. Введение модулей явилось решающим шагом на пути его превращения в язык, пригодный для крупных разработок производственного и коммерческого назначения. Модуль (Unit) в языке Turbo Pascal по определению считается отдельной программой. Модуль – это отдельно хранимая и независимо компилируемая единица в отличие от подпрограммы. Модуль представляет собой набор программных ресурсов, предназначенных для использования другими модулями и программами. Ресурсы модуля можно разбить на две части – предназначенные для использования другими модулями и программами и объекты рабочего характера, используемые только процедурами и функциями данного модуля. В соответствии с этим модуль имеет две основные части, называемые интерфейсом и реализацией. В интерфейсной части (interface) сосредоточены описания объектов модуля, доступных другим программам; такие объекты называются видимыми вне модуля. Здесь должны быть представлены только заголовки процедур и функций, видимые для других программ, а их полные описания будут содержаться в разделе реализации. В части реализации (implementation) помещаются рабочие объекты, называемые также невидимыми или скрытыми, а также реализации процедур и функций, используемых другими модулями. В последующих версиях появились еще две части: initialization и finalization. Часть initialization используется для инициализации данных, используемых модулем. Если приложение использует данный модуль, код в части initialization выполняется перед тем, как начнет выполняться само приложение. Если для модуля необходимо выполнить, например освобождение ресурсов, занятых при инициализации объектов, перед тем как завершится приложение, используется часть finalization. Часть finalization следует за частью initialization, но перед конечным end. Заголовок модуля состоит из ключевого слова Unit и идентификатора, который является именем модуля. Hапример: Unit Unit1; Interface { описание видимых объектов } Implementation { описание скрытых объектов } Initialization { операторы инициализации объектов модуля } Finalization { очистка } end. Для доступа к объектам, процедурам и функциям другого модуля нужно указать имя этого модуля в операторе Uses. Давайте рассмотрим структуру модуля, связанного с пустой формой. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) 1 2 0 private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} end. Ключевое слово Unit задает имя модуля. В интерфейсной части модуля с помощью ключевого слова Uses задаются внешние библиотеки, которые будут использоваться модулем. Ключевое слово type задает описание класса TForm1, который является наследником класса TForm. Ключевые слова private и public задают скрытые и общедоступные части класса соответственно. С помощью ключевого слова var задается переменная Form1 это объект класса TForm1. В части implementation будут создаваться обработчики событий формы. {$R *.dfm} – это не комментарий, а директива компилятора, которая говорит о том, что данный модуль связан с графическим представлением формы, файлом dfm. Не удаляйте эту директиву! Как открыть форму Форма открывается с помощью одного из своих методов: Show или ShowModal. Отличие методов состоит в том, что метод Show открывает обычное окно, а метод ShowModal открывает форму в режиме модального окна, т.е. окна, которое пользователь должен закрыть, прежде чем он сможет получить доступ к другим окнам. Например: Form2.Show; где Form2 - имя открываемой формы. Для того чтобы модуль вызывающей формы получил доступ к модулю вызываемой формы, нужно в Uses вызывающей формы добавить имя модуля вызываемой формы. Напpимеp. Из Формы1 требуется открыть Форму2. С Формой1 связан модуль Unit1, а с Формой2 связан модуль Unit2. Нужно, чтобы модуль Unit1, связанный с Формой1 видел модуль Unit2, связанный с Формой2. Для этого необходимо в операторе Uses модуля Формы1, т.е. в Unit1, прописать имя модуля второй формы Unit2. Unit Unit1 { Unit1 - модуль вызывающей Фоpмы1 } ... implementaion Uses ... , Unit2; { Unit2 - модуль вызываемой Фоpмы2 } ... Этого же можно достичь, если, находясь в модуле Unit1, выполнить меню File | Use Unit. В результате в части implementaion модуля Unit1 появится объявление модуля Unit2. Задание для самостоятельной работы 1 2 1 1. Создайте новое приложение. 2. Добавьте к нему новую форму 3. В главной форме приложения создайте кнопку, по которой будет вызываться новая форма. 4. Добавьте к приложению 5 новых форм. Откройте файл dpr и посмотрите, что он содержит. 5. Запустите приложение на выполнение и посмотрите как работает кнопка в главной форме. Способность форм ссылаться друг на друга Вы наверное обратили внимание на то, что мы добавляем оператор Uses в части implementaion модуля. Почему мы поступили именно так, почему не добавить модуль в части interface модуля? Можно добавить описание и в части interface модуля, но только в том случае, когда формы не ссылаются друг на друга. Формы могут ссылаться одна на другую, т.е., например, из формы 1 вызывается форма 2, а форма 2, в свою очередь, ссылается на объекты формы 1. В этом случае, для того, чтобы не возникла ошибка circular referances во время компиляции, необходимо сделать одно из следующих действий: разместите операторы Uses с описаниями модулей в части implementation соответствующих модулей (это означает разрешение формам ссылаться друг на друга). разместите один оператор Uses в части interface одного модуля, а другой – в части implementation другого модуля. Например, Form1 имеет связанный с ней модуль Unit1 и ссылается на форму Form2, имеющую модуль Unit2. Form2, в свою очередь, хочет получить доступ к объекту Label1, находящемуся в форме Form1. Соответствующие Unit-файлы будут выглядеть следующим образом: unit Unit1; unit Unit2; interface interface uses uses Windows, Messages, SysUtils, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; Dialogs, StdCtrls; type type TForm1 = class(TForm) TForm2 = class(TForm) Label1: TLabel; Button1: TButton; Button1: TButton; procedure Button1Click(Sender: procedure Button1Click(Sender: TObject); TObject); private private { Private declarations } { Private declarations } public public { Public declarations } { Public declarations } end; end; var var Form2: TForm2; Form1: TForm1; implementation 1 2 2 implementation uses Unit1; uses Unit2; {$R *.dfm} {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Form2.Show; end; end. procedure TForm2.Button1Click(Sender: TObject); begin Form1.Label1.Caption:='Hello'; end; end. Задание для самостоятельной работы 1. Создайте новое приложение 2. Добавьте к нему новую форму 3. В главную форму приложения поместите объект Label и вызовите по кнопке новую форму. 4. Из второй формы измените объект Label1 первой формы по кнопке. Просмотр форм и ассоциированных с ними модулей Для быстрого переключения между формами и модулями можно использовать: меню View | Forms для форм, меню View | Units для модулей; с помощью быстрых кнопок кнопочной панели View Form и View Unit(см. рис. 7.37.). View Form View Unit Рис.7.37. Основные свойства, методы и события формы В ниже следующих таблицах описаны основные свойства, методы и события формы. Свойство ActiveControl AutoScroll=True BorderIcons Таблица 7.15. Свойства формы Описание Определяет, какой именно элемент находится в фокусе во время открытия формы. Автоматически отображает линейку прокрутки, если будет отрезан какой-то компонент. Имеет набор вложенных свойств: SystemMenu = False – отключить меню управления окном; 1 2 3 BorderStyle Caption ClientHeight ClientWidth Ctl3d Cursor Enabled Font FormStyle Icon KeyPreview True Left,Top Menu Name PopupMenu Position ShowHint Hint Minimize = False – убрать кнопку минимизации окна; Maximize = False – убрать кнопку максимизации окна. Стиль окантовки, может принимать следующие значения: Dialog – окно открывается как диалоговое; None – без границы; Sizeable – граница изменяемая; Single – граница одинарная. Заголовок окна. и Свойства задают размер полезной площади в пикселях, используются для работы с большими широкими формами, когда форма не помещается на экране. Для придания трехмерного облика компонентам формы. Определяет форму курсора. Позволяет включать и отключать форму, в отключенном состоянии форма не реагирует на нажатия клавиш, мыши, таймер, т.е. чтобы пользователь не имел возможности взаимодействовать с некоторым окном. Открывает диалог установки шрифта по умолчанию. Задание стиля формы может принимать следующие значения: MDI – Multi-Document Interface (окна, содержащие дочерние, вложенные окна). MDIForm- родительское окно, MDIChild – дочернее окно. StayOnTop – форма – всегда окно переднего плана; fsNormal – обычное, не MDI-окно Иконка для формы. = Некоторые события, связанные с нажатием клавиш, сначала посылаются в форму, а затем активному компоненту. Свойства задают положение формы в момент открытия. Left – расстояние в пикселях от левой границы окна до левой границы формы. Top – расстояние в пикселях от верхней границы окна до верхней границы формы. Задает имя главного меню для формы. Имя объекта, позволяющее ссылаться на него, не может быть пустым. Задает имя контекстного меню для формы. Позволяет задавать положение формы на экране в момент открытия. Показывать подсказку. Здесь содержится текст подсказки. Метод Show ShowModal Close Hide Print Таблица 7.16. Методы формы Описание Открыть окно формы. Открыть форму как модальное окно. Закрыть окно формы; равносильно закрытию окна через системное меню управления окном. Скрыть окно формы, форма становится невидимой, но ее свойства доступны для изменения. Печать формы. Таблица 7.17. События формы 1 2 4 Событие OnActivate OnClick OnClose OnCreate OnDestroy OnDeactivate Когда возникает Каждый раз при получении формой фокуса ввода. При щелчке мышью в области окна формы. При закрытии окна. Один раз при создании формы, при загрузке формы в оперативную память методом CreateForm. При удалении формы из памяти одним из следующих методов: Free, Destroy, Release или при завершении работы приложения. При потере формой фокуса ввода. Задания для самостоятельной работы 1. 2. 3. Создать форму, которая в момент выполнения открывается строго по центру экрана, независимо от того, где она располагалась в момент проектирования приложения. Для формы создать всплывающую подсказку Исследовать в какой последовательности выполняются события формы: OnCreate, OnActivate, OnDeactivate, OnClose, OnDestroy, OnClick. Для этого в обработчике каждого из этих событий выполнить процедуру ShowMessage с названием соответствующего события в качестве аргумента. Например: ShowMessage (‘OnCreate’). Менеджер проектов Для просмотра структуры проекта, обеспечения быстрого доступа к нужной форме используется менеджер проектов (Project Manager), доступ к которому выполняется через меню View | Project Manager. Окно Менеджера проектов изображено на рис. 7.38. Работа в Менеджере проектов выполняется с помощью мыши. Менеджер проектов позволяет: просматривать формы и ассоциированные с ними модули (Open); быстро переключаться между модулями и формами приложения; удалить форму из проекта, при этом форма не удаляется физически, в любой момент она снова может быть включена в проект (Remove From Project); создать новый проект (Add New Project) или добавить существующий проект (Add Existing Project) к группе проектов (ProjectGroup). Группа проектов может содержать несколько приложений, между которыми можно быстро переключаться. Рис. 7.38. Окно Менеджера проектов 1 2 5 Опции проекта Доступ к диалогу установки опций проекта осуществляется через меню Project | Options. Диалог является многостраничным. Окно диалога опций проекта изображено на рис. Познакомимся с наиболее важными опциями проекта. Рис 7.39. Страница Forms диалога опций проекта На странице Forms (рис. 7.39) можно: задать главную форму приложения; задать список автоматически загружаемых (Auto-create forms) с помощью метода CreateForm объекта Application форм и список форм, которые будут загружаться по мере необходимости программным путем (Available forms). 1 2 6 Рис. 7.40. Страница Application диалога опций проекта Hа стpанице Application (рис. 7.40) можно задать: значок для приложения (Icon); подпись значка приложения (Title), когда приложение сворачивается (минимизируется); расширение для выполнимого файла (Target file extension); задать имя файла помощи для вашего приложения (Help File); сделать установленные опции опциями по умолчанию для новых проектов (default). На странице Compiler задаются опции компиляции, соответствующие директивам компиляции, которые вставляются прямо в программный код. На странице Linker задаются опции редактирования (линковки). Страница Packages используется разработки и выполнения проекта. для задания пакетов, требуемых во время Страница VersionInfo позволяет задавать информацию о версии продукта вашего приложения. Страница Directories\Conditional (рис. 7.41) файлов, из которых состоит ваш проект. 1 2 7 позволяет задать местоположение Рис. 7.41. Страница Directories\Conditionals диалога опций проекта Некоторые опции данной страницы описаны ниже. Output Directory задает папку, в которую компилятор поместит откомпилированные модули и выполнимый файл, по умолчанию выполнимый файл сохраняется в той же папке, где располагается исходный код приложения. Unit Output Directory – задает отдельную папку для файлов .dcu. Search Path задает пути поиска, т.е. пути, где располагаются исходные файлы вашего приложения. Упpавление пpоектами Управление проектами осуществляется через меню File. Ниже кратко описан состав функций меню File. New – создать новый объект. Например, новое приложение (application), Form – добавить новую форму к проекту, Data Module – добавить новый модуль данных к вашему приложению. Модуль данных является контейнером (хранилищем) компонентов доступа к базам данных для вашего приложения. Во время проектирования модуль данных выглядит как обычная форма, содержащая не визуальные компоненты доступа к базам данных. Во время выполнения модуль данных невидим. Open – открыть файл проекта. Opеn Project – открыть существующий проект. Reopen – открыть проект из тех, что недавно открывались. Save – сохранить активный файл проекта. Save as... – сохранить активный файл проекта с другим именем. Save project as... – используется для сохранения файла проекта (.dpr) с другим именем. Save all – сохраняются все открытые файлы, включая текущий проект и модули. Close – закрыть активный файл. 1 2 8 Close all – закрыть все открытые файлы, включая текущий проект и все модули. Use Unit – имя выбранного модуля включается в программный код текущего модуля. Это дает возможность текущему модулю видеть общедоступные (public) объекты, методы, процедуры и функции выбранного модуля. Print – используется для печати активного модуля или активной формы. Exit – выход из среды разработки Delphi. Компиляция и сборка проекта Компиляция и сборка проекта выполняется с помощью функций меню Project, которые кратко описаны ниже. Add To Project – добавить к проекту существующую форму. Remove From Project – удалить форму из проекта. Import Type Library – импортирование внешней библиотеки в ваше приложение. Add To Repository – добавить ваши собственные проекты и формы в репозиторий объектов. Репозиторий объектов содержит формы, проекты и другие виды объектов. Вы можете использовать объекты репозитория, прямо копируя их в свое приложение, либо производя наследников существующих объектов, основываясь на их типах. View Source – просмотр файла проекта (dpr). Add New Project – добавить новый проект в группу проектов. Add Existing Project – добавить существующий файл к группе проектов. Compile – компилируются только измененные формы, создается выполнимый файл. Build All – компилируются все формы вашего приложения; независимо от того, были ли внесены в них изменения, создается выполнимый файл. Syntax check – осуществляется только компиляция с выдачей возможных ошибок без линковки, выполнимый файл не создается. Information – выдается информация о компиляции. Options – доступ к опциям проекта. Выполнение и отладка проекта Выполнение и отладка проекта осуществляется посредством функций меню Run, которые кратко описаны ниже. Run – выполнить приложение. Parameters – используется для передачи параметров командной строки программе. Step Over – пошаговое выполнение программы без захода в процедуры и функции. Trace Into – пошаговое выполнение программы с заходом в процедуры и функции. Trace To Next Source Line – трассировка до следующей строки кода. Run To Cursor – выполнить программу до оператора, на котором установлен курсор. Этот режим может понадобиться для просмотра переменных памяти и перехода в дальнейший пошаговый режим отладки программы. Show Execute Point – показать точку выполнения в окне редактирования, т.е. в окне редактирования курсор устанавливается на операторе, который будет выполняться следующим. Program Pause – создание паузы, приостановка выполнения программы. Во время паузы можно просмотреть переменные памяти. Для запуска приостановленной программы выполните Run. Program Reset – принудительное завершение программы с освобождением памяти из-под нее. Но при этом не все Windows-ресурсы могут быть освобождены, часть ресурсов может быть потеряна. Поэтому принудительное завершение программы рекомендуется в случаях, когда ее нельзя завершить другим способом. В случае ошибки 1 2 9 и остановки программы предпочтительней еще раз выполнить Run, т.е. запустить программу на выполнение и затем завершить ее нормальным образом, закрыв все окна. Evaluate\Modify – просмотр и модификация переменных памяти, полей структур данных и выражений. Для этого нужно оттранслировать программу с отладочной информацией. Add Watch – добавить точку просмотра (watch). Точки просмотра используются для слежения за изменением значений переменных или полей структур данных. Add Breakpoint – добавить точку прерывания. Точка прерывания устанавливается на исполняемых строках программы и указывает отладчику на необходимость приостановки программы. Задания для самостоятельной работы 1. Для проекта, созданного в предыдущем пункте, откройте окно опций проекта. Смените главную форму приложения. Посмотрите, как изменился файл dpr. Запустите приложение на выполнение. Какая форма отрывается первой? 2. Откройте окно опций проекта. Перенесите часть форм из списка Auto-Create в список Available. Откройте файл dpr. Как он изменился? 3. В приложении создайте форму, не имеющую меню управления окном (меню в левом верхнем углу окна). Для закрытия окна необходимо создать кнопку, закрывающую окно. Контрольные вопросы 1. Что такое проект? Из каких файлов он состоит? 2. Если из проекта удалить файлы dof или res будет ли создаваться выполнимый файл? 3. Какие файлы могут быть удалены из проекта, и это не помешает созданию выполнимого файла? 4. Что такое форма? Как добавить форму к проекту? 5. Как из одной формы по кнопке открыть другую форму? Какие изменения должны быть внесены в модуль вызывающей формы? 6. Что такое модуль Pascal? Из каких основных частей он состоит? 7. Что означает ключевое слово uses в описании модуля? 8. Какую информацию может содержать интерфейсная часть модуля? Что содержится в части реализации модуля? 9. Как из одной формы сослаться на объект, находящийся в другой форме? 10. Как откомпилировать приложение? 11. Как запустить приложение на выполнение? 12. Как приостановить выполнение приложения? 13. Как прервать выполнение приложения, например в случае зависания? 14. Как получить доступ к опциям проекта? 15. Как форму сделать главной формой приложения? 16. Как открыть существующий проект? 17. Как открыть проект из числа недавно использовавшихся проектов? 18. Как сохранить все файлы, входящие в проект? 19. Как закрыть весь проект со всеми файлами, входящими в него? 20. Как добавить к проекту существующую форму? 21. Как удалить из проекта форму? Будет ли удаленная из проекта форма удалена физически? 1 3 0 Глава 8. Работа с базами данных в Delphi Как ранее было уже сказано, с помощью средств Delphi можно разрабатывать не только настольные приложения, но и приложения, работающие в архитектуре клиентсервер. Для этого Delphi использует масштабируемое ядро баз данных, позволяющее работать как с локальными таблицами, так и удаленными серверами баз данных. Причем обеспечивается совместимость с серверами Oracle, Sybase, Informix, InterBase, MS SQL Server и др. Delphi позволяет разработчику быстро создавать и свободно распространять приложения с архитектурой клиент\сервер. В данном методическом пособии рассматривается разработка приложений клиент-сервер, для создания серверной части используется сервер баз данных Interbase, для создания клиентской части – программное средство Delphi. Создание базы данных в Interbase Прежде чем начать рассказ о создании клиентской части приложения для баз данных необходимо создать базу данных и объекты в ней. Для создания базы данных Interbase можно использовать утилиту IBConsole. Давайте с помощью утилиты IBConsole создадим базу данных для нашего учебного примера «Приемная комиссия вуза». Утилита доступна через меню Пуск| Все программы| Interbase| IBConsole. Для работы с утилитой сначала необходимо зарегистрировать сервер через меню Server|Register. Открывается окно, изображенное на рис. 8.1. Рис. 8.1. Необходимо выбрать тип сервера: локальный или удаленный. Local server – это локальный сервер Interbase, установленный на этой же рабочей станции. Remote server – это удаленный сервер, установленный на одном из компьютеров в сети. 1 3 1 Server Name – это имя сервера. Для локального сервера это просто имя устройства, например С или D. Для удаленного сервера это имя сервера в сети. Network Protocol – это сетевой протокол. Как правило, указывается протокол TCP/IP. Alias name – имя алиаса базы данных. Это произвольное имя, которое указывает пользователь, например «BD». User Name – имя пользователя, по умолчанию создается пользователь SYSDBA. Password – пароль пользователя Interbase, по умолчанию пользователь SYSDBA имеет пароль «masterkey». Для создания базы данных щелкаем правой кнопкой мыши на узле Database и выбираем из контекстного меню Create Database. Появляется окно, изображенное на рис. 8.2. Рис. 8.2. Где Filename(s) – позволяет ввести путь к файлу базы данных. Это файл с расширением gdb. База данных может храниться в нескольких файлах, но мы рассмотрим самый простой случай, когда база данных находится в одном файле. Alias – имя алиаса для доступа к базе данных, поле является обязательным для заполнения. То, что у вас должно получиться изображено на рис. 8.3. 1 3 2 Рис. 8.3. Для создания объектов в базе данных и наполнения их данными наиболее удобна утилита Database Explorer. Псевдонимы. Утилита Database Explorer Доступ к базе данных осуществляется с помощью утилиты Database Explorer. Запуск утилиты выполняется в окне разработки Delphi через меню Database подменю Explorer. Функции утилиты реализуются посредством меню, либо с помощью панели инструментов, которая дублирует основные функции меню. Для работы с базой данных необходимо создать алиас или псевдоним. Псевдоним (Alias) – это независимое от системы имя, которое используется для обращения к базе данных. Приложение знает базу данных под псевдонимом. Благодаря псевдониму приложение не зависит от конкретного физического расположения базы данных, т.е. не знает имя носителя и конкретную структуру каталогов. Псевдонимы упрощают перенос базы данных на другие запоминающие устройства и в другие каталоги. Кроме того, псевдоним скрывает от приложения внутреннюю структуру базы данных, так как она может храниться, например, в формате Paradox или MS Access. Утилита позволяет: создавать новые псевдонимы (алиасы); изменять параметры псевдонима; удалять существующие псевдонимы; просматривать объекты базы данных через псевдоним; создавать новые объекты базы данных; выполнять SQL-предложения. При просмотре вы видите не только все объекты базы данных, но также и данные, которые они содержат. Утилита позволяет вводить операторы языка SQL, с помощью которых можно создавать новые объекты базы данных. Обеспечивается удобный 1 3 3 просмотр и ввод информации в таблицы. Окно утилиты Database Explorer изображено на рис. 8.4. Рис. 8.4. В левом окне утилиты вы видите список доступных алиасов, в правом окне – параметры текущего алиаса. Для создания нового алиаса необходимо щелкнуть правой кнопкой мыши в левом окне и из контекстного меню выбрать New. В окне Database Driver Name выбирается драйвер. Для работы с сервером Interbase необходимо выбрать INTRBASE, как показано на рис. 8.5. Рис. 8.5. Новому алиасу будет присвоено имя по умолчанию, например Interbase1, которое вы можете изменить. В правом окне вы увидите список параметров данного алиаса, наиболее важные из которых перечислены ниже. USER NAME – идентификатор пользователя, это имя пользователя СУБД Interbase. 1 3 4 SERVER NAME – путь к вашей базе данных, например для базы данных, расположенной на удаленном сервере Interbase и работающей под управлением операционной системы Windows NT этот путь может выглядеть так: 205x:d:\baza\303a\hotel.GDB, где 205x - имя выделенного сервера баз данных, d:\baza\303a\hotel.GDB – путь к базе данных. LANGDRIVER – языковой драйвер, выбираемый из списка (для баз данных Interbase, созданных с символьным набором Win1251, выбирать драйвер PDOX ANSI Cyrillic) . OPEN MODE – режим открытия данных (READ/WRITE или READ ONLY). SQLQRYMODE – режим выполнения SQL-запросов, может принимать одно из следующих значений: NULL – запрос сначала посылается на SQL-сервер, если его нет, то на локальный сервер. SERVER – запрос направляется только на SQL-сервер. LOCAL – запрос выполняется исключительно локально. После создания алиаса необходимо сохранить все изменения с помощью кнопки APPLY кнопочной панели. По умолчанию все алиасы сохраняются локально в файле IDAPI32.CFG. Затем необходимо выполнить соединение с базой данных, для этого нужно выбрать кнопку «Open or Close» кнопочной панели. После соединения с базой данных пользователь видит структуру базы данных через алиас (рис. 8.6). Рис. 8.6. В правом окне утилиты SQL Explorer располагаются несколько вкладок. Вкладка «Definition» позволяет узнать, кто является владельцем объекта. На вкладке «Text» располагается оператор SQL, с помощью которого создан данный объект. Вкладка «Data» позволяет просмотреть и изменять данные таблиц. Вкладка «Enter SQL» позволяет задать SQL-оператор и выполнить его с помощью кнопки «Execute Query». Объекты базы данных можно создавать двумя способами: 1 3 5 1. С помощью предложений языка определения данных SQL. 2. В режиме диалога по правой кнопке мыши в окне утилиты Database Explorer. Например, на рис.8.7 показано, как создать таблицу. Для этого щелкаем на пункте «Tables» и выбираем из меню «New». Задаем имя таблицы. Рис. 8.7. Создание таблицы в диалоге Аналогично, создаются поля таблицы. При щелчке на пункте «Column» выбираем «New». В правой части окна утилиты SQL Explorer необходимо задать свойства поля, т.е. тип поля, его размер, может ли поле принимать пустое (Null) значение, как показано на рис. 8.8. Аналогично создаются первичные ключи и связи между таблицами. После создания объектов базы данных необходимо сохранить все изменения, выбрав кнопку «APPLY». Рис. 8.8.Создание полей таблицы в диалоге 1 3 6 Задание для самостоятельной работы 1. Создать таблицы для приложения «Приемная комиссия вуза» и заполнить их значениями. Так как Interbase не допускает при задании имен использование русских букв, рекомендуем дать следующие имена таблицам: Facalty (Факультет) Abiturient (Абитуриент) Examine (Экзамен) Results (Результаты) Users (Пользователи). Структура таблиц может быть, например, такой, как приведена ниже. Таблица 8.1. Структура таблицы Facalty(Факультет) Имя атрибута Тип Размер Описание N_fac Smallint 2 байта Номер факультета, идентифицирует записи в таблице, первичный ключ Name_fac Char 50 Название факультета Telefon Char 50 телефон деканата FIO Char 50 ФИО декана Имя атрибута Nom Fam Im Otch Adres Pol N_fac Тип smallint char char char char char smallint Foto blob Имя атрибута N_user Fam Im Otch dolgn N_fac Тип smallint char char char char smallint Passw Login char char Таблица 8.2. Структура таблицы Abiturient(Абитуриент) Размер Описание 2 № экзаменационного листа, первичный ключ 50 Фамилия 20 Имя 20 Отчество 50 Адрес 1 Пол smallint Номер факультета, внешний ключ, ссылающийся на таблицу Faculty Фото Таблица 8.3. Структура таблицы Users(Пользователи) Размер Описание 2 № пользователя, первичный ключ 50 Фамилия 20 Имя 20 Отчество 30 Должность 2 Номер факультета, внешний ключ, ссылающийся на таблицу Faculty 10 Пароль 10 Логическое имя Таблица 8.4. Структура таблицы Exemine(Экзамен) 1 3 7 Имя атрибута Nomer Name_ex N_Fac Тип smallint char smallint Размер 2 50 2 Data date 8 Имя атрибута Nomer N_abit Тип smallint smallint Размер 2 50 N_exam smallint 2 Ball smallint 2 Описание № записи, первичный ключ Название экзамена Номер факультета, внешний ключ, ссылающийся на таблицу Faculty Дата проведения Таблица 8.5. Структура Results(Результаты) Описание № записи, первичный ключ Номер абитуриента, внешний ключ, ссылающийся на таблицу Abiturient Номер экзамена, внешний ключ, ссылающийся на таблицу Exemine Оценка Можно создать таблицы в диалоге утилиты SQL Explorer или воспользоваться SQLоператорами, приведенными ниже: CREATE TABLE FACULTY (N_FAC SMALLINT NOT NULL PRIMARY KEY, NAME_FAC CHAR(50), TELEFON CHAR(50), FIO CHAR(50)); CREATE TABLE ABITURIENT (NOM SMALLINT NOT NULL PRIMARY KEY, FAM CHAR(50), IM CHAR(20), OTCH CHAR(20), ADRES CHAR(20), POL CHAR(1) CHECK (POL IN ('М','Ж')), N_FAC SMALLINT REFERENCES FACULTY, FOTO BLOB); CREATE TABLE USERS( N_USER SMALLINT NOT NULL PRIMARY KEY, FAM CHAR(50), IM CHAR(20), OTCH CHAR(20), DOLGN CHAR(30), N_FAC SMALLINT REFERENCES FACULTY, PASSW CHAR(10), LOGIN CHAR(10)); CREATE TABLE EXEMINE( NOMER SMALLINT NOT NULL PRIMARY KEY, NAME_EX CHAR(50), N_FAC SMALLINT REFERENCES FACULTY, DATA DATE); CREATE TABLE RESULTS( 1 3 8 NOMER SMALLINT NOT NULL PRIMARY KEY, N_ABIT SMALLINT REFERENCES ABITURIENT, N_EXAM SMALLINT REFERENCES EXEMINE, BALL SMALLINT CHECK (BALL BETWEEN 2 AND 5)); 2. Заполнить таблицы данными, по 5 записей в каждой таблице. Первое приложение для работы с базами данных Процесс создания приложения для баз данных принципиально не отличается от разработки любого другого приложения Delphi. Для этого нужно поместить в форму нужные компоненты и установить значения их свойств. В Палитре компонентов Delphi имеются вкладки, содержащие компоненты для работы с базами данных. Вкладки «BDE» и «Data Access» содержат компоненты, обеспечивающие доступ к данным: Table, Query, Database, DataSource и др. Эти компоненты обеспечивают доступ к базе данных, но посредством только этих компонентов нельзя увидеть данные. Для визуализации данных используются компоненты, расположенные на вкладке «Data Control»: DBGrid, DBEdit, DBListBox и др. Взаимосвязь компонентов доступа и визуализации обеспечивается с помощью компонента DataSource (Вкладка «BDE»). Именно взаимодействие этих двух видов компонентов обеспечивает доступ к данным и их визуализацию. Взаимосвязь компонентов изображена на рис. 8.9. Приложение TDBGrid TDBEdit TDataSource TDBImage TDataSource TTable TQuery База данных Рис. 8.9. Использование компонентов для работы с базами данных Итак, для создания простейшего приложения для баз данных, обеспечивающего, например, просмотр данных в таблице, необходимо наличие как минимум трех компонентов в форме: компонента для доступа к данным, компонента для визуализации данных и компонента, обеспечивающего связь между ними. Например, помещаем в форму компоненты Table1:TTable, DataSource1:TDataSource, DBGrid1:TDBGrid. 1 3 9 Компонент доступа Table1 связывается с компонентом визуализации данных DBGrid1 с помощью компонента DataSource1. На рис. 8.10 схематично изображено, как должны быть связаны компоненты. Таблица 8.6 показывает, как должны быть установлены их свойства. Приложение DataSource1 Table1 База данных DBGrid1 (сетка) Рис. 8.10. Таблица 8.6. Взаимосвязь компонентов доступа и отображения данных Имя компоненты Свойство DBGrid1 DataSource DataSource1 DataSet Table1 DatabaseName Table1 TableName Table1 Active Значение DataSource1 Table1 <алиас БД> <имя таблицы> True Все значения компонентов выбираются из соответствующих списков. При задании свойства TableName объекта Table1 система всегда будет запрашивать пароль. Для того чтобы этого избежать, нужно использовать необязательный компонент TDatabase в форме. Установка свойства Active компонента Table1 в True позволяет увидеть данные из таблицы на этапе проектирования приложения. Для дальнейшей работы рассмотрим компоненты, позволяющие работать с базами данных, более подробно. Задание для самостоятельной работы Создать приложение, позволяющее просматривать в сетке (DBGrid) содержимое двух таблиц “Faculty” и “Abiturient”. Рекомендуется соответствующим компонентам Table присвоить имена связанных с ними таблиц, например: Faculty:TTabel, Abiturient: TTabel. Должно получиться, например, следующее: 1 4 0 Рис. 8.11. Использование компонента TDatabase Как вы заметили можно не использовать компонент Database для создания приложения для баз данных. Но использование Database в приложении позволяет: избавиться от необходимости каждый раз вводить пароль; обеспечивает единственное соединение с сервером; осуществляет контроль транзакций. Обычно требуется один компонент Database на все приложение. Основные свойства и методы перечислены в таблицах 8.7, 8.8. Таблица 8.7. Основные свойства класса TDatabase Свойство AliasName Connected DatabaseName DriverName KeepConnection LoginPrompt Params Описание Ссылается на используемый псевдоним BDE. Показывает, установлено ли соединение с базой данных. Определяет псевдоним для приложения. Определяет тип драйвера. Определяет, сохранять ли неактивные соединения с базой данных. Определяет, нужно ли запрашивать пароль. Массив строк, позволяющий хранить идентификатор пользователя и пароль. Таблица 8.8. Основные методы класса TDatabase Метод Open Close StartTransaction Описание Явно открывает соединение с базой данных. Явно закрывает соединение с базой данных. Явное начало транзакции. 1 4 1 Фиксировать изменения в базе данных. Отменить изменения. Commit Rollback Для того чтобы избежать вывода диалогового окна запроса пароля во время установки соединения с базой данных, нужно установить следующие свойства: 1. Свойство LoginPrompt установить равным False; 2. Свойство Params – массив строк, должен содержать следующую информацию: Username = <идентификатор пользователя> Password = <пароль>. Например: UserName=ITA Password=1 Установка свойства Connected в True позволяет соединиться с сервером на этапе проектирования. Свойство Connected должно быть установлено в False, для того чтобы вы могли менять любые свойства TDatabase. Единственный способ застраховаться от лишних связей с сервером состоит в использовании одного компонента TDatabase на все приложение. В этом случае все компоненты доступа (TTable, TQuery, TStoredProc) будут соединяться с базой данных через Database. Для этого нужно следующим образом установить свойства Database: 1. свойство Aliasname задает внешний псевдоним (т.е. тот, который задан в Database Explorer); 2. свойство DatabaseName – задает внутренний псевдоним, это любое корректное имя, посредством которого компоненты доступа вашего приложения соединяются с базой данных, т.е. соединение компонент доступа с Database выполняется через внутренний псевдоним; 3. у компонента DataSet (это может быть либо TTable, либо TQuery, либо TStoredProc) установите свойство DatabaseName равным значению внутреннего псевдонима. При открытии DataSet будет использовать связь, установленную с помощью Database, вместо того чтобы создавать свою собственную (рис. 8.12). Приложение Table1 База данных Database1 Query1 StoredProc 1 Рис. 8.12. Свойство TransIsolation компонента Database обеспечивает несколько уровней изоляции пользователей: 1. DirtyRead – «грязное» чтение, самый низкий уровень изоляции пользователей, видимы незавершенные изменения, производимые транзакциями. В InterBase не работает; необходим для совместимости с серверами Informix, Sybase, MS Server; 1 4 2 2. Read Committed – следующий уровень изоляции, видимы только завершенные изменения транзакций; 3. Reapitable Read – самый высокий уровень изоляции транзакций, при повторном чтении транзакция видит неизмененные данные. Компонент Database имеет методы для явного управления транзакциями: StartTransaction, Commit, Rollback. Любые Delphi-операции, не находящиеся под явным контролем, будут находиться под неявным контролем транзакций. В этом случае каждая SQL-операция с данными будет рассматриваться как отдельная транзакция. Задание для самостоятельной работы В приложение, созданное в предыдущем пункте, добавить компонент Database, один на все приложение и с его помощью: 1) отменить ввод пароля; 2) установить единственное соединение с сервером. Модули данных Модуль данных – это специальная форма, которая хранит не визуальные компоненты вашего приложения, такие, как компоненты доступа к базам данных ( TDatabase, TTable, TQuery, TDataSource и др.) или другие не визуальные компоненты (TTimer, TOpenDialog, TSaveDialog и др.). С модулем данных можно обращаться как с обычной формой, единственное отличие состоит в том, что он невидим во время выполнения. Использование модуля данных позволяет вам: размещать все компоненты доступа к данным в модуле данных вместо того, чтобы дублировать их для каждой формы вашего приложения; отделить бизнес-логику и доступ к данным от интерфейсной части вашего приложения, что упрощает поддержку приложений. Как правило, для приложения создается единственный модуль данных. В нем размещаются все не визуальные компоненты, необходимые вашему приложению. Модуль данных делается видимым для всех форм, использующих не визуальные компоненты, расположенные в нем. Модуль данных создается через меню File| New| DataModule. Так как модуль данных является формой, но только невидимой, то для доступа к элементам, расположенным в нем используется точно такой же подход, как и к элементам обычной формы (рис. 8.13) Рис. 8.13. Модуль данных. Задание для самостоятельной работы В приложение, созданное в предыдущем пункте, добавить модуль данных и все компоненты доступа приложения, такие как Database, DataSource, Table переместить в 1 4 3 модуль данных. Заново установить свойства компонентов доступа. Следует учесть, что главная форма приложения должна «видеть» модуль данных, иначе визуальные компоненты не смогут отображать содержимое таблиц. Отладить приложение. Работа с таблицей Для доступа к таблице используется компонент Table, который располагается на вкладке «BDE» палитры компонентов. Основные свойства и методы этого компонента обеспечивают вас всем комплексом функций, необходимых для работы с таблицей. Далее мы рассмотрим, что позволяет делать компонент Table. Открытие и закрытие таблицы Прежде чем выполнять какие-либо действия с таблицей, нужно ее открыть. Таблицу можно открыть двумя способами: либо установкой свойства Active в True, либо выполнением метода Open: Table1.Active := True; Table1.Open; Закрытие таблицы также можно выполнить двумя способами: Table1.Active := False; Table1.Close; Замечание. Изменения свойств таблицы можно производить, если таблица закрыта, т.е. свойство Active должно быть установлено в False. Задание для самостоятельной работы Как вы, должно быть, заметили в процессе выполнения предыдущего задания, каждый раз, когда вы меняете свойства компонента доступа Database, соединение с базой данных закрывается и необходимо открывать его снова. То же самое относится и к таблицам, при изменении любого из свойств компонента Table, таблица автоматически закрывается, т.е. свойство Active сбрасывается в False. Для того чтобы каждый раз не устанавливать соединение заново вручную, можно воспользоваться событием модуля данных: OnCreate. Это событие выполняется один раз при загрузке модуля данных в оперативную память. Для решения нашей проблемы необходимо написать следующий обработчик на это событие: DB.Connected:=true; Faculty.Open; Abiturient.Open; Где DB:TDatabase, Faculty:TTable, Abiturient:TTable. Т.е. автоматически устанавливается соединение с базой данных и выполняется открытие нужных таблиц. Предлагается таким образом улучшить приложение, созданное в предыдущем пункте. Перемещение по записям таблицы При навигационном доступе имеется понятие текущей записи, т.е. записи на которой установлен указатель. Для перемещения указателя по записям таблицы используются следующие методы компонента Table (см. таблицу 8.9 ). Таблица 8.9. Методы, позволяющие перемещаться по таблице 1 4 4 Метод First Last Next Prior Moveby(N) Описание Установить указатель на первую запись таблицы. Установить указатель на последнюю запись таблицы. Установить указатель на следующую запись. Установить указатель на предыдущую запись. При N>0, переместиться на N записей к концу относительно текущей, при N<0, переместиться на N записей к началу. Положение в таблице При перемещении указателя по записям таблицы, необходимо отслеживать выход указателя за границы таблицы. Это делается с помощью свойств EOF(end of file) и BOF(begin of file) компонента Table. Свойство BOF автоматически устанавливается в TRUE в трех случаях: при открытии таблицы; при вызове метода FIRST; если неудачно отработал метод NEXT. Свойство EOF автоматически устанавливается в TRUE также в трех случаях: если открывается пустая таблица; вызывается метод LAST; неудачно отработал метод NEXT. Например, следующий фрагмент кода выполняет заполнение списка ListBox1:TListBox значениями поля FIO таблицы Table1: Table1.Open; while not Table1.eof do begin ListBox1.Items.Add(Table1Fio.value); Table1.Next; end; Пояснение. Перед использованием открываем таблицу с помощью метода Open. Свойство eof компонента Table1 позволяет определить, достигнут ли конец таблицы. С помощью метода Next выполняется перемещение по записям таблицы. С помощью конструкции Table1Fio.value, о которой чуть позже, выполняется доступ к значению поля Fio таблицы. Работа с записями в таблице Прежде чем рассматривать методы для работы с записями в таблице, рассмотрим состояния, в которых таблица может находиться во время своей работы. Возможные состояния таблицы описаны в таблице 8.10: Таблица 8.10. Состояние Описание Inactive В этот режим таблица переводится при закрытии. Невозможно выполнение никаких действий с таблицей. Browse Режим по умолчанию. Устанавливается при открытии. Разрешен только просмотр, изменение данных запрещено. Edit Разрешено редактирование текущей записи. Insert Разрешено добавление новой записи. SetKey Позволяет производить поиск в таблице. 1 4 5 В каждое из этих состояний таблица переводится с помощью одноименного метода, что хорошо иллюстрирует рис. 8.14. Inactive Close Open Append, Insert SetKey Insert SetKey Browse Cancel, Post, FindKey Post,Delete Cancel,Delete, Post Edit Edit Рис. 8.14. Взаимосвязь состояний таблицы и методов Методы для работы с таблицей описаны ниже в таблице 8.11. Таблица 8.11. Методы для работы с таблицей Метод Описание Edit Переводит источник данных в положение Edit. Post Зафиксировать изменения в таблице. Пока не выполнен метод Post, можно выполнить метод Cancel, т.е. отменить все изменения. Append Добавить пустую запись в конец источника данных, требуется явный Post. Insert Вставить запись после курсора, требуется явный Post. Cancel Прервать текущую операцию. Delete Удалить текущую запись, Post не требуется. Под источником данных понимается таблица(TTable), запрос (TQuery) или хранимая процедура (TStoredProc). Метод Edit явно переводит таблицу в режим редактирования, после чего можно в нее вносить изменения. Метод Post центральный при взаимодействии приложений Delphi с источником данных. Фиксация изменений может быть выполнена явно или неявно как часть другого метода. Когда курсор перемещается с текущей записи, метод Post выполняется неявно. Например, выполняется программное редактирование записей: Table1.Edit; { таблица переводится в состояние Edit } { полю CustNo присваивается новое значение } Table1.FieldByName('CustNo').AsString:='12345'; Table1.Post; { зафиксировать изменения } Добавление пустой записи к таблице выполняется методами Append и Insert. Оба метода переводят таблицу в состояние Insert. Метод Insert добавляет пустую запись после текущей. Метод Append добавляет пустую запись в конец таблицы. Когда приложение вызывает Post, новая запись будет вставлена в позицию, определенную 1 4 6 индексом, если он есть. Таким образом, для индексированных таблиц методы работают одинаково. Метод Delete удаляет текущую запись и переводит таблицу в положение Browse. Курсор перемещается на следующую запись. Метод Cancel позволяет отменить изменения над текущей записью, если еще не выполнен Post. Существует группа методов, позволяющих не только добавлять запись к таблице, но и устанавливать определенные значения полей записи. Эти методы, описанные в табл. 8.12, жестко «завязаны» на структуру таблицы, поэтому их следует применять к таблицам, структура которых в дальнейшем не изменится. Таблица 8.12. Методы для работы с записями в таблице Метод AppendRecord ([массив значений]) InsertRecord ([массив значений]) SetFields ([массив значений]) Описание Добавляет запись с определенными значениями полей в конец таблицы, выполняется неявный Post. Вставляет запись с определенными значениями полей после текущей позиции курсора, выполняется неявный Post. Устанавливает значения соответствующих полей, требуется явный Post. В качестве параметра методы используют массив значений – это список значений через запятую. Значения могут быть литералами, переменными, пустыми значениями (null или nil). Пример. Имеем таблицу Country, состоящую из столбцов Name, Capital, Area. Метод AppendRecord добавляет запись к таблице и заполняет ее значениями: Country.AppendRecord (['Япония','Токио',344567]). Метод SetFields устанавливает новые значения полей для текущей записи. Перед использованием метода необходимо перевести таблицу в состояние Edit, после выполнения метода необходимо явно применить метод Post: Country.Edit; Country.SetFields ([nil,nil,100000]); Country.Post; Значения первого и второго поля не изменятся, третьему полю будет присвоено значение 100000. Доступ к полям таблицы. Компонент TField С каждым столбцом таблицы связывается свой компонент TField, позволяющий получать доступ к столбцу, определяющий тип данных столбца, текущее значение, формат вывода на экран, формат редактирования и др. Компонент TField имеет события (например OnValidate), позволяющие осуществлять контроль ввода. Компоненты TField создаются либо динамически во время выполнения программы, когда активизируется источник данных (TTable или TQuery), либо во время проектирования с помощью редактора полей Fields Editor. С помощью редактора полей создается постоянный набор компонентов TField, который не меняется, даже если изменить структуру базовой таблицы. Компоненты TField невидимы в форме, но очень важны, т.к. обеспечивают прямую связь приложения со столбцами таблицы. 1 4 7 Имя компонента, связанного с полем, генерируется системой путем присоединения к имени таблицы имени поля. Например, для поля Fio таблицы Faculty будет сгенерирован TField-компонент с именем FacultyFio. Существуют разнообразные TField-компоненты, соответствующие всем возможным типам данных: TStringField, TSmallintField, TIntegerField, TWordField, TBooleanField, TFloatField, TCurrencyField, TBCDField, TDateField, TTimeField, TDataTimeField. Мы будем рассматривать TField в целом, все это применимо для всех подтипов. Редактор полей Для создания постоянного набора TField-компонентов в приложении во время проектирования используется редактор полей. Использование редактора полей гарантирует, что каждый раз при запуске приложения вы увидите те же самые столбцы, в том же порядке, даже если были добавлены новые столбцы. Создание TField во время проектирования гарантирует, что компоненты доступа к базам данных и программный код, который базируется на определенных столбцах, работает, как ожидается. Если столбец из постоянного набора TField-компонентов удаляется, вырабатывается исключительная ситуация. Редактор полей позволяет создать постоянный набор TField-компонентов; изменить свойства TField-компонента; удалить TField из списка; добавить новый TField в список; создать вычисляемое поле. Доступ к редактору полей можно получить двумя способами: двойной щелчок на компоненте доступа (TTable или TQuery); щелкнуть правой кнопкой мыши на компоненте доступа и из контекстного меню выбрать Fields Editor. Для создания постоянного набора TField компонентов из контекстного меню в окне редактора полей выбрать Add Fields и из полученного списка полей выбрать нужные (рис. 8.15). Рис. 8.15. Окно редактора полей Чтобы изменить свойства нужного TField-компонента, получите доступ к его свойствам в Инспекторе объектов (рис. 8.16). 1 4 8 Рис. 8.16. Свойства компонента TField Для удаления TField компонента установите на него курсор в редакторе полей и нажмите клавишу Delete. Для добавления новых TField в список, в редакторе полей выберите Add Fields из контекстного меню и выберите нужные поля. Для создания вычисляемого поля из контекстного меню выберите New Fields, введите имя нового поля, задайте его тип и размер (рис. 8.17). Для вычисляемых полей выбирается тип Calculated, для полей, которые выбираются из других таблиц – тип Lookup. Рис. 8.17. Создание вычисляемого поля. Компонент TField для нового поля будет создан автоматически. После определения вычисляемое поле имеет пустое значение (null), до тех пор, пока вы не напишите программный код, по которому оно будет вычисляться. Код, по которому вычисляется поле, является обработчиком события OnCalcFields соответствующей DataSet. 1 4 9 Пример. Создать вычисляемое поле «налог» (nalog) в таблице Сотрудники (Sotr), равное «зарплате» (поле salary), умноженной на 0.12. Решение. Создадим новое поле nalog с помощью редактора полей. На событие OnCalcFields компонента Sotr:TTable, связанного с таблицей Сотрудники, напишем обработчик: SotrNalog.Value:= SotrSalary.Value*0.12; А теперь создадим новое поле, которое выбирается из другой таблицы. Например, в сетке мы хотим видеть не номер факультета, а его название, которое выбирается из таблицы Faculty (Факультеты). Для этого нужно повторить все тоже, что мы проделали при решении предыдущего примера, только теперь тип поля – Lookup. Рис. 8.18. Создание поля Lookup На рис. 8.18 список Dataset – задает таблицу, откуда берется значение, в нашем случае Faculty. Список Result Field – задает поле из таблицы Faculty, значение которого будет иметь создаваемое нами поле. Список Key Fields – задает поле из таблицы Abiturient, по которому идет связь с таблицей Faculty. Список Lookup Keys – задает поле из таблицы Faculty, по которому идет связь с таблицей Abiturient. Результат вы видите на рис. 8.19. 1 5 0 Рис. 8.19. Основные свойства компонента TField Наиболее важные свойства компонента TField перечислены в табл. 8.13. Таблица 8.13. Основные свойства компонента TField Свойство Alignment Calculated Currency DisplayFormat DisplayLabel DisplayWidth EditFormat Index MaxValue MinValue Name ReadOnly Size Tag Описание Выравнивание содержимого поля по левому, правому краю или по центру. Задает, является ли данное поле вычисляемым. Используется для числовых полей, представляет денежное значение (будет добавлено название той денежной единицы, которая установлена в Панели управления операционной системы). Определяет формат вывода. Задает имя столбца в DBGrid. Задает ширину в символах в DBGrid. Определяет формат ввода данных. Определяет порядковый номер поля в TTable или TQuery. Задает максимальное значение, которое может быть введено в поле. Задает минимальное значение, которое может быть введено в поле. Имя компонента TField. Если True, то поле можно только читать. Определяет максимальное число символов, которое может быть введено в символьное поле. Для нужд программиста 1 5 1 Visible Определяет, видимо ли поле Задание для самостоятельной работы Усовершенствуем наше приложение, созданное в предыдущем пункте. Создадим компоненты TField с помощью редактора полей для каждой из таблиц. Воспользуемся свойством DisplayLabel для задания названий полей по-русски и свойством DisplayWidth для задания ширины полей в сетке. Программный доступ к полям таблицы Программный доступ к полям таблицы осуществляется с помощью компонента TField. Но с помощью TField вы получаете только ссылку на нужное поле. Необходимо также указать, в каком виде хотите получить результат. Для этого используются функции преобразования. Delphi обеспечивает пять функций преобразования: AsFloat – используется для полей типа TFloat. AsInteger – используется для полей типа TFloat и TInteger. AsString – для всех видов полей. AsBoolean – используется для полей типа TBoolean. AsDateTime – используется для полей типа TDateTime. Функция преобразования может использоваться в любых выражениях, включающих TField-компонент. Пример: Edit1.Text:= KlientNom.AsString; В данном примере значение поля Nom числового типа из таблицы Klient будет преобразовано к символьному типу и присвоено свойству Text объекта Edit1. Существуют четыре способа программного доступа к полям таблицы, два из них связаны с компонентом TField, заданным для столбца, и два других со свойствами и методами компонента TTable, связанного с данной таблицей. 1-й способ. Доступ осуществляется с помощью самого компонента TField с использованием функции преобразования. Например: полю редактирования Edit1 присваивается значение поля Fio таблицы Klient, функция преобразования asString указывает тип значения: Edit1.Text:= KlientFio.AsString; 2-й способ. Доступ осуществляется с помощью свойства Value компонента TField. Пример: Edit3.Text:=KlientFio.Value; Свойство Value невидимо в Инспекторе объектов и доступно только во время выполнения. 3-й способ. Доступ осуществляется с помощью свойства Fields компонента DataSet (TTable, TQuery). Свойство Fields позволяет получить информацию о полях таблицы. Для доступа к определенному полю используется порядковый номер этого поля в таблице (нумерация с 0). Здесь также используется функция преобразования. Этот способ требует от вас знания порядка следования столбцов и их типов. Пример: Edit1.Text:= Klients.Fields[0].AsString; В этом примере поле редактирования Edit1 получает значение первого поля таблицы Klients. 4-й способ. Доступ осуществляется с помощью метода FieldByName компонента DataSet. В качестве параметра методу передается имя поля, к которому осуществляется доступ. Используется функция преобразования. Например: Edit2.Text:= Klients.FieldByName('Fio').AsString; 1 5 2 Задание для самостоятельной работы Создать несложное приложение, реализующее пользовательский интерфейс для доступа к информации об абитуриентах. Приложение должно выполнять следующие функции: Просмотр всех абитуриентов. Добавление нового абитуриента. Удаление абитуриента, на котором установлен курсор. Изменение информации об абитуриенте, на котором установлен курсор. Интерфейс приложения может выглядеть, например, так как изображено на рис. 8.20. Рис. 8.20. По кнопке «Добавить» можно добавить информацию о новом абитуриенте. При этом открывается форма, изображенная на рис. 8.21. По кнопке «Изменить» можно изменить информацию об абитуриенте, на котором установлен курсор (рис. 8.22). При этом открывается эта же форма, только теперь эта форма выполняет уже несколько иную функцию. В заголовке этой формы вы видите «Изменить информацию об абитуриенте», значения полей формы соответствуют значениям полей текущей записи, т.е. форма соответствующим образом настраивается. По кнопке «Удалить» удаляется текущая запись, при этом необходимо подтвердить удаление. 1 5 3 Рис. 8.21. Добавить информацию об абитуриенте Рис. 8.22. Изменить информацию об абитуриенте Как вы убедитесь, получается довольно трудоемкое программирование. Связано это с необходимостью программно заполнять список факультетов каждый раз при открытии формы, т.к. может быть добавлена информация о новом факультете. Кроме того, для изменения информации об абитуриенте перед открытием формы необходимо заполнить поля формы значениями текущей записи. Но упражнение полезное. В дальнейшем мы познакомимся с компонентами, напрямую связанными с полями таблиц, использование которых избавляет вас от утомительного программирования. 1 5 4 Сортировка и поиск в таблицах Для сортировки строк по определенному полю нужно указать значение одного из описанных ниже свойств компонента TTable (табл. 8.14). Таблица 8.14. Свойство IndexName IndexFieldNames Описание Используется для задания имени вторичного индекса, который существует для данной таблицы, и по которому будет осуществляться поиск/сортировка. Позволяет задать список имен полей, по которым будет производиться поиск/сортировка. Имена полей в списке разделяются знаком ';'(точка с запятой). Задание индексов не требуется. Несколько слов об индексах. Индексы это объекты базы данных, которые используются для быстрого доступа к нужным данным. Для полей первичного и внешнего ключей автоматически создаются системные индексы. Под вторичными индексами понимаются индексы, которые создаются программистом для других полей, по которым необходимо выполнять быстрый поиск или сортировку. Свойства IndexName и IndexFieldNames взаимоисключающие, т.е. задание одного автоматически очищает значение другого. Для поиска в таблицах используется метод Locate компонента Table. Locate использует самые быстрые доступные средства для соответствия критериям поиска. Если существует индекс, который может удовлетворить запрос поиска, Locate использует его. Найденная запись становится текущей. Метод выдает True в случае успешного поиска и False в случае неудачи. Формат: function Locate(const SearchColumns:string; const SearchValues:Variant; SearchOptions:TLocateOptions):Boolean; SearchColumns – задает имена полей, по которым ведется поиск. Символомразделителем полей в списке является ";" (точка с запятой). SearchValues – задает массив значений для поиска, при этом одиночные значения должны передаваться как явные варианты, т.е. значения типа variant, а несколько значений должны передаваться как массив вариантов, для этого используется функция VarArrayOf. SearchOptions – опции управления поиском. Это переменная-множество, которая может иметь два значения: loCaseInsensitive – точный поиск без учета регистра букв; loPartialKey – поиск по части значения с начала, чувствительный к регистру букв. Пример 1. Поиск абитуриента по фамилии, которую получаем в поле Edit1:TEdit: if not Abiturient.Locate('Fam', Edit1.Text, [LoCaseInsensitive]) then ShowMessage('Не найден'); Пример 2. Поиск абитуриента по фамилии и имени, в Edit1 получаем фамилию, в Edit2 – имя: if not Abiturient.Locate('Fam;IM', VarArrayOf([Edit1.Text, Edit2.Text]), [LoCaseInsensitive]) then ShowMessage('Не найден'); 1 5 5 Задание для самостоятельной работы Теперь мы готовы сделать поиск и сортировку для нашего приложения. По кнопке «Поиск» открывается форма, подобная той, что изображена на рис. 8.23. Рис. 8.23. Поиск абитуриента по заданному полю По кнопке «Сортировка» открывается форма как на рис. 8.24. Рис. 8.24. Сортировка по полю Диапазоны Диапазон задает множество последовательных строк, значения определенных полей которых попадают в заданные границы. Строки во множестве должны соответствовать последовательному набору ключей в текущем индексе. Методы SetRangeStart, SetRangeEnd, EditRangeStart, EditRangeEnd, ApplyRange и SetRange позволяют ограничить набор строк, видимых в вашем приложении. Метод SetRangeStart указывает, что за этим методом следует последовательность назначений начальной границы. Метод SetRangeEnd указывает, что за этим методом следует последовательность конечных назначений. Методы EditRangeStart и EditRangeEnd указывают, что существующие установки границ сохраняются и к ним могут быть добавлены новые. 1 5 6 Метод ApplyRange – выполнить ограничение. Метод CancelRange – отменить ограничение. Пример. В таблице Cust (покупатели) ограничение накладывается на поле CustNo (номер покупателя). Будут видимы покупатели, номера которых попадают в диапазон от StartVal.Text до EndVal.Text. Вы обязаны указать текущий индекс заданием одного из свойств IndexNames или IndexFieldNames. Решение. Cust.IndexFieldNames:='CustNo'; Cust.SetRangeStart; CustCustNo.AsString:=StartVal.Text; Cust.SetRangeEnd; CustCustNo.AsString:=EndVal.Text; Cust.ApplyRange; Фильтры Фильтры позволяют видеть в таблице только те записи, которые удовлетворяют определенным условиям, накладываемым на столбцы. Диапазоны позволяют выбирать последовательные строки в активном индексе, фильтры же являются более гибким средством фильтрации данных, чем диапазоны, так как позволяют накладывать более сложные ограничения на данные, для их использования не обязательно наличие индекса. Следующие свойства компонента TTable позволяют устанавливать фильтр (табл. 8.15). Таблица 8.15. Свойство Filter Filtered FilterOptions Описание Определяет выражение фильтра для ограничения строк, видимых в таблице. Синтаксис, поддерживаемый в выражении, подобен оператору where в SQL. Если равен True, то выполнить фильтр. Опции фильтрации. Опции фильтрации – это переменная-множество, которая может включать два возможных значения: foCaseInsensitive – фильтр игнорирует регистр данных; foNoPartialCompare – частичные совпадения полей не допускаются. Пример: with Sotrudniki do begin Filter:='nomer_otd=1'; Filtered:=True; end; В данном примере в таблице Сотрудники будут видимы строки, относящиеся только к сотрудникам первого отдела. Создание связи типа "главная–подчиненная" между двумя таблицами 1 5 7 Свойства MasterSource и MasterFields используются для создания отношения одинко-многим между двумя таблицами. Одна из таблиц является главной, другая подчиненной. В подчиненной таблице указатель записи перемещается в зависимости от указателя записи главной таблицы. Перемещаясь по записям главной таблицы, вы видите только соответствующие записи подчиненной таблицы. Оба свойства устанавливаются в подчиненной таблице и служат для связи ее с главной таблицей. В свойстве MasterSource задается источник данных для подчиненной таблицы, т.е. DataSource главной таблицы. В свойстве MasterFields указывается имя поля главной таблицы, которое связывает ее с подчиненной таблицей. Пример. Даны две таблицы: «Факультеты»(Faculty) «Абитуриенты»(Abiturients). Требуется создать форму, отображающую связь типа «главная-подчиненная» между этими таблицами, при этом таблица «Факультеты» – главная, «Абитуриенты» – подчиненная. Полем связи между таблицами является – «номер факультета». При перемещении по таблице «Факультеты», из таблицы «Абитуриенты» видима информация только об абитуриентах, поступающих на данных факультет. Решение. Установим в инспекторе объектов свойство MasterSource таблицы «Абитуриенты» равным источнику данных таблицы «Факультеты». Свойство MasterField устанавливается после установки свойства MasterSource. При установке свойства MasterField таблицы «Абитуриенты» рекомендуется использовать встроенный редактор свойств, который позволяет в диалоге установить связи между таблицами. На рис. 8.25 изображено окно редактора свойств для установки значения свойства MasterField. Рис. 8.25. Установка свойства MasterField В списках полей Detail Fields и Master Fields указываются поля соответственно подчиненной и главной таблицы, которые используются для связи таблиц друг с другом, в нашем случае это «номер факультета». По кнопке ADD устанавливается связь. Вид созданной формы на этапе выполнения показан на рис. 8.26. 1 5 8 Рис. 8.26. Другие методы компонента TTable Существует ряд других важных методов компонента TTable, описанных в табл. 8.16. Таблица 8.16 Основные методы компонента TTable Метод EmptyTable DeleteTable RenameTable EnableControls DisableControls CreateTable GetFieldNames GetIndexNames Описание Удалить все строки в таблице. Удалить таблицу. Переименовать таблицу. Разрешить совместное управление данными. Запретить совместное управление данными. Создать таблицу. Получить список полей таблицы. Получить список индексов таблицы. Компонент TTable имеет ряд важных событий, которые представлены в таблице 8.17. Таблица 8.17. Событие BeforeInsert BeforeDelete BeforeEdit AfterInsert AfterDelete AfterEdit Описание Наступает перед вставкой записи в таблицу Наступает перед удалением записи в таблице Перед редактированием записи После вставки записи в таблицу После удаления записи в таблице После редактирования записи в таблице. 1 5 9 Использование SQL в приложениях. Компонент TQuery Delphi позволяет посылать SQL-предложения на SQL-сервер с помощью компонента TQuery. Компонент TQuery имеет много общих свойств и методов с компонентом TTable. TTable обеспечивает переносимый доступ к базе данных и часто достаточен для простых операций с базой данных. Однако TQuery обеспечивает дополнительные возможности. Используйте TQuery для: многотабличных запросов (соединений); сложных запросов, которые требуют подзапросов; операций, которые требуют явного SQL-синтаксиса. Компонент TQuery использует язык SQL для доступа к базе данных. SQL обеспечивает всю мощь реляционного подхода. Но это может увеличить сложность приложения. Кроме того, использование специфического SQL-синтаксиса может уменьшить переносимость приложений, т.к. каждый SQL-сервер использует свой диалект SQL. Основные свойства и методы TQuery Основные свойства и методы TQuery, описаны в таблицах 8.18, 8.19. Таблица 8.18. Основные свойства класса TQuery Свойство Active Описание Используется для выполнения запроса. DatabaseName DataSource Псевдоним базы данных, с которой связан запрос. Определяет источник данных (DataSource), из которого берутся параметры запроса. Используется для задания параметров SQL-запроса. Содержит текст SQL-предложения. Params SQL Таблица 8.19. Основные методы класса TQuery Метод Open Close ExecSQL Prepare UnPrepare Описание Выполнить запрос, используется для запросов, возвращающих результат (таблицу). Закрыть текущий запрос. Выполнить запрос, для запросов, не возвращающих результат(таблицу). Подготовить запрос на выполнение, используется для оптимизации выполнения запроса. Освободить ресурсы, используемые методом Prepare. Динамические и статические SQL-предложения SQL-предложения могут быть статическими, т.е. полностью определяемыми на этапе проектирования, и динамическими, т.е. задаваемыми во время выполнения. 1 6 0 Статические SQL-предложения. Полностью задаются на этапе проектирования с помощью свойства SQL, которое содержит текст SQL-предложения. Результат выполнения статических SQL-предложений, возвращающих результат, можно увидеть на этапе проектирования. Например, мы хотим получить доступ к таблице «Абитуриенты» с помощью SQLпредложения - Select * from Abiturient, и увидеть результат на этапе проектирования. Для этого помещаем в форму три компонента: Query1, DataSource1, DBGrid1 (рис. 8.27). Query1 соединяется с DBGrid1 с помощью DataSource1, подобно тому, как мы это делали в случае компонента Table. При этом остальные свойства Query1 должны быть установлены так, как указано в табл. 8.20. DataSource1 Query1 БД DBGrid1 Рис. 8.27. Таблица 8.20. Установка свойств объекта типа TQuery для статического запроса Свойство DatabaseName SQL Active Значение Псевдоним базы данных. Select * from Sotr; True, для того чтобы увидеть результаты на этапе проектирования. Динамические SQL-предложения. Определяются на этапе выполнения и делятся на две категории: 1) SQL-предложение, не содержащее параметров, но сам текст SQL-предложения формируется во время выполнения; 2) SQL-предложения, содержащие параметры. Рассмотрим первую категорию SQL-предложений. Свойство SQL задает текст SQL-предложения и имеет тип TString, т.е. это серия строк в списке. Список ведет себя как массив, но это действительно специальный класс с уникальными возможностями. Свойство SQL имеет методы, позволяющие работать с ним как с обычным списком, т.е. очищать список (метод Clear), добавлять новый элемент в список (метод Add) и др. Рассмотрим пример: по введенному номеру факультета выводится список всех абитуриентов, поступающих на этот факультет. Внешний вид формы, на этапе проектирования, реализующей этот пример может быть таким, как изображено на рис. 8.28. Конечно, компоненты доступа, Query1 и DataSource1 следует помещать в модуле данных, как мы уже рассмотрели это ранее. Но для простоты и наглядности, поместим их здесь же. 1 6 1 Рис. 8.28. По кнопке «Выбрать» будет выполняться программный код, который будет формировать SQL-предложение и запускать его на выполнение: with Query1 do begin Close; { закрыть предыдущий запрос } Sql.Clear; { очистить свойство SQL для создания нового запроса } {формируем текст запроса программным путем} Sql.Add('select * from Abiturient ‘); Sql.Add(' where N_fac='+ Edit1.Text); Sql.Open; { выполнить запрос } end; Первый оператор внутри блока with – Close, закрывает результат выполнения предыдущего запроса, если этого не сделать запрос отработает правильно только один раз. Следующий оператор Sql.Clear – очищает свойство SQL, подготавливая его для формирования нового запроса. Следующие два оператора формируют текст запроса программным путем. Оператор Open – выполняет запрос. Результат выполнения запроса будет виден в сетке. Рассмотрим вторую категорию SQL-предложений, содержащих параметры на этом же простом примере. Для того чтобы отличить параметр от столбца, перед именем параметра ставится двоеточие ':' . При этом текст SQL-предложения с параметром должен содержаться в свойстве SQL объекта Query1 (рис. 8.29) и должен выглядеть, так: Select * from Abiturient where N_Fac=:N_Fac; где N_Fac – это параметр, значение которого задается во время выполнения программы. Имя параметра может совпадать с именем столбца. Запрос может содержать несколько параметров. 1 6 2 Рис. 8.29. Свойство SQL объекта Query1 На этапе проектирования необходимо задать типы параметров с помощью свойства Params объекта Query1, которое содержит встроенный редактор параметров. Редактор параметров позволяет задавать не только типы параметров, но также и их значения (рис. 8.30). Рис. 8.30. Окно редактора параметров с параметром N_fac. Выделив параметр в редакторе параметров, получим доступ к свойству параметра в инспекторе объектов, как указано на рис. 8.31. Рис. 8.31. 1 6 3 Следует установить тип данных параметра, свойство DataType, равным smallint и свойство ParamType, тип параметра, равным Input, т.е. входной. Задав значение параметра (свойство value) во время проектирования, можно увидеть данные запроса, если SQLпредложение возвращает таблицу, установив значение свойства Active компоненты TQuery равным True. Программный код на кнопку «Выбрать» может иметь следующий вид: with Query1 do begin Close; ParamByName('N_fac').AsString:=Edit1.Text; Open; end; Метод Close закрывает результат выполнения предыдущего запроса, если опустить метод Close, то запрос отработает только один раз. Метод ParamByName компонента Query1 позволяет задать значение параметра по его имени. Если параметров несколько, то метод ParamByName выполняется для каждого параметра. Метод Open выполняет запрос. Возможность изменения данных базовой таблицы через запрос Данные базовой таблицы, т. е. таблицы, на основе которой создан запрос, могут быть изменены через запрос с использованием компоненты Query. Для этого необходимо установить свойство RequestLive компонента Query равным True. При этом для серверов баз данных на запрос, позволяющий менять базовую таблицу, накладываются следующие ограничения: запрос может включает только одну таблицу; select-предложение не должно включать уточнитель order by и агрегатные функции, такие как sum, avg и т.п. По умолчанию Query возвращает данные только для чтения. Компоненты управления данными В этом разделе приводится краткое описание наиболее важных интерфейсных компонентов, осуществляющих визуализацию данных из базы данных. Компоненты располагаются на вкладке Data Control палитры компонентов. Характерным для этих компонентов является то, что они напрямую связаны с данными таблиц. Для каждого компонента приводится описание наиболее важных свойств, событий и методов, обеспечивающих его функциональность. Компонент TDBText Этот компонент позволяет отображать данные из полей таблиц, при перемещении по таблице TDBText отображает значение связанного поля текущей записи из таблицы 8.21. Таблица 8.21. Основные свойства компонента TDBText Свойство DataSource DataField Описание Задает источник данных Задает имя связанного поля, значения которого отображает данный компонент. 1 6 4 AutoSize Используется для отображения полей переменной длины, если равен true, размер объекта автоматически изменяется в соответствии с размером поля. Задание для самостоятельной работы Поместим компонент типа TDBText в форму и свяжем его с полем FIO таблицы Abiturient с помощью двух свойств DataSource и DataField, причем сначала устанавливается свойство DataSource, затем свойство DataField выбирается из списка свойств. Как вы увидите, элемент позволяет только отображать значение поля текущей записи, изменение поля не допускается. Компонент TDBEdit Компонент TDBEdit используется для изменения значения связанного поля таблицы. Пользователь может редактировать поле через компонент TDBEdit, если: 1) таблица находится в положении Edit; 2) свойство CanModify компонента DataSet равно True; 3) свойство ReadOnly компонента DBEdit равно False. В табл 8.22 перечислены наиболее важные свойства компонента. Таблица 8.22. Основные свойства компонента TDBEdit Свойство DataSource DataField Описание Задает источник данных для связи с компонентом доступа. Задает имя поля, с которым связан DBEdit. Изменения, сделанные в поле, фиксируются в таблице автоматически при перемещении по таблице или по кнопке Post компонента TDBNavigator. Задание для самостоятельной работы Поместите компонент типа TDBEdit в область формы, и с помощью свойств DataSource и DataField свяжите его с полем любым таблицы Abiturient. Как вы увидите, элемент позволяет изменять содержимое поля. При переходе на другую запись, измененное значение поля автоматически фиксируется. Компонент TDBGrid Компонент TDBGrid – сетка, позволяющая осуществлять просмотр и редактирование таблицы. С помощью редактора полей можно установить порядок вывода полей, их формат, размер, установить русские заголовки полей при просмотре и т.д. Во время выполнения можно добавлять новые записи и изменять существующие, если выполнены следующие условия: 1) свойство CanModify (DataSet) равно True; 2) свойство ReadOnly (DBGrid) равно False. По умолчанию для DBGrid изменения посылаются в DataSet только тогда, когда вы перемещаетесь к следующей записи. По клавише Esc можно отменить изменения, если вы еще не переместились на следующую запись (см. табл. 8.23 и 8.24). 1 6 5 Таблица 8.23. Основные свойства компонента TDBGrid Свойство DataSource Options Описание Задает источник данных. Набор вложенных свойств, задает опции для сетки: dgEdit – разрешено ли редактирование; dgTitles – нужно ли выводить заголовки полей; dgColLines – нужно ли выводить разделитель столбцов; dgRowLines – нужно ли выводить разделитель строк; dgConfirmDelete – подтверждать ли удаление; dgCancelOnExit – True, при выходе из сетки по Esc; последняя добавленная запись не посылается в базовую таблицу. Это препятствует попаданию в таблицу пустых и частично заполненных записей. Таблица 8.24. Основные события компонента TDBGrid Событие OnColEnter OnColExit OnDblClick OnDragDrop OnDragOver OnEnter OnExit OnKeyDown OnKeyPress OnKeyUp Когда возникает При получении столбцом фокуса ввода. При потере столбцом фокуса ввода. При двойном щелчке на сетке. При перемещении и отпускании на сетке. При перетаскивании из сетки. При получении сеткой фокуса ввода. При потере сеткой фокуса ввода. При нажатии клавиш или комбинации клавиш в сетке. При нажатии одной клавиши в сетке. При отпускании клавиши. Компонент TDBNavigator Компонент TDBNavigator содержит группу кнопок, позволяющих перемещаться по записям базовой таблицы, добавлять, удалять, редактировать записи (см. табл. 8.25). Таблица 8.25. Основные свойства компонента TDBNavigator Свойство DataSource VisibleButton ConfirmDelete ShowHints Hints Описание Задает источник данных. Набор вложенных свойств, задающих набор кнопок. Подтверждать ли удаление записи. Показывать ли подсказки к кнопкам. Свойство типа массив, содержащий названия кнопок навигатора. Задание для самостоятельной работы 1 6 6 В нашем приложении, разработанном в предыдущих пунктах создать новую форму добавления/изменения записей в таблице «Абитуриенты» с использованием компонентов визуализации данных DBEdit и элементом DBNavigator. Форма на этапе проектирования может иметь следующий вид (рис. 8.32). Рис. 8.32. Для того, чтобы не создавать элементы типа DBEdit вручную, можно использовать следующий прием. Необходимо открыть редактор полей таблицы «Абитуриенты», выбрать все поля и отбуксировать их в область формы. Элементы DBEdit будут сформированы автоматически (рис. 8.33). Отладить приложение. 1 6 7 Рис. 8.33. Компонент TDBImage Используется для вывода графики, хранящейся в BLOB-полях таблиц. Компонент позволяет редактировать графические образы путем вырезки и вставки. Основные свойства и методы описаны ниже (см. табл 8.26, 8.27). Таблица 8.26. Основные свойства компонента TDBImage Свойство DataSource DataField Picture AutoDisplay Описание Задает источник данных. Задает имя поля, с которым связан DBImage. Свойство имеет метод LoadFromFile, который позволяет загрузить рисунок из файла. Если False, то позволяет отменить вывод картинки на экран, выводится только имя поля; удобно для быстрого перемещения по таблице. Для того чтобы получить изображение, нужно дважды щелкнуть на объекте DBImage. Таблица 8.27. Основные методы компонента TDBImage Метод CutToClipboard Описание Вырезать в буфер. 1 6 8 Копировать в буфер. Вставить из буфера. CopyToClipboard PasteFromClipboard Компонент TDBComboBox Компонент TDBComboBox – это поле редактирования со списком, позволяет редактировать поле текущей записи таблицы с помощью выпадающего списка выборов и вводить новые значения, не содержащиеся в списке. Выбранное из списка значение становится значением связанного поля текущей записи. При перемещении по таблице в списке подсвечивается то значение, которое соответствует значению поля текущей записи. Если такого значения нет в списке, ничего не подсвечивается. Основные свойства описаны в табл. 8.28. Таблица 8.28. Основные свойства компонента TDBComboBox Свойство DataSource DataField Items Style ItemHeight Sorted Описание Задает источник данных. Задает имя поля, с которым связан TDBComboBox. Задает элементы списка выборов. Задает стиль отображения списка. Может принимать следующие значения: csDropDown (по умолч.) – выводится выпадающий список с областью редактирования; csSimple – выводится одноэлементный прокручиваемый cписок; csDropDownList – выводится прокручиваемый список без возможности ввода новых значений, не содержащихся в списке; csDropDownCount задает максимальное число видимых элементов списка; если число элементов больше, можно прокрутить список. Задает высоту элемента списка для стиля csOwnerDrawFixed. Задает упорядоченность элементов по алфавиту. Компонент TDBListBox Компонент TDBListBox подобен DBComboBox, только вместо выпадающего списка выводится прокручиваемый список доступных выборов. Выбранное значение из списка становится значением связанного поля текущей записи. Не разрешается вводить новые значения в список. При перемещении по таблице в списке подсвечивается то значение, которое соответствует значению поля текущей записи. Если текущее значение отсутствует в списке, ничего не подсвечивается. Основные свойства описаны в табл. 8.29. Основные свойства компонента TDBListBox Таблица 8.29. Свойство DataSource DataField Items Описание Задает источник данных. Задает имя поля, связанного со списком. Определяет элементы списка. 1 6 9 Задание для самостоятельной работы Улучшим нашу форму для ввода и редактирования записей таблицы, созданную в предыдущих пунктах. Для выбора номера факультета будем использовать список TDBComboBox (рис. 8.34). Перед использованием, например на событие формы OnActivate, необходимо программно заполнить список значениями поля «Название факультета» из таблицы «Факультеты», используя свойство Items. Рис. 8.34. Компонент TDBRadioGroup Компонент TDBRadioGroup позволяет создавать группу радио-кнопок, напрямую связанную с полем таблицы. Основные свойства элемента приведены в таблице 8.30. Таблица 8.30 Свойство DataSource DataField Caption Items Values Описание Задает источник данных. Задает имя поля, связанного со списком. Заголовок группы Определяет элементы в списке, как их видит пользователь Список значений, которые соответствуют элементам списка Items, именно значения этого списка будут присвоены связанному полю. Свойство Items задает список имен группы радио-кнопок, как их будет видеть пользователь. Свойство Value задает необязательный список значений, которые соответствуют элементам списка Items. Например, названия радио-кнопок для выбора поля абитуриента – «мужской», «женский», содержатся в свойстве Items. Значения, которые будут занесены в базу данных и соответствуют списку Items – «м» и «ж», должны располагаться в списке Values. 1 7 0 Задание для самостоятельной работы Улучшим нашу форму ввода и редактирования путем добавления интерфейсного элемента TDBRadioGroup для выбора пола (рис. 8.35). Рис. 8.35. Компонент TDBCheckBox Компонент TDBCheckBox – это флажок, напрямую связанный с полем в таблице. Этот интерфейсный элемент может принимать только два возможных значения: true и false, истина и ложь, да и нет, yes и no. Основные свойства компонента TDBCheckBox приведены в таблице 8.31. Таблица 8.31. Свойство DataSource DataField Check Caption Описание Задает источник данных. Задает имя поля таблицы, с которым связан элемент. Если равен true, то элемент выбран Подпись флажка Компонент TDBLookupComboBox Компонент TDBLookupComboBox позволяет создавать список, который динамически черпает свои элементы из связанного поля другой таблицы. Компонент позволяет создавать многоколоночные списки. Нельзя вводить новые значения в список. При перемещении по главной таблице подсвечивается тот элемент списка, который соответствует значению связанного поля текущей записи главной таблицы, если такого значения нет в 1 7 1 списке, ничего не подсвечивается. Выбор значения из списка меняет значение столбца базовой таблицы, как если бы оно было введено через компонент DBEdit. Основные свойства описаны в табл. 8.32. Таблица 8.32. Основные свойства компонента TDBLookupComboBox Свойство DataSource DataField ListSource ListField KeyField KeyValue Описание Задает источник данных главной таблицы. Задает имя поля главной таблицы, с которым связан список. Определяет источник данных таблицы, откуда берутся значения списка. Определяет поле или список полей, которые будут видны в списке. Разделителем списка является – ';' (точка с запятой). Задает имя поля связанной таблицы, значения которого должны соответствовать значениям поля DataField главной таблицы. Возвращает значение выбранного элемента списка. Разберем на примере нашей формы как нужно установить значения свойств компонента TDBLookupComboBox, для того, чтобы список отражал значения поля «Название факультета» из таблицы «Факультеты». Для этого в форме, разработанной в предыдущих пунктах наших упражнений, заменим список DBComboBox на список TDBLookupComboBox, как показано на рис. 8.36. Как вы увидите, использование списка TDBLookupComboBox не требует вообще никакого программирования. Установим свойства TDBLookupComboBox так, как показано в табл. 8.33. Таблица 8.33. Свойство Описание DataSource Задает DataSource таблицы «Абитуриенты» DataField Задает имя поля таблицы «Абитуриенты», с которым связан список, это поле N_FAC. ListSource Определяет DataSource таблицы «Факультеты», откуда берутся значения списка. ListField Имеет значение «N_FAC; NAME_FAC» – это список полей из таблицы «Факультеты», которые будут видны в списке. Разделителем списка является – ';' (точка с запятой). KeyField Имеет значение «N_FAC» и задает имя поля таблицы «Факультеты», значения которого соответствуют значению поля N_FAC таблицы «Абитуриенты». 1 7 2 Рис. 8.36. Компонент TDBLookupListBox Интерфейсный элемент TDBLookupListBox представляет собой функционально то же, что и DBLookupComboBox, но вместо выпадающего списка выводится прокручиваемый список возможных выборов. При выборе значения из списка полю главной таблицы назначается это значение. Имеет свойства и методы, аналогичные компоненту TDBLookupComboBox. Задание для самостоятельной работы Познакомившись с интерфейсными элементами, напрямую связанными с полями таблиц, воспользуемся ими для создания форм ввода и редактирования данных. Создадим форму, обеспечивающую просмотр, добавление, редактирование и удаление записей в таблицу «Абитуриенты»(Abiturient). Внешний вид формы на этапе проектирования изображен на рис. 8.37. Она включает сетку (DBGrid1), в которой разрешается только просмотр записей таблицы «Абитуриенты». Для редактирования текущей записи и добавления новых записей используется блок справа, который состоит из интерфейсных элементов, напрямую связанных с полями таблицы «Абитуриенты». В качестве контейнера для этих интерфейсных элементов используется компонент Panel1:TPanel. Для выбора факультета используется выпадающий список названий факультетов, который выбирается динамически из таблицы «Факультеты». Но при выборе названия факультета из списка в поле таблицы «Абитуриенты» заносится не название факультета, а его номер. Для выбора пола абитуриента будем использовать группу радио-кнопок. Двойной щелчок на фотографии открывает стандартную диалоговую форму Windows для выбора фотографии из файла. При выборе файла фотографии, она заносится в поле базы данных. Необходимо снабдить кнопки навигатора всплывающими подсказками. 1 7 3 Для загрузки фотографии в BLOB-поле таблицы «Абитуриенты» необходимо использовать метод LoadFromFile компонента TField, связанного с полем FOTO. Код загрузки может иметь следующий вид: if OpenDialog1.Execute then begin DM.Abiturient.Edit; Dm.AbiturientFOTO.LoadFromFile(OpenDialog1.FileName); Dm.Abiturient.Post; end; Рис. 8.37. Внешний вид формы на этапе выполнения имеет вид, изображенный на рис. 8.37. 1 7 4 Рис. 8.38. 1 7 5