Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пояснительная записка Мошкин.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
859 Кб
Скачать
    1. Разработка таблиц

Запускаем Access и выбираем, Создать новую базу данных. Сохраняем её под именем «Учет ГСМ на автобазе» и приступаем к созданию таблиц.

Для создания таблицы Автобаза, выбираем «Создание таблиц в режиме конструктора», затем вводим имена полей и их типы данных (смотри концептуальное проектирование) как показано на рисунке 8.1.

Рисунок 8.1 – Таблица автобаза в режиме конструктора

Далее закрываем таблицу и вводим название таблицы.

Аналогично создаём и заполняем остальные таблицы. Они показаны на рисунках 8.2 – 8.8

Рисунок 8.2 – Таблица гараж в режиме конструктора

Для поля код автобазы выбираем тип – мастер подстановок. Далее выбираем «объект получит значения из другой таблицы» и таблицу Автобаза, жмем далее, выбираем поля: код, название, жмем далее, задаем каскадное удаление и обновление, а также название поля подстановки.

Рисунок 8.3 – Таблица Заправщик в режиме конструктора

Рисунок 8.4 – Таблица Автомобиль в режиме конструктора

Рисунок 8.5 – Таблица Водитель в режиме конструктора

Рисунок 8.6 – Таблица Путевой лист в режиме конструктора

Таблицы Заправщик, Гараж, Автомобиль, Водитель, Путевой лист, ГСМ

Связываем с помощью мастера подстановок с таблицами Гараж, Автомобиль, Водитель, Путевой лист, Ведомость, Ведомость соответственно.

Рисунок 8.7 – Таблица Ведомость в режиме конструктора

Рисунок 8.8 – Таблица ГСМ в режиме конструктора

Таблицы Заправщик, Гараж, Автомобиль, Водитель, Путевой лист, ГСМ

Связываем с помощью мастера подстановок с таблицами Гараж, Автомобиль, Водитель, Путевой лист, Ведомость, Ведомость соответственно.

    1. Разработка форм

Создаем форму водитель с помощью мастера форм. Добавляем элемент управления - поле со списком, который будет служить для быстрого перехода к интересующей нас записи. Размещаем его в заголовке ведомости. Выделяем данный элемент и в окне свойств на вкладке события выбираем «после обновления» -> макросы. В открывшемся окне добавляем макрокоманды (см. рисунки 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 – Макрос