[an error occurred while processing this directive]

В начало

Введение

1-й час. Знакомство с Visual Basic for Applications

2-й час. Работа с макросами

3-й час. Работа с элементами управления

4-й час. Переменные и константы

5-й час. Ввод данных

6-й час. Логика условных операторов

7-й час. Циклические вычисления

8-й час. Введение в объекты

9-й час. Основные объекты Excel

10-й час. Объект Range

11-й час. Редактор Visual Basic

12-й час. Отладка программ

13-й час. Обработка ошибок

14-й час. Экранные формы

15-й час. Автоматизация экранных форм

16-й час. Панели инструментов

17-й час. Работа с меню

18-й час. Диаграммы

19-й час. Сводные таблицы

20-й час. Получение внешних данных

21-й час. Доступ к данным с помощью ADO

22-й час. Еще об ADO

23-й час. Автоматизация

24-й час. Выполнение процедур

Приложение. Ответы

22-й час. Еще об ADO

В этом часе мы углубим свои знания о технологии ADO. Основное внимание будет уделено объекту Recordset (Набор записей), его свойствам и методам. Используя эти свойства и методы, мы создадим экранную форму, отображающую данные из внешнего источника данных.

В этом часе будут рассмотрены следующие вопросы.

  • Извлечение полей из набора импортируемых данных и вставка их в экранную форму.
  • Средства перемещения по записям в экранной форме.
  • Редактирование извлеченного набора записей.

Вставка полей в экранную форму

Вместо непосредственной вставки импортируемых данных в рабочий лист их можно просмотреть с помощью экранной формы. Это предоставляет пользователю простой дружественный интерфейс для работы с данными.

Для создания экранной формы выполните следующие действия.

  1. В редакторе Visual Basic вставьте экранную форму в новую рабочую книгу.
  2. Используя рис. 22.1 как образец, добавьте в экранную форму элементыуправления.
  3. Установите следующие свойства элементов управления:
    Элемент управления Название Свойство Name Другие свойства
    Поле ввода Код товара txtProductID  
    Поле ввода Марка txtProductName  
    Поле ввода Цена txtUnitPrice  
    Поле ввода Есть на складе fetUnitsInStock  
    Командная кнопка ОК cmdOK Default=True
  4. Задайте для формы имя frmProductInfo и заголовок Информация о товаре.

Рис. 22.1. Экранная форма, которая будет отображать данные из базы данных Access Борей

Далее необходимо установить ссылку на библиотеку Microsoft ActiveX Data Objects 2.0. выполнив команду Tools > References (Сервис > Ссылки). Теперь пришло время создать первую процедуру. Эта процедура, UserForm_Activate, будет выполняться при открытии формы. Код процедуры приведен в листинге 22.1.

Листинг 22.1. Процедура UserForm_Activate

1: PrivateSubUserForm_Activate()

2:  cnnProduct.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data _

3:   Source=C:\Program Files\Microsoft _

     Office\Office\Samples\Борей.mdb"

4:

5:  rstProduct.Open _

6:   "Select КодТовара, Марка, Цена, НаСкладе from Товары", _

      cnnProduct, adOpenKeyset, adLockOptimistic, adCmdText

7:  txtProductID.Text - rstProduct.Fields(0).Value

8:  txtProductName.Text - rstProduct.Fields(1).Value

9:  txtUnitPrice.Text = rstProduct.Fields(2).Value

10:  txtUnitsInStock.Text - rstProduct.Fields(3}.Value

11:

12: End Sub

Процедура начинается с установления соединения с базой данных Борей. Далее применяется оператор Select (Выбор) для создания объекта Recordset, т.е. набора извлекаемых данных. Значения полей затем используются для задания значения свойству Text (Текст) полей ввода экранной формы. Отметим, что поля индексируются целыми числами, начиная с нуля.

В окне кода в область общих объявлений надо также поместить следующие две строки:

Dim cnnProduct As New ADODB.Connection

Dim rstProduct As New ADODB.Recordset

Двойным щелчком на командной кнопке OK откройте процедуру cmdOK_click и введите в нее код:

frmProductInfo.Hide

cnnProduct.Close

Выполните экранную форму. Вы должны увидеть в полях экранной формы значения первой записи из набора записей, извлекаемых из базы данных. Щелкните на кнопке ОК для закрытия формы. Теперь надо научиться переходить от одной записи к другой в наборе извлекаемых записей.

Перемещение по записям

Объект Recordset имеет пять методов, позволяющих перемещаться по набору записей: Move (Перейти), MoveFirst (Перейти к первой), MoveNext (Перейти к следующей), MovePrevious (Перейти к предыдущей) и MoveLast (Перейти к последней). Метод Move перемещает к записи с указанным номером, назначение остальных методов видно из их названий.

Рис. 22.2. В форму добавлены кнопки для перемещения по записям

Вставьте четыре командных кнопки в нижнюю часть экранной формы, как показано на рис. 22.2. Задайте этим кнопкам следующие свойства.

Заголовок Имя
Первая cmdFirst
Предыдущая cmdPrevious
Следующая cmdNext
Последняя cmdLast

Теперь этим кнопкам надо назначить соответствующие методы Move. Но прежде чем создавать процедуры для этих кнопок, надо написать процедуру, которая присваивала бы свойству Text полей ввода формы значения свойства Value полей записей данных. Эта процедура будет использоваться в процедурах кнопок перемещения. Код такой процедуры показан в листинге 22.2.

Листинг 22.2. Процедура Заполнение_полей

1: Sub Заполнение_полей()

2:  txtProductID.Text = rstProduct.Fields(0).Value

3:  txtProductName.Text = rstProduct.Fields(1).Value

4:  txtUnitPrice.Text = rstProduct.Fields(2).Value

5:  txtUnitsInStock.Text = rstProduct.Fields(3).Value

6: End Sub

Теперь введите код (листинг 22.3) для процедур перемещения по записям, которые будут вызываться после щелчка на соответствующих кнопках перемещения.

Листинг 22.3. Процедуры перемещения

PrivateSubcmdFirst_Click()

 rstProduct.MoveFirst

 Заполнение_полей

End Sub

Private Sub cmdLast_Click()

 rstProduct.MoveLast

 Заполнение_полей

End Sub

Private Sub cmdNext_Click()

 rstProduct.MoveNext

 If rstProduct.BOF Then

  rstProduct.MoveLast

 End If

 Заполнение_полей

End Sub

Private Sub cmdPrevious_Click()

 rstProduct.MovePrevious

 If rstProduct.EOF Then

  rstProduct.MoveFirst

 End If

 Заполнение_полей

End Sub

Испытайте новые кнопки для перемещения по набору записей. Вы увидите, что можно переходить от первой записи к последней и обратно, от текущей записи к предыдущей или следующей. Если вы еще раз посмотрите на процедуры перехода по записям, то заметите, что процедуры перехода к следующей и предыдущей записям имеют условные операторы, осуществляющие проверку значений свойств BOF (Начало файла) и EOF (Конец файла). Если эти свойства имеют значение True (Истина), т.е. достигнут коней набора записей или его начало, то во избежание ошибок выполнения применяются методы MoveLast и MoveFirst соответственно.

Редактирование данных

Посредством экранной формы можно не только просматривать данные и записывать их в рабочий лист, но и редактировать данные, а затем возвращать их обратно в базу данных. Для этого используется метод Update (Обновить). Вставьте в экранную форму еще одну командную кнопку, как показано на рис. 22.3. Задайте название этой кнопки как Правка, а имя - cmdUpdate. Введите код процедуры cmdUpdate_Click (листинг 22.4).

Рис. 22.3. Усовершенствование в форме, позволяющее редактировать данные

Листинг 22.4. Процедура cmdUpdate_Click

1: PrivateSubcmdUpdate_Click()

2:  rstProduct.Fields("Марка"].Value = txtProductName.Text

3:  rstProduct.Fields("Цена").Value = txtUnitPrice.Text

4:  rstProduct.Fields("НаСкладе").Value = txtUnitsInStock.Text

5: End Sub

Отмстим, что эта процедура не позволяет изменять поле КодТовара. Дело в том, что это поле является первичным ключом в исходной таблице товары и его нельзя изменить.

Протестируем эту процедуру. Выполните экранную форму и в произвольной записи в поле Цена введите число, отличное оттого, которое там находится. Щелкните на кнопке Правка, затем на кнопках Следующая и Предыдущая. Вы должны снова увидеть запись с измененным значением в поле Цена.

Добавление средства поиска

Последнее средство, которое мы добавим в экранную форму, - средство поиска записей по значениям поля КодТовара. Для организации такого средства используется метод Find (Найти) объекта Recordset. Этот метод всегда начинается от текущей записи. Поэтому сначала с помощью свойства Bookmark (Закладка) объекта Recordset сохраним местоположение текущей записи, а затем выполним метод MoveFirst для перехода к первой записи, откуда начнется поиск. Местоположение текущей записи необходимо на случай неудачного окончания поиска, тогда в форме восстанавливается эта запись.

Вставьте в экранную форму под кнопкой Правка еще одну командную кнопку. Назовите ее Поиск, а имя задайте cmdFind. Введите следующий код для этой кнопки.

Листинг 22.5. Процедура cmdFind_Click

1: Private Sub cmdFind_Click()

2:  Dim varBookmark

3:  varBookmark = rstProduct.Bookmark

4:  Dim strLookup As String, strFind As String

5:  strLookup = InputBox("Введите код товара", _

     "Поиск записи по коду товара")

6:  If strLookup= "" Then Exit Sub

7:  rstProduct.MoveFirst

8:  strFind = "[КодТовара] = '" & strLookup & "'"

9:  rstProduct.Find strFind, 0, adSearchForward, _

     rstProduct.Bookmark

10:  If rstProduct.EOF Then

11:   MsgBox "Товар не найден", vbInformation, "Поиск завершен"

12:   rstProduct.Bookmark = varBookmark

13:   Exit Sub

14:  End If

15:  Заполнение_полей

16:

17: End Sub

Выполните экранную форму. Щелкните на кнопке Поиск и в окне Поиск записи по коду товара введите число 17. Щелкните на кнопке ОК, и вы увидите запись, которую искали.

Резюме

В этом часе мы рассмотрели несколько методов, принадлежащих объекту Recordset. Информация, приведенная в этом часе, необходима всем, кто импортирует данные из внешних источников данных в рабочие книги Excel. Вы узнали, как осуществить перемещение, редактирование и поиск в наборе извлекаемых данных, как отобразить эти данные в экранной форме. Это необходимо любому разработчику для поддержки интеграции создаваемого приложения с внешними базами данных.

Вопросы и ответы

Вопрос. Можно ли использовать объекты Database (База данных) и Table (Таблица) вместо объекта Recordset?

Ответ. Если в окне просмотра объектов Object Browser вы просмотрите библиотеку ADODB, то не найдете в ней объектов Database и Table. В рамках технологии ADO все манипуляции с данными осуществляются посредством объекта Recordset.

Вопрос. Является ли технологии ADO наилучшим выбором для организации работы с внешними тайными?

Ответ. Это зависит от того, чего вы добиваетесь. Если вы хотите с минимальными затратами времени и программного кода создать процедуру, которая только импортирует данные из внешнего источника, то в этой ситуации предпочтительнее использовать MS Query или сводные таблицы. Если в ваши планы входит не просто импортирование данных, а работа с данными в самом источнике данных (поиск и редактирование данных с последующим сохранением в исходном наборе данных), то вам необходимо использовать ODBC и ADO. Выбор остается за вами, и помните, что из любой ситуации есть по крайней мере два выхода.

Практикум

С помощью тестов и упражнений вы проверите, насколько хорошо усвоили изложенный материал. Ответы на вопросы смотрите в Приложении.

Тесты

  1. Какой метод применяется для перемещения к последней записи в набореизвлекаемых записей?
  2. Как определить, где начало набора записей?
  3. Какой метод используется для сохранения изменений в наборе записей?
  4. Какое свойство объекта Recordset хранит информацию о местоположениитекущей записи?
  5. Какой метод используется для организации поиска данных в наборе записей?
  6. Какое свойства объекта Field используется для возврата значения поля?
  7. Истинно или ложно следующее утверждение: данные из извлекаемого наборазаписей можно вставить только в рабочий лист или в экранную форму?

Упражнение

Добавьте новый рабочий лист в книгу и назовите его Запрос Товары. В ячейки A1, B1, С1 и D1 введите заголовки будущей таблицы: Код товара, Марка, Цена, Есть на складе соответственно. Измените процедуру cmdOK_click так, чтобы при щелчке на кнопке ОК она переписывала информацию из экранной формы в рабочий лист Запрос Товары.

[an error occurred while processing this directive]