С самого появления технологии баз данных программисты испытывали потребность в механизмах доступа к этим самым данным. Различные компании по-своему пытались предоставить им такую возможность. Например, для работы с таблицами типа dBase была создана Система Управления Базами Данных ( СУБД ) . Для времен операционной системы MS-DOS - превосходное решение. Однако не мог работать ни с какими другими типами таблиц. И чем больше типов данных появлялось, тем острее вставала необходимость разработать универсальный инструмент доступа, который мог бы работать с любым типом данных.
Borland. Этот dBase, FoxPro и Paradox, к различным серверам SQL и ко многим другим источникам данных, доступ которых поддерживался при помощи драйверов ODBC. Например, с помощью BDE можно напрямую работать с табличными файлами MS Excel. Увы, механизм доступа BDE признается устаревшим даже самой компанией Borland. В данный момент многие инструменты Delphi являются кросс - платформенными, то есть, программы с небольшими доработками можно переносить на другие операционные системы. Корпорация Borland выпустила новую среду быстрой разработки программ - Kylix, на которой создаются приложения для операционных систем семейства Linux. Часто говорят, что Kylix - это Delphi для Linux. Так и есть - если вы умеете программировать на Delphi, сумеете и на Kylix. Большинство инструментов Delphi были унаследованы Kylix, но, увы, не BDE. Дальнейшее развитие этого Borland прекращено.
Тем не менее, хоронить его рано. Многие программисты до сих пор используют данный инструмент в разработке приложений для небольших компаний. Да что там говорить, китайская компания Huawei, разрабатывающая современнейшие электронные АТС как для городских, так и для мобильных телефонов, до сих пор использует BDE для доступа к настройкам и статистическим данным этих АТС! Кроме того, BDE имеет множество простых и удобных возможностей для программиста, таких например, как создание таблиц программно.
Удобство работы с BDE трудно переоценить, однако нельзя не сказать и о минусах. Основной минус - распространение приложений. Если ваше приложение использует для доступа к данным компоненты BDE, то и у клиента, который будет пользоваться вашей программой, должен быть установлен BDE. Причем если вы использовали алиасы (псевдонимы базы данных), то настройка на эти же алиасы должна быть и у клиента. Впрочем, создание инсталляционного пакета при помощи стандартной утилиты Install снимает эту проблему. Эта утилита позволяет включать настроенный механизм BDE в состав инсталляционного пакета вашей программы. Конечно, за это приходится расплачиваться большими размерами инсталляционного файла.
Другой минус касается не только BDE, но и любого другого универсального
На предыдущем курсе "Введение в программирование на Delphi " мы затрагивали работу с базами данных посредством BDE. Больше к этим темам мы возвращаться не будем, хотя изредка будем обращаться к BDE, чтобы продемонстрировать те или иные возможности, отсутствующие в других механизмах доступа к данным, или отличающиеся от них. Поэтому если вы пропустили этот курс, то хотя бы бегло просмотрите работу с BDE в лекциях 29-32.
Microsoft. Если точнее, то ADO - это надстройка над технологией OLE DB, посредством которой можно связываться с различными данными приложений Microsoft. В середине 1990-х годов большое развитие получила технология COM, и корпорация Microsoft в связи с этим объявила о постепенном переходе от старой технологии ODBC к новой OLE DB. Однако технология OLE DB достаточно сложная, использование этой технологии происходит на системном уровне и требует от программиста немало знаний и труда. Кроме того, технология OLE DB очень чувствительна к ошибкам, и "вылетает" при первом удобном случае. Чтобы облегчить программистам жизнь, корпорация Microsoft разработала дополнительный
По своим возможностям ADO напоминает BDE, хотя конечно, является более мощным инструментом. Компания Borland разработала набор компонентов для доступа к ADO и первоначально назвала его ADOExpress. Однако корпорация Microsoft упорно противится использованию своих обозначений в продуктах сторонних разработчиков, поэтому, начиная с Delphi 6, этот набор компонентов стал именоваться dbGo. Эти компоненты вы можете увидеть на вкладке ADO
Технология ADO, как и BDE, независима от конкретного сервера БД, имеет поддержку как локальных баз данных различных типов, так и некоторых клиент-серверных БД. Плюсов у этой технологии много. Драйверы, разработанные корпорацией Microsoft для собственных нужд, более надежные, чем драйверы сторонних производителей. Поэтому если вам требуется работать с базами данных или для архитектуры клиент-сервер использовать MS SQL Server, то использование ADO будет наиболее предпочтительным. Кроме того, имеется плюс и в вопросе распространения программ - во всех современных Windows встроены драйверы ADO. Другими словами, ваша программа будет работать на любом ПК, где установлен Windows.
Как ни странно, но основной минус так же заключается в вопросе распространения программ. Корпорация Microsoft поступает довольно хитро. Каждые пару-тройку лет появляются новые версии Windows. Рядовому пользователю обычно нет нужды переходить на свежую ОС, тем более что каждая новая система становится все требовательней к ресурсам ПК. Для того чтобы заставить пользователя перейти на новую версию, корпорация Microsoft обязательно вводит несколько новых стандартов или технологий, несовместимых со старыми. А для старых версий доработок не предусматривается. Вот и приходится бедному пользователю скрепя зубы тратиться на новые версии операционной системы и пакета MS Office. Поэтому при использовании технологии ADO приходится думать о том, какая версия Windows стоит у конечного пользователя, будет ли ваша программа работать у него на ПК.
Технология ADO на самом деле является частью Microsoft распространяет MDAC как отдельный продукт, к счастью, бесплатный. При этом поддерживается только самая последняя версия MDAC. Например, в состав Delphi 7 входит MDAC 2.6. При распространении собственных программ следует учитывать, что у клиента с большей долей вероятности уже установлена эта самая MDAC, причем самой последней версии. Однако если он пользуется старыми версиями Windows (Win95, 98, ME, NT), то вам потребуется позаботиться об установке на его компьютер. Если же у него установлена ОС Win2000, WinXP или более новая, то у него уже есть, и вам беспокоиться не о чем.
Еще один серьезный минус ADO в том, что он для подключения к БД использует довольно медлительную технологию COM. Если ваша база данных будет содержать несколько тысяч записей, то скорость работы с таблицами может стать в сотни раз более медленной, чем если бы вы использовали BDE! На современных ПК, имеющих частоту процессора до 2 ГГц и выше, эти замедления могут быть и незаметны, но работа с огромной базой данных на более медленных ПК превратится в сплошное ожидание.
Основными компонентами, с которыми нам предстоит работать, являются
Базы данных имеют много плюсов, часто программисты предпочитают использовать именно их. Во-первых, база данных - это один файл. Сколько бы таблиц и индексов она не содержала, все это хранится в одном единственном файле. А значит, такую базу данных легче обслуживать - переносить на новое место, делать резервные копии и так далее. Еще один плюс - имена полей в такой БД можно давать русскими буквами.
Лучше всего изучать новый материал на практике. Для примера создадим базу данных для отдела кадров какого-нибудь предприятия. Какие данные на сотрудника нам понадобятся? Прежде всего, фамилия, имя и отчество. Затем укажем пол (мужской или женский), семейное положение (холост или женат/замужем), количество детей. Также понадобятся дата рождения и дата поступления на работу. Стаж работы в годах. Образование. Военнообязанный сотрудник, или нет. Телефоны, по которым можно связаться с сотрудником в любое время. Должность сотрудника и отдел (если есть), в котором он числится. А также его домашний адрес. При этом учитываем, что сотрудник не обязательно является жителем города, где он работает. А вдруг он приехал на заработки из другого города? Или даже из другой страны? Следовательно, придется вводить и страну, и город - вдруг потребуется делать отчет по сотрудникам, прописанным в Украине, например? Вот сколько данных нужно будет вводить для отдела кадров! А ведь мы еще немного упростили их. Стаж работы подразделяется на общий и непрерывный. Эти данные учитываются при расчете больничных листов. Но для учебной базы данных такими деталями можно пренебречь.
Итак, первым делом оптимизируем данные, исходя из правил трех нормальных форм. В результате получаем целых четыре таблицы:
(рис 2.1) Оптимизированные таблицыГлавной здесь будет таблица LichData, которая содержит основные данные о сотруднике. Она имеет релятивные связи с другими таблицами. Поле "Ключ" будет автоинкрементным, то есть автоматически будет прибавляться на единицу, гарантируя нам
Главная таблица поддерживает связь один-к-одному с таблицами Doljnost и , и связь один-ко-многим с таблицей , ведь у сотрудника наверняка есть и домашний, и рабочий телефоны, а в карманах, возможно, лежит пара мобильников. То есть, один сотрудник может иметь много телефонов.
С полями и связями определились, пора создавать базу данных. Для этого загрузите программу .
Если в правой части окна у вас нет панели "Создание файла", то выберите команду "Файл -Создать". Затем выберите команду "Новая база данных". Сразу же выйдет запрос с именем этой базы данных. Создайте папку, которая все равно нам понадобится для нового проекта, укажите эту папку, а базу данных назовите ok (отдел кадров). Как только вы нажмете кнопку "Создать", появится окно этой базы данных:
(рис 2.2) Создание БДСейчас нам потребуется сделать четыре таблицы. Поэтому дважды щелкаем по команде "Создание таблицы в режиме конструктора", и переходим к конструктору. В левой части мы вводим имя поля, причем русскими буквами. В поле "Тип данных выбираем тип", а на вкладке "Общие" делаем настройки поля.
LichData ", так будет называться наша первая таблица. После этого появится окно создания маски ввода. Выберите "Краткий формат даты", нажмите "Далее", после чего в окне "Маска ввода" наберите "00.00.0000". В результате мы будем иметь маску в виде "дд.мм.гггг".В результате получим такую картину:
(рис 2.3) Поля таблицы LichDataПри попытке закрыть это окно, выйдет запрос о сохранении таблицы " LichData ". Ответьте утвердительно. Главная таблица сделана, осталось еще три.
Снова щелкаем "Создание таблицы в режиме конструктора". Вводим такие поля:
Access предложит вам сделать поле ключевым.Закрываем таблицу, даем ей имя " Doljnost ", отказываемся от создания ключа.
Делаем следующую таблицу. Поля:
Закрываем таблицу, даем имя " ", отказываемся от создания ключа.
Делаем следующую таблицу. Поля:
Закрываем таблицу " ", отказываясь от создания ключевого поля.
Все, база данных готова. Программу можно закрыть, больше она не понадобится. Пока база данных еще пустая, желательно сделать резервную копию файла ok.mdb, который и является полученной базой данных. Как видите, никаких связей между таблицами мы не делали - проще будет сделать их в проекте программы.
Базу данных мы спроектировали, таблицы сделали. Осталась еще половина работы - проект Delphi, работающий с этой базой данных. Загружаем Delphi, делаем новый проект. Главная форма нашей программы будет выглядеть так:
(рис 2.5) Главная формаЗдесь я поместил три обычных панели. Свойству Align верхней панели присвоил значение alTop (весь верх). Затем свойству Align нижней панели присвоил значение alBottom. Затем поместил компонент Splitter с вкладки Additional панели инструментов, и его свойству Align также присвоил alBottom, после чего он прижался к нижней панели. Splitter - это разделитель между панелями. С его помощью пользователь мышью сможет передвигать нижнюю панель, меняя ее размеры. И, наконец, свойству Align средней панели присвоил значение alClient, чтобы она заняла все оставшееся место на форме. Не забудьте очистить свойство Caption всех трех панелей.
Далее на верхнюю панель я поместил три компонента RadioButton с вкладки Standard
Далее я сделал раздел поиска, поместив в него обычные Label,
В последнем разделе верхней панели находятся еще две кнопки BitBtn. Одна из них предназначена для редактирования текущей записи, другая - для добавления новой.
Вторая и третья панели содержат только по одному компоненту DataControls
Свойству Name формы присвоено значение fMain, свойство Caption формы имеет текст "Отдел кадров", модуль сохранен под именем Main.pas, а проект в целом называется ok (отдел кадров).
Далее в проект добавлен модуль данных (File -> New -> Data Module). Модуль данных - это не визуальный контейнер для размещения на нем невизуальных компонентов. В основном, он предназначен для размещения в нем компонентов подключения к данным ( TDataBase, ADOConnection и т.п.), компонентов - наборов данных ( TTable / ADOTable, TQuery / ADOQuery, TStoredProc / ADOStoredProc ) и компонентов DataSource, которые обеспечивают связь наборов данных и компонентов отображения/редактирования данных. Также модуль данных часто используют и для хранения глобальных переменных, общих функций и процедур, которые должны быть видны по всей программе. Модуль данных не имеет формы, но сохраняется как модуль в файле *.pas.
Свойству Name модуля данных мы присвоим имя , а модуль сохраним как DM.pas. Теперь самое интересное. Добавляем в модуль компонент ADOConnection с вкладки ADO
Приступим к делу. Щелкните дважды по свойству ConnectionString компонента ADOConnection. Откроется окно подключения компонента к ADO:
(рис 2.6) Окно подключения к ADO.Здесь мы можем подключиться тремя способами:
ADO.Build.Воспользуемся третьим способом - нажмем кнопку Build. Открывается новое окно, содержащее настройки подключения:
(рис 2.7) Настройки подключенияВначале нам предлагается выбрать поставщика OLE DB, или иначе, указать нужный для подключения драйвер. Для связи с базой данных больше всего подходит " Jet - это название механизма работы с СУБД, встроенного в , имеющие расширение *.mdb, так и ODBC. Его и выделяем в списке.
Нажимаем на кнопку "Далее", либо переходим к вкладке "Подключение". Здесь нам нужно выбрать или ввести базу данных. Тут есть одно замечание. Если мы выберем базу данных, то есть, нажмем на кнопку с тремя точками, откроем диалог выбора и найдем там наш файл, то база данных будет привязана к указанному адресу. Если вы желаете поместить базу данных в какой-то определенной папке, то так и поступите. Однако если вы поместили файл с базой данных (в нашем случае ok.mdb) там же, где находится программа, и не желаете зависеть от определенной папки (ведь пользователь может переместить вашу программу), то нужно вручную вписать только имя файла с БД, без всякого адреса. В этом случае вы не сможете проверить подключение, нажав на кнопку "Проверить подключение". Ну и не надо, обойдемся без проверки. Укажите только имя файла - ok.mdb (вы ведь уже поместили этот файл в папку с проектом?). Нажмите на кнопку "ОК".
Закрываем окно
Пойдем дальше. Установите в модуль данных четыре компонента ADOTable, по одному на каждую таблицу из нашей базы данных. Компонент ADOTable (также как и TTable из вкладки ) предназначен для создания набора данных.
Набором данных (НД) называется группа записей, полученных такими компонентами, как TTable/ADOTable, TQuery/ADOQuery, TStoredProc/ADOStoredProc из одной или нескольких таблиц базы данных. Все компоненты наборов данных являются потомками класса TDBDataSet, и имеют много общих свойств, методов и событий. Эти компоненты также называют наборами данных.
Табличные компоненты (TTable/ADOTable) являются наборами данных, которые получают из базы данных полную копию одной из таблиц, и предоставляют полученный набор данных визуальным компонентам отображения данных (
Компоненты запросов ( TQuery/ADOQuery ) для получения набора данных из базы данных используют SQL -запрос. Компоненты позволяют получить из одной или нескольких таблиц только те данные, которые удовлетворяют запросу.
Выделите все четыре ADOTable (удерживая клавишу <Shift>), и в их свойстве Connection выберите нашу связь ADOConnection1. Таким образом, все четыре ADOTable мы подключили к базе данных.
Выделите первый компонент ADOTable. Переименуйте его свойство Name в TLichData, а в свойстве TableName выберите главную таблицу базы - LichData. Буква "Т" в начале названия компонента укажет нам в дальнейшем, что это таблица. Рядом с компонентом установите компонент DataSource из вкладки DataSource переименуйте в DSLichData ( DS - DataSource ). В свойстве DataSet выберите таблицу TLichData.
То же самое нужно проделать еще три раза, подключая аналогичным образом компоненты DataSource к другим таблицам:
(рис 2.8) Модуль данных с установленными компонентами.Затем свойство Active таблиц переведите в True, открыв их. Для тех, кто пропустил предыдущий курс, напомню, что таблицы можно открывать и закрывать не только в Инспекторе Объектов, но и программно. Как открыть, так и закрыть таблицы можно двумя абсолютно равноценными способами:
//Открываем таблицы: fDM.TLichData.Open; fDM.TDoljnost.Active := True; //Закрываем их: fDM.TLichData.Close; fDM.TDoljnost.Active := False;
Пойдем далее. Перейдите на главную форму. Выберите команду File -> Use Unit и подключите к ней модуль DM. Теперь мы сможем видеть таблицы из главной формы.
На вкладке DataControls сосредоточены визуальные (видимые пользователю) MEMO -полей) и т.д. Единственным исключением является компонент
Выделите верхнюю сетку . В таком же свойстве нижней сетки выберите . Сетки среагировали, и вы можете видеть названия полей. Разумеется, таблица еще пуста, данных пока нет. Кстати, выделите обе сетки, и установите в True их свойства ReadOnly - только чтение. Таблицы ведь будут связаны, и нам не нужно, чтобы пользователь вводил данные фрагментарно. Мы для этого сделаем отдельную форму, а эти сетки нужны только для просмотра.
Теперь нужно между таблицами установить связь. Это требуется не только для того, чтобы в нижней сетке выходили данные только на сотрудника, выделенного в верхней сетке, но и для того, чтобы мы смогли в дальнейшем вводить связанные данные в окне редактора. Снова выделите модуль данных. Щелкните дважды по первой таблице, чтобы открыть Add all fields (добавить все поля). В окне
(рис 2.9) Редактор полейlookup ). Но эту возможность мы будем рассматривать в других лекциях.
Поле "Ключ" у нас автоинкрементное, предназначено для связи с другими таблицами. Пользователю его видеть не обязательно. Выделите его, и в свойстве Visible установите False. Теперь для пользователя оно будет невидимым. Здесь у нас есть два логических поля - "Сем_Полож" и "Военнообязанный". Чтобы True и False выходили на экране так, как нам нужно, свойству DisplayValues первого из этих полей присвойте значение "Женат;Холост" (разумеется, без кавычек), а второго - "Да;Нет". Первым здесь идет значение, которое будет обозначать True, вторым - False. Эти значения разделяются точкой с запятой, пробелы не нужны.
Таким же образом добавьте все поля в остальные три таблицы. У них невидимым следует сделать поле "Сотрудник" - этому полю автоматически будет присвоено такое же число, как у поля Ключ соответствующей записи. Логических полей у них нет. Однако для поля "Телефон" таблицы следует изменить свойство EditMask. Щелкните по нему дважды, открыв редактор маски, и в поле Input Mask введите маску "#(###)-###-##-##". Сохраните ее, нажав кнопку ОК. Для полей LichData два таких поля) введите маску "##.##.####".
Далее кнопкой <F12> перейдите в редактор кода. В нижней части окна вы можете увидеть вкладку Diagram, перейдите на нее. Нам с вами потребуется сделать такие связи:
(рис 2.10) Связи базы данныхДля начала в окно диаграмм нужно добавить наши таблицы. Найдите их в окне дерева объектов Object . Если у вас это окно закрыто, откройте его клавишами <Shift+Alt+F11> либо командой меню View -> Object
LichData {TLichData}
и перетащите ее в окно диаграмм. Таблица вместе с полями отобразится в окне. Если бы ранее мы не добавили все поля в окне Master / Detail Connector, которую вы можете увидеть в верхней части окна диаграмм (предпоследняя). Нажмите на кнопку, затем подведите указатель мыши к боковой границе главной таблицы, нажмите левую кнопку и, удерживая ее, проведите линию к боковой границе таблицы . Как только вы отпустите кнопку, появится окно связей:
(рис 2.11) Окно связейЗдесь в поле Detail Fields нужно выбрать поле, по которому будет осуществляться связь, в нашем случае это поле "Сотрудник". В поле Master Fields выбираем ключевое поле "Ключ". Затем нажимаем кнопку Add и кнопку OK. Связь установлена.
При установке связей главный / подчиненный важно начинать вести линию с главной таблицы к подчиненной. Если бы мы сделали иначе, то главной таблицей стала бы TAdres. Такую же связь установите и с остальными таблицами. Просто, не правда ли?
Сохраните проект, скомпилируйте его и запустите на выполнение. Если в сетках главного окна вы видите открытые таблицы, то все хорошо. Если нет, возможно, при изменении настроек ваши таблицы закрылись. В таком случае закройте программу (но не проект!), выделите таблицы, и их свойству Active снова присвойте значение True. Таблицы должны появиться в сетках главного окна, даже на этапе проектирования.
Пойдем дальше. Теперь нам нужно сделать окно редактора данных. Создайте новую форму (File -> New -> Form). Ее свойство Name переименуйте в fEditor, а при сохранении формы дайте модулю имя Editor. Командой File -> Use Unit подключите к форме модуль данных DM. Теперь нам нужно установить на форму такие компоненты:
(рис 2.12) Окно редактора данных Здесь я поступил следующим образом: установил на форму четыре панели GroupBox с вкладки Standard, на каждую таблицу свой GroupBox. Почему я так поступил, станет понятно позже. Займемся первой таблицей. В свойстве Caption компонента GroupBox впишите "Личные данные", это название отразится в заголовке панели. Далее на эту панель следует установить восемь компонентов
муж жен
Сохраните текст, нажав кнопку ОК. Теперь пользователь сможет указать пол сотрудника, выбрав нужную строку из списка.
Для таблицы Doljnost все еще проще: на панели GroupBox всего два компонента
Для таблицы используйте три
А вот для таблицы понадобится один
Рабочий Домашний Мобильный
Теперь займемся подключением компонентов контроля. Удерживая <Shift>, выделите все компоненты контроля на первой панели (все компоненты, кроме Label ). В их свойстве DataSource выберите , подключив компоненты к нужному набору данных (таблице). Снимите общее выделение, и выделите первый , и не имеет поля, разумеется. Она отображает все видимые поля таблицы.
В правой нижней части для удобства пользователя я установил навигационный компонент , чтобы подключить компонент к главной таблице. Нам нужна от этого компонента только возможность перехода на начало или конец таблицы, на следующую или предыдущую запись. Поэтому раскройте его свойство VisibleButtons (видимость кнопок компонента) и переведите в False все кнопки, кроме nbFirst, nbPrior, nbNext и nbLast. Нажатие на эти кнопки приведет к вызову соответствующих методов компонента ADOTable. Эти методы делают следующее:
Когда у
Теперь пришло время объяснить, почему я поместил компоненты на панели GroupBox, и почему для каждой таблицы сделал отдельную панель. Если вы прошли предыдущий курс "Введение в программирование на Delphi", то знаете, что измененная запись в таблице сохраняется в трех случаях:
Когда мы, заполнив одну таблицу, перейдем к другой, то в первой таблице запись еще не будет сохранена. Поле "Ключ" у нас автоинкрементное, на него завязаны остальные таблицы. До тех пор, пока мы не сохраним запись, в этом поле не будет никакого значения. Следовательно, данные в других таблицах не смогут привязаться к какой-то записи главной таблицы. Поэтому выделите первый GroupBox, и дважды щелкните по событию
{Вышли из редактирования LichData}
procedure TfEditor.GroupBox1Exit(Sender: TObject);
begin
if fDM.TLichData.Modified then
fDM.TLichData.Post;
end;
Свойство
Далее сгенерируйте событие нажатия на кнопку "Добавить" в GroupBox с телефонными данными. Этой кнопкой мы будем добавлять новые записи в таблицу, ведь один сотрудник может иметь более одного телефона. Код в процедуре будет такой:
if fDM.TTelephones.Modified then
fDM.TTelephones.Post;
fDM.TTelephones.Append;
DBEdit14.SetFocus;
Вначале мы сохраняем измененные значения, если они были. Затем методом
После добавления новой записи таблица уже будет в режиме редактирования, поэтому можно не вызывать метод
В процедуре нажатия на кнопку "Сохранить и выйти" код простой:
if fDM.TLichData.Modified then
fDM.TLichData.Post;
if fDM.TDoljnost.Modified then
fDM.TDoljnost.Post;
if fDM.TAdres.Modified then
fDM.TAdres.Post;
if fDM.TTelephones.Modified then
fDM.TTelephones.Post;
Close;
Здесь мы лишь сохраняем изменения во всех таблицах, если они были, и закрываем окно. Напоследок у нас осталась кнопка "Добавить сотрудника". Что мы должны сделать, если пользователь нажмет на эту кнопку? Добавить новую запись в каждую таблицу и перевести курсор в первый
fDM.TLichData.Append; fDM.TDoljnost.Append; fDM.TAdres.Append; fDM.TTelephones.Append; DBEdit1.SetFocus;
С этой формой мы закончили, переходим к главной форме. Не забывайте время от времени сохранять проект. Если вы еще не подключили модуль Editor к главной форме командой File -> Use Unit, то сделайте это сейчас, чтобы можно было вызывать окно редактора из главной формы. Начнем с кнопки "Новый сотрудник". Как и в предыдущем примере, нам потребуется добавить новую запись в каждую таблицу, после чего открыть окно редактора:
fDM.TLichData.Append; fDM.TDoljnost.Append; fDM.TAdres.Append; fDM.TTelephones.Append; fEditor.ShowModal;
Сгенерируйте процедуру
fEditor.ShowModal;
В результате откроется окно редактора, и компоненты будут отображать данные текущей записи. Предположим, пользователю будет удобней дважды щелкнуть по записи в верхней сетке
Блок поиска по фамилии оставим на следующую лекцию и перейдем к программированию радиокнопок. По нашему замыслу, при открытии программы в верхней сетке . Также будет выделена радиокнопка с надписью "Адрес". Если пользователю захочется посмотреть должность или телефоны текущего сотрудника, он будет щелкать соответствующую радиокнопку, и эти данные должны быть отображены в нижней
if RadioButton1.Checked then
DBGrid2.DataSource := fDM.DSAdres;
Здесь мы проверили, включена ли данная радиокнопка. Если да, то мы меняем связь нижней сетки DBGrid и подключаем ее к таблице . Ведь связь сетки с таблицей осуществляется через соответствующий компонент DataSource, а у нас их четыре. Подключаясь то к одному, то к другому DataSource, мы можем программно менять отображенную в сетке таблицу.
Для события
if RadioButton2.Checked then
DBGrid2.DataSource := fDM.DSTelephones;
А для события
if RadioButton3.Checked then
DBGrid2.DataSource := fDM.DSDoljnost;
Таким образом, в нижней сетке мы отображаем то одну, то другую подчиненную таблицу, и всякий раз в этих таблицах будут показаны данные текущего сотрудника. Вот и весь код! Сохраните проект и скомпилируйте его. На следующей лекции мы будем изучать методы поиска и фильтрации, поэтому введите в базу данные десятка на два - три сотрудников, чтобы было, что искать.
С самого появления технологии баз данных программисты испытывали потребность в механизмах доступа к этим самым данным. Различные компании по-своему пытались предоставить им такую возможность. Например, для работы с таблицами типа dBase была создана Система Управления Базами Данных ( СУБД ) . Для времен операционной системы MS-DOS - превосходное решение. Однако не мог работать ни с какими другими типами таблиц. И чем больше типов данных появлялось, тем острее вставала необходимость разработать универсальный инструмент доступа, который мог бы работать с любым типом данных.
Borland. Этот dBase, FoxPro и Paradox, к различным серверам SQL и ко многим другим источникам данных, доступ которых поддерживался при помощи драйверов ODBC. Например, с помощью BDE можно напрямую работать с табличными файлами MS Excel. Увы, механизм доступа BDE признается устаревшим даже самой компанией Borland. В данный момент многие инструменты Delphi являются кросс - платформенными, то есть, программы с небольшими доработками можно переносить на другие операционные системы. Корпорация Borland выпустила новую среду быстрой разработки программ - Kylix, на которой создаются приложения для операционных систем семейства Linux. Часто говорят, что Kylix - это Delphi для Linux. Так и есть - если вы умеете программировать на Delphi, сумеете и на Kylix. Большинство инструментов Delphi были унаследованы Kylix, но, увы, не BDE. Дальнейшее развитие этого Borland прекращено.
Тем не менее, хоронить его рано. Многие программисты до сих пор используют данный инструмент в разработке приложений для небольших компаний. Да что там говорить, китайская компания Huawei, разрабатывающая современнейшие электронные АТС как для городских, так и для мобильных телефонов, до сих пор использует BDE для доступа к настройкам и статистическим данным этих АТС! Кроме того, BDE имеет множество простых и удобных возможностей для программиста, таких например, как создание таблиц программно.
Удобство работы с BDE трудно переоценить, однако нельзя не сказать и о минусах. Основной минус - распространение приложений. Если ваше приложение использует для доступа к данным компоненты BDE, то и у клиента, который будет пользоваться вашей программой, должен быть установлен BDE. Причем если вы использовали алиасы (псевдонимы базы данных), то настройка на эти же алиасы должна быть и у клиента. Впрочем, создание инсталляционного пакета при помощи стандартной утилиты Install снимает эту проблему. Эта утилита позволяет включать настроенный механизм BDE в состав инсталляционного пакета вашей программы. Конечно, за это приходится расплачиваться большими размерами инсталляционного файла.
Другой минус касается не только BDE, но и любого другого универсального
На предыдущем курсе "Введение в программирование на Delphi " мы затрагивали работу с базами данных посредством BDE. Больше к этим темам мы возвращаться не будем, хотя изредка будем обращаться к BDE, чтобы продемонстрировать те или иные возможности, отсутствующие в других механизмах доступа к данным, или отличающиеся от них. Поэтому если вы пропустили этот курс, то хотя бы бегло просмотрите работу с BDE в лекциях 29-32.
Microsoft. Если точнее, то ADO - это надстройка над технологией OLE DB, посредством которой можно связываться с различными данными приложений Microsoft. В середине 1990-х годов большое развитие получила технология COM, и корпорация Microsoft в связи с этим объявила о постепенном переходе от старой технологии ODBC к новой OLE DB. Однако технология OLE DB достаточно сложная, использование этой технологии происходит на системном уровне и требует от программиста немало знаний и труда. Кроме того, технология OLE DB очень чувствительна к ошибкам, и "вылетает" при первом удобном случае. Чтобы облегчить программистам жизнь, корпорация Microsoft разработала дополнительный
По своим возможностям ADO напоминает BDE, хотя конечно, является более мощным инструментом. Компания Borland разработала набор компонентов для доступа к ADO и первоначально назвала его ADOExpress. Однако корпорация Microsoft упорно противится использованию своих обозначений в продуктах сторонних разработчиков, поэтому, начиная с Delphi 6, этот набор компонентов стал именоваться dbGo. Эти компоненты вы можете увидеть на вкладке ADO
Технология ADO, как и BDE, независима от конкретного сервера БД, имеет поддержку как локальных баз данных различных типов, так и некоторых клиент-серверных БД. Плюсов у этой технологии много. Драйверы, разработанные корпорацией Microsoft для собственных нужд, более надежные, чем драйверы сторонних производителей. Поэтому если вам требуется работать с базами данных или для архитектуры клиент-сервер использовать MS SQL Server, то использование ADO будет наиболее предпочтительным. Кроме того, имеется плюс и в вопросе распространения программ - во всех современных Windows встроены драйверы ADO. Другими словами, ваша программа будет работать на любом ПК, где установлен Windows.
Как ни странно, но основной минус так же заключается в вопросе распространения программ. Корпорация Microsoft поступает довольно хитро. Каждые пару-тройку лет появляются новые версии Windows. Рядовому пользователю обычно нет нужды переходить на свежую ОС, тем более что каждая новая система становится все требовательней к ресурсам ПК. Для того чтобы заставить пользователя перейти на новую версию, корпорация Microsoft обязательно вводит несколько новых стандартов или технологий, несовместимых со старыми. А для старых версий доработок не предусматривается. Вот и приходится бедному пользователю скрепя зубы тратиться на новые версии операционной системы и пакета MS Office. Поэтому при использовании технологии ADO приходится думать о том, какая версия Windows стоит у конечного пользователя, будет ли ваша программа работать у него на ПК.
Технология ADO на самом деле является частью Microsoft распространяет MDAC как отдельный продукт, к счастью, бесплатный. При этом поддерживается только самая последняя версия MDAC. Например, в состав Delphi 7 входит MDAC 2.6. При распространении собственных программ следует учитывать, что у клиента с большей долей вероятности уже установлена эта самая MDAC, причем самой последней версии. Однако если он пользуется старыми версиями Windows (Win95, 98, ME, NT), то вам потребуется позаботиться об установке на его компьютер. Если же у него установлена ОС Win2000, WinXP или более новая, то у него уже есть, и вам беспокоиться не о чем.
Еще один серьезный минус ADO в том, что он для подключения к БД использует довольно медлительную технологию COM. Если ваша база данных будет содержать несколько тысяч записей, то скорость работы с таблицами может стать в сотни раз более медленной, чем если бы вы использовали BDE! На современных ПК, имеющих частоту процессора до 2 ГГц и выше, эти замедления могут быть и незаметны, но работа с огромной базой данных на более медленных ПК превратится в сплошное ожидание.
Основными компонентами, с которыми нам предстоит работать, являются
Базы данных имеют много плюсов, часто программисты предпочитают использовать именно их. Во-первых, база данных - это один файл. Сколько бы таблиц и индексов она не содержала, все это хранится в одном единственном файле. А значит, такую базу данных легче обслуживать - переносить на новое место, делать резервные копии и так далее. Еще один плюс - имена полей в такой БД можно давать русскими буквами.
Лучше всего изучать новый материал на практике. Для примера создадим базу данных для отдела кадров какого-нибудь предприятия. Какие данные на сотрудника нам понадобятся? Прежде всего, фамилия, имя и отчество. Затем укажем пол (мужской или женский), семейное положение (холост или женат/замужем), количество детей. Также понадобятся дата рождения и дата поступления на работу. Стаж работы в годах. Образование. Военнообязанный сотрудник, или нет. Телефоны, по которым можно связаться с сотрудником в любое время. Должность сотрудника и отдел (если есть), в котором он числится. А также его домашний адрес. При этом учитываем, что сотрудник не обязательно является жителем города, где он работает. А вдруг он приехал на заработки из другого города? Или даже из другой страны? Следовательно, придется вводить и страну, и город - вдруг потребуется делать отчет по сотрудникам, прописанным в Украине, например? Вот сколько данных нужно будет вводить для отдела кадров! А ведь мы еще немного упростили их. Стаж работы подразделяется на общий и непрерывный. Эти данные учитываются при расчете больничных листов. Но для учебной базы данных такими деталями можно пренебречь.
Итак, первым делом оптимизируем данные, исходя из правил трех нормальных форм. В результате получаем целых четыре таблицы:
(рис 2.1) Оптимизированные таблицыГлавной здесь будет таблица LichData, которая содержит основные данные о сотруднике. Она имеет релятивные связи с другими таблицами. Поле "Ключ" будет автоинкрементным, то есть автоматически будет прибавляться на единицу, гарантируя нам
Главная таблица поддерживает связь один-к-одному с таблицами Doljnost и , и связь один-ко-многим с таблицей , ведь у сотрудника наверняка есть и домашний, и рабочий телефоны, а в карманах, возможно, лежит пара мобильников. То есть, один сотрудник может иметь много телефонов.
С полями и связями определились, пора создавать базу данных. Для этого загрузите программу .
Если в правой части окна у вас нет панели "Создание файла", то выберите команду "Файл -Создать". Затем выберите команду "Новая база данных". Сразу же выйдет запрос с именем этой базы данных. Создайте папку, которая все равно нам понадобится для нового проекта, укажите эту папку, а базу данных назовите ok (отдел кадров). Как только вы нажмете кнопку "Создать", появится окно этой базы данных:
(рис 2.2) Создание БДСейчас нам потребуется сделать четыре таблицы. Поэтому дважды щелкаем по команде "Создание таблицы в режиме конструктора", и переходим к конструктору. В левой части мы вводим имя поля, причем русскими буквами. В поле "Тип данных выбираем тип", а на вкладке "Общие" делаем настройки поля.
LichData ", так будет называться наша первая таблица. После этого появится окно создания маски ввода. Выберите "Краткий формат даты", нажмите "Далее", после чего в окне "Маска ввода" наберите "00.00.0000". В результате мы будем иметь маску в виде "дд.мм.гггг".В результате получим такую картину:
(рис 2.3) Поля таблицы LichDataПри попытке закрыть это окно, выйдет запрос о сохранении таблицы " LichData ". Ответьте утвердительно. Главная таблица сделана, осталось еще три.
Снова щелкаем "Создание таблицы в режиме конструктора". Вводим такие поля:
Access предложит вам сделать поле ключевым.Закрываем таблицу, даем ей имя " Doljnost ", отказываемся от создания ключа.
Делаем следующую таблицу. Поля:
Закрываем таблицу, даем имя " ", отказываемся от создания ключа.
Делаем следующую таблицу. Поля:
Закрываем таблицу " ", отказываясь от создания ключевого поля.
Все, база данных готова. Программу можно закрыть, больше она не понадобится. Пока база данных еще пустая, желательно сделать резервную копию файла ok.mdb, который и является полученной базой данных. Как видите, никаких связей между таблицами мы не делали - проще будет сделать их в проекте программы.
Базу данных мы спроектировали, таблицы сделали. Осталась еще половина работы - проект Delphi, работающий с этой базой данных. Загружаем Delphi, делаем новый проект. Главная форма нашей программы будет выглядеть так:
(рис 2.5) Главная формаЗдесь я поместил три обычных панели. Свойству Align верхней панели присвоил значение alTop (весь верх). Затем свойству Align нижней панели присвоил значение alBottom. Затем поместил компонент Splitter с вкладки Additional панели инструментов, и его свойству Align также присвоил alBottom, после чего он прижался к нижней панели. Splitter - это разделитель между панелями. С его помощью пользователь мышью сможет передвигать нижнюю панель, меняя ее размеры. И, наконец, свойству Align средней панели присвоил значение alClient, чтобы она заняла все оставшееся место на форме. Не забудьте очистить свойство Caption всех трех панелей.
Далее на верхнюю панель я поместил три компонента RadioButton с вкладки Standard
Далее я сделал раздел поиска, поместив в него обычные Label,
В последнем разделе верхней панели находятся еще две кнопки BitBtn. Одна из них предназначена для редактирования текущей записи, другая - для добавления новой.
Вторая и третья панели содержат только по одному компоненту DataControls
Свойству Name формы присвоено значение fMain, свойство Caption формы имеет текст "Отдел кадров", модуль сохранен под именем Main.pas, а проект в целом называется ok (отдел кадров).
Далее в проект добавлен модуль данных (File -> New -> Data Module). Модуль данных - это не визуальный контейнер для размещения на нем невизуальных компонентов. В основном, он предназначен для размещения в нем компонентов подключения к данным ( TDataBase, ADOConnection и т.п.), компонентов - наборов данных ( TTable / ADOTable, TQuery / ADOQuery, TStoredProc / ADOStoredProc ) и компонентов DataSource, которые обеспечивают связь наборов данных и компонентов отображения/редактирования данных. Также модуль данных часто используют и для хранения глобальных переменных, общих функций и процедур, которые должны быть видны по всей программе. Модуль данных не имеет формы, но сохраняется как модуль в файле *.pas.
Свойству Name модуля данных мы присвоим имя , а модуль сохраним как DM.pas. Теперь самое интересное. Добавляем в модуль компонент ADOConnection с вкладки ADO
Приступим к делу. Щелкните дважды по свойству ConnectionString компонента ADOConnection. Откроется окно подключения компонента к ADO:
(рис 2.6) Окно подключения к ADO.Здесь мы можем подключиться тремя способами:
ADO.Build.Воспользуемся третьим способом - нажмем кнопку Build. Открывается новое окно, содержащее настройки подключения:
(рис 2.7) Настройки подключенияВначале нам предлагается выбрать поставщика OLE DB, или иначе, указать нужный для подключения драйвер. Для связи с базой данных больше всего подходит " Jet - это название механизма работы с СУБД, встроенного в , имеющие расширение *.mdb, так и ODBC. Его и выделяем в списке.
Нажимаем на кнопку "Далее", либо переходим к вкладке "Подключение". Здесь нам нужно выбрать или ввести базу данных. Тут есть одно замечание. Если мы выберем базу данных, то есть, нажмем на кнопку с тремя точками, откроем диалог выбора и найдем там наш файл, то база данных будет привязана к указанному адресу. Если вы желаете поместить базу данных в какой-то определенной папке, то так и поступите. Однако если вы поместили файл с базой данных (в нашем случае ok.mdb) там же, где находится программа, и не желаете зависеть от определенной папки (ведь пользователь может переместить вашу программу), то нужно вручную вписать только имя файла с БД, без всякого адреса. В этом случае вы не сможете проверить подключение, нажав на кнопку "Проверить подключение". Ну и не надо, обойдемся без проверки. Укажите только имя файла - ok.mdb (вы ведь уже поместили этот файл в папку с проектом?). Нажмите на кнопку "ОК".
Закрываем окно
Пойдем дальше. Установите в модуль данных четыре компонента ADOTable, по одному на каждую таблицу из нашей базы данных. Компонент ADOTable (также как и TTable из вкладки ) предназначен для создания набора данных.
Набором данных (НД) называется группа записей, полученных такими компонентами, как TTable/ADOTable, TQuery/ADOQuery, TStoredProc/ADOStoredProc из одной или нескольких таблиц базы данных. Все компоненты наборов данных являются потомками класса TDBDataSet, и имеют много общих свойств, методов и событий. Эти компоненты также называют наборами данных.
Табличные компоненты (TTable/ADOTable) являются наборами данных, которые получают из базы данных полную копию одной из таблиц, и предоставляют полученный набор данных визуальным компонентам отображения данных (
Компоненты запросов ( TQuery/ADOQuery ) для получения набора данных из базы данных используют SQL -запрос. Компоненты позволяют получить из одной или нескольких таблиц только те данные, которые удовлетворяют запросу.
Выделите все четыре ADOTable (удерживая клавишу <Shift>), и в их свойстве Connection выберите нашу связь ADOConnection1. Таким образом, все четыре ADOTable мы подключили к базе данных.
Выделите первый компонент ADOTable. Переименуйте его свойство Name в TLichData, а в свойстве TableName выберите главную таблицу базы - LichData. Буква "Т" в начале названия компонента укажет нам в дальнейшем, что это таблица. Рядом с компонентом установите компонент DataSource из вкладки DataSource переименуйте в DSLichData ( DS - DataSource ). В свойстве DataSet выберите таблицу TLichData.
То же самое нужно проделать еще три раза, подключая аналогичным образом компоненты DataSource к другим таблицам:
(рис 2.8) Модуль данных с установленными компонентами.Затем свойство Active таблиц переведите в True, открыв их. Для тех, кто пропустил предыдущий курс, напомню, что таблицы можно открывать и закрывать не только в Инспекторе Объектов, но и программно. Как открыть, так и закрыть таблицы можно двумя абсолютно равноценными способами:
//Открываем таблицы: fDM.TLichData.Open; fDM.TDoljnost.Active := True; //Закрываем их: fDM.TLichData.Close; fDM.TDoljnost.Active := False;
Пойдем далее. Перейдите на главную форму. Выберите команду File -> Use Unit и подключите к ней модуль DM. Теперь мы сможем видеть таблицы из главной формы.
На вкладке DataControls сосредоточены визуальные (видимые пользователю) MEMO -полей) и т.д. Единственным исключением является компонент
Выделите верхнюю сетку . В таком же свойстве нижней сетки выберите . Сетки среагировали, и вы можете видеть названия полей. Разумеется, таблица еще пуста, данных пока нет. Кстати, выделите обе сетки, и установите в True их свойства ReadOnly - только чтение. Таблицы ведь будут связаны, и нам не нужно, чтобы пользователь вводил данные фрагментарно. Мы для этого сделаем отдельную форму, а эти сетки нужны только для просмотра.
Теперь нужно между таблицами установить связь. Это требуется не только для того, чтобы в нижней сетке выходили данные только на сотрудника, выделенного в верхней сетке, но и для того, чтобы мы смогли в дальнейшем вводить связанные данные в окне редактора. Снова выделите модуль данных. Щелкните дважды по первой таблице, чтобы открыть Add all fields (добавить все поля). В окне
(рис 2.9) Редактор полейlookup ). Но эту возможность мы будем рассматривать в других лекциях.
Поле "Ключ" у нас автоинкрементное, предназначено для связи с другими таблицами. Пользователю его видеть не обязательно. Выделите его, и в свойстве Visible установите False. Теперь для пользователя оно будет невидимым. Здесь у нас есть два логических поля - "Сем_Полож" и "Военнообязанный". Чтобы True и False выходили на экране так, как нам нужно, свойству DisplayValues первого из этих полей присвойте значение "Женат;Холост" (разумеется, без кавычек), а второго - "Да;Нет". Первым здесь идет значение, которое будет обозначать True, вторым - False. Эти значения разделяются точкой с запятой, пробелы не нужны.
Таким же образом добавьте все поля в остальные три таблицы. У них невидимым следует сделать поле "Сотрудник" - этому полю автоматически будет присвоено такое же число, как у поля Ключ соответствующей записи. Логических полей у них нет. Однако для поля "Телефон" таблицы следует изменить свойство EditMask. Щелкните по нему дважды, открыв редактор маски, и в поле Input Mask введите маску "#(###)-###-##-##". Сохраните ее, нажав кнопку ОК. Для полей LichData два таких поля) введите маску "##.##.####".
Далее кнопкой <F12> перейдите в редактор кода. В нижней части окна вы можете увидеть вкладку Diagram, перейдите на нее. Нам с вами потребуется сделать такие связи:
(рис 2.10) Связи базы данныхДля начала в окно диаграмм нужно добавить наши таблицы. Найдите их в окне дерева объектов Object . Если у вас это окно закрыто, откройте его клавишами <Shift+Alt+F11> либо командой меню View -> Object
LichData {TLichData}
и перетащите ее в окно диаграмм. Таблица вместе с полями отобразится в окне. Если бы ранее мы не добавили все поля в окне Master / Detail Connector, которую вы можете увидеть в верхней части окна диаграмм (предпоследняя). Нажмите на кнопку, затем подведите указатель мыши к боковой границе главной таблицы, нажмите левую кнопку и, удерживая ее, проведите линию к боковой границе таблицы . Как только вы отпустите кнопку, появится окно связей:
(рис 2.11) Окно связейЗдесь в поле Detail Fields нужно выбрать поле, по которому будет осуществляться связь, в нашем случае это поле "Сотрудник". В поле Master Fields выбираем ключевое поле "Ключ". Затем нажимаем кнопку Add и кнопку OK. Связь установлена.
При установке связей главный / подчиненный важно начинать вести линию с главной таблицы к подчиненной. Если бы мы сделали иначе, то главной таблицей стала бы TAdres. Такую же связь установите и с остальными таблицами. Просто, не правда ли?
Сохраните проект, скомпилируйте его и запустите на выполнение. Если в сетках главного окна вы видите открытые таблицы, то все хорошо. Если нет, возможно, при изменении настроек ваши таблицы закрылись. В таком случае закройте программу (но не проект!), выделите таблицы, и их свойству Active снова присвойте значение True. Таблицы должны появиться в сетках главного окна, даже на этапе проектирования.
Пойдем дальше. Теперь нам нужно сделать окно редактора данных. Создайте новую форму (File -> New -> Form). Ее свойство Name переименуйте в fEditor, а при сохранении формы дайте модулю имя Editor. Командой File -> Use Unit подключите к форме модуль данных DM. Теперь нам нужно установить на форму такие компоненты:
(рис 2.12) Окно редактора данныхЗдесь я поступил следующим образом: установил на форму четыре панели GroupBox с вкладки Standard, на каждую таблицу свой GroupBox. Почему я так поступил, станет понятно позже. Займемся первой таблицей. В свойстве Caption компонента GroupBox впишите "Личные данные", это название отразится в заголовке панели. Далее на эту панель следует установить восемь компонентов
муж жен
Сохраните текст, нажав кнопку ОК. Теперь пользователь сможет указать пол сотрудника, выбрав нужную строку из списка.
Для таблицы Doljnost все еще проще: на панели GroupBox всего два компонента
Для таблицы используйте три
А вот для таблицы понадобится один
Рабочий Домашний Мобильный
Теперь займемся подключением компонентов контроля. Удерживая <Shift>, выделите все компоненты контроля на первой панели (все компоненты, кроме Label ). В их свойстве DataSource выберите , подключив компоненты к нужному набору данных (таблице). Снимите общее выделение, и выделите первый , и не имеет поля, разумеется. Она отображает все видимые поля таблицы.
В правой нижней части для удобства пользователя я установил навигационный компонент , чтобы подключить компонент к главной таблице. Нам нужна от этого компонента только возможность перехода на начало или конец таблицы, на следующую или предыдущую запись. Поэтому раскройте его свойство VisibleButtons (видимость кнопок компонента) и переведите в False все кнопки, кроме nbFirst, nbPrior, nbNext и nbLast. Нажатие на эти кнопки приведет к вызову соответствующих методов компонента ADOTable. Эти методы делают следующее:
Когда у
Теперь пришло время объяснить, почему я поместил компоненты на панели GroupBox, и почему для каждой таблицы сделал отдельную панель. Если вы прошли предыдущий курс "Введение в программирование на Delphi", то знаете, что измененная запись в таблице сохраняется в трех случаях:
Когда мы, заполнив одну таблицу, перейдем к другой, то в первой таблице запись еще не будет сохранена. Поле "Ключ" у нас автоинкрементное, на него завязаны остальные таблицы. До тех пор, пока мы не сохраним запись, в этом поле не будет никакого значения. Следовательно, данные в других таблицах не смогут привязаться к какой-то записи главной таблицы. Поэтому выделите первый GroupBox, и дважды щелкните по событию
{Вышли из редактирования LichData}
procedure TfEditor.GroupBox1Exit(Sender: TObject);
begin
if fDM.TLichData.Modified then
fDM.TLichData.Post;
end;
Свойство
Далее сгенерируйте событие нажатия на кнопку "Добавить" в GroupBox с телефонными данными. Этой кнопкой мы будем добавлять новые записи в таблицу, ведь один сотрудник может иметь более одного телефона. Код в процедуре будет такой:
if fDM.TTelephones.Modified then
fDM.TTelephones.Post;
fDM.TTelephones.Append;
DBEdit14.SetFocus;
Вначале мы сохраняем измененные значения, если они были. Затем методом
После добавления новой записи таблица уже будет в режиме редактирования, поэтому можно не вызывать метод
В процедуре нажатия на кнопку "Сохранить и выйти" код простой:
if fDM.TLichData.Modified then
fDM.TLichData.Post;
if fDM.TDoljnost.Modified then
fDM.TDoljnost.Post;
if fDM.TAdres.Modified then
fDM.TAdres.Post;
if fDM.TTelephones.Modified then
fDM.TTelephones.Post;
Close;
Здесь мы лишь сохраняем изменения во всех таблицах, если они были, и закрываем окно. Напоследок у нас осталась кнопка "Добавить сотрудника". Что мы должны сделать, если пользователь нажмет на эту кнопку? Добавить новую запись в каждую таблицу и перевести курсор в первый
fDM.TLichData.Append; fDM.TDoljnost.Append; fDM.TAdres.Append; fDM.TTelephones.Append; DBEdit1.SetFocus;
С этой формой мы закончили, переходим к главной форме. Не забывайте время от времени сохранять проект. Если вы еще не подключили модуль Editor к главной форме командой File -> Use Unit, то сделайте это сейчас, чтобы можно было вызывать окно редактора из главной формы. Начнем с кнопки "Новый сотрудник". Как и в предыдущем примере, нам потребуется добавить новую запись в каждую таблицу, после чего открыть окно редактора:
fDM.TLichData.Append; fDM.TDoljnost.Append; fDM.TAdres.Append; fDM.TTelephones.Append; fEditor.ShowModal;
Сгенерируйте процедуру
fEditor.ShowModal;
В результате откроется окно редактора, и компоненты будут отображать данные текущей записи. Предположим, пользователю будет удобней дважды щелкнуть по записи в верхней сетке
Блок поиска по фамилии оставим на следующую лекцию и перейдем к программированию радиокнопок. По нашему замыслу, при открытии программы в верхней сетке . Также будет выделена радиокнопка с надписью "Адрес". Если пользователю захочется посмотреть должность или телефоны текущего сотрудника, он будет щелкать соответствующую радиокнопку, и эти данные должны быть отображены в нижней
if RadioButton1.Checked then
DBGrid2.DataSource := fDM.DSAdres;
Здесь мы проверили, включена ли данная радиокнопка. Если да, то мы меняем связь нижней сетки DBGrid и подключаем ее к таблице . Ведь связь сетки с таблицей осуществляется через соответствующий компонент DataSource, а у нас их четыре. Подключаясь то к одному, то к другому DataSource, мы можем программно менять отображенную в сетке таблицу.
Для события
if RadioButton2.Checked then
DBGrid2.DataSource := fDM.DSTelephones;
А для события
if RadioButton3.Checked then
DBGrid2.DataSource := fDM.DSDoljnost;
Таким образом, в нижней сетке мы отображаем то одну, то другую подчиненную таблицу, и всякий раз в этих таблицах будут показаны данные текущего сотрудника. Вот и весь код! Сохраните проект и скомпилируйте его. На следующей лекции мы будем изучать методы поиска и фильтрации, поэтому введите в базу данные десятка на два - три сотрудников, чтобы было, что искать.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.