Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория и практические задания по ППО 2 семестр.doc
Скачиваний:
4
Добавлен:
05.05.2019
Размер:
141 Кб
Скачать
☆

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.