- •Курсовая работа
- •На курсовую работу студенту
- •Календарный план
- •Перечень условных обозначений, сокращений и терминов
- •Введение
- •Описание предметной области
- •Анализ технического задания
- •Проектирование базы данных
- •Концептуальное проектирование
- •Нормализация
- •Логическое проектирование
- •Выбор субд
- •Разработка приложения
- •Разработка таблиц
- •Разработка форм
- •Руководство пользователя
- •Заключение
- •1 Содержит
Разработка таблиц
Запускаем Access и выбираем, Создать новую базу данных. Сохраняем её под именем «Учет ГСМ на автобазе» и приступаем к созданию таблиц.
Для создания таблицы Автобаза, выбираем «Создание таблиц в режиме конструктора», затем вводим имена полей и их типы данных (смотри концептуальное проектирование) как показано на рисунке 8.1.
Рисунок 8.1 – Таблица автобаза в режиме конструктора
Далее закрываем таблицу и вводим название таблицы.
Аналогично создаём и заполняем остальные таблицы. Они показаны на рисунках 8.2 – 8.8
Рисунок 8.2 – Таблица гараж в режиме конструктора
Для поля код автобазы выбираем тип – мастер подстановок. Далее выбираем «объект получит значения из другой таблицы» и таблицу Автобаза, жмем далее, выбираем поля: код, название, жмем далее, задаем каскадное удаление и обновление, а также название поля подстановки.
Рисунок 8.3 – Таблица Заправщик в режиме конструктора
Рисунок 8.4 – Таблица Автомобиль в режиме конструктора
Рисунок 8.5 – Таблица Водитель в режиме конструктора
Рисунок 8.6 – Таблица Путевой лист в режиме конструктора
Таблицы Заправщик, Гараж, Автомобиль, Водитель, Путевой лист, ГСМ
Связываем с помощью мастера подстановок с таблицами Гараж, Автомобиль, Водитель, Путевой лист, Ведомость, Ведомость соответственно.
Рисунок 8.7 – Таблица Ведомость в режиме конструктора
Рисунок 8.8 – Таблица ГСМ в режиме конструктора
Таблицы Заправщик, Гараж, Автомобиль, Водитель, Путевой лист, ГСМ
Связываем с помощью мастера подстановок с таблицами Гараж, Автомобиль, Водитель, Путевой лист, Ведомость, Ведомость соответственно.
Разработка форм
Создаем форму водитель с помощью мастера форм. Добавляем элемент управления - поле со списком, который будет служить для быстрого перехода к интересующей нас записи. Размещаем его в заголовке ведомости. Выделяем данный элемент и в окне свойств на вкладке события выбираем «после обновления» -> макросы. В открывшемся окне добавляем макрокоманды (см. рисунки 8.9, 8.10).
Рисунок 8.9 – Макрокоманды (начало)
Рисунок 8.10 – Макрокоманды (продолжение)
Создаем кнопку сохранить и создать, размещаем её в заголовке формы, в свойствах данной кнопки выбираем прозрачный фон, а также указатель при наведении – указатель на гиперссылку. На вкладке события, выбираем нажатие кнопки – макрос, и добавляем следующие макрокоманды (см. рисунок 8.11)
Рисунок 8.11 – Макрокоманды
Далее создаем набор вкладок, первую вкладку называем «Данные о водителе» и помещаем туда поля, созданные с помощью мастера форм. Добавляем вторую и третью вкладки, называем их Ведомость и Путевой лист соответственно и перетаскиваем на них таблицы из области навигации.
На вкладке водитель выбираем элемент вложение и в свойствах ставим рисунок по умолчанию – водитель.png.
На ленте в разделе темы выбираем «базовые» цвета.
В
результате получаем форму
изображенную на рисунках 8.12, 8.13.
Рисунок
8.12 – Форма Водитель, вкладка
Данные о водителе
Рисунок 8.13 – Форма водитель, вкладка ведомость
Создаем с помощью мастера форму Автомобиль, на которой аналогично предыдущей форме располагаем кнопки «сохранить и создать» и «закрыть».
Результат изображен на рисунке 8.14.
Рисунок 8.14 – Форма Автомобиль
Далее создаем форму путевой лист, на ней помимо элементов рассмотренных в предыдущих формах будет располагаться кнопка «Отчет», которая будет открывать отчет по данному путевому листу. Для этого необходимо предварительно создать отчет. Чтобы сформировать отчет выбираем на ленте вкладку создание – конструктор отчетов. Далее формируем структуру согласно третьей форме путевого листа легкового автомобиля. Данный отчет изображен на рисунке 8.15.
Рисунок 8.15 – Отчет
В кнопу Отчет прописываем следующий код:
Private Sub отчет_Click()
DoCmd.OpenReport "Путевой лист", A_PREVIEW, , "[Код водителя]=" & [Код водителя]
End Sub
Форма путевой лист изображена на рисунке 8.16.
Рисунок 8.16 – Форма Путевой лист
С помощью мастера форм создаем ленточную форму Ведомость. Переходим в режим конструктора и добавляем кнопку новая ведомость, которая будет открывать пустую форму и автоматически заполнять первое значение поля номер ведомости. Оно будет равным самому большому номеру ведомости в таблице Ведомость + 1.Так же эта кнопка будет переводить курсор в поле Номер путевого листа и делать видимой кнопку Отмена. Для этого в процедуре обработки событий прописываем следующий код:
Private Sub new_ved_Click()
Dim rstVed As Recordset, k As Integer
Set rstVed = CurrentDb.OpenRecordset("Ведомость", dbOpenDynaset)
k = 0
Do Until rstVed.EOF
If rstVed![Номер ведомости] > k Then
k = rstVed![Номер ведомости]
End If
rstVed.MoveNext
Loop
DoCmd.OpenForm "Ведомость проба", acNormal, filt, "[Номер ведомости] =0"
Forms![ведомость проба]![Номер ведомости] = k + 1
Forms![ведомость проба]!s_v.Visible = True
Forms![ведомость проба]!отмена.Visible = True
[Номер путевого листа].SetFocus
End Sub
Кнопка Отмена будет закрывать данную форму. Для неё прописываем следующий код:
Private Sub отмена_Click()
DoCmd.Close acForm, "Ведомость проба"
End Sub
Чтобы последующие значения поля Номер ведомости заполнялись также автоматически в событие номер ведомости – получение фокуса добавляем код:
Private Sub Номер_ведомости_GotFocus()
Dim rstVed As Recordset, k As Integer
Set rstVed = CurrentDb.OpenRecordset("Ведомость", dbOpenDynaset)
k = 0
Do Until rstVed.EOF
If rstVed![Номер ведомости] > k Then
k = rstVed![Номер ведомости]
End If
rstVed.MoveNext
Loop
[Номер ведомости].Value = k
[Номер путевого листа].SetFocus
End Sub
Добавляем кнопку Сохранить и выйти, которая будет отобажаться при создании новой де домости и в нее добавляем макрос, который изображен на рисунке 8.16.
Рисунок 8.17 – Макрос
Полученная форма ведомость показана на рисунке 8.17.
Рисунок 8.18 – Форма Ведомость
Далее создаем форму поиска, с помощью которой можно будет найти данные о водителе, ведомости и автомобиле. Результат будет отображаться в появляющемся списке. При выборе поиска ведомости можно задать поле, по которому будет осуществляться сортировка (по фамилии или по номеру путового листа)
Итак, создаем группу переключателей для выбора объекта поиска и выбора сортировки, а также поле, в которое будет вводиться параметр и список для вывода результата. Скрываем все элементы, кроме группы выбора объекта. Добавляем изображение лупы, для более гармоничного вида формы. Для кнопки Поиск прописываем следующий код:
Private Sub poisk_Click()
Dim s, sor As String
Dim af As Boolean
If optp.Value = 1 Then
Dim rstVod As Recordset
Dim k As Integer
k = pole.Value
af = False
Set rstVod = CurrentDb.OpenRecordset("Водитель", dbOpenDynaset)
Do Until rstVod.EOF
If rstVod![Код водителя] = k Then
af = True
Exit Do
End If
rstVod.MoveNext
Loop
If af = True Then
s = "select фамилия, имя, отчество, стаж, [Номер авто] from Водитель where [Код водителя]=" & pole.Value & ";"
Else: MsgBox "такого водителя нет"
End If
lstp.Visible = True
lstp.RowSource = s
End If
If optp.Value = 2 Then
Dim pol As String
Dim rstAvt As Recordset
pol = pole.Value
af = False
Set rstAvt = CurrentDb.OpenRecordset("Автомобиль", dbOpenDynaset)
Do Until rstAvt.EOF
If rstAvt![Гос номер] = pol Then
af = True
Exit Do
End If
rstAvt.MoveNext
Loop
If af = True Then
s = "select Марка, Модель, [Год выпуска], Цвет, [Код гаража] from Автомобиль where [Гос номер]='" + pol + "';"
Else: MsgBox "Такого автомобиля нет!!!"
End If
lstp.Visible = True
lstp.RowSource = s
End If
If optp.Value = 3 Then
Dim nved As String
Dim rstVed As Recordset
nved = pole.Value
af = False
Set rstVed = CurrentDb.OpenRecordset("Ведомость", dbOpenDynaset)
Do Until rstVed.EOF
If rstVed![Номер ведомости] = nved Then
af = True
Exit Do
End If
rstVed.MoveNext
Loop
If af = True Then
If opts.Value = 1 Then sor = " order by водитель.фамилия "
If opts.Value = 2 Then sor = " order by ведомость.[Номер путевого листа] "
s = "SELECT Ведомость.Число, Ведомость.[Номер путевого листа] as [№ пут л ], Водитель.Фамилия, Ведомость.[Номер авто], ГСМ.Тип, Ведомость.[Количество ГСМ] FROM (Водитель INNER JOIN [Путевой лист] ON Водитель.[Код водителя] = [Путевой лист].[Код водителя]) INNER JOIN (ГСМ INNER JOIN Ведомость ON ГСМ.[Код] = Ведомость.[Код ГСМ]) ON [Путевой лист].[Номер путевого листа] = Ведомость.[Номер путевого листа] where [Номер ведомости]=" & nved & "" + sor + ";"
Else: MsgBox "Такой ведомости нет!!!"
End If
lstv.RowSource = s
lstv.Visible = True
End If
End Sub
Для события - после обновления переключателей:
Private Sub optp_AfterUpdate()
If optp.Value = 1 Then
n_rez.Visible = True
lstp.Visible = False
n_nom.Visible = False
n_ved.Visible = False
pole.Visible = False
lstv.Visible = False
opts.Visible = False
n_sort.Visible = False
n_kodv.Visible = True
pole.Visible = True
pole.SetFocus
Me!pole = ""
End If
If optp.Value = 2 Then
n_rez.Visible = True
lstp.Visible = False
n_kodv.Visible = False
n_ved.Visible = False
pole.Visible = False
lstv.Visible = False
opts.Visible = False
n_sort.Visible = False
n_nom.Visible = True
pole.Visible = True
pole.SetFocus
Me!pole = ""
lstp = ""
End If
If optp.Value = 3 Then
opts.Visible = True
n_sort.Visible = True
n_rez.Visible = True
lstv.Visible = False
n_kodv.Visible = False
pole.Visible = False
lstp.Visible = False
n_nom.Visible = False
n_ved.Visible = True
pole.Visible = True
pole.SetFocus
Me!pole = ""
lstp = ""
End If
End Sub
Полученная форма зображена на рисунках 8.19, 8.20.
Рисунок 8.19 – Форма до выполнения поиска
Рисунок 8.20 – Форма после выполнения поиска
Следующей создаем форму Обработка данных. На ней будет Группа переключателей с выбором необходимого запроса, а также поля для ввода периода.
После выбора переключателя, заполнения полей с датами и нажатия кнопки будет открываться соответствующий запрос. Код кнопки «Результат» приведен ниже.
Set db = CurrentDb
db.QueryDefs.Refresh
For Each qdf In db.QueryDefs
If qdf.Name = "Результат" Then
db.QueryDefs.Delete qdf.Name
End If
Next qdf
Date1 = Format(Me!dat1, "mm") & "/" & Format(Me!dat1, "dd") & "/" & Format(Me!dat1, "yyyy")
Date2 = Format(Me!dat2, "mm") & "/" & Format(Me!dat2, "dd") & "/" & Format(Me!dat2, "yyyy")
If optz.Value = 1 Then
StrSql = "SELECT ГСМ.Тип, Sum(Ведомость.[Количество ГСМ]) AS Количество FROM (Автомобиль INNER JOIN Водитель ON Автомобиль.[Гос номер] = Водитель.[Номер авто]) INNER JOIN ([Путевой лист] INNER JOIN (ГСМ INNER JOIN Ведомость ON ГСМ.[Код] = Ведомость.[Код ГСМ]) ON [Путевой лист].[Номер путевого листа] = Ведомость.[Номер путевого листа]) ON (Ведомость.[Код водителя] = Водитель.[Код водителя]) AND (Водитель.[Код водителя] = [Путевой лист].[Код водителя]) WHERE ((ГСМ.Тип)=[Введите тип ГСМ]) AND (ведомость.[Число]>=# " & Date1 & " # and [Ведомость].[Число]<=# " & Date2 & "#) and (автомобиль.[Код гаража]=[Введите номер гаража])GROUP BY ГСМ.тип"
Set qdf = db.CreateQueryDef("Результат", StrSql)
DoCmd.OpenQuery "Результат", acViewNormal
qdf.Close
End If
If optz.Value = 2 Then
StrSql = "SELECT Водитель.Фамилия, Водитель.Имя, ГСМ.Тип, sum(Ведомость.[Количество ГСМ]) AS Количество FROM (ГСМ INNER JOIN Ведомость ON ГСМ.Код = Ведомость.[Код ГСМ]) INNER JOIN Водитель ON Ведомость.[Код водителя] = Водитель.[Код водителя] WHERE Число>=# " & Date1 & " # and Число<=# " & Date2 & "# And Водитель.[Код водителя] = [Введите код водителя]GROUP BY Водитель.Фамилия, Водитель.Имя, ГСМ.Тип"
Set qdf = db.CreateQueryDef("Результат", StrSql)
DoCmd.OpenQuery "Результат", acViewNormal
qdf.Close
End If
If optz.Value = 3 Then
StrSql = "SELECT [Ведомость Запрос].Тип, sum([Ведомость Запрос].[количество ГСМ]) as Количество from [Ведомость Запрос] WHERE [Ведомость Запрос].[Число]>=# " & Date1 & " # and [Ведомость Запрос].[Число]<=# " & Date2 & "# GROUP BY [Ведомость Запрос].Тип"
Set qdf = db.CreateQueryDef("Результат", StrSql)
DoCmd.OpenQuery "Результат", acViewNormal
qdf.Close
End If
End Sub
Форма Обработка данных изображена на рисунке 8.21.
Рисунок 8.21 – Форма Обработка данных
Далее создаем форму с названием Главная, на которой размещаем подчиненную форму на основе запроса, код которого приведен ниже.
SELECT Ведомость.[Номер ведомости] AS [№ Вед], Ведомость.Число, Ведомость.[Номер путевого листа] AS [№ пут л], Водитель.Фамилия, (Left([Водитель].[Имя],1)+".") & (Left([Водитель].[Отчество],1)+".") AS Ин, Автомобиль.[Гос номер], Автомобиль.Марка, Автомобиль.Модель, ГСМ.Код, ГСМ.Тип, Ведомость.[Количество ГСМ]
FROM (ГСМ INNER JOIN (Ведомость INNER JOIN (Автомобиль INNER JOIN Водитель ON Автомобиль.[Гос номер] = Водитель.[Номер авто]) ON Ведомость.[Код водителя] = Водитель.[Код водителя]) ON ГСМ.Код = Ведомость.[Код ГСМ]) INNER JOIN [Путевой лист] ON (Ведомость.[Номер путевого листа] = [Путевой лист].[Номер путевого листа]) AND (Водитель.[Код водителя] = [Путевой лист].[Код водителя])
WHERE (((Автомобиль.[Код гаража])=[tempvars]![kod_z]))
ORDER BY Ведомость.[Номер ведомости];
В данном запросе отбираются записи в которых код гаража из таблицы автомобиль равен коду гаража авторизованного заправщика. В источнике строк списка номер путового листа также соблюдено данное условие. Таким образом мы можем отследить каким заправщиком были выданы ГСМ.
Далее создаем кнопки-ссылки на созданные ранее формы, а также кнопки Новая ведомость, Обновить и Отчет. После нажатия кнопки Отчет всплывает окно, куда следует ввести номер ведомости и нажать ОК. Откроется отчет с ведомостью, номер которой мы ввели. В заглавии отчета отображается название автобазы, в примечании – фамилия и имя заправщика.
Отчет по ведомости приведен на рисунке 8.22.
Рисунок 8.22 – Отчет Ведомость
В заголовке формы Главная отображаются данные об авторизованном заправщике и коде гаража. Это достигнуто путем присвоения полям значений временних переменых, созданных в форме Окно входа.
Форма Главная изображена на рисунке 8.23.
Рисунок 8.23 – Форма Главная
На форме Окно входа расположены две кнопки Выйти из приложения и Вход. При нажатии кнопки вход, если поле Заправщик заполнено, то создаются временные переменные, закрывается Окно входа и открывается форма Главная, если нет, то выдается соответствующее сообщение.
Внедренный макрос кнопки вход изображен на рисунке 8.23
Рисунок 8.24 – Макрос
