Поле Address я разбил на 3 поля: StreetName, Sign, First и занес их в отдельную таблицу tblStreet.
Поля PersonID таблицы tblWorker и StreetID таблицы tblStreet назначены ключевыми полями, следовательно, записи однозначно определятся по этим полям. Чтобы создать ключевое поле, необходимо нажать правой кнопкой на поле и выбрать "ключевое поле". Возле этого поля появится соответственный значок ключа.
Далее я отделил от основной таблицы некоторые поля и занес их в отдельные следующие таблицы, представленные на рисунке:
2. Создание связей
После создания всех таблиц необходимо создать связи между ними и после этого база данных будет готова к работе. Microsoft Access поддерживает 4 типа связей: один-к-одному, один-ко-многим, многие-к-одному и многие-ко-многим. Для создания связей нужно сначала открыть схему данных. Для этого надо выбрать на ленте "Создание" и нажать кнопку "Схема данных". После этого переносим все таблицы на пространство схемы данных. И переносим курсор мыши, зажав левую клавишу от поля одной таблицы к полю другой, которые мы хотим объединить связью. Появится окно "Изменение связей":
Для целостности данных необходимо отметить галочки "Обеспечение целостности данных" и "каскадное обновление связанных полей".
По окончанию создания связей я получил следующую схему данных:
4. Разработка приложения
После создания базы данных и создания векторного чертежа наступает самый сложный и объемный этап работы – разработка приложения. Без законченного приложения обычный пользователь не сможет работать с этими данными и, следовательно, не получится законченной геоинформационной системы! Программное обеспечение связывает графическую информацию с информацией атрибутивной, что позволяет удобно и просто оперировать с этими данными.
Своё приложение я создавал при помощи мощного инструмента, входящего в состав многих программных продуктов, – Visual Basic for Applications (VBA).
Для начала работы с VBA необходимо в Автокаде выполнить команду меню "Сервис-Макросы-Редактор Visual Basic". Откроется окно редактора Microsoft Visual Basic.
Для начала необходимо создать стартовую форму и сделать для неё автозапуск, чтобы она открывалась при открытии Автокада. Для начала выбираем пункт меню "Insert-UserForm". Появится новая пустая форма. Необходимо добавить на форму элементы управления с помощью окна Toolbox и отредактировать их свойства в окне Properties.
Внешний вид объектов на форме:
После создания формы и всех объектов на ней необходимо написать код обработки событий для этих объектов. Для автозапуска стартовой формы необходимо создать обработчик события AcadDocument_Activate(), которое выполняется при активации документа. Для этого в окне Project дважды кликаем на ThisDrawing и перед нами откроется окно редактирования кода. Над ним расположено 2 раскрывающихся списка. В левом выбираем AcadDocument, а в правом – Activate и автоматически создастся обработчик этого события. В него пишем следующий код:
Private Sub AcadDocument_Activate()
StartForm.Show 'При активации документа показываем стартовую форму
End Sub
Теперь при активации документа появится стартовая форма.
Моё приложение работает в двух режимах: пользователя и конструктора. Путь к базе данных изначально устанавливается автоматически в той же директории, что и файл чертежа. Также можно выбрать другой путь к базе данных, нажав на кнопку открытия. При выборе режима конструктора осуществляется переход к Автокаду и никакой код не выполняется. При выборе пользовательского режима блокируются все слои, кроме слоя Блоков, дабы избежать потери графической информации. За выбор режима отвечает следующий код:
Далее если пользователь зашел в пользовательский режим, то ему предоставляется выбор из трёх объектов на чертеже. При нажатии на какой-либо из объектов выскакивает сообщение с краткой информацией об объекте и предложением просмотреть более подробную информацию.
Это реализуется в ThisDrawing в обработчике события
AcadDocument_SelectionChanged() (изменение выбора) следующим образом:
If ThisDrawing.PickfirstSelectionSet.count > 0 Then 'Проверяем, выбрано ли что-либо
Set objGen = ThisDrawing.PickfirstSelectionSet.Item _
(ThisDrawing.PickfirstSelectionSet.count - 1) 'Если выбрано то устанавливаем objGen как последний выбранный объект
If objGen.ObjectName = "AcDbBlockReference" Then 'Проверяем, является ли выбранный объект блоком
Select Case objGen.Name 'Проверяем, какой объект выбран
Case 1
If MsgBox("Выбрана Библиотека" & vbCr & "Показать информацию об этом помещении?", _
vbOKCancel, "Выбрано помещение") = vbOK Then 'Выдаем сообщение и запрос на вывод информации
ShowInf = True 'Показать информацию
End If
ID = 1 'Устанавливаем номер выбранного помещения
Case 2
If MsgBox("Выбран Деканат" & vbCr & "Показать информацию об этом помещении?", _
vbOKCancel, "Выбрано помещение") = vbOK Then
ShowInf = True
End If
ID = 2
Case 3
If MsgBox("Выбрана Кафедра" & vbCr & "Показать информацию об этом помещении?", _
vbOKCancel, "Выбрано помещение") = vbOK Then
ShowInf = True
End If
ID = 3
End Select
Далее, если пользователь нажимает "Да", то появляется окно с информацией о работниках данного помещения:
При этом происходит соединение с базой данных и посылается запрос на работников, работающих в данном помещении. Список работников выводится в ListBox. Текст запроса и вывода:
Public record As ADODB.Recordset 'Переменная запроса к базе данных
…
Set record = New ADODB.Recordset 'Создаем переменную запроса к базе
…
With record
'Создаём запрос в базу
.Source = "Select tblWorker.PersonID, tblWorker.Family, tblWorker.FirstName, tblWorker.SecondName, " & _
"tblWorkPlace.Place From tblWorker, tblWorkPlace where tblWorker.WorkPlace=tblWorkPlace.WorkPlace and " & _
"tblWorker.WorkPlace=" & ID & " order by Family, FirstName, SecondName"
'Открываем его
.Open
CountQuery = .RecordCount 'Считаем кол-во записей в запросе
End With
FlatInf.ListBox1.Clear
FlatInf.TextBox1.Text = record!Place 'Устанавливаем место работы сотрудника
FlatInf.Label3.Caption = "Всего: " & CountQuery & " " & Operations.intToStroka(CountQuery) 'Устанавливаем в Label3 кол-во работников, попавших в запрос
For i = 0 To CountQuery - 1 'Перебираем все записи
FlatInf.ListBox1.AddItem (record!Family & " " & record!FirstName & " " & record!SecondName) 'Добавляем в список Фамилию, имя и отчество работника record.MoveNext 'Переходим к следующей записи
Next i
При нажатии на кнопку "Показать информацию о работнике" вызывается форма, в которой содержится вся информация о данном работнике.
При построении данной формы посылается запрос в базу данных по всем таблицам. При этом осуществляются проверки на правильность данных в таблице. Например, для поля текстового типа:
Rem Фамилия
If rec!Family <> "" Then
.TextBox1.Text = rec!Family
.Caption = .Caption & rec!Family
Else TextBox1.Text = ""
End If
Такие компоненты, как ComboBox заполняются данными из отдельных таблиц. Например, список кафедр заполняется в ComboBox1:
Rem Составляем список кафедр
DopRec.Open ("Select * from tblDepartament") 'Получаем все кафедры
For i = 0 To DopRec.RecordCount - 1 'Проходим по всем записям
.ComboBox1.AddItem (DopRec!Departament) 'Добавляем запись в ComboBox1
DopRec.MoveNext 'Переходим к следующей записи
Next i
Rem Выбор Кафедры
If (Not rec!DepartamentID = 0) Then 'Если в поле кафедры есть значение
.ComboBox1.ListIndex = rec!DepartamentID - 1 'Выбираем его номер в списке
Else 'Иначе
.ComboBox1.ListIndex = -1 'Ничего не выбираем
End If
DopRec.Close
Также из этой формы открывается дополнительное окно, которое содержит информацию о трудовой книжке сотрудника. Эта информация также получается с помощью запросов к базе данных.
Из формы с информацией о сотруднике можно перейти к стартовой форме, нажав соответствующую кнопку. Кроме того, в ней можно пролистывать записи базы данных, вносить изменения в базу, создавать новые записи о сотрудника и удалять записи. При обновлении в базу посылается SQL запрос на обновление данных и все поля базы обновляются. При успешном обновлении появляется сообщение. При добавлении новой записи в базу данных посылается запрос на добавление записи и вносится новый PersonID сотрудника, после чего вызывается обновление этой записи, тем самым производятся изменения всех полей записи. При удалении записи посылается запрос на удаление и производится переход на соседнюю запись. Если в базе записей нет, то появляется сообщение об этом и форма закрывается.
5. Авторские находки
Для того, чтобы еще более автоматизировать своё приложение, и сделать проще доступ к нему, я решил создать отдельное автономное приложение, из которого можно открыть все файлы данной курсовой работы. И я написал .exe файл, из которого можно открыть файл моего чертежа AutoCAD, файл базы данных Access и этот файл отчёта. Внешний вид программы:
6. Список литературы
1. Полещук Н.Н. AutoCAD: разработка приложений, настройка и адаптация. СПб.: БХВ-Петербург, 2006 - 992 c.: ил.
2. Погорелов В.И. AutoCAD 2007. Экспресс-курс. СПб.: БХВ-Петербург, 2006 - 560 c.: ил.
3. Гурвиц Г.А. Access 2007. Разработка приложений на реальном примере. СПб.: БХВ-Петербург, 2007 - 672 c.: ил.