Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Описание выполнения всех заданий по VB.doc
Скачиваний:
1
Добавлен:
21.07.2019
Размер:
1.89 Mб
Скачать

Описание выполнения Задания 6.

Название задания: Задание 6.

Тема задания: “Обработка базы данных Access в среде Visual Basic 6”.

Цель задания: Освоение методов обработки БД Access средствами Visual Basic 6. Ознакомление с объектами технологии ADO и их методами. Ознакомиться с процессом создания на форме пользовательского меню. В качестве примера выполнения Задания 6 ниже приводится решение следующей задачи:

Создать БД с таблицами:

  1. Номер курса, номер группы, номер в группе, ФИО, пол, год рождения.

  2. Номер курса, номер группы, номер в группе, оценки по 6 экзаменам.

С помощью меню пользователя обеспечить возможность обработки БД:

- корректировки записей в таблицах;

- добавления новых записей в таблицы;

- удаления заданных записей из таблиц.

Обработав БД, получить таблицу:

  1. Справка о студентах, чей средний балл ниже общего среднего значения

Сформировать запрос к БД:

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!