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

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

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

Лабораторная работа № 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