ПРОГРАММИРОВАНИЕ

Уроки программирования баз данных в Visual Basic


Урок 1 Введение в базы данных

Что такое база данных

Можно с большой степенью достоверности утверждать, что большинство приложений, которые предназначены для выполнения хотя бы какой-нибудь полезной работы, тем или иным образом используют структурированную информацию или, другими словами, упорядоченные данные. Такими данными могут быть, например, списки заказов на тот или иной товар, списки предъявленных и оплаченных счетов или список телефонных номеров ваших знакомых. Обычное расписание движения автобусов в вашем городе — это тоже пример упорядоченных данных.

При компьютерной обработке информации упорядоченные каким либо образом данные принято хранить в базах данных — особых файлах, использование которых вместе со специальными программными средствами позволяет пользователю как просматривать необходимую информацию, так и, по мере необходимости, манипулировать ею, например, добавлять, изменять, копировать, удалять, сортировать и т. д.

Таким образом, дать простое определение базы данных можно следующим образом. База данных — это набор информации, организованной тем, или иным способом. Пожалуй, одним из самых банальных примеров баз данных может быть записная книжка с телефонами ваших знакомых. Наверное, у вас есть сейчас или когда-либо была эта полезная вещь. Этот список фамилий владельцев телефонов и их телефонных номеров, представленный в вашей записной книжке в алфавитном порядке, представляет собой, вообще говоря, проиндексированную базу данных. Использование индекса — в данном случае фамилии (или имени) позволяет вам достаточно быстро отыскать требуемый номер телефона.


Структура базы данных

Телефонный справочник представляет собой так называемую “плоскую” базу данных, в которой вся информация располагается в единственной таблице. Каждая запись в этой таблице содержит идентификатор конкретного человека — имя и фамилию и его номер телефона. Таким образом таблица состоит из записей, информация в которых разделена на несколько частей — полей. В данном случае полями являются “ФИО” и “Номер телефона”, как показано на рис. 1.1.



Рис. 1.1. Таблица, запись и поле.


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

Здесь следует отметить, что использование реляционной модели баз данных не является единственно возможным способом представления информации. В настоящее время существует несколько различных моделей представления данных, которые, однако, пока не получили такого широкого распространения среди разработчиков и пользователей, как реляционная модель. То есть при разработке систем управления базами данных реляционная модель практически является стандартом.

В качестве примера реляционной базы данных можно привести поставляемую вместе с Visual Basic базу данных BIBLIO.MDB, содержащую библиографическую информацию о книгах по программированию, их авторах и издательствах, эти книги опубликовавших.

Так как Visual Basic использует ту же систему управления базами данных (MS Jet Engine), что и MS Access, то несмотря на наличие в Visual Basic средств работы со многими форматами БД, все таки в приложениях предпочтительно использовать файлы баз данных в формате MS Access. Эти файлы имеют расширение MDB и здесь в основном будут описаны приемы работы с файлами именно такого формата.

Перейдем теперь к исследованию базы данных с библиографией. Для этого откройте файл BIBLIO.MDB при помощи MS Access или VisData.

Содержимое файла базы данных BIBLIO.MDB показано на рис. 1.2. В базу данных входят таблицы (Tables), запросы (Queries), формы (Forms), отчеты (Reports), макросы (Macros) и модули (Modules). Макросы, формы и модули нам не интересны, так как это вотчина разработчиков, применяющих Visual Basic for Applications или, сокращенно, VBA.



Рис. 1.2. Содержимое файла BIBLIO.MDB


Из рисунка видно, что база данных состоит из таблиц: PUBLISHERS, AUTHORS и TITLES. Каждая из таблиц содержит информацию об объектах одного типа. Из названий таблиц становиться понятно, что данные в каждой таблице принадлежат одной и той же группе объектов. Каждая строка в этих таблицах однозначно определяет один объект из соответствующей группы. Вообще, база данных может состоять из одной или нескольких таблиц. Запись, в свою очередь, состоит из нескольких полей, каждое из которых содержит элемент данных об объекте.

Типы данных, которые можно поместить в таблицу, зависят от формата файла базы данных. В таблице 1.1 приведены некоторые типы данных, которые поддерживаются системой управления базами данных Visual Basic для файлов MS Access.

Таблица 1.1

Название ∙ Описание

Text ∙ Строки алфавитно-цифровых символов. Например, адрес, номер телефона, почтовый индекс и т. п. Текстовое поле может содержать от 0 до 255 символов.

Memo ∙ Длинные строки. Например, комментарии. Максимальный размер ограничен 1.2 Гбайт.

Yes/No ∙ Yes/No, True/False, On/Off, 0 или 1.

Byte ∙ Целые числа в диапазоне от 0 до 255.

Integer ∙ Целые числа в диапазоне от -32768 до +32767.

Long ∙ Целые числа в диапазоне от -2147483648 до 2147483647.

Single ∙ Вещественные числа в диапазоне от -3,4∙1038 до 3,4∙1038.

Double ∙ Вещественные числа в диапазоне от -1.8∙10308 до 1.8∙10308.

Date/Time ∙ Дата и время.

Currency ∙ Используется для обозначения денежных сумм. Запоминаются 11 знаков слева от десятичной точки и 4 знака справа от десятичной точки.

Counter ∙ Длинные целые с автоматическим приращением.

OLE ∙ OLE-объекты, созданные в других программах с использованием протокола OLE. Размер ограничен 1.2 Гбайт.

Binary ∙ Любой двоичный объект размером до 1.2 Гбайт. Этот тип обычно используется для хранения рисунков и двоичных файлов.


Таблица PUBLISHERS (Издатели) содержит информацию об издательствах (имя компании, ее адрес, телефон, факс и др.). На рис. 1.3 и 1.4 показаны структура таблицы PUBLISHERS и ее содержимое в табличном виде.



Рис. 1.3. Структура таблицы PUBLISHERS



Рис. 1.4. Содержимое таблицы PUBLISHERS


Таблица AUTHORS (Авторы) содержит информацию о авторах — ФИО и год рождения. Структура этой таблицы и ее содержимое показаны на рис. 1.5 и 1.6 соответственно.



Рис. 1.5. Структура таблицы AUTHORS



Рис. 1.6. Содержимое таблицы AUTHORS


Таблица TITLES (Заголовки) содержит данные о самих книгах — название книги, год издания, код ISBN, издатель, краткое описание и др. Структура таблицы TITLES и ее содержимое показаны на рис. 1.7 и 1.8 соответственно.



Рис. 1.7. Структура таблицы TITLES



Рис. 1.8. Содержимое таблицы TITLES


Из рис. 1.2 видно, что в базе данных BIBLIO.MDB присутствует еще и таблица TITLE AUTHOR. На первый взгляд непонятно зачем она нужна. Ведь в базе данных есть таблица TITLES с заголовками книг и таблица AUTHORS с данными об авторах. Однако все же эта таблица нужна и для чего она так необходима станет понятно, когда в дальнейшем будем рассматривать отношения между таблицами.


Отношения между таблицами

Отношения между таблицами устанавливают связь между данными находящимися в разных таблицах базы данных.

Отношения между таблицами определяются отношением между группами объектов соответствующего типа. Например, один автор может написать несколько книг и издать их в разных издательствах. Или издательство может опубликовать несколько книг разных авторов. Таким образом, между авторами и названиями книг существует отношение один-ко-многим, а между издательствами и авторами существует отношение много-ко-многим.

Отношения между таблицами базы данных BIBLIO.MDB показаны на рис. 1.9.



Рис. 1.9. Отношения между таблицами базы данных BIBLIO.MDB.


Отношение один-к-одному

Если между двумя таблицами существует отношение один-к-одному, то это означает, что каждая запись в одной таблице соответствует только одной записи в другой таблице.

Примером такого отношения может служить отношение между таблицами. Таблица AUTHORS (Авторы) рассмотрена выше (рис. 1.5 и 1.6) и содержит краткую информацию о авторах (ФИО и год рождения). Таблица PERSON (Личность) содержит персональную информацию о авторах (домашний адрес, телефон, образование и др.) Структура таблицы PERSON показана на рис. 1.10. Следует отметить, что в базе данных BIBLIO.MDB никакой таблицы PERSON нет и мы упоминаем о ней только как о иллюстрации отношения между таблицами — один-к-одному.



Рис. 1.10. Структура таблицы PERSON


Между таблицами AUTHORS и PERSON существует отношение один-к-одному, так как одна запись, идентифицирующая автора, однозначно соответствует только одной записи в таблице PERSON, содержащей персональные данные об авторе.

Связь между таблицами определяется с помощью совпадающих полей: AuID в таблице AUTHORS и в таблице PERSON.


Отношение один-ко-многим

Хорошим примером отношения между таблицами один-ко-многим является отношение между авторами и названиями книг (таблицы AUTHORS и TITLES), так как каждый автор может иметь отношение к созданию нескольких книг. Связь между таблицами AUTHORS и TITLES осуществляется с помощью совпадающих полей Au ID в обеих таблицах.

Аналогичное отношение существует между издательствами и названиями изданных книг, организацией и работающими в ней сотрудниками, автомобилем и деталями, из которых он состоит и т. п. Понятно, что подобный тип отношения между таблицами наиболее часто встречается при проектировании структуры баз данных.


Отношение много-к-одному

Отношение много-к-одному полностью аналогично рассмотренному выше отношению один-ко-многим.


Отношение много-ко-многим

При отношении между двумя таблицами много-ко-многим каждая запись в одной таблице связана с несколькими записями в другой таблице и наоборот. Иллюстрацией такого отношения может служить отношение между таблицами PUBLISHERS и AUTHORS. С одной стороны, каждое издательство может публиковать книги разных авторов и с другой стороны — каждый автор может публиковаться в разных издательствах.

Для удобства работы с таблицами, имеющими отношение много-ко-многим, обычно в базу данных добавляют еще одну таблицу, которая находится в отношении один-ко-многим и много-к-одному к соответствующим таблицам. В случае базы данных BIBLIO.MDB такой таблицей является TITLE AUTHOR.


Нормализация баз данных

Рассмотрим процесс нормализации базы данных на примере базы данных BIBLIO.MDB. Вообще говоря, все данные о книгах, авторах и издательствах можно разместить в одной таблице, названной, например, BIBLIOS. Структура этой таблицы показана на рис. 1.11.



Рис. 1.11. Структура таблицы BIBLIOS.


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

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

Ввод пользователем большого количества повторяющейся информации неизбежно приведет к возникновению ошибок.

Изменение, например, номера телефона издательства потребует значительных усилий по корректировке каждой записи, содержащей данные об издателе.

Если, при проектировании приложения для работы с базами данных, вы организуете свои данные таким нерациональным образом, то в дальнейшем вам, скорее всего, больше не поручат решение аналогичных задач.

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

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

Для того, чтобы построить достаточно эффективную структуру данных, достаточно придерживаться нескольких простых правил:

1. Определите таблицы таким образом, чтобы записи в каждой таблице описывали объекты одного и того же типа. В нашем случае библиографические данные можно разместить в трех таблицах:

PUBLISHERS — содержит информацию об издательствах;

AUTHORS — содержит информацию об авторах книг;

TITLES — содержит информацию об изданных книгах.

2. Если в вашей таблице появляются поля, содержащие аналогичные данные, разделите таблицу.

3. Не запоминайте в таблице данных, которые могут быть вычислены при помощи данных из других таблиц.

4. Используйте вспомогательные таблицы. Например, если в вашей таблице есть поле Страна, то может быть стоит ввести вспомогательную таблицу Country, которая будет содержать соответствующие записи (Россия, Украина, США и т. п.). Этот прием также поможет уменьшить количество ошибок при вводе данных, допускаемых пользователями.


Ключи и индексы

Как было отмечено выше при описании отношений между таблицами, в реляционных базах данных таблицы связываются друг с другом посредством совпадающих значений ключевых полей. Ключевым полем может быть практически любое поле в таблице. Ключ может быть первичным (primary) или внешним (foreign).

Первичный ключ однозначно определяет запись в таблице. В примере с базой данных BIBLIO.MDB таблицы PUBLISHERS, AUTHORS и TITLES имеют первичные ключи PubID, Au ID и ISBN соответственно. Таблица TITLES также имеет два внешних ключа PubID и Au ID для связи с таблицами PUBLISHERS и AUTHORS. Таким образом, первичный ключ однозначно определяет запись в таблице, в то время как внешний ключ используется для связи с первичным ключом другой таблицы.

Ключевой поле может иметь определенный смысл, как например ключ ISBN в таблице TITLES. Однако, очень часто ключевое поле не несет никакой смысловой нагрузки и является просто идентификатором объекта в таблице. Во многих случаях удобно использовать в качестве ключа поле счетчика (Counter field). При этом вся ответственность по поддержанию уникальности ключевого поля снимается с пользователя и перекладывается на процессор баз данных. Поле счетчика представляет собой четырехбайтовое целое число (Long) и автоматически увеличивается на единицу при добавлении пользователем новой записи в таблицу.

Данные запоминаются в таблице в том порядке, в котором они вводятся пользователем. Это, так называемый, физический порядок следования записей. Однако, часто требуется представить данные в другом, отличном от физического, порядке. Например может потребоваться просмотреть данные об авторах книг, упорядоченные по алфавиту. Кроме того, часто необходимо найти в большом объеме информации запись, удовлетворяющую определенному критерию. Простой перебор записей при поиске в большой таблице может потребовать достаточно много времени и поэтому будет неэффективным.

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

Индекс представляет собой таблицу, которая содержит ключевые значения для каждой записи в таблице данных и записанные в порядке, требуемом для пользователя. Ключевые значения определяются на основе одного или нескольких полей таблицы. Кроме того, индекс содержит уникальные ссылки на соответствующие записи в таблице. На рис. 1.12 показан фрагмент таблицы CUSTOMERS, содержащей информацию о покупателях, и индекс IDXNAME, построенный на основе поля Name таблицы CUSTOMERS. Индекс IDX NAME содержит значения ключевого поля Name, упорядоченные в алфавитном порядке, и ссылки на соответствующие записи в таблице CUSTOMERS.



Рис. 1.12. Связь между таблицей и индексом.


Каждая таблица может иметь несколько различных индексов, каждый из которых определяет свой собственный порядок следования записей. Например, таблица AUTHORS может иметь индексы для представления данных об авторах, упорядоченные по дате рождения или по алфавиту. Таким образом, каждый индекс используется для представления одних и тех же данных, но упорядоченных различным образом.

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

При разработке приложений, работающих с базами данных, наиболее широко используются простые индексы. Простые индексы используют значения одного поля таблицы. Примером простого индекса в базе данных BIBLIO.MDB может служить код ISBN, идентификатор автора Au ID или идентификатор издательства PubID.

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

Урок 2 Приложение VisData

Чтобы создать приложение для обработки информации из базы данных необходимо для начала иметь собственно базу данных. Базу данных в формате MS Access можно создать несколькими способами, например:

С помощью системы управления базами данных MS Access;

С использованием объектов доступа к данным Visual Basic;

С использованием приложения VisData, входящего в комплект поставки Visual Basic.

О том, как создать базу данных с помощью системы управления базами данных MS Access, можно узнать из любого соответствующего руководства. Так как эти уроки посвящены работе с Visual Basic, то все наше внимание будет уделено последним двум способам. Создание базы данных с помощью объектов доступа к данным, или другими словами, программным способом, будет описано ниже, в соответствующих уроках (про DAO).

В поставку Visual Basic входит приложение для управления базами данных VisData. Это приложение позволяет создавать и модифицировать базы данных как в формате MS Access, так и в других популярных форматах. Запустить его можно из меню Add-Ins интегрированной среды разработки Visual Basic. Кроме того, исходные тексты этого очень полезного приложения поставляются в комплекте с Visual Basic в качестве одного из примеров. Для тех, кто хочет детально разобраться во всех тонкостях работы с базами данных с помощью Visual Basic, исходные тексты приложения VisData являются просто находкой. Пожалуй, не существует таких приемов работы, которые не были бы продемонстрированы в этом приложении.

С помощью VisData создадим базу данных FRIENDS.MDB, в которой можно хранить персональные данные о ваших знакомых. Эта база данных может в дальнейшем служить основой для создания электронной записной книжки. Предположив заранее, что многие из ваших друзей и/или подруг могут работать или учиться в одном и том же месте, во избежание повторов разобьем данные на две группы — собственно персональную информацию о человеке (имя, фамилия, домашний телефон, домашний адрес, день рождения и т. д.) и информацию о месте работы/учебы (название, адрес, рабочий телефон, электронная почта). Таким образом FRIENDS.MDB будет включать в себя таблицу PERSON, содержащую следующие поля:

Name — имя,

LastName — фамилия,

Adress — домашний адрес,

HomePhone — домашний телефон,

Idwork — идентификатор места работы/учебы,

HomeWWW — адрес домашней страницы в сети Интернет,

Email — адрес электронной почты,

Note — примечание и таблицу COMPANY, содержащую поля:

Id work — уникальный идентификатор места работы/учебы,

Office — название места работы/учебы,

Adress — адрес места работы/учебы,

WorkPhone1 — рабочий телефон 1,

WorkPhone2 — рабочий телефон 2,

Email — адрес электронной почты,

Note — примечание.


Создание базы данных

Запустите приложение VisData и выполните команду меню File->New->Microsoft Access->Version 7.0 MDB (см. рис. 2.1). В появившемся диалоговом окне введите имя файла FRIENDS.MDB и, если необходимо, измените путь к файлу. После этого, сохраните файл базы данных нажатием командной кнопки Save (рис. 2.2). Дальше, в окне DataBase Window (Окно базы данных) вы можете посмотреть свойства созданной базы данных (рис. 2.3).



Рис. 2.1. Создание файла



Рис. 2.2. Диалоговое окно создания файла



Рис. 2.3. Свойства базы данных FRIENDS.MDB


После создания файла можно приступить к проектированию структуры базы данных. В окне DataBase Window нажмите правую кнопку мыши и в появившемся всплывающем меню выполните команду New Table (Новая таблица), чтобы добавить в базу таблицу PERSON. На рис. 2.4 показано окно структуры таблицы (Table Structure). Введите в поле имени таблицы (Table Name) слово Person и можете приступать к добавлению полей в таблицу. Для этого нажмите командную кнопку Add Field (Добавить поле). В окне добавления поля введите имя первого поля — Name и установите другие необходимые атрибуты. Результат показан на рис. 2.5. Затем нажмите кнопку ОК для подтверждения проделанных действий и подобным образом добавьте в таблицу PERSON оставшиеся поля.



Рис. 2.4. Окно структуры таблицы



Рис. 2.5. Добавление поля в таблицу


Когда все поля и атрибуты установлены не забудьте нажать кнопку Build the Table (Построить таблицу) в нижней части окна Table Structure. До этого момента вся вводимая вами информация сохранялась в памяти компьютера и если вы по ошибке вместо кнопки Build the Table нажмете кнопку Close (Закрыть) все данные будут потеряны.

После этого совершенно аналогично создайте таблицу WORKPLACE и добавьте в нее необходимые поля.


Редактирование структуры таблицы

После того, как в базу данных добавлены таблицы и для них определены поля и установлены необходимые свойства, вы возвращаетесь в окно DataBase Window. Теперь вы можете редактировать структуру таблиц. Для этого выделите необходимую таблицу в списке и нажмите правую кнопку мыши или просто кликните на ней правой кнопкой мыши. Выполнив команду Design (Проектировать) в появившемся меню, вы откроете окно Table Structure, в котором можно редактировать таблицу. Кроме того, в этом меню (см. рис. 2.6) доступны команды Rename (Переименовать таблицу) и Delete (Удалить таблицу).

Если необходимо удалить поле из таблицы, в окне Table Structure выделите в списке полей (Fields List) требуемое поле и нажмите кнопку Remove Field (Удалить поле).

Следует отметить, что приложение VisData позволяет редактировать структуру таблицы даже в том случае, когда в эту таблицу уже введены какие-либо данные.



Рис. 2.6. Меню для работы с таблицей


Работа с индексами

Если в таблицу требуется добавить индекс, нажмите кнопку Add Index (Добавить индекс) в окне Table Structure. Появится диалоговое окно Add Index, в котором следует ввести имя индекса в окне редактирования Name и выбрать поля на основе которых будет построен индекс из списка доступных полей таблицы (Available Filds). Диалоговое окно добавления индекса показано на рис. 2.7. На рис. 2.8 показан результат добавления индекса по двум полям таблицы — Name и LastName.



Рис. 2.7. Диалоговое окно добавления индекса в таблицу PERSON



Рис. 2.8. Результат добавления индекса построенного по двум полям Name и LastName.


Аналогичным образом можно добавить в таблицу и другие индексы. Чтобы удалить индекс, выделите его в списке индексов (Index List) и нажмите кнопку Remove Index (Удалить индекс). После подтверждения намерений индекс будет удален.


Другие возможности приложения VisData

Помимо создания баз данных MS Access, разработки и модифицирования их структуры, приложение VisData позволяет решить еще целый ряд задач:

— Создание или открытие файлов баз данных во многих популярных форматах, включая dBase, FoxPro, Paradox, Excel, ODBC и текстовых файлов

— Ввод информации в базу данных и ее редактирование

— Копирование таблиц из одной базы данных в другую Восстановление поврежденных файлов баз данных формата MS Access

— Сжатие баз данных формата MS Access и их конвертация в разные версии Microsoft Jet Engine

— Выполнение глобальных замен данных в таблицах, в том числе и с использованием различных критериев

— Присоединение внешних файлов баз данных к базе данных MS Access Разработка и выполнение SQL-запросов различной степени сложности

Урок 3 Введение в объект управления данными — Data Control

Само название этого объекта говорит о том, что предназначен он для работы с данными. С помощью Data Control можно быстро создавать простые приложения для работы с базами данных практически без написания программного кода. А используя этот элемент управления вместе с объектами доступа к данным (Data Access Objects или DAO) можно создавать достаточно мощные по своим функциональным возможностям программные комплексы, предназначенные для обработки информации из баз данных.

Объект управления данными — это компонент Visual Basic, который позволяет получить доступ и манипулировать данными, хранящимися в файлах баз данных различных форматов. Как уже отмечалось выше, используя объект Data, вы можете достаточно быстро создавать работоспособные Windows-приложения практически без написания кода программы. Перечислим основные действия, которые объект управления данными позволяет выполнять без вмешательства программиста (точнее, почти без вмешательства):


Подключение (connect) к базе данных.

— Открытие таблицы базы данных или определение при помощи соответствующего SQL-запроса критерия выбора записей из полей базы данных.

— Передача данных из полей базы данных к связанным элементам управления, расположенным на форме (например, поле редактирования), где данные можно просматривать или изменять.

— Добавление новых записей, удаление записей и обновление содержимого базы данных (здесь, правда, без написания нескольких строк кода не обойтись).

— Закрытие базы данных.

Применение объекта Data дает возможность разработчику использовать в своих приложениях базы данных в наиболее распространенных в настоящее время форматах, таких как Microsoft Access, dBASE, FoxPro, Paradox, Btrieve, а также файлы электронных таблиц Microsoft Excel и Lotus 1-2-3. Кроме того, можно использовать в качестве источника данных обычные текстовые файлы (с расширением txt) или базы данных, доступные через интерфейс Open Database Connectivity (ODBC).

Объект управления данными обозначен на панели инструментов интегрированной среды разработки Visual Basic 5 пиктограммой, показанной на рис. 3.1.



Рис. 3.1. Пиктограмма объекта Data на панели инструментов Visual Basic 5.


Внешний вид объекта Data на вашей экранной форме показан на рис. 3.2. При его выделении, в углах и на серединах сторон появляются маркеры, с помощью которых можно изменять линейные размеры этого элемента управления по вашему вкусу. Объект Data содержит заголовок и четыре кнопки, предназначенные для перемещения по записям базы данных, а точнее, по созданному им набору записей (что такое набор записей вы узнаете несколько позднее). В качестве заголовка лучше использовать текст, каким-либо образом характеризующий данные, с которыми вы предполагаете работать. Заголовок определяется свойством Caption объекта Data.



Рис. 3.2. Вид объекта Data на экранной форме.


Чтобы использовать объект управления данными в приложении, необходимо выполнить, по крайней мере, четыре действия:

1. Выбрать объект Data на панели инструментов, перенести его на экранную форму и установить требуемые размеры.

2. Определить имя файла базы данных, с которым вы собираетесь работать, установкой свойства DatabaseName объекта Data.

3. Определить источник данных установкой свойства RecordSource объекта Data.

4. Определить тип набора записей установкой свойства RecordsetType объекта Data (этот пункт не обязателен, так как по умолчанию будет создан набор записей динамического типа).

Если приложение должно работать с несколькими источниками данных, то можно одновременно разместить на экранной форме и использовать целый ряд объектов Data.


Как установить свойства объекта Data

Установить имя базы данных во время разработки (design time) приложения можно в окне свойств (Properties) объекта управления данными. При выборе свойства DatabaseName в правом столбце окна свойств появится кнопка с многоточием. При нажатии на нее откроется диалоговое окно просмотра файлов DatabaseName, при помощи которого необходимо выбрать требуемую для работы базу данных. Кроме того, если вы хорошо знаете полный путь к файлу, то можете просто ввести имя файла в окне свойств, используя клавиатуру компьютера. Здесь следует особо подчеркнуть, что имя должно включать в себя полный путь к файлу базы данных.



Рис. 3.3. Диалоговое окно просмотра файлов баз данных.



Рис. 3.4. Вы можете просто ввести имя файла.


После определения имени файла базы данных, в том же окне свойств надо определить источник данных.

Свойство RecordSource объекта Data определяет, из какой таблицы базы данных требуется использовать данные. Имя таблицы можно ввести с использованием клавиатуры компьютера, или выбрать из списка таблиц, которая появится после нажатия кнопки со стрелкой в правом столбце окна свойств.

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



Рис. 3.5. Установка свойства RecordSource.


Что такое набор записей

Теперь пришло время определить понятие набора записей (Recordset). Объект управления данными не работает напрямую с базой данных, а создает в памяти компьютера именованную область, которая используется как буфер между файлом базы данных и объектом Data. В этой области памяти и содержится информация из базы данных. Данные для объекта Recordset определяются свойствами RecordSource и RecordsetType объекта Data.

Таким образом, набор записей представляет собой некоторое подмножество записей из одной или нескольких таблиц базы данных (или из нескольких баз данных). При этом, он может содержать как полную копию таблицы, так и ее часть. Если источник данных определен с помощью языка SQL, то набор записей будет содержать строки из базы данных, удовлетворяющие соответствующему SQL-запросу.

Объект Recordset (как и любой другой объект в Visual Basic) имеет вполне конкретные свойства и методы, которые подробно будут рассмотрены позднее в уроках, посвященных объектам доступа к данным (DAO).

В пятой версии Visual Basic поддерживаются пять типов наборов записей. Но наиболее широко используются только три типа: набор записей динамического типа или динамический набор записей, набор записей типа таблица и статический набор записей. Их краткое описание приведено в таблице 3.1.


Таблица 3.1.

Тип набора записей ∙ Описание

Table ∙ Набор записей, представляющий собой всю таблицу базы данных. Используя такой набор записей, можно добавлять, изменять или удалять записи, причем доступ возможен только к одной таблице.

Dynaset ∙ Динамический набор записей представляет собой таблицу базы данных или результат запроса, содержащего поля одной или нескольких таблиц. Можно добавлять, изменять или удалять записи и изменения будут отражаться в соответствующей базе данных.

Snapshot ∙ Статическая копия таблицы, которую можно использовать, например, для поиска данных или для составления отчетов.


По умолчанию объект управления данными создает набор записей динамического типа.

Использование набора записей типа таблица по своему действию аналогично прямому открытию таблицы. При этом в память компьютера загружается только содержимое текущей записи. Из этого и вытекают преимущества и недостатки табличного набора записей. Используя его, вы можете работать только с одной таблицей, причем таблица открывается вся целиком, что может потребовать значительных ресурсов памяти… Основным преимуществом такого набора записей является возможность использования индексов для упорядочения и поиска данных в таблице.

Из всех трех доступных типов наборов записей наиболее гибким в использовании является динамический набор записей (не зря же именно он создается объектом Data по умолчанию). Фактически, набор записей динамического типа представляет собой ряд ссылок на информацию в базе данных, поскольку использует ключевые поля, однозначно определяющие каждую строку в базе данных. Использование ключей увеличивает скорость загрузки данных и уменьшает нагрузку на сеть при работе приложений многопользовательской среде. Содержимое Мето-полей и полей, содержащих OLE-объекты не загружается до тех пор, пока не возникнет необходимость их использования, например, вывода их на экран. Все это позволяет использовать динамические наборы записей при работе с большими таблицами и таблицами, содержащими OLE-объекты и Меню-поля. Самым существенным недостатком набора записей динамического типа можно считать невозможность использования индексов. При каждом изменении способа упорядочения записей динамический набор должен пересоздаваться заново.

При использовании статического набора записей, в отличие от табличного и динамического наборов, вся информация из базы данных (определенная свойством RecordSource объекта Data) заносится в память компьютера. Статический набор может содержать данные из одной или нескольких таблиц базы данных, при этом обновление данных невозможно. Поэтому, он может использоваться в случаях, не требующих обновления данных в исходной таблице, например, для поиска определенной записи или для составления отчетов. Так как содержимое записей статического набора находится в памяти, то все операции с ним выполняются гораздо быстрее, чем при использовании динамического или табличного наборов записей. При этом платой за высокую скорость является потребность в значительных ресурсах памяти.

Объекты — наборы записей, создаваемые программно, могут быть связаны со свойством Recordset объекта управления данными при помощи оператора Set:

Set Data1.Recordset=NewRecordset.

Таким же образом набор записей, созданный одним объектом управления данными может быть связан с другим объектом управления данными во время выполнения (run time) приложения:

Set Data1.Recordset=NewRecordset

Set Data2.Recordset=Data1.Recordset.


Текущая запись

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

Когда вы программируете какие-либо операции с данными из набора записей, вы всегда должны быть уверены, что текущая запись является допустимой (valid). Это условие является необходимым, так как, например, удаленная запись является недопустимой (invalid) и любая попытка доступа к ней записи вызовет ошибку. Такие свойства объекта Data, как BOFAction и EOFAction, предоставляют некоторый контроль над состоянием текущей записи, но вы также можете создать программный код для проверки свойств BOF (начало файла) и EOF (конец файла) объекта Recordset. Установка этих двух свойств и определяет состояние текущей записи. В таблице 3.2 представлены возможные состояния свойств BOF/EOF объекта Recordset.


Таблица 3.2.

Свойство BOF/EOF объекта ∙ Описание

Recordset

BOF и EOF равны False ∙ Указатель текущей записи является допустимым (valid) до тех пор, пока вы не удалите последнюю запись в наборе записей.

BOF = True ∙ Текущая запись установлена перед первой записью. Указатель текущей записи является недопустимым (invalid).

EOF = True ∙ Текущая запись установлена за последней записью. Указатель текущей записи является недопустимым (invalid).

BOF и EOF равны True ∙ В наборе записей нет строк. Указатель текущей записи является недопустимым (invalid).


Связанные с данными элементы управления

При разработке приложений такие действия как открытие базы данных, определение источника данных и др. возлагаются на объект управления данными. Однако, для создания полноценного приложения совершенно необходимым является наличие у разработчика средств визуализации самих данных. Для решения этой задачи в Visual Basic предусмотрены, так называемые, связанные с данными элементы управления (Data-bound Controls). Другими словами, в связанных элементах управления, расположенных на экранной форме, отображается содержимое полей текущей записи из базы данных (точнее, из набора записей).

В качестве связанных объектов управления могут выступать некоторые стандартные объекты Visual Basic, например такое как Text box (текстовое окно).

Кроме свойств, присущих обычным элементам управления Visual Basic, эти элементы управления имеют несколько общих свойств, специально предназначенных для связи с базами данных:

DataField — Определяет имя поля в наборе записей, созданном объектом управления данными.

DataSource — Определяет имя объекта управления данными, с которым связывается элемент управления.

DataChanged — Показывает, было ли изменено содержимое связанного элемента управления.

Таким образом, чтобы добавить связанный элемент управления в приложение, необходимо выполнить следующие действия:

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

Установите свойство DataSource для связи с объектом управления данными.

Установите свойство DataField для связи с требуемым полем набора записей.

Кроме стандартных связанных элементов управления, в Visual Basic предусмотрено несколько специальных связанных элементов управления, которые, кроме как для работы с данными обычно не используются:

Data-bound list box,

Data-bound combo box,

Data-bound grid.

Тот факт, что они используются вместе с данными, отражен в самих их названиях. Их детальное описание и примеры использования в приложениях будут рассмотрены в отдельнх уроках.

Источником данных для любого связанного элемента управления всегда является объект управления данными. Когда пользователь при помощи кнопок со стрелками на объекте Data перемещает указатель текущей записи с одной записи на другую, обновление данных в связанных элементах управления происходит автоматически. Любое изменение данных в связанных элементах управления, сделанное пользователем, немедленно отображается в наборе записей и затем в базе данных (если, конечно, не предусмотреть специальных мер).

В таблице 3.3 представлены типы данных, которые могут отображаться в связанных объектах управления.


Таблица 3.3

Название объекта ∙ Типы данных

Picture box ∙ Long Binary

Image ∙ Binary

Label ∙ Text, Numeric, Date

Text box ∙ Text, Numeric, Date

Check box ∙ True/False, Yes/No

List box ∙ Text, Numeric, Date

Combo box ∙ T ext, Numeric, Date

Data bound list box ∙ Text, Numeric, Date

Data bound combo box ∙ Text, Numeric, Date

Data bound grid ∙ Text, Numeric, Date

Masked edit ∙ Text, Numeric, Date


Простое приложение для просмотра полей базы данных

Для демонстрации использования объекта управления данными и связанных элементов управления создадим очень простое приложение, которое, тем не менее, позволит нам просматривать библиографическую информацию из базы данных BIBLIO.MDB. Для этого вы должны последовательно выполнить следующие действия:

1. Откройте новый проект и измените свойство Caption формы Form1 на “Книги по программированию”.

2. Перенесите из панели инструментов на форму объект управления данными Data1.

3. В окне свойств объекта Data1 измените свойство Caption на “Книги”.

4. В окне свойств объекта Data1 установите свойство DatabaseName, как имя файла базы данных с указанием полного пути C: \VB5\BIBLIO.MDB.

5. В окне свойств объекта Data1 определите свойство RecordSource, как следующий SQL-запрос:

SELECT * FROM TITLES, AUTHORS, PUBLISHERS, [TITLE AUTHOR] WHERE TITLES.ISBN = [TITLE AUTHOR].ISBN AND [TITLE AUTHOR].AU_ID = AUTHORS.AU_ID AND TITLES.PUBID= PUBLISHERS.PUBID

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

6. Разместите на форме восемь меток и, соответственно, восемь текстовых окон как показано на рис. 3.6 и установите их свойства следующим образом:

Label1.Сарtion=Название

Text1.DataSource=Data1

Text1.DataField=Title

Label2.Caption=ABTop

Text2.DataSource=Data1

Text2.DataField=Author

Label3.Caption=год издания

Text3.DataSource=Data1

Text3.DataField=Year Published

Label4.Caption=Teмa книги

Text4.DataSource=Data1

Text4.DataField=Subject

Label5.Caption=Описание

Text5.DataSource=Data1

Text5.DataField=Description

LаЬеl6.Caption=Международный код ISBN

Text6.DataSource=Data1

Text6.DataField=TITLES.ISBN

LаЬеl7.Caption=Издательство

Text7.DataSource=Data1

Text7.DataField=Name

LаЬеl8.Caption=Примечание

Text8.DataSource=Data1

Text8.DataField=Notes



Рис. 3.6. Вид экранной формы.


7. Предусмотрим средство для завершения работы приложения. Для этого добавьте на форму командную кнопку, определите ее свойство Caption как “Выход” и установите следующий код в процедуре обработки события Click:

Private Sub Command1 Click ()

Unload Me

End Sub

8. Запустите проект на выполнение выбором команды Start из меню Run, или нажмите клавишу F5. Результат работы программы показан на рис. 3.7. С помощью кнопок со стрелками на объекте управления данными можно перемещать текущий указатель по набору записей и содержимое соответствующих полей будет автоматически отображаться на форме в связанных элементах управления.

9. Закройте приложение нажатием кнопки “Выход”.



Рис. 3.7. Результат работы приложения.

Урок 4 Свойства, методы и события объекта управления данными

Объект Data, как и любой другой элемент управления в Visual Basic, имеет несколько стандартных, общих для многих элементов управления, свойств, методов и событий. Наряду с ними, он имеет целый ряд свойств, методов и событий, предназначенных для работы с данными. Именно они и будут последовательно рассмотрены ниже.


Свойства

• BOFAction

Свойство BOFAction определяет действие объекта Data, если свойство BOF (beginning of file — начало файла) у созданного им набора записей установлено в True.

Синтаксис: data1.BOFaction=value.

Значение value может быть выбрано из двух альтернатив: MoveFirst или BOF.

При создании объекта Data свойство BOFAction устанавливается по умолчанию как MoveFirst. При этом текущей становится первая запись в наборе записей.

Установка свойства BOFAction в BOF приводит к тому, что при перемещении указателя текущей записи за пределы набора сверху, текущая запись становится недопустимой (invalid) и любая попытка ее редактирования приведет к ошибке. В этом случае происходит событие Validate на первой записи в наборе и, затем, событие Reposition, уже на недопустимой записи. При этом кнопка перемещения указателя к предыдущей записи на объекте управления данными становится неактивной.

Установить свойство BOFAction объекта управления данными data1 в режиме выполнения приложения можно следующим образом:

data1.BOFaction= vbBOFActionMoveFirst,

или

data1.BOFaction= vbBOFActionBOF.

Возможные установки свойства BOFAction приведены в следующей таблице.

Установка ∙ Константа ∙ Значение

MoveFirst ∙ vbBOFActionMoveFirst ∙ 0

BOF ∙ vbBOFActionBOF ∙ 1


• Connect

Свойство Connect определяет тип базы данных, открываемой объектом Data. По умолчанию открывается база данных в формате Microsoft Access.

Синтаксис: data1.connect=string.

Возможные варианты установки свойства Connect приведены в следующей таблице.

Тип базы данных ∙ Определение

MS Access ∙ ";"

dBASE х ∙ "dBASE x;"

Paradox x.x ∙ "Paradox x.x;"

FoxPro x.x ∙ "FoxPro x.x;"

Excel x.0 ∙ "Excel x.0;"

Lotus WKx ∙ "Lotus WKx;"

Text ∙ "Text;"

Btrieve ∙ "Btrieve;"

ODBC ∙ "ODBC; DATABASE = defaultdatabase; UID=user; PWD=password; DSN=datasourcename; LOGINTIMEOUT=seconds"

Установка свойства Connect в режиме выполнения приложения производится следующим образом: data1.connect= " dBASE IV;"

data1.connect= " FoxPro 3.0;".


• Database

Использование свойства Database в режиме выполнения приложения позволяет получить ссылку на объект Database, который создан объектом Data.

Синтаксис: Set databaseobject = data1.Database.

Объект Data создает объект Database на основе своих свойств DatabaseName, Exclusive, ReadOnly, и Connect. Так как объект Database имеет свои собственные свойства и методы то, получив на него ссылку, вы можете использовать их в приложении. Например, вы можете использовать методы Close или Execute. Подробное описание работы с объектом Database приведено в уроках, посвященных объектам доступа к данным.


• DatabaseName

Использование свойства DatabaseName позволяет получить или установить имя и месторасположение источника данных для объекта Data.

Синтаксис: data1.DatabaseName=string.

Строковое выражение string определяет месторасположение и имя файла базы данных в форматах MS Access и Btrieve. Если используется база данных, размещенная на файл-сервере, то строка должна включать полный путь к требуемому файлу, например:

\\SERVER\DATA\DATABASE.MDB.

Для баз данных в формате dBASE, Paradox и др. строка string должна содержать только путь к файлу.

Для баз данных ODBC это свойство не определяется, так как все необходимые параметры для связи с базой данных устанавливаются свойством Connect.

Если вы во время работы приложения изменяете свойство DatabaseName, то после сделанных изменений необходимо выполнить метод Refresh объекта Data.

Продемонстрируем использование свойства DatabaseName в режиме выполнения приложения. Для этого:

1. Откройте проект, созданный для просмотра содержимого файла BIBLIO.MDB.

2. Удалите содержимое свойства DatabaseName объекта управления данными Data1.

3. Добавьте следующий код в процедуру обработки сообщения о загрузке формы:

Private Sub Form_Load()

data1.databasename= "c: \vb5\biblio.mdb"

data1.refresh

End Sub

4. Запустите проект.

При разработке приложений для работы с базами данных лучше не привязывать пользователя к конкретной структуре каталогов установкой свойства DatabaseName на этапе разработки программы. Это может быть не всегда удобно для пользователя. Хорошим примером уважительного отношения к пользователю служит хранение путей к файлам баз данных в специальных файлах конфигурации вашего приложения с последующим считыванием этой информации в процессе загрузки программы. Код, осуществляющий эту операцию, можно включить, например, в процедуры обработки событий Load или Activate соответствующей экранной формы.

Другим способом определения пути к файлу базы данных является использование глобального объекта Visual Basic — объекта Арр. Хотя этот объект не имеет ни методов, ни событий, у него есть несколько очень полезных свойств. Одним из них является свойство Path, которое определяет путь к выполняемому файлу. Если вы используете интегрированную среду разработки Visual Basic, например, для отладки приложения, то App.Path определяет путь к файлу проекта, который вы запустили.

Пусть файлы баз данных для вашей программы находятся в подкаталоге DBASE каталога, в котором находится ваше приложение (проект). Тогда вы можете определить необходимый путь к файлу с помощью следующего фрагмента кода. Причем каталог, из которого запускается приложение (проект) может называться как угодно.

Dim DBName As String

DBName = "BIBLIO.MDB"

Data1.Databasename = App.Path+"\DBASE\"+DBName Data1.Refresh


• EOFAction

Свойство EOFAction определяет действие объекта Data, если свойство EOF (end of file — конец файла) у созданного им набора записей установлено в True.

Синтаксис: data1.EOFAction=value.

Значение value может быть выбрано из трех альтернатив: MoveLast, EOF, или AddNew.

При создании объекта Data свойство EOFAction устанавливается по умолчанию как MoveLast. При этом текущей остается последняя запись в наборе записей.

Установка свойства EOFAction в EOF приводит к тому, что при перемещении указателя текущей записи за пределы набора снизу, текущая запись становится недопустимой (invalid) и любая попытка ее редактирования приведет к ошибке. В этом случае происходит событие Validate на последней записи в наборе и, затем, событие Reposition, уже на недопустимой записи. При этом кнопка перемещения указателя на следующую запись на объекте управления данными становится неактивной.

Если установить свойство EOFAction в AddNew, то при перемещении указателя текущей записи за последнюю запись набора, происходит событие Validate на последней записи, затем, в набор записей добавляется новая пустая запись и происходит событие Reposition. Когда пользователь таким способом добавляет новую запись, эта она сначала создается в памяти компьютера в буфере копирования. Если после этого пользователь ввел необходимые данные и переместил указатель текущей записи на любую другую запись, то новая строка, уже содержащая данные, будет помещена в набор записей и потом в базу данных. В противном случае, если пользователь не ввел данные и переместил указатель, то пустая новая строка не добавляется в набор записей. Таким образом, установка свойства EOFAction в AddNew дает возможность пользователю добавлять в базу данных новые записи с помощью объекта Data и связанных с ним элементов управления.

Установить свойство EOFAction объекта управления данными data1 в режиме выполнения приложения можно следующим образом:

data1.EOFaction=vbEOFActionMoveLast,

data1.EOFaction=vbEOFActionEOF,

data1.EOFaction=vbEOFActionAddNew.

Возможные установки свойства EOFAction приведены в следующей таблице.

Установка ∙ Величина ∙ Значение

vbEOFActionMoveLast ∙ 0 ∙ MoveLast

vbEOFActionEOF ∙ 1 ∙ EOF

vbEOFActionAddNew ∙ 2 ∙ AddNew

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

Для этого:

1. Создайте вспомогательную базу данных BIBLI02.MDB, содержащую всего одну таблицу TITLES (чтобы не изменить оригинальную базу данных BIBLIO.MDB). Это можно сделать с помощью MS Access.

2. Откройте новый проект и добавьте на форму объект управления данными Data1.

3. В окне свойств объекта Data1 установите свойство DatabaseName, как имя файла базы данных с указанием полного пути C: \VB5\BIBLI02.MDB.

4. В окне свойств объекта Data1 установите свойство RecordSource как TITLES.

5. Разместите на форме пять меток и, соответственно, пять текстовых окон как показано на рис. 4.8 и установите их свойства следующим образом:

LаЬеl1.Сарtion=Название

Text1.DataSource=Data1

Text1.DataField=Title

Label2.Caption=Год выпуска

Text2.DataSource=Data1

Text2.DataField=Author

Label3.Caption=Доп. информация

Text3.DataSource=Data1

Text3.DataField=Year Published

Label4.Caption=Описание

Text4.DataSource=Data1

Text4.DataField=Subject

Label5.Caption=Ид. издателя

Text5.DataSource=Data1

Text5.DataField=Description



Рис. 4.1. Вид экранной формы.


6. Запустите приложение.

7. Переместите указатель на последнюю запись и, затем, добавьте новую пустую запись нажатием на кнопку перехода к следующей записи.

8. Введите какие-нибудь данные в связанных текстовых окнах и переместите указатель на любую другую запись, например, на предыдущую. Если, введенные вами данные соответствуют типам полей в таблице, то новая запись будет добавлена в набор записей и в базу данных. Результат работы программы показан на рис. 4.2.

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



Рис. 4.2. Новая запись в базе данных.


• Exclusive

Свойство Exclusive определяет режим работы открываемой базы данных: однопользовательский или многопользовательский.

Синтаксис: data1.Exclusive=value.

Значение value имеет тип boolean и может принимать значения True или False. Если свойство Exclusive установлено в True, то база данных открывается в однопользовательском режиме. Если оно установлено в False, то с базой данных могут одновременно работать несколько пользователей. По умолчанию свойство Exclusive устанавливается в False для поддержки многопользовательского режима работы.

Свойство Exclusive используется объектом Data только во время открытия базы данных, поэтому, если переустановить его во время выполнения приложения, то необходимо применить также и Refresh метод:

Data1.Exclusive=true

Data1.Refresh.

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

Для баз данных ODBC это свойство игнорируется.

Откройте проект, созданный для демонстрации свойства EOFAction, установите свойство Exclusive объекта управления данными в True и запустите его. Таким образом, вы открыли базу данных BIBLIO2.MDB в однопользовательском режиме. Затем запустите систему управления базами данных MS Acces и попытайтесь открыть файл BIBLIO2.MDB. Результатом ваших действий будет выданное на экран сообщение, уведомляющее вас, что базу данных открыть невозможно.


• Options

Свойство Options позволяет установить или получить один или несколько параметров набора записей созданного объектом Data. Это свойство обычно используется при разработке многопользовательских приложений.

Синтаксис: data1.Options=value.

Возможные значения параметра value приведены в следующей таблице:

Постоянная ∙ Значение

dbDenyWrite ∙ 1

dbDenyRead ∙ 2

dbReadOnly ∙ 4

dbAppendOnly ∙ 8

dbInconsistent ∙ 16

dbConsistent ∙ 32

dbSQLPassThrough ∙ 64

dbForwardOnly ∙ 256

dbSeeChanges ∙ 512

Ниже приведено краткое описание возможных установок свойства Options:

dbDeny Write — в многопользовательской среде другие пользователи не могут вносить изменения в записи;

dbDenyRead — в многопользовательской среде другие пользователи не имеют возможности читать записи. Эта установка применяется только для наборов записей типа таблица;

dbReadOnly — набор записей открывается только для чтения. В этом случае вы не можете изменять записи;

dbAppendOnly — в этом случае вы имеете возможность добавлять новые записи в набор записей, но не можете редактировать существующие записи;

dblnconsistent — обновление может применяться для всех полей в наборе записей, даже если они нарушают условие объединения;

dbConsistent — обновление применяется только для тех полей в наборе записей, которые не нарушают условие объединения. Это значение свойства Options устанавливается по умолчанию;

dbSQLPassThrough — эта константа означает, что SQL-запрос, определенный свойством RecordSource объекта управления данными, будет выполняться на сервере MS SQL Server или Oracle (если вы, конечно, используете такие ODBC-базы данных);

dbForwardOnly — эта установка определяет набор записей таким образом, что по нему возможно перемещение только вперед (только метод MoveNext может использоваться для перемещения по набору записей);

dbSeeChanges — установка этого значения вызывает появление ошибки, когда какой либо пользователь изменил данные в то время, когда вы их редактируете.

При необходимости установить сразу несколько параметров набора записей, используйте операцию сложения. После изменения свойства Options во время выполнения приложения необходимо применить метод Refresh. Следующий пример иллюстрирует, как в многопользовательской среде открыть набор записей только для чтения исключительно для собственного пользования:

Data1.DatabaseName="C: \VB5\BIBLIO.MDB"

Data1.Options=dbDenyWrite + dbReadOnly

Data1.Refresh.

Для того, чтобы сравнить параметры набора записей с каким либо определенным значением вы можете использовать оператор And. С использованием следующего фрагмента кода вы, например, можете проверить, открыт ли набор записей только для чтения:

If Data1.Options And dbReadOnly Then…


• ReadOnly

Свойство ReadOnly определяет метод доступа к базе данных, открытой с помощью объекта Data: только для чтения или для чтения-записи.

Синтаксис: data1.ReadOnly=Boolean.

Если свойство ReadOnly установлено в True, то открытая база данных доступна только для чтения и вы, следовательно, не имеете возможности редактировать данные. Если же свойство установлено в False, то база данных открыта для чтения-записи и вы можете делать с данными все, что угодно. По умолчанию свойство ReadOnly устанавливается в False.

После изменения свойства ReadOnly во время выполнения приложения необходимо применить метод Refresh. Следующий пример показывает, как открыть базу данных только для чтения:

Data1.DatabaseName="C: \VB5\BIBLIO.MDB"

Data1.ReadOnly=T rue

Data1.Refresh

Если нет необходимости редактировать данные, то предпочтительно открывать базу данных в режиме только для чтения, так как операции с данными в этом случае выполняются несколько быстрее.


• Recordset

Свойство Recordset определяет набор записей, создаваемый объектом Data.

Синтаксис: data1.Recordset=string.

Параметр string представляет собой текстовую строку, которая определяет набор записей.

После загрузки приложения автоматически создается объект Data. Если у него корректно установлены свойства Connect, DatabaseName, Options, RecordSource, Exclusive, ReadOnly и RecordsetType, то ядро системы управления базами данных Jet database engine создаст новый объект Recordset. То же самое произойдет, если во время выполнения приложения будет применен метод Refresh объекта Data. Доступ к этому объекту — набору записей можно получить через свойство Recordset объекта Data.

Объект Recordset имеет несколько свойств и методов, о которых речь пойдет в разделе, посвященном использованию объектов доступа к данным. Тем не менее, в следующем примере показано, как использовать метод Delete объекта Recordset для удаления записей.

1. Откройте проект, который использовался для демонстрации возможности добавления записи в базу данных с использованием объекта управления данными.

2. Добавьте на форму командную кнопку и определите ее свойство Caption, как “Удалить”.

3. Добавьте в процедуру обработки события Click командной кнопки следующий фрагмент кода: Private Sub Command1_Click()

Data1.Recordset.Delete

Data1.Refresh

End Sub

4. Запустите приложение. Теперь, используя в приложении объект управления данными, вы можете не только добавлять в базу данных новые записи, но и удалить любую запись.


• RecordsetType

Свойство RecordsetType определяет тип набора записей, созданного объектом Data.

Синтаксис: data1.RecordsetType=value.

Параметр value определяет тип набора записей. Возможные значения параметра value приведены в следующей таблице:


Постоянная ∙ Значение ∙ Описание

vbRSTуpeTable ∙ 0 ∙ Создается набор записей типа таблицы.

vbRSTуpeDynaset ∙ 1 ∙ Создается набор записей динамического типа. Этот тип создается по умолчанию.

vbRSTypeSnapshot ∙ 2 ∙ Создается статический набор записей.

После изменения свойства RecordsetType во время выполнения приложения необходимо применить метод Refresh.

В следующем примере для объекта управления данными Data1 закрывается существующий набор записей и, затем, создается новый набор записей статического типа:

Data1.Recordset Close

Data1.RecordsetType=vbRSTypeSnapshot

Data1.DatabaseName= “C: \VB5\BIBLIO.MDB”

Data1.RecordSource= “select * from Titles”

Data1.Refresh.


• RecordSource

Свойство RecordSource определяет источник данных для набора записей, создаваемого объектом Data.

Синтаксис: data1 RecordSource=string.

Параметр string представляет собой строку, определяющую источник данных. Возможные значения этого параметра представлены в следующей таблице:

Установка ∙ Описание

Имя таблицы ∙ Имя одной из таблиц, содержащихся в базе данных.

SQL-запрос ∙ Текстовая строка, представляющая собой SQL-запрос к базе данных. Причем синтаксис SQL выражения должен соответствовать типу базы данных.

Объект QueryDef ∙ Имя одного из объектов QueryDef из набора QueryDefs объекта Database. Этот источник данных поддерживается только для баз данных MS Access.


Чтобы проиллюстрировать использование свойства RecordSource объекта Data, построим приложение для просмотра полей базы данных BIBLIO2.MDB, в котором предусмотрим возможность отображать данные на экране компьютера упорядоченным образом. Для этого требуется выполнить следующие действия:

1. Откройте новый проект.

2. Добавьте на форму объект управления данными Data1 и определите его свойство DatabaseName, как C: \VB5\ BIBLI02.MDB. Не устанавливайте свойство RecordSource.

3. Добавьте на форму объект DBGrid и определите его свойство RecordSource, как Data1.

4. Добавьте на форму метку “Упорядочить по” и объект ComboBox.

5. Добавьте в раздел General следующий код:

Dim х As Integer

Dim A(4) As String Dim B(4) As String

6. Добавьте в процедуру загрузки формы следующий код:

Private Sub Form_Load()

А(0) = "Названиям"

А(1) = "Году издания"

А(2) = "ISBN"

А(3) = "Ид. Издателя"

For i = 0 То 3 Combol.AddItem A(i)

Next i

Combo1.Listlndex = 0 B(0) = "Title"

B(l) = "[Year Published]"

B(2) = "ISBN"

B(3) = "PubID"

End Sub

7. Добавьте в процедуру обработки события Click элемента управления ComboBox следующий код: Private Sub Combol_Click()

Dim strl As String strl = "select * From titles order by " & B(Combo1.Listlndex)

If Combo1.Listlndex = Empty Then strl = "select * From titles"

End If

Data1.RecordSource = strl

Data1.Refresh

End Sub

8. Запустите проект на выполнение.

После загрузки формы, данные в таблице DBGrid будут отображены в неупорядоченном виде, вернее, данные будут размещены в физическом порядке, то есть в том, в котором они были введены в базу данных, хотя в элементе управления ComboBox будет показано “По названиям”. Затем выберите из списка другой доступный способ упорядочения, например, “По году издания”. После обработки события Click будет создан новый набор записей, источником данных для которого будет служить результат выполнения следующего SQL-запроса select * From titles order by [Year Published].

На рис. 4.3 представлена библиографическая информации из базы данных BIBLIО2.MDB, упорядоченная по году издания книги.



Рис. 4.3. Библиографические данные, упорядоченные по году издания книги.


Методы объекта Data

• Refresh

После изменения свойства объекта Data во время выполнения приложения, ядро системы управления базами данных Jet database engine сразу не меняет ранее уже установленные свойства. Вообще говоря, просто изменить в программе одно установленное свойство на другое невозможно. Необходимо заново инициализировать объект управления данными, который затем автоматически создаст другие объекты доступа к данным (например, DataBase или Recordset) с уже новыми свойствами. Для этого необходимо применить метод Refresh. Таким образом, метод Refresh используется для того, чтобы во время выполнения приложения переинициализировать объект управления данными, но уже с новыми свойствами.

Синтаксис: Data1.Refresh.

После применения метода Refresh указатель текущей записи устанавливается на первой записи в наборе, созданном объектом Data.


• UpdateControls

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

Синтаксис: Data1.UpdateControls.

Хорошей иллюстрацией использования метода UpdateControls является предоставление пользователю возможности подтвердить сделанные изменения содержимого текущей записи. Для этого необходимо вмешаться в процедуру обработки события Validate объекта Data.

1. Откройте проект, который использовался для демонстрации удаления записи и добавьте следующий фрагмент кода в процедуру обработки события Validate:

Private Sub Data1_Validate(Action As Integer, Save As Integer)

If Save = False Then Exit Sub

End If

If MsgBox("Coxpaнить сделанные изменения",vbYesNo,"","",0)=vbNo Then

Data1.UpdateControls

Exit Sub

End If

End Sub

2. Запустите приложение.

3. Измените содержимое какого-нибудь связанного текстового окна, например, года издания, и, используя кнопки перемещения по набору записей, измените положение текущей записи. В результате, на экран будет выдано диалоговое окно, в котором можно подтвердить или отменить сделанные изменения.

4. Закройте приложение.


• UpdateRecord

Метод UpdateRecord сохраняет в базе данных содержимое текущей записи, отображаемое в связанных элементах управления.

Синтаксис: Data1.UpdateRecord.

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

Следующий пример показывает, как использовать в приложениях метод UpdateRecord:

1. Откройте проект, использованный для демонстрации метода UpdateControls.

2. Разместите на форме командную кнопку, измените ее свойство Caption на “Обновить данные” и добавьте следующий код в процедуру обработки события Click:

Private Sub Command2_Click()

Data1.UpdateRecord End Sub

3. Запустите проект. Отредактируйте содержимое связанных элементов управления и нажмите кнопку “Обновить данные”. Теперь, сделанные вами изменения сохранены в базе данных.


События

• Error

Событие Error происходит, когда при использовании объекта Data возникает какая-либо ошибка доступа к данным, причем в это время программный код, написанный программистом не выполняется. Примером такой ситуации может быть случай, когда база данных, определенная свойством DatabaseName объекта Data, не найдена. Здесь не выполняется написанного программистом кода и, поэтому, обработка такого рода ошибки невозможна с использованием стандартных средств Visual Basic. К счастью, в этом случае происходит событие Error, в процедуру обработки которого программист имеет полное право вмешаться.

Синтаксис: Private Sub Data1 Error (DataErr As Integer, Response As Integer)

Параметр DataErr содержит код ошибки. Различные варианты действия после возникновения ошибки определяются параметром Response, и приведены в следующей таблице:

Постоянная ∙ Значение ∙ Действие

vbDataErrContinue ∙ 0 ∙ После возникновения ошибки приложение продолжает выполняться.

vbDataErrDisplay ∙ 1∙ После возникновения ошибки появляется диалоговое окно с соответствующим сообщением. Этот вариант действия установлен по умолчанию.

1. Откройте любой проект и измените свойство DatabaseName объекта управления данными Data1 на С: \BIBLIO.MDB.

2. Запустите проект и убедитесь, что на экране появляется сообщение об ошибке.

3. Добавьте в процедуру обработки события Error следующий фрагмент:

Private Sub Data1_Error(DataErr As Integer, Response As Integer)

Response = vbDataErrContinue

End Sub

4. Запустите приложение. В этом случае сообщения об ошибке не возникает.


• Reposition

Событие Reposition происходит, когда запись в наборе записей становится текущей.

Синтаксис: Private Sub Data1 Reposition ().

После загрузки объекта Data и открытия соответствующего набора записей, первая запись в наборе становится текущей и происходит событие Reposition. Это событие также происходит, когда пользователь нажимает кнопки на объекте Data для перемещения по набору записей, а также при использовании методов Move или Find. Вообще говоря, применение любых методов, при которых происходит изменение положения текущей записи, вызывает событие Reposition.

В отличие от события Validate, которое происходит перед изменением текущей записи, событие Reposition всегда происходит после того, как следующая запись стала текущей.


• Validate

Событие Validate происходит перед изменением положения текущей записи, а так же перед выполнением методов Update (за исключением случая, когда данные сохраняются с помощью метода UpdateRecord), Delete, Unload, или Close.

Синтаксис: Private Sub Data1 Validate (Action As Integer, Save As Integer)

Аргумент Save определяет состояние связанных элементов управления. Если аргумент Save установлен в True, то содержимое связанных элементов управления было изменено. Если же аргумент Save установлен в False, то никаких изменений в связанных элементах управления не произошло.

Аргумент Action определяет действие, которое вызвало событие Validate. Возможные значения этого параметра и их краткие описания приведены в следующей таблице.

Постоянная ∙ Значение ∙ Описание

vbDataActionCancel ∙ 0 ∙ Отменяет операцию при выходе из процедуры обработки события.

vbDataActionMoveFirst ∙ 1 ∙ Нажата кнопка перехода к первой записи на объекте Data или применен метод MoveFirst объекта Recordset.

vbDataActionMovePrevious ∙ 2 ∙ Нажата кнопка перехода к предыдущей записи на объекте Data или применен метод MovePrevious объекта Recordset.

vbDataActionMoveNext ∙ 3 ∙ Нажата кнопка перехода к следующей записи на объекте Data или применен метод MoveNext объекта Recordset.

vbDataActionMoveLast ∙ 4 ∙ Нажата кнопка перехода к последней записи на объекте Data или применен метод MoveLast объекта Recordset.

vbDataActionAddNew ∙ 5 ∙ Применен метод AddNew объекта Recordset или указатель текущей записи перемещен за конец файла при установленном свойстве EOFAction объекта Data в AddNew.

vbDataActionUpdate ∙ 6 ∙ Применен метод Update объекта Recordset (но не UpdateRecord объекта Data).

vbDataActionDelete ∙ 7 ∙ Применен метод Delete объекта Recordset.

vbDataAction ∙ 8 ∙ Применен один из методов Find объекта Recordset.

vbDataActionBookmark ∙ 9 ∙ Изменено свойство Bookmark объекта Recordset.

vbDataActionClose ∙ 10 ∙ Применен метод Close объекта Recordset.

vbDataActionUnload ∙ 11 ∙ Выгружена экранная форма, содержащая объект управления данными.


В процедуре обработки события Validate можно заменить действие, вызвавшее это событие, на другое действие при помощи установки свойства Action соответствующим образом. При этом совершенно свободно можно менять любой из методов Move на метод AddNew и обратно. Отмена любого действия производится установкой аргумента Action в 0 (Action = vbDataActionCancel).

Примером обработки события Validate можно найти в уже рассмотренном ранее проекте, посвященном применению метода UpdateControls. Только теперь, вместо метода UpdateControls для отмены результатов редактирования, вы можете использовать установку аргумента Action в vbDataActionC ancel:

Private Sub Data1_Validate(Action As Integer, Save As Integer) If Save=False Then Exit Sub End If

If MsgBox("Coxpaнить сделанные изменения",vbYesNo,"","",0)=vbNo Then

Action=vbDataActionCancel

Exit Sub

End If

End Sub

Урок 5 Элемент управления Data и объекты доступа к данным

Использование объекта управления данными позволяет быстро создавать простые приложения для работы с базами данных практически без написания кода, только при помощи соответствующих установок его свойств и применения его методов. Для отображения информации на экранной форме используются связанные элементы управления. Однако, для повышения функциональности разрабатываемого приложения вам, скорее всего, придется все-таки писать код. К счастью, Visual Basic 5 обеспечивает очень широкие возможности для программирования операций с данными. В следующих разделах этой главы описана лишь небольшая часть из чрезвычайно широкого сервиса, предоставляемого разработчику системой Visual Basic 5. Более полно и подробно использование в приложениях объектов доступа к данным изложено в последующих уроках.


Перемещение по набору записей с использованием Моvе-методов

Ранее было показано, как перемещаться от записи к записи в базе данных с использованием кнопок со стрелками на объекте управления данными. В этом разделе обсуждаются способы перемещения по базе данных с использование методов объекта Recordset, созданного объектом Data, то есть с помощью программного кода.

Следующая таблица показывает, вызов какого из методов объекта Recordset эквивалентен нажатию кнопки со стрелкой на объекте управления данными.

Куда переместить указатель текущей записи ∙ Использование метода Move

К первой записи ∙ Data1.Recordset.MoveFirst

К предыдущей записи ∙ Data1.Recordset.MovePrevious

К следующей записи ∙ Data1.Recordset.MoveNext

К последней записи ∙ Data1.Recordset.MoveLast

При разработке приложений часто возникает необходимость перемещения к первой или последней записи в наборе записей. Например, если вам требуется запрограммировать процедуру поиска записи, содержащей какое-либо значение, вполне естественным условием будет начинать поиск с первой строки.

Для перемещения указателя текущей записи на первую или последнюю записи используются методы MoveFirst и MoveLast:

Data1.Recordset.MoveFirst

Data1.Recordset.MoveLast.

Если текущий указатель позиционирован на первой или последней записи в наборе записей, то дальнейшее перемещение назад и вперед, соответственно, устанавливает свойства объекта Recordset BOF и EOF в True. Если BOFAction и EOFAction свойства объекта управления данными установлены в единицу, то в этом случае указатель текущей записи становится недопустимым и связанные органы управления очищаются. При использовании метода Move для перемещения указателя за пределы файла Visual Basic генерирует ошибку.

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

Do While Data1.Recordset.EOF = False

Data1.Recordset.MoveNext код для работы с текущей записью

Loop

Data1.Recordset.MoveLast

В конце этого цикла указатель текущей записи становится недопустимым и требуется использовать метод MoveLast, чтобы его переустановить на последнюю запись в наборе.

Методы MoveNext и MovePrevious перемещают указатель на следующую и предыдущую записи в наборе записей. Обычно эти методы используются для последовательного просмотра содержимого полей базы данных.

Следующий фрагмент кода загружает два списка и заполняет их названиями книг и годами их публикации из таблицы TITLES базы данных BIBLIO.MDB.

Data1.DatabaseName="C: \VB5\BIBLIO.MDB"

Data1.RecordSource="Titles"

Data1.Refresh

Do Until Data1.Recordset.EOF Entry = Data1.Recordset("Title")

List1Addltem Entry

Entry = Data1.Recordset("Year Published")

List2.AddItem Entry

Data1.Recordset.MoveNext

Loop

Вы также можете применить Move метод с целочисленным аргументом для перемещения указателя текущей записи на определенное количество строк вперед или назад (в зависимости от знака аргумента) от текущего положения указателя или от положения, сохраненного с использованием закладки. Следующий пример показывает, как переместить указатель текущей записи на пять строк вперед, начиная от положения, определенного свойством MyBookmark:

Data1.Recordset.Move 5, MyBookmark.

Для перемещения по набору записей также можно использовать такие свойства объекта Recordset, как AbsolutePosition и PercentPosition.


Перемещение по набору записей с помощью закладок

Использование закладки (bookmark) позволяет сначала сохранить указатель на текущую запись и затем, из любого места базы данных непосредственно позиционировать его на этой записи. Свойство Bookmark объекта Recordset содержит указатель на запись. Установкой свойства Bookmark, равному значению сохраненного ранее указателя, вы можете прямо позиционировать указатель на требуемую запись.

Следующий фрагмент кода устанавливает указатель текущей записи в положение, предварительно сохраненное с использованием закладки MyBookmark:

Dim MyBookmark As Variant

MyBookmark = Data1.Recordset.Bookmark

Data1.Recordset.MoveLast

Data1.Recordset.Bookmark=MyBookmark.


Применение Find-методов для поиска записи

Ранее было показано, как осуществлять перемещение по базе данных для просмотра записей. Однако большинству пользователей необходимо иметь возможность не только просматривать запись за записью в базе данных, но и осуществлять поиск записи, отвечающий какому-либо условию. Чтобы найти определенную запись, можно воспользоваться методами Find для объектов — наборов записей типа dynaset и snapshot и методом Seek — для наборов записей типа table.

Методы Find используются для поиска в наборах записей типа dynaset и snapshot. В Visual Basic поддерживается четыре метода Find:

Метод FindFirst осуществляет поиск первой записи, удовлетворяющей условию.

Метод FindLast осуществляет поиск последней записи, удовлетворяющей условию.

Метод FindNext осуществляет поиск следующей записи, удовлетворяющей условию.

Метод FindPrevious осуществляет поиск предыдущей записи, удовлетворяющей условию.

При использовании любого из Find методов необходимо определить условие поиска. Обычно условием поиска является равенство имени поля какому-нибудь значению. Например, следующий фрагмент кода показывает, как найти в таблице Titles первую запись, в которой поле AU ID равно пяти:

Data1.Recordset.FindFirst "AU_ID=5".

Построим простое приложение для просмотра таблицы Titles базы данных BIBLIО2.MDB с возможностью простого поиска записи. Для этого:

1. Создайте новый проект и разместите на форме объект Data, объект DBGrid и две командные кнопки, как показано на рис. 5.1.



Рис. 5.1. Главное окно приложения.


2. Установите следующие свойства для объектов Data и DBGrid:

Data1.DatabaseName=" C: \VB5\BIBLI02.MDB"

Data1.RecordSource=Titles

DBGrid1.DataSource=Data1.

3. Как обычно, предусмотрим возможность завершения работы приложения, определив обработку нажатия кнопки “Выход” следующим образом:

Private Sub Command2_Click()

Unload Me

End Sub.

4. Для загрузки и вывода на экран окна поиска записи добавьте в процедуру обработки нажатия кнопки “Поиск” следующую строку:

Private Sub Commandl_Click()

Form2.Show

End Sub

5. Добавьте в проект новую форму и разместите на ней текстовое окно, метку и две командные кнопки, как показано на рис. 5.2.



Рис. 5.2. Окно поиска записи.


6. Добавьте в процедуру обработки нажатия кнопки “Поиск” следующий код:

Private Sub Command1_Click()

Dim strCompare As String

strCompare = "[Year Published] = " + Text1.Text

Form1!Data1.Recordset.MoveFirst

Form1!Data1.Recordset.FindFirst strCompare

Unload Me

End Sub.

Строковая переменная strCompare определяет условие поиска. Перед использованием метода FindFirst указатель текущей записи устанавливается на первую запись в наборе. Таким образом поиск осуществляется с первой записи в наборе.

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

7. Для отмены поиска необходимо выгрузить окно в процедуре обработки нажатия кнопки “Отмена”:

Private Sub Command2_Click()

Unload Me

End Sub.

8. Запустите приложение.


Использование метода Seek для поиска записи

Метод Seek используется для поиска только в наборе записей типа Table. При использовании метода Seek процессор баз данных использует текущий индекс таблицы, который определен свойством Index объекта Recordset. После выполнения этого метода текущей записью в наборе становится найденная запись.

Метод Seek имеет следующий синтаксис:

Recordset.Seek comp, key1, key2.

Первый из аргументов — comp является строкой, которая определяет тип сравнения. В следующей таблице представлены типы сравнения, которые используются с методом Seek.

Строка ∙ Описание

"=" ∙ Равно определенной величине.

">=" ∙ Больше или равно определенной величине.

">" ∙ Больше определенной величины.

"<=" ∙ Меньше или равно определенной величине.

"<" ∙ Меньше определенной величины.

Аргументы keyn представляют собой последовательность значений, с которыми Visual Basic производит сравнение содержимого записей таблицы.

В следующем примере метод Seek используется для поиска записи, содержащей величину 5 в поле

AUID, которое является уникальным индексным полем.

Dim MyTable As Recordset

Set MyTable = Data1.Recordset

MyTable.Index = "AU_ID"

MyTable.Seek "=",5

Стоит еще раз подчеркнуть, что перед использованием метода Seek необходимо установить текущий индекс с использованием свойства Index. В противном случае обращение к этому методу приведет к ошибке.


Как узнать, можно ли изменять базу данных

Если вы намереваетесь редактировать содержимое базы данных, то должны быть уверены, что это можно делать. При использовании наборов записей типа snapshot, вы не можете вносить изменения в базу данных по определению. Если вы не уверены, что содержимое базы данных можно редактировать, можете проверить выполнение следующих условий:

Свойства Updatable у базы данных, набора записей и поля должны быть установлены в True.

Если какое-нибудь из этих свойств установлено в False, то соответствующие данные доступны только для чтения.

Вы должны использовать объект управления данными, у которого свойство ReadOnly установлено в False.

С помощью следующего фрагмента кода вы можете проверить, можно ли редактировать базу данных:

If Data1.ReadOnly = True or Data1.Database.Updatable = False Or _

Data1.Recordset.Updatable = False Then

MsgBox "Эти данные не могут быть изменены"

End If

Для того, чтобы определить, допускает ли возможность редактирования определенное поле базы данных, надо проверить бит dbUpdatableField у свойства Attributes. Если этот бит содержит 0, то содержимое поля изменить невозможно. В противном случае редактирование поля допускается.

В следующем примере показано, как проверить возможность редактирования поля "Author":

If Data1.Recordset.Fields("Author").Attributes And _

dbUpdatableField = 0 Then

MsgBox "Это поле не может быть изменено"

End If


Добавление новой записи

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

Для того, чтобы добавить новые записи в набор записей надо проделать следующие действия:

1. Добавить новую пустую запись с помощью метода AddNew объекта Recordset. При этом указатель текущей записи сохраняется и затем перемещается на новую запись.

2. Определить новые значения в полях добавленной записи.

3. Сохранить сделанные изменения использованием метода Update. При этом указатель текущей записи принимает значение, которое у него было перед использованием метода AddNew.

Следующий фрагмент кода показывает, как с помощью программного кода добавить новую запись в таблицу Titles.

Data1.DatabaseName = "BIBLIO.MDB"

Data1.RecordSource = "Titles"

Data1.Refresh

Data1.Recordset.AddNew 'Добавить новую запись

Data1.Recordset("Title") = "Visual Basic" ' Установить значения полей

Data1.Recordset("Year Published") = "1996"

Data1.Recordset("AU_ID") = 37 Data1.Recordset("ISBN") = "111-111-11-11"

Data1.Recordset("PubID") = 43 Data1.Recordset.Update ' Сохранить изменения


Редактирование текущей записи

Для того чтобы изменить данные в вашей базе данных, вы должны сначала сделать запись, подлежащую изменению, текущей записью. Это можно просто сделать при помощи одного из методов Move или при помощи кнопок со стрелками на объекте управления данными. Затем можно провести необходимые изменения содержимого связанных объектах управления. Чтобы сохранить сделанные изменения, достаточно просто переместить указатель текущей записи на любую другую запись или использовать метод Update.

Таким образом, для редактирования текущей записи надо сделать следующее:

1. Позиционируйте указатель текущей записи на запись, которую вы хотите редактировать.

2. Определите новые значения в полях текущей записи.

3. Используйте метод Update или любой из методов Move

Следующий пример показывает, как с помощью программного кода изменить содержимое поля PubID в первой записи таблицы Titles. Обратите внимание, что вы можете изменить данные либо в самом наборе записей, либо в связанном объекте управления:

Data1.DatabaseName = "C: \VB5\BIBLIО2.MDB"

Data1.RecordSource = "Titles"

Data1.Refresh

Data1.Recordset("PubID") = "48"

TxtPub.Text = "Visual Basic"

Data1.Recordset.Update


Удаление записей

Чтобы удалить запись, установите указатель на требуемую запись и примените метод Delete объекта Recordset. Удаление одной записи нам уже встречалось при изучении свойства Recordset объекта управления данными. Чтобы удалить группу записей, надо повторить подобные действия необходимое количество раз. В следующем примере из таблицы Titles базы данных BIBLIO.MDB удаляются все записи, у которых поле “Year Published” содержит величину меньшую, чем 1989.

Data1.DatabaseName="C: \VB5\BIBLIO.MDB"

Data1.RecordSource="Select * from Titles where [Year Published]<1989"

Data1.Refresh

Do While Data1.Recordset.EOF = False

Data1.Recordset.Delete

Data1.Recordset.MoveNext

Loop

В этом примере при каждом проходе тела цикла используется метод MoveNext для перемещения указателя на следующую запись. Вам необходимо использовать этот метод, так как после удаления текущая запись становится недопустимой (invalid) и любая попытка доступа к ней вызовет ошибку.

Использование пары методов Delete и MoveNext не является единственным способом удаления сразу нескольких записей из базы данных. Для аналогичных целей можно использовать соответствующий SQL-запрос. Например, вместо приведенного выше кода можно использовать аналогичный по своему действию SQL-запрос:

DELETE FROM Titles WHERE [Year Published] < #1/1/1989#.

Причем, такой подход оказывается более эффективным, чем применение в цикле пары методов Delete и MoveNext.

Урок 6 Связанные с данными элементы управления

Применение связанных с данными элементов управления — Data-bound Controls уже кратко обсуждалось в уроке, посвященном работе с Data Control. Связанные элементы управления служат для отображения на экранной форме содержимого записей из таблиц базы данных и всегда используются только вместе с объектом Data.

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

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

В Visual Basic 5 в качестве связанных с данными элементов управления может использоваться целый ряд обычных элементов управления:

Text box — текстовое окно, Label — метка, Check box — контрольный индикатор, Image — изображение, Picture box — графическое окно, List box — список, Combo box — комбинированное окно, OLE container control — OLE-контейнер.

Примеры использования текстовых окон для отображения содержимого записей базы данных были уже рассмотрены в предыдущей главе.

Кроме обычных элементов управления для работы с базами данных, пятая версия Visual Basic поддерживает несколько ActiveX объектов:

Data-bound list box — связанный с данными список,

Data-bound combo box — связанное с данными комбинированное окно,

MSFlexGrid — сетка,

Data-Bound Grid (DBGrid) — связянная с данными сетка,

MaskedEdit — окно редактирования с маской,

RichTextBox — улучшенное окно редактирования.

Все эти объекты, за исключением MaskedEdit и RichTextBox позволяют отображать на экране целые группы записей в виде списков или таблиц. А применение DBGrid позволяет настолько повысить функциональность разрабатываемых приложений, что об этом будет специальный разговор.

Более того, если по каким-либо причинам вас не удовлетворяют возможности поставляемых вместе с Visual Basic связанных элементов управления, вы можете использовать связанные элементы управления, созданные другими разработчиками, или можете сами создать собственные ActiveX объекты для связи с данными по вашему вкусу.


Общие свойства связанных элементов управления

Большинство связанных с данными элементов управления имеют три свойства, само название которых определяет их принадлежность к группе объектов, имеющих самое непосредственное отношение к данным — DataField, DataSource и DataChanged. Во всех названиях свойств присутствует слово Data. В следующей таблице приведено их краткое описание.

Свойство ∙ Описание

DataField ∙ Этим свойством определяется имя поля в наборе записей, созданном объектом управления данными

DataSource ∙ Этим свойством определяется имя объекта управления данными, с которым связывается данный элемент управления

DataChanged ∙ Это свойство показывает, было ли пользователем изменено содержимое связанного элемента управления

Чтобы использовать возможности связанных элементов управления вам необходимо: во-первых — определить источник данных указанием имени объекта управления данными в свойстве DataSource и, во-вторых — связать его с требуемым полем базы данных соответствующей установкой свойства DataField. Если база данных доступна во время разработки приложения, то список допустимых полей отображается в окне Properties (Свойства) связанного элемента управления (рис. 6.1).



Рис. 6.1. Установка свойства DataField текстового окна

Урок 7. Метка (Label), текстовое окно (Text box),...

...окно редактирования с маской (MaskedEdit), контрольный индикатор (Check box), Изображение (Image) и графическое окно (Picture box)

Label и Text Box

Объекты управления Label и Text Box используются для вывода текстовой информации на экранную форму. При работе с базами данных эти элементы управления могут применяться и для отображения на экране текстовой информации из полей базы данных. На панели инструментов Visual Basic метка и текстовое окно изображены пиктограммами и соответственно. Чтобы установить связь с объектом управления данными необходимо определить их свойства DataSource и DataField соответствующим образом.

Метка (Label) может быть как однострочной, так и многострочной, но в отличие от текстового окна в ней не предусмотрены возможности редактирования и прокрутки данных. Если выводимый текст не помещается в отведенное для метки место на форме, то текст обрезается. Управлять этим поведением можно при помощи свойств AutoSize и WordWrap. Свойство AutoSize определяет поведение размеров метки при изменении длины выводимого текста и по умолчанию устанавливается в False, при этом размер метки не увеличивается с ростом длины строки. При установленном в True свойством AutoSize с помощью установок свойства WordWrap определяется поведение вертикального размера метки. Если WordWrap установлен в False, то при увеличении длины строки переносов слов не будет и горизонтальный размер метки будет увеличиваться до тех пор, пока текст не достигнет правого края экранной формы. Если WordWrap установлен в True, то по мере достижения правой границы метки будет осуществляться перенос слов. Такое поведение меток продемонстрировано на рис. 7.1.



Рис. 7.1. Управление поведением размеров метки при выводе текста с помощью свойств AutoSize и WordWrap


Следует помнить, что для сохранения заданного размера метки по горизонтали необходимо установить свойство WordWrap в True до установки свойства AutoSize. В противном случае, этот размер сразу уменьшится до значения, определяемого длиной строки в свойстве Caption.

Для отображения текстовой информации из базы данных все-таки гораздо больше подходит текстовое окно. Связь с объектом управления данными осуществляется установкой свойств DataSource и DataField.

Как и метка, элемент управления — текстовое окно (TextBox) может быть однострочным или многострочным. Это определяется установкой свойства MultiLine, которое по умолчанию устанавливается в False. Если вы хотите использовать многострочное текстовое окно с возможностью прокрутки данных, то после определения его размеров и месторасположения на экранной форме установите свойство MultiLine в True и, если требуется, свойство ScrollBars (рис 7.2).



Рис. 7.2. Однострочное и многострочное текстовые окна


Если вам требуется выводить текст не подлежащий редактированию пользователем, установите, например, свойство Locked в True.

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


Check box

Связанный с данными контрольный индикатор (Check box) можно использовать для наглядного представления на экранной форме информации из полей базы данных логического типа (Да или Нет, 1 или 0, True или False). Примерами таких данных могут служить: оплачен или не оплачен счет — при разработке системы управления счетами, есть товар на складе или нет — при автоматизации складского хозяйства, постоянный покупатель или нет — в системе работы с покупателями (рис. 7.3) и т. п. На 17 панели инструментов Visual Basic контрольный индикатор обозначен пиктограммой . Связь контрольного индикатора с объектом управления данными осуществляется установкой свойств DataSource и DataField.



Рис. 7.3. Пример использования контрольного индикатора


MaskedEdit

Известно, что пользователи часто совершают ошибки при вводе информации в базы данных. Впрочем, не ошибается лишь тот, кто ничего не делает. Установить некоторый контроль над действием пользователей позволяет использование для ввода специальной информации окна редактирования с маской (MaskedEdit) Этот элемент управления позволяет так же помещать в поле ввода символы разметки. Примером такой информации может выступать номер телефона или почтовый индекс. Типичный номер телефона имеет следующий формат, где скобки и дефисы являются символами разметки, а символ # определяет любую цифру:

(###)###-##-##

Почтовый индекс состоит из шести цифр и не должен содержать букв или других символов.

Окно редактирования с маской имеет свойство Mask (Маска), которое позволяет определить формат отображаемой строки в поле ввода. По умолчанию свойство Mask не определено и поведение объекта Mask полностью аналогично обычному текстовому окну. Символы, которые используются в качестве маски приведены в таблице.


Таблица. Символы, используемые в качестве маски

Символ - Описание

# - Любая цифра

- Десятичная точка (например, 3.1415),

, - Разделитель тысяч (например, 1,000,000)

: - Разделитель времени (например, 21:30)

/ - Разделитель даты (например, 05/08/97)

& - Любой символ

A - Любая цифра или буква

? - Любая буква

С полем базы данных объект MaskedEdit связывается установкой свойств DataSource и DataField.

Построим простое приложение в котором будут реализованы возможности рассмотренных в этом разделе связанных элементов управления. Создадим, например, при помощи приложений VisData или MS Access базу данных CUSTOMER.MDB с одной таблицей CUSTOMERS, в которой будем хранить информацию о покупателях. Пусть эта таблица будет содержать следующие поля:



Так как наше приложение будет простой программой просмотра содержимого базы данных, то самостоятельно добавьте в таблицу CUSTOMERS несколько произвольных записей.

Создайте новый проект и расположите на форме объект управления данными, семь меток, пять текстовых окон, окно редактирования с маской и один контрольный индикатор, как показано на рис. 7.4.



Рис. 7.4. Расположение элементов управления на экранной форме


Теперь в окне свойств объекта Data1 определите свойство Caption, как “Покупатели”, установите свойство DatabaseName как имя файла базы данных с указанием полного пути C: \WORK\ CUSTOMER.MDB и укажите имя таблицы Customers в качестве источника данных RecordSource.

Затем установите свойства меток, текстовых окон, окна редактирования с маской и контрольного индикатора следующим образом:

LаЬеl1.Сарtion=Имя

LаЬеl2.Сарtion=Фамилия

LаЬеl3.Сарtion=Предприятие

LаЬеl4.Сарtion=Адрес

LаЬеl5.Сарtion=Телефон

LаЬеl6.Сарtion=Примечание

Text1.DataSource=Data1

Text1.DataField=Name

Text2.DataSource=Data1

Text2.DataField=LastName

Text3.DataSource=Data1

Text3.DataField=Concern

Text4.DataSource=Data1

Text4.DataField=Address

Text5.DataSource=Data1

Text5.DataField=Note

MaskedEdit1.DataSource=Data1

MaskedEdit1.DataField=Phone

MaskedEdit1.Mask=(###)###-##-##

Check1.Caption=Постоянный покупатель

Check1.DataSource=Data1

Check1.DataField=Const

Метку Label7 будем использовать аналогично текстовому окну, в котором отображается содержимое поля Note (Примечание). Для этого установите следующие свойства:

Label6.DataSource=Data1

Label6.DataField=Note

Теперь сохраните и запустите проект. Результат работы приложения показан на рис. 7.5.



Рис. 7.5. Результат работы приложения


Image и Picture box

Для отображения на форме графических объектов в формате Windows (битовые карты — файлы с расширением BMP, иконы — ICO и метафайлы — WMF), а также рисунков в форматах GIF и JPG можно использовать элементы управления Image (Изображение) и Picture Box (Графическое окно). Связываются эти объекты управления с базой данных установкой все тех же свойств DataSource и DataField и на панели инструментов Visual Basic обозначены пиктограммами и соответственно.

Хотя эти элементы управления и служат одной цели, тем не менее, они отличаются эти друг от друга способом отображения графики. Свойство Stretch (Растяжение) объекта Image по умолчанию устанавливается в False и линейные размеры объекта “Изображение” будут изменяться в соответствии с действительными размерами рисунка. Если Stretch равно True, то рисунок при выводе его на форму будет сжиматься или растягиваться согласно взаимному соотношению размеров рисунка и линейным размерам объекта “Изображение”. В этом случае, если длина и ширина объекта и самого рисунка не пропорциональны друг другу то, то что вы увидите на экране может заметно отличаться от оригинала. Картинка может заметно исказиться (рис. 7.6). Таким образом, при использовании объекта Image для вывода графики в любом случае, независимо от установки свойства Stretch, вся картинка разместится на экранной форме.



Рис. 7.6. Влияние установки свойства Stretch на вывод изображения


Использование для представления графики объекта “Графическое окно” позволяет выводить рисунки без искажений. При установке свойства AutoSize объекта Picture в False, а именно так оно определяется по умолчанию, размеры объекта не будут приводиться в соответствие с размерами картинки. Если в этом случае картинка не поместится целиком в графическое окно, то она будет обрезана (рис. 7.7). С другой стороны, если AutoSize равен True, то при выводе картинки на экран размеры графического окна изменятся согласно размерам выводимого изображения.



Рис. 7.7. Влияние установки свойства AutoSize на вывод изображения


Использование элементов управления Image и Picture Box не позволяют проводить редактирование изображений. Если в вашем приложении необходимо вносить изменения в графические изображения, то лучше воспользоваться контейнером OLE.

Урок 8. Окно списка (List box), комбинированное окно (Combo box),...

...контейнер OLE (OLE container), связанное окно списка (Data-bound list box) и связанное комбинированное окно (Data-bound combo box).

List box и Combo box

Окна списка и комбинированные окна удобно использовать когда необходимо предоставить возможность пользователю выбирать элемент из списка. Кроме того, с помощью комбинированного окна пользователь может добавить элемент в список, а панели инструментов Visual Basic окно списка и комбинированное окно изображены пиктограммами и . Как и все обычные элементы и комбинированное окно изображены пиктограммами управления Visual Basic окна списка и комбинированные окна связываются с базой данных установкой свойств DataSource и DataField.

Заполнение списков проводится при помощи метода Addltem или установкой свойства List.

Построим простое приложение для демонстрации использования списка и комбинированного списка. Положим, что у нас есть база данных PRODUCTS.MDB для учета товаров, единственная таблица которой PRODUCTS содержит поля, как показано в таблице.



Текстовое поле Depository определяет наличие товара на складе и может содержать только одну из двух строк “Да” или “Нет”.

Создайте новый проект и расположите на форме объект управления данными, пять меток, четыре текстовых окна, командную кнопку, список и комбинированный список как показано на рис. 8.1.



Рис. 8.1. Расположение элементов управления на форме


В окне свойств объекта Data1 определите свойство Caption, как “Товары”, установите свойство DatabaseName как имя файла базы данных с указанием полного пути, например, C: \WORK\PRODUCTS.MDB и укажите в качестве источника данных имя таблицы PRODUCTS определением свойства RecordSource. Затем установите свойства меток, текстовых окон и командной кнопки, списка и комбинированного списка следующим образом:

Label1.Caption=Код товара

Label2.Caption=Наименование

Label3.Caption=Цена

Label4.Caption=Присутствие на складе

Label5.Caption=Примечание

Соmmand1.Caption=Добавить

Text1.DataSource=Data1

Text1.DataField=Id

Text2.DataSource=Data1

Text2.DataField=Product

Text3.DataSource=Data1

Text3.DataField=Price

Text4.DataSource=Data1

Text4.DataField=Note

List1.DataSource=Data1

List1.DataField=Depository

Combo1.DataSource=Data1

Combo1.DataField=Depository

В процедуру обработки события нажатия кнопки добавьте код, который добавит пустую запись в набор записей и сделает ее текущей:

Private Sub Command1_Click()

Data1.Recordset.AddNew

End Sub

И наконец, в окне свойств списка и комбинированного списка определите свойство List добавив строки “Да” и “Нет”.

Запустите проект и добавьте записи в базу данных. Ввести значение в поле Depository можно выбрав “Да” или “Нет” в простом или комбинированном списке. При перемещении указателя текущей записи по набору записей в комбинированном списке будет отображаться “Да” или “Нет” в зависимости от содержимого поля Depository, в то время как в обычном списке значение поля будет выделяться подсветкой (рис. 8.2).



Рис. 8.2. Результат работы приложения


Контейнер OLE (OLE container)

Применение объекта OLE container дает возможность не только размещать на экранной форме приложения различные OLE-объекты, хранящиеся в базе данных, но и редактировать их. В качестве OLE-объектов могу выступать например: рисунки, документы Microsoft Word, таблицы Microsoft Excel, звуковые фрагменты и видеоклипы и многое другое. Посмотреть, какие OLE-объекты вы имеете возможность разместить в своей базе данных можно, например, выполнив команду меню Вставка->Объект текстового процессора Microsoft Word. В появившемся окне будет находиться список всех объектов OLE, зарегистрированных в вашей системе (рис. 8.3).



Рис. 8.3. Список OLE-объектов, зарегистрированных в системе


В своем приложении вы можете использовать либо внедренные (embedded) либо связанные (linked) объекты. Внедренные OLE-объекты содержат информацию как о самом объекте, так и о приложении его создавшем — OLE-сервере. Редактирование внедренного объекта можно проводить только с помощью приложения-клиента. В нашем случае это разрабатываемая СУБД. В отличие от внедренных, связанные OLE-объекты в базе данных сохраняют связь с объектом — оригиналом и любое изменение оригинала приведет к аналогичному изменению объекта, хранящегося в БД.

В базе данных формата MS Access внедренные объекты или ссылки на связанные объекты всегда хранятся в поле типа OLE Object. Понятно, что если вы создадите базу данных с документами Microsoft Word, то просматривать эту БД можно будет только на компьютере, на котором так же установлен этот текстовый процессор.

Контейнер OLE связывается с базой данных установкой свойств DataSource и DataField и его пиктограмма на панели инструментов — .

Продемонстрируем использование элемента управления OLE-контейнер в приложениях. Для этого построим простую СУБД по управлению базой данных, содержащую OLE-объекты.

Положим, что у на есть база данных OLEOBJ.MDB, таблица которой OBJ содержит поля, как показано в таблице.



Создайте новый проект и расположите на форме объект управления данными, две метки, два текстовых окна, OLE-контейнер и командную кнопку, как показано на рис. 8.4.



Рис. 8.4. Расположение элементов управления на экранной форме


Установите свойства объекта управления данными следующим образом. Свойство Caption определите как “OLE объекты”, свойство DatabaseName установите как имя файла базы данных C: \WORK\DB.MDB и укажите в качестве источника данных (свойство RecordSource) имя таблицы OBJ. Затем установите свойства меток, текстовых окон, контейнера OLE и командной кнопки:

Label1.Caption=Идентификатор

Label2.Caption=Описание

Text1.DataSource=Data1

Text1.DataField=Id

Text2.DataSource=Data1

Text2.DataField=Desc

OLE1.DataSource=Data1

OLE1.DataField=Obj

Command1.Caption=Добавить

Запустите проект. Если ваша базе данных не пуста и в ней есть какие-либо записи с OLE-объектами (в данном случае с помощью MS Access созданы две записи с математическим уравнением и рисунком), вы увидите, что в OLE-контейнере отобразится содержимое поля Obj первой записи (рис. 8.5).



Рис. 8.5. Результат работы приложения


Внедренные объекты можно редактировать. Нажатие правой кнопки мыши на OLE-контейнере приведет к появлению всплывающего меню с двумя пунктами: “Изменить” и “Открыть”. Выбор первого пункта позволит вам редактировать содержимое OLE-контейнера прямо в вашей экранной форме, в то время как выбор второго — приведет к запуску приложения-сервера и загрузке в него содержимого OLE-контейнера (рис. 8.6). В данном случае это будет редактор формул, входящий в поставку текстового процессора MS Word. После внесения необходимых изменений закройте приложение-сервер и убедитесь, что результаты редактирования отображены в базе данных.



Рис. 8.6. Запуск приложения-сервера


Таким образом мы создали приложение, которое позволяет не только просматривать, но и редактировать OLE-объекты, хранящиеся в базе данных. Это могут быть совсем разные объекты: математические уравнения, рисунки, текстовые документы, таблицы, диаграммы и др.

В нашем приложении осталась незадействована командная кнопка “Добавить”. Очевидно, что она должна быть предназначена для добавления новых записей в базу данных. Добавим в процедуру обработки события нажатия этой кнопки код, который позволит нам добавлять пустую запись в конец набора записей:

Private Sub Command1_Click()

Data1.Recordset.AddNew

OLE1.InsertObjDlg

End Sub.

Метод InsertObjDlg OLE-контейнера отображает на экране диалоговое окно выбора типа объекта (рис. 8.7). Отметив кнопку-переключатель Create New (Создать новый), вы можете вставить новый объект в базу данных, выбрав требуемый тип из списка зарегистрированных в системе объектов OLE. Выбор кнопки-переключателя Create from File (Создать из файла) позволит вам вставить в базу данных уже существующий на вашем жестком диске OLE-объект (рис. 8.8). При этом вы можете установить связь между файлом-оригиналом и добавленным в базу данных объектом, отметив контрольный индикатор Link (Установить связь).



Рис. 8.7. Диалоговое окно вставки объекта



Рис. 8.8. Вставка объекта из файла


Теперь с помощью нашего приложения вы можете не только просматривать и редактировать OLE-объекты в базе данных, но и добавлять новые, предварительно выбрав его тип. Однако в базах данных хранятся, как правило, объекты одного типа. Для создания объекта требуемого типа можно использовать метод CreateEmbed объекта OLE-контейнер. Метод имеет следующий синтаксис:

object.CreateEmbed sourcedoc, class.

Объектное выражение object определяет имя объекта OLE-контейнера. Первый аргумент — sourcedoc является обязательным и определяет имя файла документа, используемого как шаблон для внедряемого объекта. Если вы не определяете этот файл, то необходимо задать этот аргумент в виде пустой строки Второй аргумент — class не обязателен и определяет класс внедряемого объекта. Этот аргумент игнорируется, если определен параметр sourcedoc.

Когда вы создаете новый внедренный OLE-объект при помощи метода CreateEmbed, приложение-сервер, определяемое именем класса — class, должно быть корректно зарегистрировано в вашей системе. Посмотреть классы объектов можно выбрав в окне свойств OLE-контейнера свойство Class и нажав справа кнопку с тремя точками. Появится окно со списком всех зарегистрированных классов (рис. 8.9).



Рис. 8.9. Окно выбора класса


Свойство Class объекта OLE-контейнер определяет имя класса внедряемого объекта следующим образом:

application.objecttype.version

objecttype.version

где application определяет приложение, objecttype определяет тип объекта в библиотеке объектов приложения и version определяет номер версии. Например, электронная таблица MS Ecxel пятой версии поддерживает несколько объектов — рабочие листы (worksheets) и диаграммы (charts). Соответствующие имена классов — Excel.Sheet.5 и Excel.Chart.5.

Вернемся к нашему приложению. Несколько изменим код обработки события нажатия командной кнопки, для вставки математического выражения:

Private Sub Command1_Click()

Data1.Recordset.AddNew

OLE1.CreateEmbed "Equation.2"

End Sub

Теперь при нажатии кнопки “Добавить” в базу данных будут добавляться записи, содержащие математические уравнения, которые вы можете редактировать в окне OLE-контейнера на вашей экранной форме.


Связанное окно списка (Data-bound list box) и связанное комбинированное окно (Data-bound combo box)

Связанные с данными окно списка и комбинированное окно в отличие от своих обычных аналогов List и Combo box специально разработаны для использования в СУБД и их основное предназначение — упростить ввод или отображение на экранной форме информации из базы данных в виде списков.

По умолчанию пиктограммы этих элементов управления отсутствуют на панели инструментов Visual Basic. Чтобы их добавить, надо выполнить команду меню Project — > Components, выбрать из списка элементов управления (Controls) Microsoft data bound list controls и затем нажать кнопку OK (рис. 8.10). К аналогичному результату приведет щелчок правой кнопкой мыши на панели инструментов.

Последствием этих действий будет появление следующих пиктограмм: (связанный список) и (связанное комбинированное окно) на панели инструментов. Теперь вы можете добавлять эти объекты управления в проекты своих приложений просто отбуксировав их с панели инструментов на экранную форму.



Рис. 8.10. Список элементов управления Visual Basic


Объекты управления Data-bound list box и Data-bound combo box имеют пять свойств, установка которых определяет их поведение как связанных с данными элементов управления. Краткое описание этих свойств приведено в таблице.


Таблица. Свойства связанного списка и связанного комбинированного окна

Свойство ∙ Описание

RowSource ∙ Имя объекта управления данными, которое используется для заполнения списка.

ListField ∙ Имя поля в наборе записей, определенном свойством RowSource, которое используется для заполнения списка.

DataSource ∙ Имя объекта управления данными, с которым связывается список.

DataField ∙ Имя поля в наборе записей, определенном свойством DataSource. Это поле используется для определения, какой элемента списка выбран. После выбора элемента списка и перемещения указателя текущей записи на другую запись это поле будет обновлено.

BoundColumn ∙ Имя поля в наборе записей, определенном свойством RowSource, значение которого будет скопировано.


Поля определяемые свойствами DataField и BoundColumn, должны быть одного типа.

Приведем пример простого приложения, в котором показано на практике как использовать связанные списки и связанные комбинированные окна для связи с данными.

Будем использовать базу данных FRIENDS.MDB, которая была создана ранее при демонстрации некоторых возможностей приложения VisData в первой главе. Эта база данных состоит из двух таблиц: PERSON, в которой находится персональная информация о ваших знакомых, и WORKPLACE, содержащая сведения об их местах работы или учебы. Связь между таблицами осуществляется на основании содержимого совпадающих полей Id work.

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

Создайте новый проект и расположите на экранной форме два объекта управления данными, связанный список, связанное комбинированное окно, четыре метки и три текстовых окна, как показано на рис. 8.11.



Рис. 8.11. Расположение элементов управления на форме


В окне свойств первого объекта управления данными установите свойство DataBaseName как имя базы данных FRIENDS.MDB с указанием полного пути к файлу. Затем установите свойство RecordSource как PERSON. Использование кнопок со стрелками этого объекта управления даст возможность пользователю перемещаться от записи к записи в таблице PERSON. У второго объекта управления данными установите свойство DataBaseName аналогичным образом и определите источник записей как следующий SQL-запрос:

SELECT Idwork, Office FROM WORKPLACE ORDER BY Id_work.

В результате выполнения этого запроса будет создан набор записей, содержащий значения полей Id work и Office, и упорядоченный по полю Id work. В принципе, второй объект управления данными можно сделать невидимым, установив его свойство Visible в False, так как для работы нам потребуется только созданный им набор записей.

Определите свойства меток, текстовых окон, списка и комбинированного окна следующим образом:

Label1.Caption=Имя

Label2.Caption=Фамилия

Label3.Caption=Идентификатор места работы

Label4.Caption=Обновление места работы

Text1.DataSource=Data1

Text1.DataField=Name

Text2.DataSource=Data1

Text2.DataField=LastName

Text3.DataSource=Data1

Text3.DataField= Idwork

DBList1.RowSource=Data2

DBList1.ListField=Office

DBList1.DataSource=Data1

DBList1.DataField=Id_work

DBList1.BoundColumn=ID_work

DBCombo1.RowSource=Data2

DBCombo1.ListField=Office

DBCombo1.DataSource=Data1

DBCombo1.DataField= Idwork

DBCombo1.BoundColumn=ID_work

Сохраните и запустите проект (рис. 8.12). В связанных текстовых окнах на экранной форме будет отображаться содержимое полей Name, LastName и Id work из таблицы PERSON. Список и комбинированное окно заполнятся названиями мест работы из таблицы WORKPLACE, причем место работы человека, определенного содержимым текстовых окон, будет выделено в списке подсветкой. Перемещением по набору записей с помощью первого объекта управления данными установите указатель на запись, где вы хотите обновить место работы. Из списка или комбинированного окна выберите требуемое значение и нажмите какую-либо кнопку на первом объекте управления данными, чтобы переместить указатель текущей записи и произвести обновление данных. Теперь верните указатель на ту же запись и убедитесь что информация о месте работы изменена в соответствие со сделанным выбором.



Рис. 8.12. Результат работы приложения

Урок 9 Сетка (MSFIexGrid) и улучшенное текстовое окно (RichTextBox)

MSFIexGrid

ActiveX объект MSFIexGrid может применяться для отображения на экранной форме данных, представленных в табличном виде. Если сетка MSFIexGrid связана с базой данных, то данные используются в режиме только для чтения. Это значит, что вы можете проводить операции над содержимым ячеек таблицы, например, сложение, умножение, сравнение, слияние строк, вывод результатов в ячейки, но не можете обновить данные в базе данных. Для установки связи сетки MSFIexGrid с данными используется свойство DataSource, которое определяется как имя соответствующего объекта управления данными.

Чтобы добавить объект MSFIexGrid на панель инструментов, выполните команду меню Project — > Components и выберите из списка элементов управления (Controls) Microsoft FlexGrid Control и затем нажмите кнопку ОК.

После этого на панели инструментов появится новая пиктограмма -.

Свойства Row и Col объекта MSFIexGrid определяют положение текущей ячейки. Содержимое текущей ячейки доступно через свойство Text, то есть данные в таблице хранятся в текстовом виде. Этот факт не доставляет много хлопот, так как в Visual Basic есть функции преобразования строки в число и обратно. Если в ячейку требуется занести число, то необходимо использовать функцию преобразования числа в строку CStr, например:

MSFlexGrid1.Text=CStr(sum).

С другой стороны, при извлечении числа из текстового содержимого ячейки можно использовать функцию Val, например:

sum=sum + Val(MSFlexGrid1.Тext)

Свойства Rows и Cols позволяют определить количество строк и столбцов в сетке. Наличие заголовков у строк и столбцов можно установить с помощью свойств FixedRows и FixedCols. Содержимое заголовков определяется свойством FormatString. Например, следующей пример показывает, как установить заголовки столбцов сетки:

s$ = "<Код товара |<Дата зак.|<Код покуп.|>Кол-во |<Наименов. товара|<Цена "

MSFlexGrid1.FormatString = s$

Заголовки строк сетки определяются аналогичным образом, только в начало строки необходимо поместить символ “точка с запятой”, который укажет сетке, что это именно заголовки строк:

s$ = Имя|Адрес|Телефон"

MSFlexGridl1.FormatString = s$

Получить или установить содержимое произвольной ячейки позволяет свойство TextArray. Это свойство имеет синтаксис:

MSFlexGrid1.TextArray(cellindex) [= string]

где string — текстовое содержимое ячейки, определенной аргументом cellindex. Аргумент cellindex представляет собой индекс ячейки в сетке и рассчитывается следующим образом. К номеру колонки произвольной ячейки прибавляется произведение ее номера строки на общее количество колонок в сетке, определенное свойством Cols. Для расчета аргумента cellindex удобно использовать следующую функцию:

Function GetCellIndex(row As Integer, col As Integer) As Long GetCellIndex = row*MSFlexGrid1.Cols + col End Function

При операциях со строками и колонками объекта MSFIexGrid следует помнить, что отсчет строк и колонок ведется не с единицы, а с нуля. Таким образом, первая строка сетки, в которой обычно находятся заголовки, на самом деле является нулевой строкой.

Для демонстрации использования объекта MSFlexGrid создадим приложение, предназначенное для просмотра полей базы данных, содержащей информацию о покупателях, сделанных ими заказах и товарах.

База данных CASTOMER.MDB включает в себя три таблицы:

CASTOMER — содержит информацию о покупателях,

ORDERSALES — содержит информацию о сделанных ими заказах,

PRODUCTS — содержит информацией о товарах.

Структуры таблиц базы данных показаны в следующих таблицах.


Таблица. Структура таблицы CASTOMER

Поле ∙ Описание

Idcust ∙ Код покупателя

Name ∙ Имя

LastName ∙ Фамилия

Concern ∙ Предприятие

Address ∙ Адрес

Phone ∙ Телефон

Note ∙ Примечание


Таблица. Структура таблицы ORDERSALES

Поле ∙ Описание

Idprod ∙ Код товара

Dateorder ∙ Дата заказа

idcust ∙ Код покупателя

numorder ∙ Количество заказанного товара

Datesale ∙ Дата продажи

numsale ∙ Количество проданного товара

Note ∙ Примечание


Таблица. Структура таблицы PRODUCTS

Поле ∙ Описание

Idprod ∙ Код товара

Product ∙ Наименование товара

Price ∙ Цена за единицу товара

Repository ∙ Наличие товара на складе

Note ∙ Примечание


Связь между таблицами осуществляется на основании значений совпадающих полей idcust и Idprod.

Создайте новый проект и расположите на форме два объекта управления данными, пять меток, четыре текстовых окна, командную кнопку и объект управления MSFIexGrid. Размещение объектов показано на рис. 9.1.



Рис. 9.1. Расположение элементов управления на экранной форме


В окне свойств первого объекта управления данными установите свойство DataBaseName как имя базы данных CASTOMER.MDB. Затем определите свойство RecordSource этого объекта как CASTOMER. У второго объекта Data установите свойство DataBaseName аналогичным образом, а его свойство RecordSource определим позднее в коде программы и оно будет устанавливаться должным образом во время выполнения приложения. Этот объект можно сделать невидимым, установив его свойство Visible в False.

Определите свойства меток, текстовых окон и объекта MSFIexGrid следующим образом:

Label1.Caption=Имя

Label2.Caption=Фамилия

Label3.Caption=Предприятие

Label4.Caption=Код покупателя

Label5.Caption=Заказы

Text1.DataSource=Data1

Text1.DataField=Name

Text2.DataSource=Data1

Text2.DataField=LastName

Text3.DataSource=Data1

Text3.DataField=Concern

Text4.DataSource=Data1

Text4.DataField=Id_Cust

DataSource=Data2

FixedCols=0

FixedRows=1

Cols=2

Rows=2

Теперь установите свойство Caption командной кнопки как “Просмотр заказов” и добавьте в процедуру обработки нажатия кнопки следующий код:

Private Sub Command1_Click()

' Определим источник данных для объекта

Data2 Dim str As String

str = "SELECT ORDERSALES.Id_prod, PRODUCT.product, PRODUCT.price,

ORDERSALES.num_order, ORDERSALES.Date_order, ORDERSALES.Id_cust, ORDERSALES.Date_sale, ORDERSALES.num_sale FROM ORDERSALES, PRODUCT WHERE ordersales.Id_cust=" + Text4.Text + "AND ordersales.id_prod = product.id_prod"

Data2.RecordSource = str

Data2.Refresh


' Установим Заголовки столбцов у объекта MSFlexGrid

s$ = "<Код товара |<Наименов. товара |<Цена |<Кол-во |<Дата заказа |<Код покуп. |<Дата продажи |<Кол-во прод. "

MSFlexGrid1.FormatString = s$

MSFlexGrid1.Rows = MSFlexGrid1.Rows + 1

MSFlexGrid1.row = MSFlexGrid1.Rows — 1

MSFlexGrid1.col = 0 MSFlexGrid1.Text = "Всего:"

MSFlexGrid1.col = 1

' Расчет суммы заказа

Dim i As Integer

Dim sum As Double

sum = 0

For i = MSFlexGrid1.FixedRows To MSFlexGrid1.Rows — 1 sum = sum + Val(MSFlexGrid1.TextArray(GetCellIndex(i, 2))) *

Val(MSFlexGrid1.TextArray(GetCelllndex(i, 3)))

Next

MSFlexGrid1.Text = CStr(sum) + " руб."

MSFlexGrid1.row = 1

MSFlexGrid1.col = 1

End Sub

Function GetCellIndex(row As Integer, col As Integer) As Long GetCellIndex = row * MSFlexGrid1.Cols + col

End Function


Сохраните и запустите проект. Результат работы приложения показан на рис. 9.2.



Рис. 9.2. Результат работы приложения


Улучшенное текстовое окно (RichTextBox)

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

Все эти функции реализованы посредством поддержки этим объектом управления формата RTF (Rich Text Format — расширенный текстовый формат). Объект RichTextBox транслирует текст в формате RTF и выполняет форматирование и отображение текста на экранной форме.

С базой данных RichTextBox связывается установкой свойств DataSource и DataField. Тип поля в базе данных формата MS Access, с которым связывается объект RichTextBox, должен быть Binary или Memo. Если используется другой формат, то поле должно быть большой емкости (например, типа Text у базы данных Microsoft SQL Server).

По умолчанию RichTextBox недоступен на панели инструментов Visual Basic. Добавить его в проект можно выполнив команду меню Project->Components и отметив контрольный индикатор Microsoft Rich ТехВох Control в окне объектов управления (Controls). После этого но панели инструментов появится его пиктограмма ~

Создадим с помощью приложения VisData базу данных RICH.MDB, единственная таблица TEXTS которой содержит два поля Id (типа Integer) и Textl (типа Memo).

В демонстрационном приложении предусмотрим возможность форматирование текста изменением следующих нескольких свойств объекта RichTextBox: SelBold, Selltalic, SelUnderline и SelStrikeThru. Возможные установки этих свойств приведены в таблице.


Таблица. Некоторые свойства улучшенного текстового окна.

Свойство ∙ Описание

SelBold ∙ Если установлено True, то выделенный текст отображается полужирным стилем.

Selltalic ∙ Если установлено True, то выделенный текст отображается курсивом.

SelUnderline ∙ Если установлено True, то выделенный текст подчеркивается.

SelStrikeThru ∙ Если установлено True, то выделенный текст перечеркивается.


Создайте новый проект и расположите на экранной форме объект управления данными, текстовое окно, улучшенное текстовое окно и пять командных кнопок, как показано на рис. 9.3. Обычное текстовое окно позволит увидеть, что представляет собой текст в формате RTF.



Рис. 9.3. Расположение элементов управления на экранной форме


Определите свойства объекта управления данными DataBaseName и RecordSource как “C: \WORK\RICH.MDB” и “Texts”, соответственно. Свойства остальных объектов, расположенных на форме установите следующим образом:

Command1.Caption=Полужирный

Command2.Caption=Курсив

Command3.Caption=Подчеркнутый

Command4.Caption=Перечеркнутый

Command5.Caption=Добавить

Text1.DataSource=Data1

Text1.DataField=Textl

RichTextBox1.DataSource=Data1

RichTextBox1.DataField=Text1


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

Private Sub Command1_Click()

If RichTextBox1.SelBold = Fulse Then

RichTextBox1.SelBold = True

Else

RichTextBox1.SelBold = Fulse

End If

End Sub


Private Sub Command2_Click()

If RichTextBox1.Selltalic = Fulse Then

RichTextBox1.Selltalic = True

Else

RichTextBox1.Selltalic = Fulse

End If

End Sub


Private Sub Command3_Click()

If RichTextBoxl.SelUnderline = Fulse Then

RichTextBox1.SelUnderline = True

Else

RichTextBox1.SelUnderline = Fulse

End If

End Sub


Private Sub Command4_Click()

If RichTextBox1.SelStrikeThru = Fulse Then

RichTextBox1.SelStrikeThru = True

Else

RichTextBox1.SelStrikeThru = Fulse

End If


Private Sub Command5_Click()

Data1.Recordset.AddNew

End Sub


Сохраните и запустите проект. Добавьте произвольную текстовую строку в базу данных и проведите операции форматирования выделяемых участков текста с помощью командных кнопок.

Результат работы этого приложения показан на рис. 9.4. Обратите внимание на то, как в обычном текстовом окне отображается содержимое объекта RichTexBox.



Рис. 9.4. Результат работы приложения

Урок 10 Применение Data Form Wizard для быстрого создания экранных форм

Для быстрого создания приложений, предназначенных для работы с базами данных, может быть использован Мастер форм данных (Data Form Wizard). Эта программа — Мастер входит в комплект поставки Visual Basic и доступна из меню Add-Ins (Дополнения). Однако, по умолчанию, запуск этого приложения недоступен и соответствующую команду следует сначала добавить в меню при помощи Менеджера дополнений (Add-In Manager). Выполните команду меню Add-Ins->Add-In Manager, отметьте контрольный индикатор VB Data Form Wizard в диалоговом окне Менеджера дополнений и подтвердите сделанный выбор нажатием кнопки ОК. Теперь запуск этой программы доступен из меню Visual Basic.

С помощью Мастера форм данных вы в интерактивном режиме легко создадите экранную форму приложения, откроете требуемую базу данных и определите источники данных, расположите на форме объект управления данными и связанные с ним элементы управления Visual Basic. Причем, тип связанных элементов управления будет соответствовать данным, содержащимся в соответствующем поле базы данных. Если потребуется, вы легко добавите на форму командные кнопки для выполнения таких типичных действий пользователя, как добавление или удаление записей, обновление данных и завершение работы приложения.

После запуска в первом диалоговом окне (если не принимать во внимание окна-заставки — Introduction) Мастер потребует указать тип базы данных, которую вы предполагаете использовать в приложении (рис. 10.1). Выбор типа БД производится из списка поддерживаемых Мастером форматов. Это могут быть базы данных в формате Access, dBase, FoxPro или Paradox различных версий. Поддерживаются также удаленные (Remote) базы данных ODBC. Выделите в списке требуемый тип, например, Access и нажмите кнопку Next (Дальше).



Рис. 10.1. Окно выбора типа БД


В следующем окне необходимо указать имя файла базы данных и определить источник данных. Имя файла можно ввести при помощи клавиатуры непосредственно в текстовом окне DataBase Name (Имя базы данных) или, нажав кнопку Browse (Просмотреть), выбрать файл в диалоговом окне Open DataBase (Открыть базу данных). В качестве источников данных могут использоваться таблицы или запросы, доступные из БД. Выбор источников данных проводится с помощью одноименных контрольных индикаторов (рис. 10.2). Сделав выбор, нажмите кнопку Next.



Рис. 10.2. Окно выбора базы данных


Следующее окно Мастера — окно формы (Form). Здесь вы можете определить вид экранной формы приложения нажатием одной из трех доступных кнопок-переключателей (рис. 10.3):

Single record — на форме будут размещены данные только из одной записи,

Grid (Datasheet) — данные на форме будут размещены в виде таблицы,

Master/Detail — при таком выборе возможен просмотр данных из двух связанных таблиц.

В зависимости от сделанного выбора, будущий внешний вид вашей экранной формы будет показан в левом верхнем углу диалоговой панели Form.

После выбора типа формы нажмите кнопку Next.



Рис. 10.3. Окно формы


В следующем окне Record Source (Источник записей) (рис. 10.4) требуется выбрать источник записей из комбинированного списка Record Source, в который включены все источники записей, доступные для выбранной базы данных. В списке Available Fields (Доступные поля) выберите те поля, содержимое которых вы собираетесь отображать на экранной форме. Выбор производится двойным щелчком мыши на требуемом поле или нажатием кнопки с изображением правой стрелки. После этого название выбранного поля переместится из списка доступных полей в список Selected Fields (Выбранные поля). Если вы хотите просматривать содержимое всех доступных полей, нажмите кнопку с двойной правой стрелкой. Кнопки с левыми стрелками позволяют удалить одно или все поля из списка выбранных полей.

Кнопки с вертикальными стрелками позволяют расположить выбранные поля в требуемом вам порядке.

В этом диалоговом окне вы также можете задать поле, которое будет использоваться для сортировки данных. Список доступных полей содержится в комбинированном списке Column to sort by (Колонка сортировки).

Определив источник записей, нажмите кнопку Next.



Рис. 10.4. Диалоговое окно определения источника записей


Разместить на экранной форме дополнительные элементы управления Visual Basic такие, как командные кнопки и объект управления данными вы можете в следующем диалоге — Control Selection (Выбор элементов управления) (рис. 10.5). Из списка Available Controls (Доступные элементы управления) выберите необходимые элементы и нажмите кнопку Next.



Рис. 10.5. Добавление элементов управления на экранную форму


В последней диалоговой панели Мастера вы можете изменить установленное по умолчанию имя вашей экранной формы.

Нажмите кнопку Finish (Завершить) и получите готовую экранную форму вашего приложения (рис. 10.6). В дальнейшем можете вносить, по мере необходимости, любые изменения в расстановку элементов управления на этой экранной форме.



Рис. 10.6. Экранная форма, созданная Мастером.

Загрузка...