МИНОБРНАУКИ РОССИИ ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ «ПРИАМУРСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИМЕНИ ШОЛОМ-АЛЕЙХЕМА» Факультет информационных и промышленных технологий СОЗДАНИЕ БАЗ ДАННЫХ В СРЕДЕ ПРОГРАММИРОВАНИЯ DELPHI Лабораторный практикум Автор-составитель: С.В. Фефелова Биробиджан ФГБОУ ВПО «ПГУ им. Шолом-Алейхема» 2014 1 Печатается по решению редакционно-издательского совета ГОУ ВПО «Дальневосточная государственная социально-гуманитарная академия» Создание баз данных в среде программирования Delphi: Лабораторный практикум / авт.-сост.: С.В. Фефелова. – Биробиджан: Изд-во ПГУ им. ШоломАлейхема, 2014. – 33 с. Учебно-методическое пособие разработано применительно к программе учебного курса «Прикладное программирование» для обучающихся по специальности 230115 «Программирование в компьютерных системах». Лабораторные работы в практикуме, затрагивают четыре основные темы: проектирование БД, создание приложения в Delphi, Связь БД и Delphi и организация запросов на SQL. Лабораторные работы содержат вводную часть, где кратко описывается понятийный аппарат и постановку задачи, а также ход работы, где пошагово описываются операции, которые необходимо выполнить студенту на практических занятиях. Пособие ориентировано на студентов в качестве дополнительного материала при изучении предмета и нацелено на развитие профессиональных качеств студентов. Рецензенты: Соломоненко Н.В., председатель ПЦК информационных технологий Сурменко С.Л., директор ОГАУ ЦОКО © Фефелова Светлана Витальевна, сост., 2014 © ФГБОУ ВПО «Приамурский государственный университет имени Шолом-Алейхема», 2014 2 Оглавление Введение ............................................................................................................................................. 4 ЛАБОРАТОРНАЯ РАБОТА №1 ...................................................................................................... 5 ЛАБОРАТОРНАЯ РАБОТА №2 .................................................................................................... 12 ЛАБОРАТОРНАЯ РАБОТА №3 .................................................................................................... 14 ЛАБОРАТОРНАЯ РАБОТА №4 .................................................................................................... 20 ЛАБОРАТОРНАЯ РАБОТА №5 .................................................................................................... 24 ЛАБОРАТОРНАЯ РАБОТА №6 .................................................................................................... 28 ЛАБОРАТОРНАЯ РАБОТА №7 .................................................................................................... 32 3 Введение Профессия программист довольно востребована в современном мире. Основная потребность современных организаций – это автоматизированная работа с данными. Создание баз данных в среде программирование Delphi является одним из самых доступных способов автоматизации работы с данными. Лабораторный практикум затрагивают четыре основные темы: проектирование БД, создание приложения в Delphi, Связь БД и Delphi и организация запросов на SQL. Лабораторные работы содержат вводную часть, где кратко описывается понятийный аппарат и постановку задачи, а также ход работы, где пошагово описываются операции, которые необходимо выполнить студенту на практических занятиях. В ходе выполнения лабораторных работ студент систематизирует свои знания о совместной работе БД и Delphi, уведет наглядный результат своего труда и сможет создавать собственные приложения, опираясь на полученные знания. Важным достоинством данного практикума является то, что студент может самостоятельно готовиться к написанию практической части выпускной квалификационной работы, используя лабораторные работы т.к. разработка информационной системы является неотъемлемой частью выпускной квалификационной работы для студентов специальности 230115 Программирование в компьютерных системах. 4 ЛАБОРАТОРНАЯ РАБОТА №1 Тема: Проектирование БД Цель: Проектирование БД «Отдел кадров» в соответствии с основными шагами проектирования Краткие теоретические сведения Под базой данных понимается некоторая унифицированная совокупность данных, совместно используемая персоналом/населением группы, предприятия, региона, страны, мира... Задача базы данных состоит в хранении всех представляющих интерес данных в одном или нескольких местах, причем таким способом, который заведомо исключает ненужную избыточность. В хорошо спроектированной базе данных избыточность данных исключается, и вероятность сохранения противоречивых данных минимизируется. Таким образом, создание баз данных преследует две основные цели: понизить избыточность данных и повысить их надежность. Жизненный цикл любого программного продукта, в том числе и системы управления базой данных, состоит (по-крупному) из стадий проектирования, реализации и эксплуатации. Требования к базам данных Итак, хорошо спроектированная база данных: Удовлетворяет всем требованиям пользователей к содержимому базы данных. Перед проектированием базы необходимо провести обширные исследования требований пользователей к функционированию базы данных. Гарантирует непротиворечивость и целостность данных. При проектировании таблиц нужно определить их атрибуты и некоторые правила, ограничивающие возможность ввода пользователем неверных значений. Для верификации данных перед непосредственной записью их в таблицу база данных должна осуществлять вызов правил модели данных и тем самым гарантировать сохранение целостности информации. Обеспечивает естественное, легкое для восприятия структурирование информации. Качественное построение базы позволяет делать запросы к базе более «прозрачными» и легкими для понимания; следовательно, снижается вероятность внесения некорректных данных и улучшается качество сопровождения базы. Удовлетворяет требованиям пользователей к производительности базы данных. При больших объемах информации вопросы сохранения производительности начинают играть главную роль, сразу «высвечивая» все недочеты этапа проектирования. Основные шаги проектирования базы данных: 1. Определить информационные потребности базы данных. 5 Он включает в себя опрос будущих пользователей для того, чтобы понять и задокументировать их требования. Следует выяснить следующие вопросы: сможет ли новая система объединить существующие приложения или их необходимо будет кардинально переделывать для совместной работы с новой системой; какие данные используются разными приложениями; смогут ли Ваши приложения совместно использовать какие-либо из этих данных; кто будет вводить данные в базу и в какой форме; как часто будут изменяться данные; достаточно ли будет для Вашей предметной области одной базы или Вам потребуется несколько баз данных с различными структурами; какая информация является наиболее чувствительной к скорости ее извлечения и изменения. 2. Проанализировать объекты реального мира, которые необходимо смоделировать в базе данных. Сформировать из этих объектов сущности и характеристики этих сущностей (например, для сущности «деталь» характеристиками могут быть «название”, «цвет”, «вес» и т.п.) и сформировать их список. Формирование концептуальной модели базы данных включает в себя: идентификацию функциональной деятельности Вашей предметной области. Например, если речь идет о деятельности предприятия, то в качестве функциональной деятельности можно идентифицировать ведение учета работающих, отгрузку продукции, оформление заказов и т.п. идентификацию объектов, которые осуществляют эту функциональную деятельность, и формирование из их операций последовательности событий, которые помогут Вам идентифицировать все сущности и взаимосвязи между ними. Например, процесс «ведение учета работающих» идентифицирует такие сущности как РАБОТНИК, ПРОФЕССИЯ, ОТДЕЛ. идентификацию характеристик этих сущностей. Например, сущность РАБОТНИК может включать такие характеристики как Идентификатор Работника, Фамилия, Имя, Отчество, Профессия, Зарплата. идентификацию взаимосвязей между сущностями. Например, каким образом сущности РАБОТНИК, ПРОФЕССИЯ, ОТДЕЛ взаимодействуют друг с другом? Работник имеет одну профессию (для простоты!) и значится в одном отделе, в то время как в одном отделе может находиться много работников. 3. Поставить в соответствие сущностям и характеристикам таблицы и столбцы (поля) в нотации выбранной Вами СУБД. 4. Поскольку каждая сущность реального мира обладает некими характеристиками, в совокупности образующими полную картину ее проявления, можно поставить им в соответствие набор отношений (таблиц) и их атрибутов (полей). 6 5. Перечислив все отношения и их атрибуты, уже на этом этапе можно начать устранять излишние позиции. Каждый атрибут должен появляться только один раз; и Вы должны решить, какое отношение будет являться владельцем какого набора атрибутов. 6. Определить атрибуты, которые уникальным образом идентифицируют каждый объект. Это необходимо для того, чтобы система могла получить любую единичную строку таблицы. Вы должны определить первичный ключ для каждого из отношений. Если нет возможности идентифицировать кортеж с помощью одного атрибута, то первичный ключ нужно сделать составным - из нескольких атрибутов. Хорошим примером может быть первичный ключ в таблице работников, состоящий из фамилии, имени и отчества. Первичный ключ гарантирует, что в таблице не будет содержаться двух одинаковых строк. Во многих СУБД имеется возможность помимо первичного определять еще ряд уникальных ключей. Отличие уникального ключа от первичного состоит в том, что уникальный ключ не является главным идентифицирующим фактором записи и на него не может ссылаться внешний ключ другой таблицы. Его главная задача - гарантировать уникальность значения поля. 7. Выработать правила, которые будут устанавливать и поддерживать целостность данных. Эти правила включают: определение типа данных выбор набора символов, соответствующего данной стране создание полей, опирающихся на домены установка значений по умолчанию определение ограничений целостности определение проверочных условий. 8. Установить связи между объектами (таблицами и столбцами), провести нормализацию таблиц. Связь «один-к-одному» представляет собой простейший вид связи данных, когда первичный ключ таблицы является в то же время внешним ключом, ссылающимся на первичный ключ другой таблицы. Такую связь бывает удобно устанавливать тогда, когда невыгодно держать разные по размеру (или по другим критериям) данные в одной таблице. Например, можно выделить данные с подробным описанием изделия в отдельную таблицу с установлением связи «один-к-одному» для того чтобы не занимать оперативную память, если эти данные используются сравнительно редко. Связь «один-ко-многим» в большинстве случаев отражает реальную взаимосвязь сущностей в предметной области. Она реализуется уже описанной парой «внешний ключ-первичный ключ”, т.е. когда определен внешний ключ, ссылающийся на первичный ключ другой таблицы. Именно эта связь описывает широко распространенный механизм классификаторов. Имеется справочная таблица, содержащая названия, имена и т.п. и некие 7 коды, причем, первичным ключом является код. В таблице, собирающей информацию - назовем ее информационной таблицей - определяется внешний ключ, ссылающийся на первичный ключ классификатора. После этого в нее заносится не название из классификатора, а код. Такая система становится устойчивой от изменения названия в классификаторах. Имеются способы быстрой «подмены» в отображаемой таблице кодов на их названия как на уровне сервера БД (для клиент-серверных СУБД), так и на уровне пользовательского приложения. Но об этом - в дальнейших уроках. Связь «многие-ко-многим» в явном виде в реляционных базах данных не поддерживается. Однако имеется ряд способов косвенной реализации такой связи, которые с успехом возмещают ее отсутствие. Один из наиболее распространенных способов заключается во введении дополнительной таблицы, строки которой состоят из внешних ключей, ссылающихся на первичные ключи двух таблиц. Например, имеются две таблицы: КЛИЕНТ и ГРУППА_ИНТЕРЕСОВ. Один человек может быть включен в различные группы, в то время как группа может объединять различных людей. Для реализации такой связи «многие-ко-многим» вводится дополнительная таблица, назовем ее КЛИЕНТЫ_В_ГРУППЕ, строка которой будет иметь два внешних ключа: один будет ссылаться на первичный ключ в таблице КЛИЕНТ, а другой - на первичный ключ в таблице ГРУППА_ИНТЕРЕСОВ. Таким образом в таблицу КЛИЕНТЫ_В_ГРУППЕ можно записывать любое количество людей и любое количество групп. 9. Спланировать вопросы надежности данных и, при необходимости, сохранения секретности информации. Основные концепции реляционных баз данных В реляционной теории одним из главных является понятие отношения. Реляционная база данных представляет собой совокупность отношений, содержащих всю необходимую информацию и объединенных различными связями. Атрибут (или набор атрибутов), который может быть использован для однозначной идентификации конкретного кортежа (строки, записи), называется первичным ключом. Первичный ключ не должен иметь дополнительных атрибутов. Это значит, что если из первичного ключа исключить произвольный атрибут, оставшихся атрибутов будет недостаточно для однозначной идентификации отдельных кортежей. Для ускорения доступа по первичному ключу во всех системах управления базами данных (СУБД) имеется механизм, называемый индексированием. Грубо говоря, индекс представляет собой инвертированный древовидный список, указывающий на истинное местоположение записи для каждого первичного ключа. Естественно, в разных СУБД индексы реализованы поразному (в локальных СУБД - как правило, в виде отдельных файлов), однако, принципы их организации одинаковы. 8 Возможно индексирование отношения с использованием атрибутов, отличных от первичного ключа. Данный тип индекса называется вторичным индексом и применяется в целях уменьшения времени доступа при нахождении данных в отношении, а также для сортировки. Таким образом, если само отношение не упорядочено каким-либо образом и в нем могут присутствовать строки, оставшиеся после удаления некоторых кортежей, то индекс (для локальных СУБД - индексный файл), напротив, отсортирован. Для поддержания ссылочной целостности данных во многих СУБД имеется механизм так называемых внешних ключей. Смысл этого механизма состоит в том, что некоему атрибуту (или группе атрибутов) одного отношения назначается ссылка на первичный ключ другого отношения; тем самым закрепляются связи подчиненности между этими отношениями. При этом отношение, на первичный ключ которого ссылается внешний ключ другого отношения, называется master-отношением, или главным отношением; а отношение, от которого исходит ссылка, называется detailотношением, или подчиненным отношением. После назначения такой ссылки СУБД имеет возможность автоматически отслеживать вопросы «ненарушения» связей между отношениями, а именно: если Вы попытаетесь вставить в подчиненную таблицу запись, для внешнего ключа которой не существует соответствия в главной таблице (например, там нет еще записи с таким первичным ключом), СУБД сгенерирует ошибку; если Вы попытаетесь удалить из главной таблицы запись, на первичный ключ которой имеется хотя бы одна ссылка из подчиненной таблицы, СУБД также сгенерирует ошибку. если Вы попытаетесь изменить первичный ключ записи главной таблицы, на которую имеется хотя бы одна ссылка из подчиненной таблицы, СУБД также сгенерирует ошибку. Ход выполнения работы Спроектируйте БД «Отдел кадров» в соответствии с основными шагами проектирования БД. 1.Определить информационные потребности базы данных «Отдел кадров» Система не будет брать информацию из других приложений Данные из нашей системы не будут использоваться другими приложениями Данные будут вводить сотрудники Работающие в Отделе кадров, данные будут изменяться часто. Для предметной области достаточно одной БД Данная БД должна содержать подробную информацию о сотрудниках предприятия: их личные данные, контактные и информацию о должности, которую занимает сотрудник. 9 БД должна отвечать на запросы по поиску того или иного сотрудника. БД должна выводить различные отчеты как на экран, так и на печать. 2.Проанализировать объекты реального мира, которые необходимо смоделировать в базе данных. Сотрудник, Должности, Телефоны, Адреса. 3.Поставить в соответствие сущностям и характеристикам - таблицы и столбцы (поля) в нотации выбранной Вами СУБД. Информация о сотрудниках Должность Id_должность Название должности Отдел Id_сотрудник Фамилия Имя Отчество Пол Сем-Положение Детей Дата рождения Дата поступления Стаж Образование Военнообязанный Телефонная книга Id_телефон Сотрудник Телефон Примечание Штат сотрудников Id_сотрудника в штате Сотрудник Должность 4.Определить атрибуты, которые уникальным образом идентифицируют каждый объект. Ключевые поля отметим знаком «*» Должность Информация о *Id_должность сотрудниках Название *Id_сотрудник должности Фамилия Отдел Имя Отчество Пол Штат сотрудников Сем-Положение *Id_сотр. в штате Детей Сотрудник Дата рождения Должность Дата поступления Телефонная книга Стаж *Id_телефон Образование Сотрудник Военнообязанный Телефон Примечание 10 5.Выработать правила, которые будут устанавливать и поддерживать целостность данных. Для этого для всех полей всех таблиц установим типы данных (Таблицы 1 – 4). Таблица 1 Типы данных таблицы «Информация о сотруднике» Имя поля *Id_сотрудник Фамилия Имя Отчество Пол Сем_положение Колич_детей Дата рождения Дата поступления Стаж Образование Военнообязанный Тип данных Счетчик Текстовый Текстовый Текстовый Текстовый Логический Числовой Дата/Время Дата/Время Числовой Текстовый Логический Таблица 2 Типы данных таблицы «Должность» Имя поля *Id_должность Название должности Отдел Тип данных Счетчик Текстовый Текстовый Таблица 3 Типы данных таблицы «Штат сотрудников» Имя поля *Id_сотр_в_штате Сотрудник Должность Тип данных Счетчик Числовой Числовой Таблицы 4 Типы данных таблицы «Телефонная книга» Имя поля *Id_телефон Сотрудник №_телефона Примечание Тип данных Счетчик Числовой Текстовый Текстовый 11 6.Установить связи между объектами (таблицами и столбцами). Информация о сотрудниках *Id_сотрудник Фамилия Имя Отчество Пол Сем-Положение Детей Дата рождения Дата поступления Стаж Образование Военнообязанный Должность *Id_должность Название должности Отдел Штат сотрудников *Id_сотр. в штате Сотрудник Должность Телефонная книга *Id_телефон Сотрудник Телефон Примечание ЛАБОРАТОРНАЯ РАБОТА №2 Тема: Создание БД в MS Access Цель: Создание БД «Отдел кадров» в MS Access в соответствии с требованиями Delphi Ход выполнения работы: 1. Создайте БД «OtdelKadrov». !!! БД необходимо создавать в MS Office 2003, иначе при подключении БД к Delphi будет выводиться ошибка, которая не позволит продолжить дальнейшую работу. !!! название таблиц должно быть латинскими буквами, а имена полей должны быть написаны либо слитно, либо через нижнее подчеркивание. Это в дальнейшем облегчит работу БД и Delphi. В базе данных создайте таблицы, спроектированные в Лабораторной работе №1 (Inf_o_Sotr, ShtatSotr, Dolgnost, TelKniga). Создайте маску для тех полей, которые в этом нуждаются: «Пол». Текстовый, размер 3 символа. В формате поля укажите «муж/жен», конечно, без кавычек. «Сем_Полож». Логический тип, формат поля «Да/Нет». Здесь мы будем указывать, состоит ли сотрудник (сотрудница) в браке. 12 «Дата_Рождения». Тип поля - Дата/Время. Выберите формат «Краткая форма даты». Затем выберите тот же формат для поля «Маска». При попытке выбора маски выйдет запрос на подтверждение сохранения таблицы. Ответьте утвердительно, а вместо. После этого появится окно создания маски ввода. Выберите «Краткий формат даты», нажмите «Далее», после чего в окне «Маска ввода» наберите «00.00.0000». В результате мы будем иметь маску в виде «дд.мм.гггг». «Дата_Поступления». Все то же самое, что и в «Дата_рождения» «Военнообязанный». Логический тип, формат «Да/Нет» «№_телефона». Тип текстовый, размер 17. Желательно задать маску. Сразу же выйдет запрос о сохранении таблицы, сохраните ее. Для этого выбираем маску (дважды щелкаем по ней), в окне нажимаем кнопку «Список» Настраиваем маску, как на рисунке 1: Выбираем в маске Телефон, нажимаем далее Заполнитель выбираем _, Как следует сохранить данные? Выбираем первый пункт, Рис. 1 Маска для телефона 2. Свяжите полученные таблицы при помощи. В результате должна получиться следующая схема данных (рисунок 2) Рис. 2 Схема данных БД «Отдел кадров» 13 ЛАБОРАТОРНАЯ РАБОТА №3 Тема: Разработка интерфейса в Delphi Цель: Разработка интерфейса и сценария работы информационной системы «Отдел кадров» Краткие теоретические сведения Интерфейс пользователя - эта та часть программы, которая находится у всех на виду. Некоторые программисты склонны оставлять дизайн интерфейса пользователя на потом, считая, что реальное достоинство приложения - его программный код, который и требует большего внимания. Однако часто возникает недовольство пользователей из-за неудачно подобранных шрифтов, непонятного содержимого экрана и скорости его прорисовывания, поэтому работу над интерфейсом также нужно воспринимать серьезно. Пользователь не видит программного кода, зато интерфейс (хороший или плохой) всегда перед ним. Разработка эффективных форм Формы - это строительные блоки интерфейса пользователя. Хороший дизайн форм включает нечто большее, чем просто добавление элементов управления и программирование процедур обработки событии. Чтобы создать хорошо спроектированную форму, вы должны уяснить ее назначение, способ и время использования, а также ее связи с другими элементами программы. Кроме того в приложении может находиться несколько форм, каждая из которых будет отображаться по мере необходимости. Одни пользователи широко используют многозадачность Windows, другие предпочитают работать только с одним приложением. Необходимо помнить об этом во время разработки интерфейса пользователя (UI) Вы должны максимально реализовать все возможности Windows, чтобы пользователи с любыми навыками работы могли эффективно применять созданное вами приложение. Проектирование форм ввода данных Особый вид форм - формы, предназначенные для ввода данных. Они позволяют пользователю идти в нужном ему темпе, не оглядываясь на программиста. Общий смысл и основное правы: если пользователь собирается ввести в базу данных 10000 записей, вероятно, он не хочет подтверждать ввод каждой записи. В форме ввода данных необходимо максимально использовать свободное пространство, поскольку открытие и закрытие дополнительных форм существенно замедляет работу. При разработке форм ввода данных основное внимание следует уделить скорости их работы. Чтобы максимально ускорить процесс ввода данных, следуйте приведенным ниже основным правилам. Всегда назначайте клавиатурные эквиваленты команд; не требуйте обязательного использования мыши. (Кстати, этот совет хорош для всех 14 форм программы, а не только для форм ввода данных.)· Расположение элементов должно быть согласовано с задачами пользователя. Другими словами, не заставляйте пользователя перепрыгивать из раздела в раздел; при вводе информации это совсем не обязательно. Не заставляйте пользователя выполнять лишнюю работу. Другими словами, если информация, содержащаяся в полях со 2-го по 10-е, необходима только, когда первое поле имеет определенное значение, не нужно заставлять пользователя заполнять все поля подряд. В то же время, не ставьте работу формы в зависимость от содержимого отдельных полей. В противном случае это может существенно замедлить работу пользователя. Используйте заметную, но ненавязчивую обратную связь с пользователем. Хороший пример - работа редактора программного кода Visual Basic, который проверяет правильной написания переменных и констант. Если возможно, выполняйте добавление и редактирование записей в одной и той же форме, тогда пользователю не придется осваивать несколько методов доступа к одним и тем же данным. Работа с несколькими формами Если интерфейс пользователя должен содержать несколько форм, вам предстоит принять самое важное решение: какой использовать вид интерфейса - однодокументный (SDI) или многодокументный (MDI). В SDl-приложениях окна форм появляются совершенно независимо друг от друга. Однако не имеет значения какой тип интерфейса SDI или MD1 выбран; взаимодействие пользователя с формами происходит одинаково посредством обработки событий, поступающих от элементов управления формы. Поэтому если в вашем приложении предусмотрено несколько форм, программу необходимо написать так, чтобы у пользователей не было возможности нарушить предписанные ход ее выполнения (например, у пользователя не должно быть средств вывести форму, для которой еще не готова информация). Эффективные меню Еще одна важная часть разработки форм - создание содержательных и эффективных меню. Приведем некоторые важные рекомендации: · Следуйте стандартным соглашениям о расположении пунктов меню принятым в Windows File, Edit, View, и т.д. · Группируйте пункты меню в логическом порядке и по содержанию. Для группировки пунктов в раскрывающихся меню используйте разделительные линии.· Избегайте избыточных меню.· Избегайте пунктов меню верхнего уровня, не содержащих раскрывающихся меню· Не забывайте использовать символ троеточия для обозначения пунктов меню, активизирующих диалоговые окна.· Обязательно используйте клавиатурные эквиваленты команд и «горячие» клавиши.· Помещайте на панель инструментов часто используемые команды меню. Ощущение скорости 15 Ощущение - это реальность. Здесь мы попытаемся объяснить, как ощущения пользователя могут повлиять на то, понравится ему ваша программа или нет. Простой пример - скорость работы приложения. У вас может быть самый быстродействующий программный код, но это ничего не значит, если с точки зрения пользователя он работает медленно. Когда пользователи жалуется на скорость, программисты защищаются, утверждая, что «пользователь не знает, что делает программа". Однако, если воспользоваться некоторыми уловками, то можно сделать так, что будет казаться: программа работает быстрее. Пользователь гораздо более расположен к ожиданию, если считает, что компьютер работает с максимальной скоростью. Хороший пример - загрузка Windows, которая обычно требует достаточно много времени. Однако вывод графики, сопровождающие звуки, шум жесткого диска отвлекают настолько, что пользователь не ощущает ожидания. Описанная ниже техника поможет в создании «более быстрых» приложений. Информируйте пользователя о ходе процесса Когда есть видимость работы приложения, пользователи более легко переносят длительное ожидание в работе программы. Один из способов информирования пользователя о ходе выполнения работы - использовать в форме индикатор процесса. Если вы обновляете записи базы данных, можно использовать такой индикатор для отображения числа записей, над которыми операция уже произведена. Для этого добавьте пару строк кода обновляющих показания индикатора по мере перехода к следующим записям. Выводы по проектированию пользовательского интерфейса Хотя ни одно ухищрение не гарантирует создания удачного интерфейса пользователя, плохой интерфейс гарантирует отсутствие пользователей вашей программы. Однако при стремительном появлении новшеств, в сфере пользовательских интерфейсов понятие «хорошего» интерфейса очень быстро изменяется. Возьмем, например, процесс настройки часов видеомагнитофона. Раньше часы программировали «вслепую» кнопками и переключателями, потом стали применяться дисплеи, для которых использовался экран телевизора, а теперь в некоторых моделях этот процесс выполняется автоматически по радиосигналу. Так и интерфейс пользователя программ будет «эволюционировать» по мере того, как индустрия будет устанавливать новые стандарты, и вы, в свою очередь, должны быть всегда в курсе, как в наибольшей степени удовлетворить ожидания пользователя. Ход выполнения работы 1. Необходимо продумать сценарий работы ИС и ее интерфейс Сценарий ИС «Отдел кадров»: Перед пользователем откроется главная форма под названием «Отдел кадров», на которой будут две кнопки: «Штат сотрудников» и «Телефонная книга» (Рисунок 3). 16 Рис. 3 Главная форма «Отдел кадров" При нажатии на кнопку «Штат сотрудников» пользователь перейдет на форму «Штат сотрудников» и сможет: Просмотреть информацию о сотрудниках и их должностях При нажатии на любого сотрудника, посмотреть подробную информацию о нем Добавить нового сотрудника и новую должность Назначить сотрудника на должность Организовать поиск сотрудника по фамилии 2. В Delphi создайте на главной форме две кнопки Button1 «Штат сотрудников» и Button2 «Телефонная книга» по нажатию на которые произойдет переход на другие формы. 3. Для формы 1: Свойству Name присвойте значение fOk, свойство Caption формы имеет текст «Отдел кадров», модуль сохранить под именем fOk1.pas, а проект в целом называется OtdelKadrov.dpr (отдел кадров). 4. Создайте новую форму 17 5. Свойству Name формы 2 присвойте значение fShtat, свойство Caption формы имеет текст «Штат сотрудников», модуль сохранить под именем fShtat1.pas. 6. Для кнопки «Штат сотрудников» прописать код для перехода на другую форму fShtat.Show; или fShtat.ShowModal; 7. Поместите на форму «Штат сотрудников» три обычных панели. Свойству Align верхней панели присвоить значение alTop (весь верх). Затем свойству Align нижней панели присвоить значение alBottom. Затем поместите компонент Splitter с вкладки Additional панели инструментов, и его свойству Align также присвоить alBottom, после чего он прижмется к нижней панели. Splitter - это разделитель между панелями. С его помощью пользователь мышью сможет передвигать нижнюю панель, меняя ее размеры. И, наконец, свойству Align средней панели присвоил значение alClient, чтобы она заняла все оставшееся место на форме. Не забудьте очистить свойство Caption всех трех панелей. Создайте раздел поиска, поместив в него обычные Label, Edit и кнопку BitBtn. Этот раздел позволит организовать поиск по фамилии. В последнем разделе верхней панели находятся еще три кнопки BitBtn. Они предназначены для добавления новых записей. Раздел поиска и кнопок разделите компонентом Bevel с вкладки Additional палитры компонентов. Его ширину (свойство Width) сделал равным 2 пикселям, превратив его в вертикальную разделительную полосу. Вторая и третья панели содержат только по одному компоненту DBGrid из вкладки DataControls палитры компонентов, свойствам Align которых присвоено значение alClient. В итоге форма «Штат сотрудников» должна иметь вид приблизительно как на рисунке 4. Рис. 4 Форма «Штат сотрудников» 18 8. Создайте еще 3 формы, которые будут называться «Новый сотрудник», «Новая должность», «Устроить сотрудника». Компоненты для этих форм будут размещены в лабораторной работе № 5. 9. Свойству Name формы «Новый сотрудник» присвойте значение fNewSotrudnik, свойство Caption формы имеет текст «Новый сотрудник», модуль сохранен под именем fNewSotrudnik1.pas. Произведите такие же настройки для остальных форм (свойство Name, Caption и сохраните модуль под соответствующим именем). fNewDolgnost fUstrSotrudnik проект в целом называется OtdelKadrov.dpr (отдел кадров). 19 ЛАБОРАТОРНАЯ РАБОТА №4 Тема: Подключение БД к Delphi Цель: Подключение БД «Отдел кадров» к Delphi с помощью технологии ADO. Краткие теоретические сведения Механизм доступа к данным - это программный инструмент, позволяющий получить доступ к базе данных и ее таблицам. Как правило, это драйвер в виде *.dll файлов, который устанавливается на ПК разработчика (и клиента), и который используется программой для связи с БД. Сравнение BDE и ADO Borland Database Engine (BDE) - первая такая разработка фирмы Borland. Этот механизм доступа к данным позволяет обращаться к локальным и файл-серверным форматам баз данных dBase, FoxPro и Paradox, к различным серверам SQL и ко многим другим источникам данных, доступ которых поддерживался при помощи драйверов ODBC. Например, с помощью BDEможно напрямую работать с табличными файлами MS Excel, но он признается устаревшим даже самой компанией Borland. В данный момент многие инструменты Delphi являются кросс - платформенными, то есть, программы с небольшими доработками можно переносить на другие операционные системы. Корпорация Borland выпустила новую среду быстрой разработки программ - Kylix, на которой создаются приложения для операционных систем семейства Linux. Удобство работы с BDE трудно переоценить, однако нельзя не сказать и о минусах. Основной минус - распространение приложений. Если ваше приложение использует для доступа к данным компоненты BDE, то и у клиента, который будет пользоваться вашей программой, должен быть установлен BDE. ActiveX Data Object (ADO) - это механизм доступа к данным, разработанный корпорацией Microsoft. Если точнее, то ADO - это надстройка над технологией OLE DB, посредством которой можно связываться с различными данными приложенийMicrosoft. В середине 1990-х годов большое развитие получила технология COM, и корпорация Microsoft в связи с этим объявила о постепенном переходе от старой технологии ODBC к новой OLE DB. Однако технология OLE DB достаточно сложная, использование этой технологии происходит на системном уровне и требует от программиста немало знаний и труда. Кроме того, технология OLE DB очень чувствительна к ошибкам, и «вылетает» при первом удобном случае. Чтобы облегчить программистам жизнь, корпорация Microsoft разработала дополнительный прикладной уровень ADO. 20 По своим возможностям ADO напоминает BDE, хотя конечно, является более мощным инструментом. Компания Borlandразработала набор компонентов для доступа к ADO и первоначально назвала его ADOExpress. Однако корпорация Microsoftупорно противится использованию своих обозначений в продуктах сторонних разработчиков, поэтому, начиная с Delphi 6, этот набор компонентов стал именоваться dbGo. Эти компоненты вы можете увидеть на вкладке ADO палитры компонентов. Основными компонентами, с которыми предстоит работа, являются TADOConnection (для подключения БД), TADOTable (аналог TTable из BDE), TADOQuery (аналог TQuery из BDE, для выполнения запросов и получения набора данных) и TADODataSet(предназначенный для набора данных, полученных через SQL-запрос). Ход выполнения работы 1. Добавьте в проект модуль данных: File – new – DataModul !!! Модуль данных - это не визуальный контейнер для размещения на нем невизуальных компонентов. В основном, он предназначен для размещения в нем компонентов подключения к данным (TDataBase, ADOConnection и т.п.), компонентов - наборов данных ( TTable / ADOTable, TQuery / ADOQuery,TStoredProc / ADOStoredProc ) и компонентов DataSource, которые обеспечивают связь наборов данных и компонентов отображения/редактирования данных. Также модуль данных часто используют и для хранения глобальных переменных, общих функций и процедур, которые должны быть видны по всей программе. Модуль данных не имеет формы, но сохраняется как модуль в файле *.pas. 2. Свойству Name модуля данных мы присвойте имя fDM, а модуль сохраните как DM.pas. Добавьте в модуль компонент ADOConnection с вкладки ADO палитры компонентов. Этот компонент обеспечит связь других компонентов с базой данных при помощи механизма ADO. Связь обеспечивается свойством компонента ConnectionString. 3. Щелкните дважды по свойству ConnectionString компонента ADOConnection. Откроется окно подключения компонента к ADO (Рисунок 5) Рис. 5 Окно подключения к ADO 21 !!! Прежде чем начнете подключение убедитесь, что файл с БД находится в той же папке где и созданный вами проект. 4. Нажмите кнопку Build. Открывается новое окно, содержащее настройки подключения (Рисунок 6): Рис. 6 Настройки подключения Необходимо выбрать поставщика OLE DB, или иначе, указать нужный для подключения драйвер. Для связи с базой данных MS Access больше всего подходит «Microsoft Jet 4.0 OLE DB Provider». Jet - это название механизма работы с СУБД, встроенного в MS Access. Этот механизм поддерживает как собственные БД MS Access, имеющие расширение *.mdb, так иODBC. Выберете его из списка - далее 10. Переходим к вкладку «Подключение». Здесь нам нужно выбрать базу данных. Для того чтобы БД не была привязана ни к какой папке и программа могла работать с базой на другом компьютере, необходимо поместить файл с базой в папку с программой. После чего в строке удалите весь адрес, кроме имени файла и его расширения. OtdelKadrov.mdb. Проверьте подключение и нажмите на кнопку «ОК». 11. Настройте свойства ADOConnection: LoginPrompt – False (иначе при каждой попытке соединиться с базой будет спрашиваться логин и пароль), Connected – True (Если вам удалось это сделать, и не вышло никаких сообщений об ошибке, то подключение состоялось). 12. Установите в модуль данных четыре компонента ADOTable, по одному на каждую таблицу из нашей базы данных. Компонент ADOTable (также как и TTable из вкладки BDE) предназначен для создания набора данных. 22 !!! Набором данных (НД) называется группа записей, полученных такими компонентами, как TTable/ADOTable, TQuery/ADOQuery, TStoredProc/ADOStoredProc из одной или нескольких таблиц базы данных. Все компоненты наборов данных являются потомками класса TDBDataSet, и имеют много общих свойств, методов и событий. Эти компоненты также называют наборами данных. !!! Табличные компоненты (TTable/ADOTable) являются наборами данных, которые получают из базы данных полную копию одной из таблиц, и предоставляют полученный набор данных визуальным компонентам отображения данных ( DBGrid, DBEdit, DBMemo и проч.). 13. Выделите все четыре ADOTable (удерживая клавишу <Shift>), и в их свойстве Connection выберите связь ADOConnection1. Таким образом, все четыре ADOTable будут подключены к базе данных. 14. Настройте компоненты ADOTable (все 4 компонента) Свойство Name TableName Значения Для каждой таблицы введите имя таблицы из БД и перед именем поставьте «Т», которая указывает на то, что это таблица: ТDoljnost, TInf_o_Sotr, TShtatSotr, TelKniga Из выпадающего списка выберете одноименную таблицу, которую необходимо подключить к этому компоненту. 15. Рядом с компонентами ADOTable установите компоненты DataSource из вкладки Data Access палитры компонентов. !!! Компонент DataSource предназначен для организации связи с наборами данных, и служит посредником между такими компонентами НД, как ADOTable, ADOQuery и между компонентами отображения данных, например, DBGrid, DBEdit и т.п. 16. Свойство Name DataSet Настройте компоненты DataSource (все 4 компонента) Значения Для каждой таблицы введите имя таблицы из БД и перед именем поставьте «DS», которая указывает на то, что это компонент для визуально отображения таблиц : DSDolgnost, DSInf_o_Sotr, DSShtatSotr, DSTelKniga. Из выпадающего списка выберете одноименную таблицу, которую необходимо подключить к этому компоненту. DM с необходимыми компонентами представлен на рисунке 7. 23 Рис. 7 Модуль данных с установленными компонентами 17. в True. Теперь откроем таблицы, для этого свойство таблиц Active переведите ЛАБОРАТОРНАЯ РАБОТА №5 Тема: Визуальное отображение данных на форме Цель: Настроить визуальное отображение содержимого БД «Отдел кадров» на формах Delphi. Краткие теоретические сведения На вкладке DataControls сосредоточены визуальные (видимые пользователю) компоненты отображения данных, такие как DBGrid (сетка, отображающая все данные НД в виде таблицы, и позволяющая редактировать их), DBEdit (поле редактирования данных, предназначенная для ввода или редактирования одного поля записи, то есть, ячейки таблицы), DBMemo (для редактирования MEMO -полей) и т.д. Единственным исключением является компонент DBNavigator. Этот компонент предназначен не для отображения данных, а для перемещения по записям набора данных, для вставки новой записи или удаления старой, для перевода НД в режим редактирования или для подтверждения сделанных изменений в наборе данных. Ход выполнения работы 1. Каждую форму необходимо соединить модулем данных. Для связи формы «Штат сотрудников» выберите команду File -> Use Unit и подключите к ней модуль DM. Теперь мы сможем видеть таблицы из формы. 24 2. На формt «Штат сотрудников» уже размещены компоненты DBGrid с вкладки DataControls на нижней и средней панели. 3. Выделите верхнюю сетку DBGrid, в ее свойстве DataSource выберите fDM.DSShtatSotr. В таком же свойстве нижней сетки выберите fDM.DSInf_o_Sotr. Сетки среагировали, и вы можете видеть названия полей. Разумеется, таблица еще пуста, данных пока нет. Кстати, выделите обе сетки, и установите в True их свойства ReadOnly - только чтение. Таблицы ведь будут связаны, и нам не нужно, чтобы пользователь вводил данные фрагментарно. Мы для этого сделаем отдельную форму, а эти сетки нужны только для просмотра. 4. Добавьте название полей в таблицы. Снова выделите модуль данных fDM. Щелкните дважды по таблице TInf_o_Sotr, чтобы открыть редактор полей (Рисунок 8). Правой кнопкой щелкните по этому редактору и выберите команду Add all fields (добавить все поля). В окне редактора полей появились все поля таблицы: Рис. 8 Редактор полей !!! Редактор полей предназначен для настройки параметров каждого поля, для добавления новых полей или удаления имеющихся. Если в редакторе полей нет ни одного поля, то в компоненте DBGrid будут отображены все поля таблицы, имеющие параметры поумолчанию. Если же мы добавили в редактор полей хотя бы одно поле, то сетка DBGrid его и отобразит. В редакторе мы можем для каждого поля изменить различные параметры, например, ширину колонки, название колонки, видимое это поле или нет, и т.п. Кроме того, редактор полей предоставляет возможность добавлять в набор данных новые поля, например вычисляемые или просматриваемые ( lookup ). Но эту возможность мы будем рассматривать в других лекциях. 5. Поля «id» у нас автоинкрементное, предназначено для связи с другими таблицами. Пользователю его видеть не обязательно. Выделите его, и в свойстве Visible установите False. Теперь для пользователя оно будет невидимым. 25 6. Здесь у нас есть два логических поля - «Сем_Полож» и «Военнообязанный». Чтобы True и False выходили на экране так, как нам нужно, свойству DisplayValues первого из этих полей присвойте значение «Женат;Холост» (разумеется, без кавычек), а второго - «Да;Нет». Первым здесь идет значение, которое будет обозначать True, вторым - False. Эти значения разделяются точкой с запятой, пробелы не нужны. 7. Таким же образом добавьте все поля в остальные три таблицы. Однако для поля «Телефон» таблицы Telephones следует изменить свойство EditMask. Щелкните по нему дважды, открыв редактор маски, и в поле Input Mask введите маску #(###)-###-##-##. Сохраните ее, нажав кнопку ОК. Для полей типа Дата в этом свойстве (в таблице информация о сотруднике два таких поля) введите маску ##.##.####. 8. Теперь нужно между таблицами установить связь. Это требуется не только для того, чтобы в нижней сетке выходили данные только на сотрудника, выделенного в верхней сетке, но и для того, чтобы мы смогли в дальнейшем вводить связанные данные в окне редактора. Далее кнопкой <F12> перейдите в редактор кода. В нижней части окна вы можете увидеть вкладку Diagram, перейдите на нее. Нам с вами потребуется сделать такие связи, как на рисунке 9. Рис. 9 Связи БД 9. Для начала в окно диаграмм нужно добавить таблицы TShtatSotr и TInf_o_Sotr. Найдите их в окне дерева объектов Object TreeView. Если у вас это окно закрыто, откройте его клавишами <Shift+Alt+F11> либо командой меню View -> Object TreeView. Ухватитесь в этом окне мышью название таблиц и перетащите их в окно диаграмм. Таблица вместе с полями 26 отобразится в окне. Если бы ранее мы не добавили все поля в окне редактора полей компонента ADOTable, то здесь мы не увидели бы полей. Связи главная - подчиненная делают кнопкой Master / Detail Connector, которую вы можете увидеть в верхней части окна диаграмм (предпоследняя). Нажмите на кнопку, затем подведите указатель мыши к боковой границе главной таблицы ShtatSotr, нажмите левую кнопку и, удерживая ее, проведите линию к боковой границе таблицы LichDate. Как только вы отпустите кнопку, появится окно связей как на рисунке 10. Рис. 10 Окно связей 10. Здесь в поле Detail Fields нужно выбрать поле, по которому будет осуществляться связь, в нашем случае это поле «id_сотрудник». В поле Master Fields выбираем ключевое поле «Сотрудник» Затем нажимаем кнопку Add и кнопку OK. Связьустановлена. 11. При установке связей главный / подчиненный важно начинать вести линию с главной таблицы к подчиненной. 12. Сохраните проект, скомпилируйте его и запустите на выполнение. Если в сетках главного окна вы видите открытые таблицы, то все хорошо. Если нет, возможно, при изменении настроек ваши таблицы закрылись. В таком случае закройте программу (но не проект!), выделите таблицы, и их свойству Active снова присвойте значение True. Таблицы должны появиться в сетках главного окна, даже на этапе проектирования. !!! При запуске программы вы столкнетесь с проблемой, в верхней таблице будет отображение данных в числовом формате, что не очень удобно для воспириятия. Для решения этой проблемы, вам необходимо создать запрос в базе данных код для создания запроса ниже: SELECT Inf_o_Sotr.Фамилия, Inf_o_Sotr.Имя, Inf_o_Sotr.Отчество, Dolgnost.[Название должности], Dolgnost.Отдел, ShtatSotr.Сотрудник 27 FROM Inf_o_Sotr INNER JOIN (Dolgnost INNER JOIN ShtatSotr ON Dolgnost.id_должность=ShtatSotr.Должность) ON Inf_o_Sotr.id_сотрудник=ShtatSotr.Сотрудник WHERE (((Inf_o_Sotr.Фамилия)="Петров")); 18. После создания запроса необходимо перейти в делфи и подключить настройки для TShtatSotr, в свойстве Connection выберите связь ADOConnection1, если таково отсутствует, далее в TableName выбрать имя созданного запроса, далее в окне формы fDM необходимо щелкнуть дважды по TShtatSotr, в окне fDM.TShtatSotr убрать имеющиеся поля и добавить новые из запроса, в свойстве Active переведите в True. После этого проверьте настройки DBGrid1, должны быть, как вы выполнили в работе 4. И в настройках связей в модуле DM на вкладке Diagram измените связь, теперь у вас изменены поля из таблицы «Штат сотрудников», поэтому обновите эту таблицу и свяжите их по полям Фамилия-Фамилия, по тем же шагам, которые вы проделали выше для установления связей, сохраните работу. Откомпилируйте программу После переподключения данные будут представлены в Текстовом виде (Рисунок 11). Рис. 11Итоговый вид формы «Штат сотрудников» ЛАБОРАТОРНАЯ РАБОТА №6 Тема: Редактирования и заполнения таблиц БД через Delphi. Цель: Настройка форм для редактирования и заполнения таблиц БД «Отдел кадров» через Delphi. 28 Ожидаемый результат после выполнения работы: Если вы правильно выполните действия ниже, то у вас должно получится следующее: при выборе кнопки «Новый сотрудник» вам необходимо будет заполнить формы данными, обратите внимание, что на панели заполнения номера телефона, вам необходимо будет, помимо номера телефона и выбора примечания, добавить порядковый номер сотрудника, после нужно нажать на кнопку «Сохранить и выйти». Ход выполнения работы 1. Откройте форму «Новый сотрудник» File Open fNewSotrudnik1.pas. На этой форме будет представлена личная информация о новом сотруднике, которого будут принимать на работу, далее эта информация будет учавствовать при присвоении определенной должности. 2. На форме разместите компонент GroupBox1 с панели Standard, в свойстве Caption задайте имя Сотрудник. На нем расположите DBEdit с вкладки DataControls палитры компонентов в количестве восемь, два DBComboBox для списков и один DBCheckBox для редактирования логических данных. Поясняющие компоненты Label установите и настройте самостоятельно согласно рисунку №12. 3. Немного доработаем компонент DBComboBox1. Щелкните дважды по его свойству Items, открыв редактор. В нем введите строки: замужем; женат, в браке не состоит. Сохраните текст, нажав кнопку ОК. То же самое сделайте для DBComboBox2, только ввести необходимо муж., жен. Теперь пользователь сможет указать пол сотрудника, выбрав нужную строку из списка. 4. Теперь займемся подключением компонентов контроля. Удерживая <Shift>, выделите все компоненты контроля на первой панели (все компоненты, кроме всех Label), если не получится так, то настройку осуществляем по одному по очереди. В их свойстве DataSource выберите fDM.DSInf_o_Sotr, подключив компоненты к нужному набору данных (таблице). Снимите общее выделение, и выделите первый DBEdit. В его свойстве DataField выберите поле «Фамилия». Это свойство подключает выбранный компонент к определенному полю таблицы. Таким же образом подключите к соответствующим полям остальные компоненты. 5. В правой нижней части для удобства пользователя устанавливаем навигационный компонент DBNavigator с вкладки Data Controls. Этот компонент предназначен для перемещения по записям, включения режим редактирования записи, сохранения или отмены сделанных изменений, добавления новой записи или удаления существующей. В его свойстве DataSource вибираем fDM.DSInf_o_Sotr, чтобы подключить компонент к главной таблице. Результат смотрите на рисунке 12. 29 !!! Если нужно убрать какие-нибудь кнопки с управляющей панели, то раскройте его свойство VisibleButtons(видимость кнопок компонента) и переведите в False те кнопки, которые не нужны. Значение кнопок: First - переход на первую запись таблицы. Prior - переход на предыдущую запись. Next - переход на следующую запись. Last - переход на последнюю запись. Рис. 12 Форма «Новый сотрудник» 6. По подобию самостоятельно создайте и настройте вкладки «Должность» и «Телефоны», в результате у вас должна получиться форма, изображённая на рисунке 12. Подсказка для компонента DBComboBox3 в свойство Items добавьте: Домашний, Рабочий, Сотовый. 7. Когда мы, заполнив одну таблицу, перейдем к другой, то в первой таблице запись еще не будет сохранена. Поле «Ключ» у нас автоинкрементное, на него завязаны остальные таблицы. До тех пор, пока мы не сохраним запись, в этом поле не будет никакого значения. Следовательно, данные в других таблицах не смогут привязаться к какой-то записи главной таблицы. Поэтому выделите первый GroupBox, и дважды щелкните по событию onExit на вкладке Events инспектора объектов. Это событие происходит всякий раз, когда пользователь перейдет к другой панели GroupBox, либо к кнопкам, расположенным в нижней части окна. В сгенерированной процедуре впишите код: {Вышли из редактирования Inf_o_Sotr } procedure TfNewSotrudnik.GroupBox1Exit(Sender: TObject); 30 begin if fDM.TInf_o_Sotr.Modified then fDM.TInf_o_Sotr.Post; end; !!! Свойство Modified компонента ADOTable имеет логический тип - в нем содержится True, если данные были изменены, и False в противном случае. Метод Post этого компонента, как уже упоминалось, сохраняет измененную запись таблицы. При этом в поле «Ключ» попадет присвоенное автоматически значение. Таким образом, введенный код означает, что если запись была изменена, то следует ее сохранить. Сгенерируйте событие onExit для оставшихся панелей GroupBox и таким же образом сохраните изменения записей в соответствующих таблицах (подсказка для панели должность if fDM.TDoljnost.Modified then fDM.TDoljnost.Post; для панели телефоны код для вставки: if fDM.TTelKniga.Modified then fDM.TTelKniga.Post;) 8. Далее сгенерируйте событие нажатия на кнопку «Добавить» в GroupBox с телефонными данными. Этой кнопкой мы будем добавлять новые записи в таблицу, ведь один сотрудник может иметь более одного телефона. Код в процедуре будет такой (если будет ошибка, проверьте правильность имен для DBEdit): if fDM.TTelephones.Modified then fDM.TTelephones.Post; fDM.TTelephones.Append; DBEdit14.SetFocus; !!! Вначале мы сохраняем измененные значения, если они были. Затем методом Append мы добавляем в таблицу новую запись. Добавить новую запись можно двумя методами: Append - добавляет новую запись в конец таблицы. Insert - добавляет новую запись в текущее положение курсора. 9. После добавления новой записи таблица уже будет в режиме редактирования, поэтому можно не вызывать метод Edit, который переводит таблицу в этот режим. Далее мы переводим фокус ввода на DBEdit с телефонными номерами, чтобы пользователю не пришлось делать это самому. В процедуре нажатия на кнопку «Сохранить и выйти» код простой: if fDM.TInf_o_Sotr.Modified then fDM.TInf_o_Sotr.Post; if fDM.TDoljnost.Modified then 31 fDM.TDoljnost.Post; if fDM.TTelKniga.Modified then fDM. TTelKniga.Post; Close; Добавить новую запись в каждую таблицу и перевести курсор в первый DBEdit, в котором редактируется фамилия делаем так: : fDM.TInf_o_Sotr.Append; fDM.TDoljnost.Append; fDM.TTelKniga.Append; DBEdit1.SetFocus; 10. Попробуйте после запуска программы нажать на кнопку новый сотрудник, если при заполнении полей таблицы телефонная книга выходит ошибка, то необходимо проверить наличие связей в модуле DM на вкладке Diagram установили ли вы связи между таблицами «Информация о сотрудниках» и «Телефонная книга». Если связи отсутствуют, то необходимо их установить. Как это делать описано в работе №5. После выполненных правильных шагов у вас должно получится как на рисунке ниже. 11. Сохраните изменения и запустите программу, заполните окно данными о новом сотруднике. ЛАБОРАТОРНАЯ РАБОТА №7 Тема: Реализация автоматических запросов на выборку в Delphi. 32 Цель: Организация запроса на выборку в Delphi о поиске информации о сотруднике по его фамилии. Краткие теоретические сведения Запросы (TQuery, TADOQuery) - это такие же наборы данных, как и таблицы (TTable, TADOTable). Запросы, как и таблицы, происходят от общего предка - TDBDataSet, в связи с этим они имеют схожие свойства, методы и события. Но имеются и существенные различия. Прежде всего, если табличный набор данных TTable (TADOTable) получает точную копию данных из таблицы базы данных, то запрос TQuery (TADOQuery) получает этот набор, основываясь на запросе, сделанном на специальном языке SQL (Structured Query Language - Язык Структурированных Запросов). С помощью этого языка программист создаетзапрос, который передается параметру TQuery.SQL (TADOQuery .SQL). При открытии набора данных этот запрос обрабатывается используемым механизмом BDE, ADO или др. и в набор данных передаются запрошенные данные. Заметили разницу? Не копия таблицы, а именно запрошенные данные, причем в указанном порядке! Используя запросы, в одном наборе данных можно получить взаимосвязанные данные из разных физических таблиц. Отпадает надобность в подстановочных полях. Имеется два варианта работы с SQL -запросами. В первом случае, SQL -запрос запрашивает нужные данные из таблицы (таблиц) базы данных. При этом формируется временная таблица, созданная в каталоге запуска программы, и компонент-запрос становится ее владельцем. Работа с такими данными очень быстрая, но пользователь при этом не может изменять данные, он лишь просматривает их. Такой подход идеален для составления отчетности. Если же пользователю требуется вносить изменения в таблицу (таблицы), то с помощью специальных операторов SQL ( INSERT,UPDATE, DELETE ) формируется запрос, уведомляющий механизм доступа к данным изменить данные БД. В этом случае никаких временных таблиц не создается. Запрос передается механизму доступа, обрабатывается им, выполняются изменения, и механизм доступа уведомляет программу о благополучном (или нет) изменении данных. Ход выполнения работы 1. Создадим запрос, который выводит информацию о сотруднике по введенной фамилии. В БД Отдел кадров самостоятельно создайте и сохраните запрос поиск по фамилии, подсказка - код запроса: SELECT * FROM Inf_o_Sotr ORDER BY Фамилия; 33 2. Далее переходим в наш проект. Теперь необходимо на DM поместить компонент ADOQuery1 с вкладки ADO. 3. Подключим его к БД как и все остальные элементы DM. (в помощь: задайте свойство Connection). 4. В свойстве SQL данного компонента вводим запрос на языке SQL. !!! Текст запроса можно взять из БД. Либо ниже. SELECT * FROM Inf_o_Sotr ORDER BY Фамилия; 5. Свойство Active переводим в True, если все было проделано верно, то это получится. 6. Для визуального отображения данных добавим на DM компонент DataSource и соединим его с нашим запросом (свойство DataSet выберем наш запрос с именем ADOQuery1 у вас имя может иметь иное название). 7. Открываем форму fShtat. Для запуска созданного запроса, необходимо прописать событие для компонента Edit1, щелкаем дважды по нему л.к.мыши, копируем код, выделенный желтым и вставляем в нужное место): procedure TfShtat.Edit1Change(Sender: TObject); begin if Edit1.Text='' then DBGrid2.DataSource:=fDM.DSInf_o_Sotr else begin DBGrid2.DataSource:=fDM.DataSource1; end; fDM.ADOQuery1.Close; //Закрывает старый запрос fDM.ADOQuery1.SQL.Text:='SELECT*from Inf_o_Sotr WHERE Фамилия like "%'+Edit1.Text +'%"'; fDM.ADOQuery1.open; // открывает запрос. end; 8. Сохраните проект. Запустите его. Нажмите на кнопку «Штат сотрудников» окно должно иметь вид см.рисунок 13. 34 Рисунок 13 9. Введите в строку фамилию из списка сотрудников, у вас появится информация об этом сотруднике, рисунок 14. Рисунок 14 Поиск информации по фамилии 10. Откройте форму fOk с названием «Отдел кадров» для кнопки «Штат сотрудников» допишите код, изображенный ниже Это необходимо для того, чтобы при переходе на форму «Штат сотрудников», главная форма «Отдел кадров» закрывалась. 35 11. Откройте форму fShtat - Штат сотрудников, добавьте новую кнопку, дайте ей название «Вернуться назад» и для нее пропишите код, изображенный ниже Это необходимо для того, чтобы можно было осуществить переход назад при этом текущая открытая форма закроется. Правила создания авторизации для информационной системы. 1. Необходимо создать новую форму. Разместить на ней необходимые компоненты см.рисунок ниже. Для кнопки «Вход» прописать код Для кнопки «Отмена» Листинг программы для кода авторизации: unit avtor; interface 36 uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Edit1: TEdit; Edit2: TEdit; Button1: TButton; Button2: TButton; Label2: TLabel; Label3: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses fOk1; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var login,pass:string; begin login:='admin'; pass:='751-4'; if (edit1.Text=login) and (edit2.Text=pass) then begin Form1.Hide; fOk.Show; end else Application.MessageBox ('Íåïðàâèëüíûé ëîãèí èëè ïàðîëü!', 'Âõîä íå óäàëñÿ', mb_IconExclamation); Edit1.Clear; Edit2.Clear; end; procedure TForm1.Button2Click(Sender: TObject); begin Edit1.Clear; Edit2.Clear; end; end. Для того, чтобы при вводе пароля на экране отображались звездочки и пароль был скрыт, необходимо в свойстве компонента Edit2 (куда вводится пароль) PasswordChar то, что в нем написано и поставить там *. Теперь для правильного завершения работы с программой, необходимо реализовать кнопку выхода из проекта. Для этого на форме «Отдел кадров», где расположены кнопки «Штат сотрудников» и Телефонная книга» добавьте кнопку «Выход из программы», напишите код выхода из проекта по подобию рисунка ниже, используя свои названия предыдущей главной формы и той, которой вы ее заменили. 37 После этого необходимо сделать так, чтобы после запуска программы первой запускалась форма авторизации. Для этого зайдите в меню в Project – Options – Forms и выбрать там название формы авторизации. Запрос поиск телефона по фамилии SELECT LihcData.Фамилия, LihcData.Дата_рождения, Telophone.№_телефона FROM LihcData INNER JOIN Telophone ON LihcData.id_сотрудник=Telophone.Сотрудник WHERE (((LihcData.Фамилия) Like "С*")); TInf_o_SotrId_.Value:= TTelKnigaDSDesigner.Value; 38 Фефелова Светлана Витальевна СОЗДАНИЕ БАЗ ДАННЫХ В СРЕДЕ ПРОГРАММИРОВАНИЯ DELPHI Лабораторный практикум Лицензия № ___ от ___ г. Формат издания ____. Печать . Усл. печ. _____. Уч.-изд. _____ Тираж _____ экз. Заказ № _________ Отпечатано в печатном цехе Приамурского государственного университета имени Шолом-Алейхема 679015, г. Биробиджан, ул. Широкая, 70-А 39