Степень независимости данных определяется тщательностью проектирования базы данных. Всесторонний анализ объектов предметной области и их взаимосвязей минимизирует влияние изменения требований к данным в одной программе на другие программы. В этом и состоит всеобъемлющая независимость данных.
Основное различие между указанными выше тремя типами моделей данных (концептуальной, логической и физической) состоит в способах представления взаимосвязей между объектами. При проектировании БД требуется различать взаимосвязи между объектами, между свойствами одного объекта и между свойствами различных объектов.
В процессе проектирования объекты преобразуются в отношения, свойства в поля таблиц, методы – в процедуры, формы и т.д. (что и было произведено). Правильно проведенный объектно-ориентированный анализ позволяет значительно облегчить работу.
Таблица 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