Описание выполнения Задания 6.
Название задания: Задание 6.
Тема задания: “Обработка базы данных Access в среде Visual Basic 6”.
Цель задания: Освоение методов обработки БД Access средствами Visual Basic 6. Ознакомление с объектами технологии ADO и их методами. Ознакомиться с процессом создания на форме пользовательского меню. В качестве примера выполнения Задания 6 ниже приводится решение следующей задачи:
Создать БД с таблицами:
Номер курса, номер группы, номер в группе, ФИО, пол, год рождения.
Номер курса, номер группы, номер в группе, оценки по 6 экзаменам.
С помощью меню пользователя обеспечить возможность обработки БД:
- корректировки записей в таблицах;
- добавления новых записей в таблицы;
- удаления заданных записей из таблиц.
Обработав БД, получить таблицу:
Справка о студентах, чей средний балл ниже общего среднего значения
Сформировать запрос к БД:
4. На основании 1-ой таблицы .вывести список студентов, чьи
фамилии начинаются с вводимой с клавиатуры заглавной
русской буквы.
Прежде, чем приступать к выполнению данного задания следует внимательно прочесть стр.3 – 20 учебного пособия, находящегося в файле “Учебное_пособие_БД”. Затем рекомендуется не просто прочесть, а усвоить материал, изложенный на стр. 20-28 этого учебного пособия. На его стр. 28-43 приведены те же процедуры, которые будут приводиться здесь ниже. Каждая из них для лучшего понимания снабжена подробными комментариями непосредственно в текстах кодов процедур.
В среде БД Access или с помощью надстройки VB “Visual Data Manager” создать двухтабличную БД в соответствии с индивидуальным заданием.
Приступаем к выполнению Задания № 6. На чистой дискете создаем папку под названием Задание 6 и копируем в эту папку созданный файл БД. Открываем новый проект. Так как текст задания № 6 достаточно большой, то для вывода на экран условия задачи будет требоваться отдельная форма. Поэтому создаем проект, содержащий 2 формы: форму с текстом условия задания frmQuest и рабочую форму frmActiveX.
На форму frmQuest помещаем 2 метки и командную кнопку. В таблице описываем их свойства:
Таблица свойств формы frmQuest и расположенных на ней
элементов управления.
-
Объект
Свойство
Значение свойства
Форма
Name
Caption
Font
frmQuest
Задание № 6. Условие задачи.
Times New Roman, жирный, размер 12
Метка
Name
Caption
Alignment
Font
Label1
“ Условие задачи: “
2-по центру
Times New Roman, жирный, размер 16
Метка
Name
Caption
Alignment
Font
Label2
Задается в процедуре загрузки формы
2-по центру
Times New Roman, нормальный, размер 12
Командная кнопка
Name
Caption
Font
Command1
“Далее”
Times New Roman, нормальный, размер 12
Текст задания будет выводится на метку Label2 процедурой загрузки формы. Поэтому дважды щелкаем по форме и в заготовку процедуры Form_Load записываем код:
Private Sub Form_Load()
Label1 = "Средствами Access или VB создать БД с таблицами:" & vbCrLf & _
“ 1. Номер курса, номер группы, номер в группе, пол, год рождения." & vbCrLf & _
" 2. Номер курса, номер группы, номер в группе, оценки по 6 экзаменам." & vbCrLf & _
"С помощью меню пользователя обеспечить возможность:" & vbCrLf & _
" - корректировки данных в таблицах;" & vbCrLf & _
" - добавления новых записей в таблицы;" & vbCrLf & _
" - удаления заданной записи из таблиц." & vbCrLf & _
"Обработав БД, получить таблицу:" & vbCrLf & _
" 3. Справка о студентах, чей средний балл ниже общего среднего " & vbCrLf & _
"Выполнить запрос к БД:" & vbCrLf & _
" 4. На основании 1-ой таблицы выдать сведения о студентах, чьи фамилии" & _
vbCrLf & _
" начинаются с вводимой с клавиатуры заглавной русской буквы."
End Sub
Для командной кнопки записываем процедуру перехода к форме frmActiveX:
Private Sub Command1_Click()
frmQuest.Hide
frmActiveX.Show
End Sub
Переходим к проектированию формы frmActiveX.
Процесс создания на форме пользовательского меню подробно излагается в любом учебнике по VB 6. Нужно ознакомиться с ним и создать на форме меню со следующей структурой:
Таблицы Редактирование Результат Выход
(имя таблицы1) Корректировка записей
(имя таблицы2) Добавление записей
Удаление записей
Теперь поместим на форму элемент MSFlexGrid. Если по условию задачи целесообразно вывести на экран какое-либо числовое или иное значение, то
располагаем на форме для его визуализации текстовое окно и над ним метку с поясняющим текстом. Для варианта образца этого задания форма приобретает вид:
Таблица свойств формы frmActiveX и расположенных на ней элементов управления:
Объект |
Свойство |
Значение свойства |
Форма |
Name Caption Font |
frmActiveX Задание № 6. Обработка БД Access средствами VB Times New Roman, жирный, размер 12 |
MSFlexGrid |
Name |
flg |
Метка |
Name Caption Alignment Font ForeColor |
Label1 Общее среднее 2-центровка Times New Roman, жирный, размер 16 vbMagenta
|
Текстовое окно |
Name Font ForeColor |
Text1 Times New Roman, жирный, размер 14 vbRed |
Добавляем к проекту с помощью пункта “Проект” главного меню стандартный модуль. Его имя нужно установить отличающимся от имени модуля, созданного при выполнении Задания 5. В созданный модуль записываем процедуру, обеспечивающую подключение созданной БД к нашему проекту:
Public Sub Connect(db$, tb$, cn As Object, rs As Object)
cn.ConnectionString = "Driver=Microsoft Access Driver (*.mdb)"
cn.Open ("Provider=Microsoft.Jet.OLEDB.3.51; Data Source=" & _
CurDir & "\" & db & ".mdb")
rs.ActiveConnection = cn
rs.CursorType = adOpenDynamic
rs.LockType = adLockPessimistic
rs.Open tb
End Sub
Теперь выполняем команду: “Проект \ Информация …”, в открывшемся окне находим строку “ Microsoft ActiveX Data Objects 2.0 Library” и щелкаем на значке квадратика в начале этой строки. Этим мы подключили к нашему проекту библиотеку, содержащую нужные нам объекты ActiveX. Для завершения операции щелкаем в окне кнопку Ok.
В разделе General формы объявляем общедоступные переменные:
Public cn As New ADODB.Connection, rs As New ADODB.Recordset
Public st$, kolzap%
Переходим к программированию пунктов созданного нами пользовательского меню. Каждый из этих пунктов аналогичен командной кнопке. Поэтому для каждого из них можно создать процедуру обработки его события Click. Для задачи образца Задания № 6 эти процедуры будут следующими:
Процедуры рабочей формы:
Процедура вывода на экран таблицы “Сессия”:
Private Sub mnuSessia_Click()
Dim i%, cn1 As New ADODB.Connection, rs1 As New ADODB.Recordset
Label1.Visible = False: Text1.Visible = False
' Подключаем объекты ADO к БД
Call Connect("Institut", "Сессия", cn1, rs1)
' Определяем количество записей в таблице "Сессия"
kolzap = 0
Do While Not rs1.EOF
rs1.MoveNext
kolzap = kolzap + 1
Loop
' Задаем параметры элемента MSFlexGrid
flg.Cols = rs1.Fields.Count: flg.Rows = kolzap + 1
For i = 0 To rs1.Fields.Count - 1
flg.ColWidth(i) = flg.Width / (rs1.Fields.Count + 1)
Next i
' Задаем заголовки столбцов элемента MSFlexGrid
flg.FormatString = "^ № |^№ курса |^№ группы |^№ в группе " & _
"|^ О1 |^ О2 |^ О3 |^ О4 |^ О5 |^ О6"
' Заносим в MSFlexGrid данные из таблицы "Сессия"
rs1.MoveFirst
For i = 1 To kolzap
flg.TextMatrix(i, 0) = rs1.Fields(0)
flg.TextMatrix(i, 1) = rs1.Fields(1)
flg.TextMatrix(i, 2) = rs1.Fields(2)
flg.TextMatrix(i, 3) = rs1.Fields(3)
flg.TextMatrix(i, 4) = rs1.Fields(4)
flg.TextMatrix(i, 5) = rs1.Fields(5)
flg.TextMatrix(i, 6) = rs1.Fields(6)
flg.TextMatrix(i, 7) = rs1.Fields(7)
flg.TextMatrix(i, 8) = rs1.Fields(8)
flg.TextMatrix(i, 9) = rs1.Fields(9)
rs1.MoveNext
Next i
' Закрываем подключение ADO к БД и освобождаем
' занимаемую объектами ADO память
rs1.Close
Set rs1 = Nothing
cn1.Close
Set cn1 = Nothing
End Sub
Вид формы с выводом данных таблицы ”Сессия” БД.
Процедура вывода на экран таблицы “Студенты”:
Private Sub mnuStudents_Click()
Dim i%, cn2 As New ADODB.Connection, rs2 As New ADODB.Recordset
Label1.Visible = False
Text1.Visible = False
' Подключаем объекты ADO к БД
Call Connect("Institut", "Студенты", cn2, rs2)
' Определяем количество записей в таблице "Студенты"
kolzap = 0
Do While Not rs2.EOF
rs2.MoveNext
kolzap = kolzap + 1
Loop
' Задаем параметры элемента MSFlexGrid
flg.Cols = rs2.Fields.Count: flg.Rows = kolzap + 1
For i = 0 To rs2.Fields.Count - 1
flg.ColWidth(i) = flg.Width / (rs2.Fields.Count + 1)
Next i
' Задаем заголовки столбцов элемента MSFlexGrid
flg.FormatString = "^ № |^ № курса |^ № группы |^ № в группе " & _
"|< ФИО |^ Пол |^ Год рождения "
' Заносим в MSFlexGrid данные из таблицы "Студенты"
rs2.MoveFirst
For i = 1 To kolzap
flg.TextMatrix(i, 0) = rs2.Fields(0)
flg.TextMatrix(i, 1) = rs2.Fields(1)
flg.TextMatrix(i, 2) = rs2.Fields(2)
flg.TextMatrix(i, 3) = rs2.Fields(3)
flg.TextMatrix(i, 4) = rs2.Fields(4)
flg.TextMatrix(i, 5) = rs2.Fields(5)
flg.TextMatrix(i, 6) = rs2.Fields(6)
rs2.MoveNext
Next i
' Закрываем подключение ADO к БД и освобождаем
' занимаемую объектами ADO память
rs2.Close
Set rs2 = Nothing
cn2.Close
Set cn2 = Nothing
End Sub
Вид формы с выводом данных таблицы ”Студенты” БД.
Расчетные соотношения для решения задачи образца задания № 6:
sr(i) = / 6, где i - номер оценки по i – му экзамену студента.
osr = , где j – номер студента в таблице БД.
Таблица использованных идентификаторов:
Идентификатор |
Объект программы |
Тип данного |
Значение |
Физический смысл |
i |
переменная |
Integer |
от 1 до 6 |
Параметр цикла |
j |
переменная |
Integer |
от 1 до kolzap |
Параметр цикла |
kolzap |
переменная |
Integer |
определяется содержимым таблицы |
Количество записей в таблице |
sr(i) |
динамический массив |
Single |
вычисляется |
Среднее значение оценок i-го студента |
osr |
переменная |
Single |
вычисляется |
Общее среднее значение оценок всех студентов |
Процедура решения задачи:
Private Sub mnuViewResult_Click()
Dim sr!(), i%, j%, k%, osr!
Label1.Visible = True: Text1.Visible = True
' Создаем объекты Connection и RecordSet для таблицы "Сессия"
Dim cn1 As New ADODB.Connection, rs1 As New ADODB.Recordset
' Создаем объекты Connection и RecordSet для таблицы "Студенты"
Dim cn2 As New ADODB.Connection, rs2 As New ADODB.Recordset
' Подключаем объекты ADO к БД
Call Connect("Institut", "Сессия", cn1, rs1)
' Подсчитываем кол-во записей в таблице
kolzap = 0
Do While Not rs1.EOF
rs1.MoveNext
kolzap = kolzap + 1
Loop
‘ Задаем размер динамического массива sr
ReDim sr(1 To kolzap)
' Для каждого студента определяем его средний балл и
' полученные значения заносим в массив sr
osr = 0: rs1.MoveFirst
For i = 1 To kolzap
sr(i) = 0
For j = 4 To 9
sr(i) = sr(i) + rs1.Fields(j) / 6
Next j
osr = osr + sr(i)
rs1.MoveNext
Next i
' Определяем общий средний балл и выводим его значение в текстовое окно
osr = osr / kolzap
Text1.Visible = True
Label1.Visible = True
Text1.Text = " " & Format(osr, "Fixed")
' Задаем параметры элемента управления MSFlexGrid
flg.Clear
flg.Cols = 6: flg.Rows = kolzap + 1
For i = 0 To 5
flg.ColWidth(i) = flg.Width / 5
Next i
For i = 0 To kolzap
flg.RowHeight(i) = flg.Height / 7
Next i
flg.FormatString = "^ № |^ № курса |^ № группы |^ № в группе " & _
"|< ФИО |^ Ср. балл "
' Из таблицы "Сессия" заносим в MSFlexGrid значения № курса, № группы,
‘ № в группе и средний балл тех студентов, у которых средний балл ниже
‘ общего среднего балла
k = 0
rs1.MoveFirst
For i = 1 To kolzap
If sr(i) < osr Then
k = k + 1
For j = 1 To 3
flg.TextMatrix(k, j) = rs1.Fields(j)
Next j
flg.TextMatrix(k, 0) = k
flg.TextMatrix(k, 5) = Format(sr(i), "Fixed")
End If
rs1.MoveNext
Next i
' Подключаем объекты ADO к таблице "Студенты" базы данных
Call Connect("Institut", "Студенты", cn2, rs2)
' Из таблицы "Студенты" заносим в MSFlexGrid фамилии тех студентов,
‘ у которых средний балл ниже общего среднего балла
k = 0
rs2.MoveFirst
For i = 1 To kolzap
If sr(i) < osr Then
k = k + 1
flg.TextMatrix(k, 4) = rs2.Fields(4)
End If
rs2.MoveNext
Next i
' Окончательно закрываем подключение объектов ADO к БД.
rs1.Close
Set rs1 = Nothing
cn1.Close
Set cn1 = Nothing
rs2.Close
Set rs2 = Nothing
cn2.Close
Set cn2 = Nothing
End Sub
Вид формы с выводом решения задачи.
Процедура редактирования данных в БД:
Private Sub mnuEditRec_Click()
Dim i%, n%, sz$, nf As Variant
Label1.Visible = False: Text1.Visible = False
st = InputBox("Введите имя таблицы")
' Подключаем объекты ADO к БД
rs.LockType = adLockOptimistic
Call Connect("Institut", st, cn, rs)
' Выводим на экран таблицу
If st = "Сессия" Then mnuSessia_Click Else mnuStudents_Click
' Вводим данные для корректировки
n = InputBox("Введите номер корректируемой записи")
sz = InputBox("Введите имя корректируемого поля записи")
nf = InputBox("Введите новое значение корректируемого поля")
' Находим запись с нужным номером и корректируем ее заданное поле
Do While Not rs.EOF
If rs.Fields(0) = n Then rs.Fields(sz) = nf: Exit Do
rs.MoveNext
Loop
rs.Update
' Прерываем связь объектов Connection и RecordSet с БД и освобождаем
‘ занимаемую ими память
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
' Выводим на экран отредактированную таблицу
If st = "Сессия" Then mnuSessia_Click Else mnuStudents_Click
End Sub
Процедура добавления новых данных в БД:
Private Sub mnuSetNewRec_Click()
Dim i%, pz As Variant
Label1.Visible = False: Text1.Visible = False
st = InputBox("Введите имя таблицы, в которую нужно добавить новую запись")
rs.LockType = adLockOptimistic
Call Connect("Institut", st, cn, rs)
' Выводим на экран таблицу
If st = "Сессия" Then mnuSessia_Click Else mnuStudents_Click
' Добавляем новую запись в таблицу
rs.AddNew
For i = 0 To rs.Fields.Count - 1
pz = InputBox("Введите значение " & i & "-го поля новой записи таблицы." & st & _
". При вводе нужно соблюдать уникальность комбинации: № курса, “ & _
“ № группы, № в группе")
rs.Fields(i) = pz
Next i
rs.Update
' Прерываем связь объектов Connection и RecordSet с БД и освобождаем
‘ занимаемую ими память
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
' Выводим на экран измененную таблицу
If st = "Сессия" Then mnuSessia_Click Else mnuStudents_Click
‘ Задержка для просмотра таблицы
Do
Loop Until MsgBox(" Таблица " & st, 64) = vbOK
' Переходим к другой таблице
If st = "Сессия" Then st = "Студенты" Else st = "Сессия"
rs.LockType = adLockOptimistic
Call Connect("Institut", st, cn, rs)
' Выводим на экран другую таблицу
If st = "Сессия" Then mnuSessia_Click Else mnuStudents_Click
' Добавляем новую запись в другую таблицу
rs.AddNew
For i = 0 To rs.Fields.Count - 1
pz = InputBox("Введите значение " & i & "-го поля новой записи таблицы " & st & _
"При вводе нужно соблюдать уникальность комбинации: № курса, “ & _
“ № группы, № в группе")
rs.Fields(i) = pz
Next i
rs.Update
' Прерываем связь объектов Connection и RecordSet с БД и освобождаем
‘ занимаемую ими память
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
' Выводим на экран измененную другую таблицу
If st = "Сессия" Then mnuSessia_Click Else mnuStudents_Click
End Sub
Процедура удаления заданных данных из БД:
Private Sub mnuDelRec_Click()
Dim n%, k%
Label1.Visible = False: Text1.Visible = False
st = InputBox("Введите имя таблицы, из которой хотите удалить запись")
' Создаем объекты Connection и RecordSet для таблицы
rs.LockType = adLockOptimistic
Call Connect("Institut", st, cn, rs)
' Выводим на экран таблицу
If st = "Сессия" Then mnuSessia_Click Else mnuStudents_Click
' Вводим номер удаляемой записи
n = InputBox("Введите номер удаляемой записи")
' Определяем позицию удаляемой записи в наборе RecordSet
k = 0
Do While Not rs.EOF
k = k + 1
If n = rs.Fields(0) Then Exit Do
rs.MoveNext
Loop
rs.MoveFirst
' Удаляем из таблицы запись с заданным номером
rs.Move k - 1
rs.Delete
rs.Update
' Прерываем связь объектов Connection и RecordSet с БД и освобождаем
‘ занимаемую ими память
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
' Выводим на экран измененную таблицу
If st = "Сессия" Then mnuSessia_Click Else mnuStudents_Click
‘ Задержка для просмотра таблицы
Do
Loop Until MsgBox(" Таблица " & st, 64) = vbOK
' Переходим к другой таблице
If st = "Сессия" Then st = "Студенты" Else st = "Сессия"
Call Connect("Institut", st, cn, rs)
' Выводим на экран другую таблицу
If st = "Сессия" Then mnuSessia_Click Else mnuStudents_Click
' Определяем позицию удаляемой записи
k = 0
Do While Not rs.EOF
k = k + 1
If n = rs.Fields(0) Then Exit Do
rs.MoveNext
Loop
rs.MoveFirst
' Удаляем из таблицы запись с заданным номером
rs.Move k - 1
rs.Delete
rs.Update
' Прерываем связь объектов Connection и RecordSet с БД и освобождаем
‘ занимаемую ими память
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
' Выводим на экран измененную другую таблицу
If st = "Сессия" Then mnuSessia_Click Else mnuStudents_Click
End Sub
В индивидуальных вариантах Задания № 6 отсутствует требование формирования и выполнения запроса к БД. Однако, будет приветствоваться, если Вы самостоятельно сформируете какой-либо простой запрос к БД и создадите процедуру его выполнения. Естественно, что при этом будет требоваться добавить к пунктам созданного меню соответствующий новый пункт. Процедура выполнения запроса к БД для образца Задания № 6 имеет вид:
Процедура выполнения запроса к БД:
Private Sub mnuZapros_Click()
Dim sq As String, fam$
Label1.Visible = False: Text1.Visible = False
' Формируем строку SQL-оператора запроса
sq = "Select * From Студенты Where [ФИО] Like"
fam = InputBox("Введите первую букву фамилии", "Ввод заглавной русской буквы")
sq = sq & "'" & fam & "%'"
' Устанавливаем связь с БД
Call Connect("Institut", "Студенты", cn, rs)
' Выполняем запрос
Set rs = cn.Execute(sq)
' Выводим результат запроса в элемент MSFlexGrid
kolzap = 0
Do While Not rs.EOF
rs.MoveNext
kolzap = kolzap + 1
Loop
flg.FormatString = "^ № |^ № курса |^ № группы |^ № в группе |< ФИО " & _
"|^ Пол |^ Год рождения "
flg.Cols = rs.Fields.Count: flg.Rows = kolzap + 1
rs.MoveFirst
For i = 1 To kolzap
flg.TextMatrix(i, 0) = rs.Fields(0)
flg.TextMatrix(i, 1) = rs.Fields(1)
flg.TextMatrix(i, 2) = rs.Fields(2)
flg.TextMatrix(i, 3) = rs.Fields(3)
flg.TextMatrix(i, 4) = rs.Fields(4)
flg.TextMatrix(i, 5) = rs.Fields(5)
flg.TextMatrix(i, 6) = rs.Fields(6)
rs.MoveNext
Next i
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub
Вид формы с результатом выполнения запроса.
Процедура завершения работы приложения:
Private Sub mnuExit_Click()
End
End Sub
Как обычно добавляем к проекту форму-заставку frmZ6z. Процедура для ее командной кнопки должна иметь вид:
Private Sub Command1_Click()
frmZ6z.Hide
frmQuest.Show
End Sub
Вопросы к защите Задания № 6.
1. Опишите процесс создания на форме пользовательского меню.
2. Опишите процесс подключения к проекту требующейся библиотеки
объектов ActiveX.
3. Что такое программный объект?
4. Основные объекты ADO, их назначение.
5. Как объявить новый объект ADO?
6. Объект Connection, его свойства и методы.
7. Объект RecordSet, его свойства и методы.
8. Типы наборов данных объекта RecordSet.
9. Методы навигации по записям таблицы БД.
10. Возможные способы обращения к конкретным полям записи в таблице
БД.
11. Как отключить связь объектов с БД и освободить занимаемую ими
память?
Желаю успешной защиты Задания 6!