5 строк кода

Как писать комерческие приложения на MS Access

Archive for Октябрь, 2008

Импорт базы MS Access в MS Visio

2 комментария

Здравствуйте.

В любом проекте настает момент, когда количество таблиц увеличилось на столько, что все в голове не удержишь. И появляется желание посмотреть на схему таблиц. Это желание возникает, как правило, при пожелании пользователя чего-нибудь этакого. Что коренным образом затрагивает существующие отношения между таблицами. Или вы решили задокументировать БД и положить проект в архив до лучших времен.

Первым делом все лезут в «Сервис»->«Схема данных». Если не заполнена, то заполняют. Тут то и встает проблема. Как ее достать? Первый простейший способ это «Prt Scr» и вставить в текстовый редактор. Если же таблиц больше, чем помещается на экран, то тут можно взять “бубен” побольше – графический редактор, чтобы в нем составить картинки.

Для экстренного случая предыдущий способ подойдет. Но вот делать этот танец регулярно навряд ли кто-то захочет. Есть отличное решение – MS Visio. Оно конечно не единственное. О других средствах позже.

MS Visio умеет:
• Импортировать информацию из mdb.
• Обновлять схему из mdb.

MS Visio не умеет (в стандартной поставке):
• Создавать mdb на основании схемы.

Последний пункт немного омрачает. Но и без него хорошо живется.

Импорт информации из mdb
Для начала нам нужно создать документ типа Database Model Diagram (он находится в категории Database). Потом выбрать пункт «Database->Reverse Engineer…» и немного покликать:
1. Выбираем драйвер MS Access 97 Database (или другой необходимый)

2. Не заполняем имя пользователя и пароль (по умолчанию это так). Иначе придется заполнить.

3. Выбираем файл БД

4. Отмечаем какая информация нас интересует

5. Выбираем таблицы (обычно все)

6. Сейчас выбрано «Добавлять таблицы на страницу»

7. Финиш!

В результате мы получим документ с нашими таблицами. Если «схема таблиц» была заполнена, то Visio подтянет и связи. Руками их тоже не проблема нарисовать.

Чтобы нарисовать связь, необходимо «кинуть» на документ линию Relations. Основание линии перетаскиваем на таблицу с FK (Foreging Key или внешний ключ), а стрелку линии перетягиваем на таблицу с PK (Primary Key или первичный ключ). Если имена совпали, то связь установится автоматически. В противном случае, в таблицу с FK будет добавлено поле с именем PK. Не беда, в свойствах связи меняем поля, а лишнее поле можно удалить.

После связей останется только навести «гламурный» вид, чтобы стрелки как можно меньше пересекались, и распределить таблицы в группы по смыслу.

Обновлять схему из mdb
Это делать еще проще. Я полагаю, что документ со схемой БД уже открыт. Остается только выбрать пункт меню Database->Refresh Model и немножечко покликать как и в предыдущем пункте. В результате откроется окно найденных отличий с ними остается только согласиться. После этого придется немного подравнять схему.

Создавать mdb на основании схемы
Возможно вы подумаете, что отсутствие этой функции важный недостаток. «Нет», – скажу я вам, – «Все намного проще».

Практика показала. Разработка базы начинается методом листика, карандаша и стирки. Потом делается набросок в mdb файле. И начинает кипеть работа с логикой.

Когда же необходимо сделать реинжиниринг, то схема печатается, а дальше вступают в работу карандаш и стирка. Эти изменения вносятся в mdb и, если необходимо, схема обновляется.

До скорых встреч!

(с) Скоков Сергей

Written by Сергей Скоков

Октябрь 22nd, 2008 at 2:14 пп

События

Один комментарий

Здравствуйте, уважаемые читатели.

Поговорим в этом выпуске об очень интересной штуке – события. Я очень мало где видел их использование в MS Access. Но они очень сильно облегчают жизнь при работе, особенно с формами. У событий есть маленькое ограничение. Их могут использовать только объекты. Это означает, что их можно объявлять и получать только в модулях пользовательских классов, формах и отчетах.

Чтобы объявить событие необходимо в начале модуля класса (формы, отчета или пользовательского) написать:
Event ИмяСобытия( СписокАргументов )

Для использовании события необходимо объявить в начале модуля ссылку на объект и в списке (левый список, который расположен в редакторе кода) выбрать обявленный атрибут, в правом списке можно выбрать событие, если их несколько. В результате получим следующее:
Dim WithEvents Имя As Тип

Вызвать событие можно так:
RaiseEvent ИмяСобытия( Параметры )

Где это можно применить? Рассмотрим пример из жизни. На форме заказа есть поле клиента. В этом поле отображается, допустим, УНН и название клиента. Рядом с полем кнопка. По нажатию на кнопке отображается еще одна форма – список клиентов. Задача – выбрать клиента.

Одним из решений будет открыть модальное окно и тут возникает куча разных вариантов: записать напрямую с формы списка клиентов в поле формы заказов (очень плохая идея!!!), скрыть форму при нажатии пользователем кнопки “Ок” (Выбрать) и т.д.

При помощи событий получается простое и элегантное решение. Всего-то объявить на форме списка клиентов событие:
Event OnClientSelect(ByVal lId As Long)

На форме заказа это событие обработать:

Dim WithEvents m_frmKlientSepis As Form_frmKlientSpis
'--

Private Sub Kn_KlientSelect_Click()
	'-- выбор клиента
	'-- можно и так
	'-- DoCmd.OpenForm "frmKlientSpis"
	'-- Set m_frmKlientSepis = Forms("frmKlientSpis")

	'-- но мне нравится этот вариант
	Set m_frmKlientSepis = New Form_frmKlientSpis
	m_frmKlientSepis.Visible = True
End Sub

Private Sub m_frmKlientSepis_OnClientSelect(ByVal lK_KLIENT As Long)
	'-- клиент выбран пользователем
	Me.K_KLIENT = lK_KLIENT
	Set m_frmKlientSepis = Nothing '-- уничтожаем форму
End Sub

Подробности можете увидеть в примере. Чуть позже я расмотрю еще один пример – связные списки.

До скорых встреч!

(с) Скоков Сергей

Written by Сергей Скоков

Октябрь 5th, 2008 at 7:09 пп