- •Основы программирования с использованием ado, доступ и работа с базами данных Access.
- •I. Два этапа подготовки работы с базами данных:
- •II. Практическая работа с базой данных:
- •Задания по работе с базой данных.
- •Доступ к данным из набора записей: Свойство Fields объекта Recordset.
- •Листинг 4. Извлечение данных из набора записей
- •Поиск записи.
- •Добавление новой записи
- •2. Извлечение записей
- •1. Извлечение значений из поля
1. Извлечение значений из поля
Для извлечения одного значения необходимо:
переместиться к нужной записи,
присвоить значение определенного поля ячейке рабочего листа.
Например:
ActiveSheet.[А1] = нз('Страна')
2. Извлечение записей
метод GetRows - возвращает записи в виде двумерного массива, где
первый индекс - это номер поля (номер первого поля равен 0)
второй индекс - это номер записи (номер первой записи равен 0).
Синтаксис:
Recordset.GetRows Rows, Start, Fields
Recordset - Объект типа Recordset
Rows - Количество строк, которые необходимо извлечь, начиная с текущей записи.
Чтобы извлечь все записи, начиная с текущей и до конца набора записей, используется константа adGetRowsRest
Start - Необязательный аргумент, который определяет закладку, начиная с которой
будут извлекаться записи
Fields - Необязательный аргумент, определяющий извлекаемые поля. Допускается
использование названия одного поля или массива названий
Листинг 10. Вставка извлеченных записей в рабочий лист Excel
Sub Извлечение_записей()
Dim нз As Recordset
Dim строка_критерия As String
Dim массив_записей As Variant
Dim obj1 As Object
Set obj1 = CreateObject("Excel.Application")
Dim obj2 As Object
Set obj2 = CreateObject("Excel.Sheet")
' Создание объекта Recordset
Set нз = CreateObject("ADODB.Recordset")
' Открытие объекта
With нз
.Source = "Клиенты"
.ActiveConnection = "db1"
.CursorType = adOpenKeyset
.Open
End With
obj1.workbooks.Add
obj1.activesheet.Name = "Записи из базы данных"
массив_записей = нз.GetRows(100)
For i = 0 To UBound(массив_записей, 2)
For j = 0 To UBound(массив_записей, 1)
obj1.cells(i + 1, j + 1) = массив_записей(j, i)
Next j
Next i
For k = 1 To нз.Fields.Count - 1
obj1.cells(1, k) = нз.Fields(k).Name
obj1.cells(1, k).Font.Bold = True
obj1.cells(1, k).EntireColumn.AutoFit
Next k
obj1.Visible = True
нз.Close '
Set нз = Nothing
MsgBox "Пауза.."
obj1.Quit
Set obj1 = Nothing
End Sub
Извлечение всего набора записей
можно вызвать метод GetRows (asGetRowsRest), начиная с первой записи, а затем, чтобы записать эти данные в рабочий лист, следует выполнить все действия, показанные в листинге 10
можно воспользоваться методом CopyFromRecordset объекта Range
метод CopyFromRecordset объекта Range, входящего в иерархию Excel
Range.CopyFromRecordset(Data, MaxRows, MaxColumns)
Range Объект типа Range, который определяет левый верхний угол диапазона,
в котором будут содержаться извлекаемые данные
Data Набор извлекаемых записей
MaxRowe Количество извлекаемых записей. Если опустить этот необязательный
аргумент, Excel скопирует все записи
MaxColumne Максимальное количество извлекаемых полей. Если пропустить этот необязательный аргумент, Excel скопирует все поля
Замечания, о которых следует помнить при работе с методом CopyFromRecordset:
Excel начинает копирование с текущей записи. Если необходимо извлечь все записи, убедитесь, что сначала был вызван метод MoveFirst, который перемещает указатель на первую запись.
После выполнения метода CopyFromRecordset свойство EOF объекта Recordset станет равным True.
Данный метод вернет ошибку, если объект Recordset имеет поля, которые хранят двоичные данные (т.е. поля, содержащие объекты OLE).
Листинг 11. Извлечение всего набора записей
Sub Извлечение_типов_товаров()
Dim нз As Recordset
Dim поле As Field
Dim строка_SELECT As String
Dim obj1 As Object
Set obj1 = CreateObject("Excel.Application")
' Создание объекта Recordset
Set нз = CreateObject("ADODB.Recordset")
' Открытие объекта
With нз
.Source = "Типы"
.ActiveConnection = "db1"
.CursorType = adOpenKeyset
.Open
End With
' Переменная строка_SELECT будет содержать
' оператор SELECT, с помощью которого будут
' удалены двоичные поля из набора записей
строка_SELECT = "SELECT "
' Просмотр полей набора записей
For Each поле In нз.Fields
' Проверка на двоичное поле
If поле.Type <> adBinary And _
поле.Type <> adLongVarBinary Then
' Если поле не содержит объектов OLE,
' то добавляем его в оператор SELECT
строка_SELECT = строка_SELECT & поле.Name & ","
End If
Next поле
' Удаление последней запятой
строка_SELECT = Left(строка_SELECT, Len(строка_SELECT) - 1)
' Добавление элемента FROM
строка_SELECT = строка_SELECT & " FROM Типы"
' Открытие набора записей без двоичных полей
With нз
.Close
.Source = строка_SELECT
.ActiveConnection = "db1"
.CursorType = adOpenKeyset
.Open
End With
' Активизация рабочего листа "Записи из базы данных"
obj1.workbooks.Add
obj1.activesheet.Name = "Записи из базы данных"
массив_записей = нз.GetRows(100)
' Извлечение всего набора записей
For i = 0 To UBound(массив_записей, 2)
For j = 0 To UBound(массив_записей, 1)
obj1.cells(i + 1, j + 1) = массив_записей(j, i)
Next j
Next i
'Ввод и форматирование названий полей
For u = 0 To нз.Fields.Count - 1
obj1.cells(u + 1) = нз.Fields(u).Name
'obj1(i + 1).font.bold = true .offset(0, i)
obj1.cells(u + 1).Font.Bold = True
obj1.cells(u + 1).EntireColumn.AutoFit
Next u
obj1.Visible = True
' Закрытие объектов и освобождение памяти
нз.Close
Set нз = Nothing
Set поле = Nothing
MsgBox "Пауза.."
obj1.Quit
Set obj1 = Nothing
End Sub
Пояснения к процедуре:
В этой процедуре таблица Типы открывается как объект типа Recordset. Следует убедиться, что поля, содержащие объекты OLE, не будут копироваться. Поэтому в процедуре программно создается оператор SELECT, который будет содержать все поля, кроме тех, которые хранят двоичные данные (объекты OLE). Этот оператор содержится в переменной строка_SELECT, которая начинается с «SELECT». После этого в цикле For.. .Next просматриваются все поля объекта нз, и проверяется, содержат ли они объекты OLE (т.е. равно ли свойство Туре константам adBinary или adLongVarBinary). Если поле не содержит объекты OLE, то его название (после которого следует запятая) добавляется в строку оператора SELECT.
Затем удаляется последняя запятая, и к строке добавляется элемент FROM оператора SELECT. На основе переменной строка_SELECT открывается новый набор данных, и вызывается метод CopyFromRecordset для извлечения записей в рабочий лист Excel.
