Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метода ИТ.doc
Скачиваний:
12
Добавлен:
07.11.2018
Размер:
2.76 Mб
Скачать

Контрольное задание

Добавить меню База авторов с командами Добавить…, Удалить…

Лабораторная работа № 11

База данных издательства

Задание №1 Создание базы данных приложения

В разрабатываемом нами приложении будем использовать базу данных Access. Наша база данных будет состоять из трех таблиц: Проекты, Авторы, Занятость.

Таблица Проекты будет содержать информацию о находящихся в производстве проектах. По каждому проекту будет сохра­няться его код, выделенной под описание проекта, наименование проекта, объем в страницах и дату его завершения. В таблице Авторы будет храниться информация об авторах, сотрудни­чающих с издательством. По каждому автору необходимо иметь следующую информацию: код автора, фамилию, имя, отчество, адрес, номер телефона, паспортные данные.

В таблице Занятость содержится информация о заня­тости авторов в проектах, представленная кодом проекта и ко­дом автора, она является связующей таблицей между таблицами авторов и проектов по "ключевым" полям с кодами авторов и проектов.

Схема данных базы данных изображена на рис. 11.1.

Рис. 11.1. Схема данных базы данных издательств

2. Подключение к базе данных

Чтобы работать с данными в базе данных, нужно сначала выполнить соединение с этой базой данных, то есть получить на нее ссылку. В Access можно использовать две объектные модели для доступа к данным DAO и ADO. В модели ADO, чтобы получить доступ к данным в некоторой базе данных (не текущей), обязательно должен быть создан объект Connection. Объект Connection представляет собой одно подключение к провайдеру OLE DB. Этот объект содержит информацию об источнике данных, о том, где он находится и какой тип провайдера будет использоваться. Когда ссылка будет получена, тогда можно обращаться к семействам и объектам этой базы данных. В объектной модели ADO можно обращаться к объектам данных непосредственно. В большинстве приложений достаточно иметь только одну рабочую область Jet, которая создается по умолчанию и используется для работы с объектами базы данных Access.

Подключение к базе данных будет происходить при открытии приложения.

Для этого следующий код нужно добавить в процедуру Init:

Dim conn As New ADODB.Connectionобъект типа соединение

с базой данных

conn Open “Provider=Microsoft.Jet.OLEDB.4.0;_

Data Source=C:\Autors.mdb ‘окрытие соединения

с источником данных

3. Реализация меню База авторов

Меню База авторов включает две ко­манды: Добавить и Удалить. Первая добавляет нового автора в базу данных, а вторая удаляет. Реализуем только первую команду. Вторая выполняется аналогично. Основная цель в реализации этой командыпоказать работу с базой данных.

Эта команда связана с вызовом процедуры AddAuthor() :

Public Sub AddАuthor ()

AuthorInDB. Show Отображение диалоговой формы AuthorInDB End Sub

Процедуру AddАuthor напишем в модуле DBFunctions, который, прежде всего, следует создать в проекте нашего шаблона. Эта процедура отображает диалоговую форму AuthorInDB (рис. 11.2), код которой добавляет нового автора в таблицу Authors базы данных Authors.mdb.

Рис. 11.2. Внешний вид формы AuthorInDB

В полях этой формы вводится вся необходимая для включения в договор ин­формация об авторе. Когда все поля заполнены, то нажатием кнопки «Ok» создается запись о новом авторе в базе данных. Код процедуры обработки события Сlick этой кнопки показан в следующем листинге:

Первый способ:

Dim rs As New ADODB.Recordset 'Создаем объект типа

With rs набор записей

.ActiveConnection = conn

.CursorType = adOpenKeyset

.LockType = adLockOptimistic

.Open Source:="авторы"

End With

rs.AddNewзаполняем поля этого объекта данными из формы

rs!фамилия = Me.LastName.Value

rs!имя = Me.FirstName.Value

rs!отчество = Me.SecondName.Value

rs!адрес = Me.address.Value

rs!телефон = Me.telephone.Value

rs!паспорт = Me.passport.Value

rs.Update обновляем базу данных

Второй способ:

Dim cmd As New ADODB.Command

Set cmd.ActiveConnection = conn

Vaal = "'" + Me.LastName.Value + "'," + _

"'" + Me.FirstName.Value + "'," + _

"'" + Me.SecondName.Value + "'," + _

"'" + Me.address.Value + "'," + _

"'" + Me.telephone.Value + "'," + _

"'" + Me.passport.Value + "'"

cmd.CommandText = "INSERT INTO авторы (фамилия, имя, отчество, адрес, телефон, паспорт) VALUES (" + Vaal + ")"

cmd.Execute выполнить запрос на добавление

Если пользователь по каким-то причинам не желает заносить информацию в базу данных, то он всегда может нажать кнопку «Отмена» и просто закрыть форму без записи в базу данных. Это действие реализуется в процедуре об­работки щелчка мышью по этой кнопке.

Private Sub Ret_Click()

Unload Me Выгрузить форму

End Sub

После нажатия кнопки OK формы AuthorsInDB с введенными данными, в таблицу Авторы базы данных Authors добавится еще одна запись о новом авторе.

Теперь перейдем к основному меню Договор разрабатываемого приложения. При создании документа на основе нашего шаблона в этом меню доступны только две команды - Заполнить и Выход. Третья команда Сохранить не­доступна для пользователя, но это и логично - что сохранять, когда дого­вор еще не заполнен?! Она станет доступной только после выполнения ко­манды Заполнить, причем сама эта команда сразу же после ее выполнения станет недоступной.

При выборе команды Заполнить вызывается процедура

Public Sub fillContract()

GetProject.Show метод,вызываемый при отображении

формы Договор с автором

поиск в строке меню пункта меню с надписью Договор

For Each mn In CommandBars("Меню Authors").Controls

If mn.Caption = "&Договор" Then

поиск в меню Договор пунктов Заполнить и Сохранить.

команду Заполнить делаем неактивной, а команду Сохранить

активной

For Each cmd In mn.Controls

If cmd.Caption = "&Сохранить..." Then cmd.Enabled = True

If cmd.Caption = "&Сохранить..." Then cmd.Enabled = False

Next

End If

Next

End Sub

Команда Выход предназначена для выхода из приложения и реализуется с помощью следующей процедуры:

Public Sub exitApp()

ActiveDocument.Close ' Закрытие документа

End Sub

Теперь перейдем к реализации основной функциональности нашего приложения - формированию договора с авторами книги. По команде Заполнить предполагаем отобразить следующую диалоговую форму:

Рис. 11.3. Форма договор с автором

Эта форма предназначена для ввода данных в базу данных о новом проекте, заполнения бланка договора на основе этих данных, а также для просмотра информации о проектах, находящихся в разработке. Предусматривает реализацию следующих функциональных возможностей:

  1. Выбор названия существующего проекта. При выборе названия проекта из соответствующего списка, в списке “Авторы проекта” автоматически должны выводиться фамилии авторов, работающих с этим проектом. Также предусматривается ввод объема проекта в страницах, и дата завершения проекта.

  2. Ввод названия вновь создаваемого проекта.

  3. Формирование коллектива авторов, предназначенного для разработки данного проекта.

  4. Заполнение шаблона договора.

При вызове метода GetProject.Show из процедуры fillContract() инициализируется событие Initialize. В процедуре его обработки удобно устанавливать свойства элементов управления формы. Будем использовать эту процедуру для заполнения списка проектов и списка авторов.

Private Sub UserForm_Initialize()

Set comd.ActiveConnection = conn

Выборка названий всех проектов из базы данных

comd.CommandText = "Select Наименование from проекты"

rs.Open comd, , adOpenStatic, adLockBatchOptimistic

Заполнение списка проектов

rs.MoveFirst

Do Until rs.EOF

cmbTitle.AddItem (rs.Fields(0))

rs.MoveNext

Loop

rs.Close

Выборка фамилий всех авторов из базы данных

comd.CommandText = "Select Фамилия from Авторы"

rs.Open comd, , adOpenStatic, adLockBatchOptimistic

Заполнение списка авторов

rs.MoveFirst

Do Until rs.EOF

ListBox1.AddItem (rs.Fields(0))

rs.MoveNext

Loop

rs.Close

End Sub

При изменении содержимого поля со списком cmbTitle (в нашем случае, при вводе названия нового проекта или выборе названия проекта из списка) вызывается обработчик этого события cmbTitle_Change().

Для реализации возможностей, указанных в первом пункте, при каждом изменении текущего значения поля cmbTitle необходимо выполнять запрос на выборку: “Выбрать фамилии авторов задействованных в проекте с данным названием” и заполнять результатом выборки поле “Авторы проекта”.

Dim rs As New ADODB.Recordsetсоздаем объект типа

набор записей

Dim cmd As New ADODB.Commandсоздаем объект типа запрос

Set cmd.ActiveConnection = connинициализируем свойство

активное соединение

значением глобальной переме-

нной conn, которая была ранее

создана и инициализирована в

процедуре Init(лаб. раб.№1)

книга = cmbTitle.Value

Активизируем кнопки Добавить автора

и Удалить автора из проекта

CommandButton1.Enabled = True

CommandButton2.Enabled = True

В свойство текст запроса объекта cmd записываем запрос на ‘выборку фамилий авторов, задействованных в проекте

c данным названием

cmd.CommandText = "SELECT Фамилия FROM проекты INNER JOIN (авторы INNER JOIN занятость ON авторы.authorCode=_ занятость.автор) ON проекты.код = занятость.проект WHERE_ проекты.наименование = " & "'" & книга & "'" & "order by _ фамилия"

Заполняем объект rs (набор записей) результатом выполнения запроса на выборку фамилий авторов

rs.Open cmd, , adOpenStatic, adLockBatchOptimistic

Очищаем список авторы проекта

ListBox2.Clear

Устанавливаем курсор на первую запись набора записей

If Not rs.EOF Then rs.MoveFirst

Перебираем все записи набора записей и заполняем ими список

авторы проекта

Do Until rs.EOF

ListBox2.AddItem (rs.Fields(0))

rs.MoveNext

Loop

End If

End Sub

При формировании коллектива авторов данного проекта возможны две ситуации:

  1. Создается новый проект. В этом случае, при нажатии кнопки “добавить автора” сначала выполняется запрос на добавление записи о новом проекте в таблицу Проекты, а затем запрос на добавление кода выбранного автора и кода нового проекта в таблицу Занятость.

  2. Если проект занесен в таблицу Проекты, записи добавляются только в таблицу Занятость.

Обработчик события нажатие кнопки Добавить автора:

Private Sub CommandButton1_Click()

В переменную название записываем название проекта,

введенное в поле формы

название = cmbTitle.Value

Проверяем, есть ли проект в таблице Проекты с таким названием

comd.CommandText = "Select count(*) from проекты where _

наименование =" & "'" & название & "'"

rs.Open comd, , adOpenStatic, adLockBatchOptimistic

Количество возвращаемых запросом записей записываем в _

переменную количество

количество = rs.Fields(0)

Если записи о проекте с таким названием в базе нет

добавляем его в таблицу Проекты

If количество = 0 Then

comd.CommandText = "INSERT INTO проекты _

(наименование, объем, срок) values('" & cmbTitle.Value _

& "','" & TextBox1.Value & "','" & TextBox2.Value & "')"

comd.Execute

cmbTitle.AddItem (cmbTitle.Value)

End If

Добавляем запись в таблицу Занятость, код выбранного в списке

Все авторы автора, и код проекта, выбранного или набранного в ‘поле cmbTitle

comd.CommandText = "INSERT INTO занятость _

(автор, проект )SELECT авторы.authorCode, проекты.код _ FROM проекты, авторы where авторы.фамилия =" & "'" & _ ListBox1.Value & "'" & "and проекты.наименование=" & "'" &_ cmbTitle.Value & "'"

comd.Execute

Добавляем запись в список Авторы проекта

ListBox2.AddItem (ListBox1.Value)

rs.Close

End Sub