Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VB_6.doc
Скачиваний:
97
Добавлен:
01.12.2018
Размер:
3.77 Mб
Скачать

10.2.2. Свойство Recordset элемента Data.

Создаваемый элементом Data набор записей RecordSet отображается в свойстве Recordset элемента Data. Это обеспечивает программный доступ к значениям полей текущей записи. Например, чтобы передать в переменную w значение i-го поля текущей записи, достаточно написать оператор:

w = Data1.Recordset.Fields(i).Value

Последнюю точку вместе со словом Value можно не указывать, т.к. они подразумеваются по умолчанию.

Количество полей в текущей записи позволяет определить оператор:

n = Data1.Recordset.Fields.Count,

а количество записей в наборе:

m = Data1.Recordset.RecordCount.

Нумерация как полей, так и записей в VB начинается с нуля.

Для перемещения программным путем по записям набора служат методы элемента Data:

- MoveFirst – делает текущей первую запись;

- MoveNext – делает текущей следующую запись

- MovePrevious – делает текущей предыдущую запись набора;

- MoveLast – делает текущей последнюю запись набора.

Факт выхода за последнюю запись набора можно установить, опросив значение функции EOF. Если произошел выход за последнюю запись, то эта функция примет значение True. Тогда следует вернуться в набор, например, следующим образом:

If Data1.Recordset.EOF Then Data1.Recordset. MoveLast

Добавить новую запись в набор можно с помощью метода

AddNew, а удалить текущую запись из набора – с помощью метода Delete:

Data1.Recordset.AddNew

Data1.Recordset.Delete

Эти изменения передадутся в БД либо в момент перемещения на другую запись набора, либо без перемещения с помощью метода Update:

Data1.Recordset.Update

Код будет более прозрачным и легким для восприятия, если в разделе General окна кодов формы объявить для каждого расположенного на форме элемента Data объектную переменную, например:

Private rs1 As Object, rs2 As Object,

а в процедурах формы задать их значения:

Set rs1 = Data1.Recordset: Set rs2 = Data2.Recordset

После этого в процедуре вместо, например, оператора:

If Data1.Recordset.Fields(0) = Data2,Recordset.Fields(1) Then

sv = Data1.Recordset.Fields(2) – Data2.Recordset.Fields(4)*3^2

End If

можно писать:

If rs1.Fields(0) = rs2.Fields(1) Then

sv = rs1.Fields(2) – rs2.Fields(4)*3^2

End If

т.е. всюду вместо Data1.Recordset использовать соответствующую объектную переменную. Это сократит операторы и сделает коды процедур более прозрачными для восприятия.

10.2.3. Программное связывание элементов.

Подключение элемента Data к БД, а также связывание с ним элементов, отображающих данные, может быть осуществлено программно в режиме run, т.е. без установки свойств элементов в окне свойств в режиме design. Для этого нужно указать тип используемого объекта RecordSet. Дело в том, что система заранее не знает, с каким типом данных Вы собираетесь работать: таблицами или запросами.

Существует несколько типов объектов RecordSet. Тип Table используется для работы с таблицами. Тип DynaSet является набором, который динамически меняется при модификации связанной с ним таблицы и его целесообразно использовать при работе с запросами. Фактически он является подмножеством записей существующей таблицы. Тип Snapshot является набором, соответствующим состоянию БД в момент ее открытия. В этом случае последующие изменения данных в БД не сказываются на содержимом набора RecordSet.

Итак, при программном связывании элементов управления с элементом Data нужно указать, какой тип набора записей RecordSet желательно получить. Это зависит от значения свойства RecordsetType элемента Data. Если элемент Data подключается к таблице БД, то значение этого свойства следует устанавливать равным 0, что соответствует типу Table набора RecordSet: Data1.RecorsetType = 0. Если же элемент Data подключается к запросу, то нужно установить: Data1.RecordsetType = 1, что соответствует типу Dynaset набора RecordSet. В этом случае Вы получаете возможность в процессе выполнения приложения вводить с клавиатуры разные запросы к БД. При этом следует обновлять состояние набора, отображаемого элементом Data с помощью метода Refresh.

Пример 1. Программным способом отобразить в элементе MSFlexFrid содержимое таблицы БД.

Связываем элемент управления MSFlexGrid с элементом Data:

MSFlexGrid1.DataSource = Data1

Задаем тип набора записей:

Data1.RecordsetType = 0

Пример 2. Разместить на форме текстовое окно, ввести в него запрос на языке SQL и отобразить в элементе MSFlexGrid результат выполнения этого запроса.

MSFlexGrid1.DataSource = Data1

Text1.Text = InputBox(“Введите SQL - оператор запроса”)

Data1.RecordSource = Text1.Text

Data1.RecordsetType = 1

Data1.Refresh

Описанные свойства DatabaseName, RecordsetType и RecordSourсe элемента Data обеспечивают связь с БД, но не обеспечивают доступ к данным в ней. Это делает только автоматически создаваемый при загрузке формы в ОП объект RecordSet. Значит, к моменту загрузки формы перечисленные свойства элемента Data должны быть уже заданы. Задать их можно либо в окне свойств элемента Data, либо программно, причем, только в процедуре загрузки формы и нигде больше. Если Вы задали их в окне свойств, то приложение будет непереносимым на другой носитель. Действительно, когда свойство DatabaseName устанавливается в окне свойств, то в его строке прописывается путь к БД. При переносе проекта на другом носителе прежнего пути к БД может не существовать. Поэтому целесообразно свойства элемента Data задавать в процедуре загрузки формы, чтобы приложение выполнялось всегда без повторного задания значений свойств элемента Data. Например, так:

Private Sub Form_Load()

With Data1

.DatabaseName = CurDir$ & “\ db1.mdb”

.RecordsetType = Table

.RecordSource = “Таблица1”

End With

End Sub

Только нужно помнить, что при этом файл БД должен находиться в папке проекта.

Приведем пример обработки двухтабличной БД в рамках технологии DAO. Пусть требуется решить следующую задачу:

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

1. Код предприятия, названия предприятия, ФИО директора.

2. Код предприятия, количество рабочих в начале предыдущего

квартала, количество уволенных рабочих в течении квартала,

количество принятых рабочих в течении квартала.

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

3. Текучесть кадров на предприятии: код предприятия, название

предприятия, ФИО директора, текучесть кадров.

Итог: средняя текучесть кадров по всем предприятиям.

Рис. 10.2.1. Вид разработанной формы.

В разделе General формы объявляем переменные:

Private rs1 As Object, rs2 As Object

В процедуру загрузки формы записываем код:

Private Sub Form_Load()

Data1.DatabaseName = CurDir$ & "\db1.mdb"

Data1.RecordsetType = 0: Data1.RecordSource = "Таблица1"

Data2.DatabaseName = CurDir$ & "\db1.mdb"

Data2.RecordsetType = 0: Data2.RecordSource = "Таблица2"

End Sub

Процедура решения задачи

Private Sub mnuSolution_Click()

Dim i%, j%, kz%, krk%, srt!

' kz – количество записей в таблице;

‘ krk – количество рабочих в конце квартала;

‘ srt – средняя текучесть кадров

Set rs1 = Data1.Recordset: Set rs2 = Data2.Recordset

kz = rs2.RecordCount

fg.Rows = kz + 1: fg.Cols = 4

fg.FormatString = "^ Код предпр. |< Названия предпр. |< ФИО директора

|^ Текучесть кадров"

rs1.MoveFirst

i = 0: srt = 0

Do While Not rs1.EOF

i = i + 1

fg.TextMatrix(i, 0) = rs1.Fields(0)

fg.TextMatrix(i, 1) = rs1.Fields(1)

fg.TextMatrix(i, 2) = rs1.Fields(2)

rs2.MoveFirst

For j = 1 To kz

If rs1.Fields(0) = rs2.Fields(0) Then

krk = rs2.Fields(1) - rs2.Fields(2) + rs2.Fields(3)

srt = srt + krk: Exit For

End If

rs2.MoveNext

Next j

fg.TextMatrix(i, 3) = krk

rs1.MoveNext

Loop

srt = srt / kz

Text1.Text = Str(Round(srt, 2))

End Sub

Рис. 10.2.2. Вид формы с результатом решения задачи.

Чтобы исправить значение поля некоторой записи в таблице БД, нужно обратиться е методу Edit объекта RecordSet, затем ввести новое значение поля и передать это изменение в таблицу с помощью метода Update объекта RecordSet, непример:

rs.Edit: rs.Fields(5)=nf: rs.Update

Чтобы добавить в таблицу БД новую запись, нужно обратиться к методу AddNew объекта RecordSet, затем, как и при редектировании, ввести значения полей добавляемой записи и после этого обратиться к методу Update объекта RecordSet для внесения новой записи в таблицу БД.

Чтобы удалить запись из таблицы БД, нужно просто переместиться на эту запись и обратиться к методу Delete объекта RecordSet

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]