Смекни!
smekni.com

Создание информационной модели (стр. 3 из 4)

Степень независимости данных определяется тщательностью проектирования базы данных. Всесторонний анализ объектов предметной области и их взаимос­вязей минимизирует влияние изменения требований к данным в одной программе на другие программы. В этом и состоит всеобъемлющая независимость данных.

Основное различие между указанными выше тремя типами моделей данных (концептуальной, логической и физической) состоит в способах представления взаимосвязей между объектами. При проектировании БД требуется различать взаимосвязи между объектами, между свойствами одного объекта и между свойствами различных объектов.

В процессе проектирования объекты преобразуются в отношения, свойства в поля таблиц, методы – в процедуры, формы и т.д. (что и было произведено). Правильно проведенный объектно-ориентированный анализ позволяет значительно облегчить работу.

Таблица 3. Проект таблицы для физической модели.

№ п/п Наименование поля Примечание
ТОВАР
1. Key_tovar Уникальный ключ товара
2. Key_postav Уникальный ключ поставщика
3. Key_zakaz Уникальный ключ заказчика
4. Name_tovar Наименование товара
5. Date Дата изготовления
6. Marka Акцизная марка
7. Kod Расшифровка штрих-кода
8. Srok_god Срок годности
9. Ves_b Вес Брутто
10. Ves_n Вес Нетто
11. Cena_1 Цена за единицу
12. Cena Суммарная цена
13. Upakovka Вид упаковки
ЗАКАЗЧИК
1. Key_zakaz Уникальный ключ заказчика
2. Name_zakaz Наименование заказчика
3. Yrid_zakaz Юридическая принадлежность
4. FIO_zakaz Ф.И.О. руководителя
5. Adres_zakaz Адрес
6. Tel_zakaz Телефон/факс
7. Cena_z Предполагаемая цена
8. Number_N Номер накладной
9. Oplata Пометка об оплате
10. Date_N Дата накладной
ПОСТАВЩИК
1. Key_poctav Уникальный ключ поставщика
2. Name_postav Наименование поставщика
3. Yrid_poctav Юридическая принадлежность
4. FIO_postav Ф.И.О. руководителя
5. Adres_postav Адрес
6. Tel_postav Телефон/факс
7. Number_D Номер договора
8. Date_Z Дата заключения
СЧЕТА
1. Number_S Номер счёта
2. Date_P Дата продажи
3. Key_tovar Уникальный ключ товара
4. NDS НДС
5. Summa Сумма к оплате

Одним из основных факторов, влияющих на производительность программ, которые взаимодействуют с базой данных, является способ хранения и доступа к данным. Обычно в дополнение к специализированным методам доступа в рамках внешней модели СУБД использует несколько методов доступа внутренней модели. Мы рассмотрим (по условию варианта) индексно-последовательный метод доступа (ИМД).

Существует множество индексных методов доступа, в основе которых лежит принцип создания отдельного файла или структуры из статей значений действительного ключа. Статья действительного ключа называется статьёй индекса, а весь файл действительных ключей - индексом. Индексный файл значительно меньше собственно базы данных, и, поскольку в оперативной памяти могут находиться многие из его статей, скорость поиска в нём гораздо выше.

В индексно-последовательном методе доступа индексный файл всегда упорядочен по так называемому первичному ключу. Первичный ключ - главный атрибут физической записи. По его значению идентифицируется физическая запись. До тех пор, пока это возможно, записи хранятся в той же логической последовательности, что и индекс (отсюда и название "индексно-последовательный метод доступа").

Приведём пример таблицы индексов и их связи с имеющимися файлами данных, согласно варианта.

Таблица 4. Таблица индексного файла "ТОВАР" для индексно-последовательного метода доступа.

Примечание (Доходя через индексы к файлу данных, посредством самого индекса считывается наименование товара и далее вся информация по полям находящаяся в записи, согласно таблицы ТОВАР).

Индексный файлБлок 7
Значение Ключа Номер Блока Файл данных Блок 1
10 1 01
15 2 05
Индексный файл 10
Блок 10 Блок 2
Значение Номер 11
Ключа Блока 15
15 7
25 8 Блок 3
35 9 Блок 8 16
Индекс 2-го уровня Значение Номер 20
Ключа Блока
20 3
25 4 Блок 4
21
25
Блок 5
Блок 9 26
Значение Номер 30
Ключа Блока
30 5 Блок 6
35 6 31
Индекс 1-го уровня 35

Форма “ГЛАВНАЯ КНОПОЧНАЯ ФОРМА”

Option Compare Database

Option Explicit

Private Sub Form_Open(Cancel As Integer)

' Свертывание окна базы данных, инициализация формы.

' Переход на страницу кнопочной формы, отмеченную для использования по умолчанию.

Me.Filter = "[ItemNumber] = 0 AND [Argument] = 'по умолчанию' "

Me.FilterOn = True

End Sub

Private Sub Form_Current()

' Обновление заголовка и заполнение списка команд.

Me.Caption = Nz(Me![ItemText], "")

FillOptions

End Sub

Private Sub FillOptions()

' Заполнение команд для страницы кнопочной формы.

' Число кнопок в форме.

Const conNumButtons = 8

Dim dbs As Database

Dim rst As Recordset

Dim strSQL As String

Dim intOption As Integer

' Установка фокуса на первую кнопку формы, скрытие всех кнопок формы, кроме первой.

' Поле с фокусом скрыть нельзя.

Me![Option1].SetFocus

For intOption = 2 To conNumButtons

Me("Option" & intOption).Visible = False

Me("OptionLabel" & intOption).Visible = False

Next intOption

' Открытие таб. элементов кнопочной формы, поиск первого элемента текущей страницы формы.

Set dbs = CurrentDb()

strSQL = "SELECT * FROM [Элементы кнопочной формы]"

strSQL = strSQL & " WHERE [ItemNumber] > 0 AND [SwitchboardID]=" & Me![SwitchboardID]

strSQL = strSQL & " ORDER BY [ItemNumber];"

Set rst = dbs.OpenRecordset(strSQL)

' Вывод сообщения при отсутствии элементов на странице кнопочной формы.

' В остальных случаях - заполнение страницы элементами.

If (rst.EOF) Then

Me![OptionLabel1].Caption = "Элементы кнопочной формы отсутствуют"

Else

While (Not (rst.EOF))

Me("Option" & rst![ItemNumber]).Visible = True

Me("OptionLabel" & rst![ItemNumber]).Visible = True

Me("OptionLabel" & rst![ItemNumber]).Caption = rst![ItemText]

rst.MoveNext

Wend

End If

' Закрытие набора записей и базы данных.

rst.Close

dbs.Close

End Sub

Private Function HandleButtonClick(intBtn As Integer)

' Эта функ. вызывается при нажатии кнопки. Аргумент intBtn указывает, какая кнопка была нажата.

' Константы для выполняемых команд.

Const conCmdGotoSwitchboard = 1

Const conCmdOpenFormAdd = 2

Const conCmdOpenFormBrowse = 3

Const conCmdOpenReport = 4

Const conCmdCustomizeSwitchboard = 5

Const conCmdExitApplication = 6

Const conCmdRunMacro = 7

Const conCmdRunCode = 8

' Особая ошибка.

Const conErrDoCmdCancelled = 2501

Dim dbs As Database

Dim rst As Recordset

On Error GoTo HandleButtonClick_Err

' Поиск записи, соответствующей нажатой кнопке, в таблице элементов кнопочной формы.

Set dbs = CurrentDb()

Set rst = dbs.OpenRecordset("Элементы кнопочной формы", dbOpenDynaset)

rst.FindFirst "[SwitchboardID]=" & Me![SwitchboardID] & " AND [ItemNumber]=" & intBtn

' Если нужная запись не найдена, вывод сообщения об ошибке и выход из функции.

If (rst.NoMatch) Then

MsgBox "Ошибка при чтении таблицы элементов кнопочной формы."

rst.Close

dbs.Close

Exit Function

End If

Select Case rst![Command]

' Переход к другой кнопочной форме.

Case conCmdGotoSwitchboard

Me.Filter = "[ItemNumber] = 0 AND [SwitchboardID]=" & rst![Argument]

' Открытие формы в режиме добавления записей.

Case conCmdOpenFormAdd

DoCmd.OpenForm rst![Argument], , , , acAdd

' Открытие формы.

Case conCmdOpenFormBrowse

DoCmd.OpenForm rst![Argument]

' Открытие отчета.

Case conCmdOpenReport

DoCmd.OpenReport rst![Argument], acPreview

' Настройка кнопочной формы.

Case conCmdCustomizeSwitchboard

' Обработка ситуации, когда диспетчер

' кнопочных форм не установлен

' (например, при сокращенной установке).

On Error Resume Next

Application.Run "WZMAIN80.sbm_Entry"

If (Err <> 0) Then MsgBox "Команда недоступна."

On Error GoTo 0

' Обновление формы.

Me.Filter = "[ItemNumber] = 0 AND [Argument] = 'по умолчанию' "

Me.Caption = Nz(Me![ItemText], "")

FillOptions

' Выход из приложения.

Case conCmdExitApplication

CloseCurrentDatabase

' Запуск макроса.

Case conCmdRunMacro

DoCmd.RunMacro rst![Argument]

' Выполнение программы.

Case conCmdRunCode

Application.Run rst![Argument]

' Другие команды не поддерживаются.

Case Else

MsgBox "Неизвестная команда."

End Select

' Закрытие набора записей и базы данных.

rst.Close

dbs.Close

HandleButtonClick_Exit:

Exit Function

HandleButtonClick_Err:

' Если выполнение прервано пользователем, сообщение об ошибке не выводится.

' Вместо этого выполнение продолжается со следующей строки.

If (Err = conErrDoCmdCancelled) Then

Resume Next

Else

MsgBox "Ошибка при выполнении команды.", vbCritical

Resume HandleButtonClick_Exit

End If

End Function

Форма “ЗАКАЗЧИК”

Option Compare Database

Option Explicit

Private Sub Кнопка18_Click()

On Error GoTo Err_Кнопка18_Click

DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70

DoCmd.DoMenuItem acFormBar, acEditMenu, 6, , acMenuVer70