    32	Способы доступа к данным в Visual Bat 

    Глава 2.   Работа с данными через элемент управления Data 

    Элемент управления Data можно использовать для создания приложений, 
работающи) данными ряда форматов баз данных. 
    Элемент управления Data взаимодействует с процессором базы данных 
Microsoft Jel позволяет создавать в приложении механизмы доступа к данным с 
минимальным объем! программирования. 
    В этой главе рассматривается использование элемента управления Data и 
нескольк специальных элементов управления для просмотра, редактирования и 
модификации v формации в базе данных. 

    2.1. Способы доступа к данным в Visual Basic 

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

    2.1.1. Использование ядра базы данных Microsoft Jet 

    Объекты Доступа к данным (ОАО) и элемент управления Data для обращения к 
базг данных используют процессор базы данных Microsoft Jet. Процессор Jet 
позволяет обр щаться к следующим трем типам баз данных: 
    •   базы данных формата Jet. Эти базы данных создаются и управляются 
непосредстве но ядром Jet. Microsoft Access и Visual Basic используют один и 
тот же процессор ба; данных Jet; 
    •   базы данных индексно-последовательного метода доступа (ISAM). Форматы 
эп баз данных включают Btrieve, dBASE, Microsoft Visual FoxPro, Paradox, а 
также текстовь файлы и HTML; 
    •   ODBC-совместимые базы данных. Эти базы данных включают базы данных кл 
ент/сервер, которые соответствуют стандарту ODBC, такие, как Microsoft SQL 
Server, помощью Visual Basic может быть доступно большинство баз данных, 
которые поддерж вают ODBC. 

    2.1.2. Другие методы доступа к данным 

    Другие методы доступа к данным, поддерживаемые Visual Basic, включают: 
    •   элемент управления Remote Data Source. Это — элемент управления, 
используемь для получения доступа к базам данных ODBC. Remote Data Source 
доступен только редакции Enjtejprjse; 
    •   библиотеки ODBC. Эти библиотеки позволяют вызывать непосредственно 
интерфе)! программирования приложений (API) ODBC; они доступны как отдельный 
программнь продукт; 
    •   библиотеки Visual Basic SQL (VBSQL). Эти библиотеки обеспечивают 
прямую связь Microsoft SQL Server; они доступны как отдельный программный продукт. 


    Глава 2. Работа с данными через элемент управления Data	33 


    2.2. Основы организации данных 

    3 большинстве систем баз данных используется реляционная модель 
организации базы данных. 
    Реляционная модель базы данных представляет данные как семейство таблиц. 
Таблица — логическая группа связанной информации. Например, база данных может 
содержать таблицу, в которой хранятся данные служащих, и другую таблицу, в 
которой хранятся заказы. 
    На следующей иллюстрации показана структура примерной базы данных 
Nwind.mdb, поставляемой с Visual Basic (структура получена в окне 
Relationships (Схема данных) в Microsoft Access): 


    ~~;~;        :    :~z^^,w;«'<:;r '    :	———:L""*       11 
    .    ja.;.wj.«-w   !	t   ..                       m l     ._:      .;...   
   ,      m .—....   H 
    ЗцщёегЮ     _i.   Й '  ' ProducUD	""tjj Orderro               —— 
OnterlD	^J- CushmerSD ^ 
    I        CompanyNarn            \       ProductName	ЧЬ; ProductTO	^   
CustomerlD	""'      CornpanyNarr 
    ContactName        ; *§« SupplierlD	;~' •. ; UnitPrice	-: IT EmployeelD	ContactName 
    ContactTitle                "*•. CategorylD	^Quantity	OrderDate	ContactTitle 
    ftddress         •. '•              QuantityPerUnit	Discount	RequiredDate	Address 
    City                -               UnitPrice	——————————	ShippedDate	„,    
 icity 
    .  Region                          ; s 
UnitsInStock	ff»fjj»ts>'5«i.j*5.»m-	ShipVia	~"     • Region 
    1       .' PostalCode    _      '. Й] UnitsOnOrder	;                       
                  ;	t        Freight	! PostalCode 
    Country                       'x?' ReorderLevel	<  ч -       EmployeelD  
^	5hipName	| Country        — 
    Phone               -           ^Discontinued	i >     . • 
LastName	ShipAddress	Phone           *\ 
    "'•••_____-Д            -—„,-, ^,,-,-,4            FirstName	ShipCity	——————————' 
    ;,:««*:^ч\е,-!Ь5Ч%,;	Title	ShipRegion	,-;•,";   ,,-4%^*.%, 
    ,	TitleOFCourteJ	shipPostalCode	i рШкННВ 
    Categuryro           —'	BirthDate	ShioCnuntrv	КОЛЗЛ!^га» 
    :          CategoryName	HireDate	P           Y	CompanyName 
    !: Description          :	Address	]phor'e______ 
    Picture	City                »J 
    _iU_______________________________±r|_ 

    Рис. 2.1. Реляционная структура базы данных. 

    2.2.1. Элементы таблицы 

    База данных Nwind содержит ряд таблиц, группирующих информацию. Это, 
например, таблицы Orders (заказы), Customers (клиенты) и Employees (служащие). 
    В базе данных Jet строки таблицы называются записями, а столбцы — полями. 
На рис. 2.2 приводится иллюстрация структуры таблицы Employees. 

    Первичный ключ 

    Каждая таблица включает первичный ключ, который является полем (или 
комбинация полей), уникальным для каждой строки в таблице. 
    i Например, для таблицы Employees первичный ключ — поле EmployeelD. 
    1 Таблица может также содержать внешние ключи — поля, которые ссылаются на 
строку в другой таблице. 
    i Например, в базе данных Nwind таблица Orders содержит поле CustomerlD. 
Это поле — внешний ключ, так как оно ссылается на "внешнюю" таблицу Customer, 
а не на таблицу 
    ; Orders. Вместо того чтобы дублировать всю информацию по заказчику для 
каждого заказа, для каждого заказа имеется только один заказчик, но, в то же 
время, один заказчик может иметь много заказов. В терминологии баз данных 
отношение между информацией заказчика и таблицей Orders — отношение один-к-многим. 

    34 Работа с элементом управления D 
    

    ^•1	able Structure	E3l 
    Table Name:                  (Employees 
    Field List:	Wame:                      JEmployeelD 
    FrnnlnvefilD                                        14 
    !ЗЙ	LastName	Туре:                       |                         Г 
    1	FirstName Title	Size;                       |                        Г 
    TitleOfCourtesy BirthDate HireDate Address	CollatingOrderi       j         
             f~ Г" AllowZeroLength 
    Ш'	City	OrdinalPosition;       |o                      Г Required 
    1	PostalCode	ValidationText;       1 
    1	Country                                             . HomePhone          
                         J^J	ValidationRule:        1 
    Add Field       j    Remove Field	DefaultValue:          1 
    Index List:	Name:                    jPrimaryKey 
    LastName PostalCode                                . шшшшнмнинмммммнии	r   
                       r,                          r, F                      Г 
    Add Index      I   Remove Index	Fields:      |+EmployeeID 

    Рис. 2.2. Структура таблицы (используется окно Table Structure надстройки 
Visual Data Manager). 

    Записи 

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

    Индексы 

    Индексы таблиц баз данных — сортированные списки, поиск информации в 
которых ocyi ствляется значительно быстрее, чем непосредственно в таблицах. 
    С целью обеспечения более быстрого доступа к базе данных в большинстве баз 
дат используется один или больше индексов. Например, в таблице Employees может 
6i построен индекс для столбца EmployeelD. 

    2.3. Работа с элементом управления Data 

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

    Глава 2. Работа с данными через элемент управления Data 35 

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

    2.3.1. Доступ к данным с помощью элемента управления Data 

    Элемент управления Data реализует доступ к данным с использованием 
процессора базы данных Microsoft Jet. Эта технология обеспечивает доступ к 
базам данных многих форматов. 
    Процесс создания приложения базы данных с применением элемента управления 
Data включает следующие два шага: 
    1. Добавить элемент управления Data к форме и установить свойства, 
специфицирующие базу данных и таблицу, из которой будут отбираться данные. 
    2. Добавить к форме связанные элементы управления и установить их 
свойства, чтобы i       связать их с элементом управления Data; после этого в 
них могут отображаться данные. 

    Использование связанных элементов управления 

    После размещения сватанного элемента управления в форме и установки его 
свойств в этом элементе управления автоматически отображаются данные из базы 
данных. Если | пользователь изменяет данные в связанном элементе управления, 
эти изменения автома-тически фиксируются в базе данных, когда пользователь 
перемещается на другую запись. С данными может быть cjgjati^g^^cjj^eHHbix 
элементов управления Visual Basic, включая флажок (CheckBox), образ (Image), 
надпись (Label), изображение (PictureBox), текстовое поле (TextBox), простой 
список (ListBox), поле со списком (ComboBox) и OLE-контейнер. 
    На следующей иллюстрации показана примерная форма, которая содержит 
элемент управ-!  ления Data и два связанных элемента управления: 

    'не       Фамилия	(Степанков———:———— Свойства поля: 
    эв	________         ;     - DataSource = Datal 
    Имя	|Кирилл!                             -DataField = Last Name 
    М| 41 Datal "	ПЛИ]———•— Свойства элемента управления Data: 
    |Ца        ——-,.	;      - DatabaseName = NWIND.MDB 
    '      - RecordSource = Employees 

    Рис. 2.3. Форма с элементом управления Data и связанными элементами управления. 

    Чтобы увидеть демонстрацию использования элемента управления Data, нужно, 
в соответствии с иллюстрацией, разместить на форме элементы управления, 
установить их свойства и запу-ых  стить проект. С помощью такого простого 
приложения можно просматривать и редактировать JTb  информацию из базы данных 
Nwind (или какой-либо другой). Эти шаги описаны ниже. 

    Установка свойств элемента управления Data 

    Чтобы соединить элемент управления Data с базой данных: 
    еи  1. Специфицировать базу данных, к которой требуется получить доступ, 
внеся имя базы я.       данных в свойство DatabaseName. 
    пе  2. Специфицировать записи, которые требуется отбирать, внеся в 
свойство RecordSource ,ьк      имя таблицы базы данных или строку SQL. 

    36	Работа с элементом управления Dai 


    Примечание: Чтобы соединиться с базой данных dBase, Paradox или Btrieve, 
нужно указать свойстве DatabaseName папку^котррая содержит файлы базы данных, 
и установить в свойств Connect соответствующий тип базы данных. 


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

    После того как установлены свойства для элемента управления Data, нужно 
связать отдел! ные элементы управления с элементом управления Data и затем 
специфицировать, какс поле таблицы будет отображать каждый элемент управления. 
    Чтобы связать элемент управления с элементом управления Data: 
    1. Во время разработки внести в свойство DataSource элемента управления 
имя элемент управления Data (в форме может быть несколько элементов управления Data). 
    2. Во время разработки или в период выполнения специфицировать поле, 
которое требуе" ся связать с элементом управления, установив его свойство DataField. 

    2.3.2. Некоторые свойства и методы элемента управления Data 

    Свойство Connect 

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

    Свойство Exclusive 

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

    Свойство Readonly 

    Свойство Readonly определяет, может ли пользователь модифицировать базу 
данны) Если модифицировать базу данных не планируется, более эффективно будет 
установит свойство Readonly в True. 

    Свойство Recordset 

    Свойство Recordset —?бъекг, который содержит набор записей, возвращенных 
элементе! управления Data. С этим свойством связаны свойства и методы, которые 
можно использс вать при работе с возвращенными записями. 

    Свойства BOFAction и EOFAction 

    Эти свойства определяют, какое действие должен выполнить элемент 
управления Date когда свойства ВОР или EOF набора записей принимают значение True. 
    Например, если свойство EOFAction элемента управления Data установлено в 
vbAc tionAddNew и элемент управления Data используется для перемещения ниже 
последне записи набора записей, будет автоматически выполнен метод AddNew, 
позволяющи: вводить новую запись.	"~~ 

    Метод Refresh 

    Метод Refresh регенерирует объект Recordset. Если в период выполнения 
изменяете свойство RecordSource, необходимо вызвать метод Refresh, чтобы 
обновить набор записеР В следующем фрагменте показано, как использовать метод Refresh: 

    Глава 2. Работа с данными через элемент управления Data	37 

    Datal.RecordSource = "SELECT * FROM Employees " & _ 
    "WHERE [Employee ID] = " & txtEmpID.text Datal.Refresh 

    2.3.3. Объект Recordset 

    В приложении базы данных пользователи перемещаются по записям базы данных, 
используя кнопки элемента управления Data. Ниже показано, что "скрывается" за 
элементам управления Data и его кнопками.	" ~"——~ 

    Что такое Recordset? 

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

    Определение границ набора записей 

    Если для изменения позиции текущей записи используется программный код, 
необходимо определить начало и конец набора записей, контролируя свойства EOF 
и ВОР объекта Recordset. При перемещении к записи EOF или BOF выполняется 
действие, установленное значением свойства BOFAction или EOFAction. 
    Например, можно установить EOFAction таким образом, чтобы автоматически 
добавлялась новая запись. Если свойство EOFAction установлено к EOF, то при 
перемещении к записи EOF никакого действия выполняться не будет. В случае же 
перемещения на одну запись до BOF или после EOF возвращается ошибка выполнения. 
    На следующей иллюстрации показано, как свойства BOF и EOF определяют 
границы объекта Recordset (набора записей). 

    ВОР или действие ВОР 
    :	т-                                               1                   ВОЛКОВ 
    Текущая        . ———=———————————— запись    — > -2.        Глухов_______ 
    4        ДаНИЛ6Ц	- зНаапби°сРей 
    п         Степанков______ EOF или действие EOF   _ 
    ;	.            

    Рис. 2.4. Пределы объекта Recordset. 

    Использовать_объект Recordset определенного элемента управления Data в 
программном коде можно через свойство Recordset элемента управления_0а1|а, как 
показано в следующем фрагменте:

    Datal.Recordset.MoveNext   ' Перемещение на следующую запись набора 
    fr"5atal.Recordset.EOF  Then Datal.Recordset.MoyeLast 

    38	Работа с элементом управления D


    2.3.4. Свойства и методы объекта Recordset 

    Для отбора информации из набора записей используются свойства и методы 
объе Recordset. Они позволяют перемещаться по записям, добавлять, 
модифицировать i> удалять записи. 

    Свойства ВОР и EOF 

    Свойства ВОР и EOF объекта Recordset указывают, установлена ли позиция 
текущей зат в наборе перед первой записью или после последней записи. Если в 
наборе записей имеется никаких записей, то и свойство ВОР, и свойство EOF — True. 

    Метод AddNew 

    Добавить новую запись к набору записей можно методом AddNew. При 
выполнении мете AddNew Visual Basic очищает связанные элементы управления и 
устанавливает для ев ства EditMode элемента управления Data значение dbEditAdd. 
    Новая запись не будет добавлена к базе данных, пока не будет явно выполнен 
Mei UpdateRecord или Update или пока пользователь не переместится на другую запись. 
    В следующем фрагменте показано, как добавить новую запись к набору: 

    Sub   cmdAdd_Click   () 
    Datal.Recordset.AddNew 


    Метод UpdateRecord элемента управления Data 

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

    Sub   cmdUpdate_Click   () Datal.UpdateRecord 


    Метод CancelUpdate элемента управления Data 

    Чтобы отменить метод AddNew или Edit и обновить связанные элементы 
управлен данными из текущего набора записей, можно использовать метод CancelUpdate. 
    Например, если пользователь изменил поля на форме, но еще не модифицировал 
и; решил отменить изменения, метод CancelUpdate отменит операцию, обновит поля 
ори нальными данными из набора записей и выведет на экран текущую запись. 
    Ниже показано, как отменить добавление или редактирование записи: 

    Sub   cmdCancel_Click   () Datal.CancelUpdate 


    Метод Delete 

    Для удаления записи из базы данных используется метод Delete. Удаленная 
запись оста* ся текущей, пока пользователь не перемещается на другую запись, 
как показано в следу щем коде.	" " ~ 

    Sub   cmdDelete_Click   () 
    Datal.Recordset.Delete 
    Datal.Recordset.MoveNext 
    If  Datal.Recordset.EOF  Then Datal.Recordset.MoveLast 
    End   If End  Sub 


    Глава 2. Работа с данными через элемент управления Data	39 

    Примечание: В базе данных могут быть установлены определенные правила 
ссылочной целостности. Например, в базе данных Nw/nd установлены правила, 
запрещающие удаление служащих, с а     которыми связаны заказы. Информацию 
относительно управления нарушениями ссылочной цело-1И     стности см. в 
разделе "Ссылочная целостность" главы 4 "Расширенные возможности 
программирования доступа к данным". 

    2.3.5. Мастер Data Form Wizard 

    Data Form Wizard — служебная программа Visual Basic, которая 
генерирует простые формы ie    для работы с базой данных с использованием 
элемента управления Data. Мастер Data Form Wizard можно использовать для 
быстрого формирования исходных (а возможно и окончательных) вариантов форм в 
начале "разработки приложения базы данных. 
    Чтобы загрузить мастер Data Form Wizard, нужно выбрать команду Add-In 
Manager в меню ia Add-lns и в окне Add-In Manager установить соответствующий 
флажок; нажать ОК. После й- этого элемент Data Form Wizard появляется в меню 
Add-lns, откуда его можно запустить. 

    Available Add-lns;	OK        1 
    LJ Microsoft DataTools	Cancel      I j VB ActiveX Control Interface Wizard 
                           ———————' 
    I] VB ActiveX Document Migration Wizard .] VB Add-In Toolbar	Help        I 
    11 VB Application Wizard	————————' 
    I] VB Property Page Wizard [.] VB Wizard Manager 
    t 
    1Я 
    и 
    и-	""""" 

    Рис. 2.5. Окно Add-In Manager. 


    2.3.6. Пример использования мастера Data Form Wizard 

    В следующем примере мастер Data Form Wizard используется для создания 
формы ввода данных для таблиц Orders (заказы) and Order Details (позиции 
заказа) базы данных Nwind.mdb. В форме отображается отношение "один-к-многим" 
между этими двумя таблицами (см. рис. 2.1). 
    1. Создать новый проект Standard EXE. о
    2. Используя Add-In Manager, загрузить Data Form Wizard. 
    3. В меню Add-lns выбрать Data Form Wizard. 
    4. Выбрать опции Data Form Wizard, как показано в следующей таблице: 

    Опция	____                  ________Значение                    ______ 

    Database Format (Формат базы данных)_________ _Access_______________ 
Database Name (Имя базы данных)___________ <Папка> \Nwind.mdb_______ 


    40	Работа с элементом управления Dal 

    Опция	Значение 

    Form Layout (Компоновка формы)____________ Master/Detail___________ Master 
Record Source (Источник записей стороны	Таблица Orders 
"один")________________________________________________ Master Fields (Поля 
стороны стороны "один")                   OrderlD, CustomerlD, EmployeelD, __  
  ___________________________ OrderDate, ShipName_______ Detail Record Source 
(Источник записей стороны             Таблица Order Details 
"многие")______________________________________________ Detail Fields (Поля 
стороны "многие")__________ Все поля таблицы Order Details Record Source 
Relation (Поля для связывания таблиц)       OrderlD______________ Available 
Controls (Доступные элементы управления)     Select All_____________ Form Name 
(Имя формы)_________________ frmOrders____________ 

    5. В окне диалога Project Properties установить frmOrders для Startup Object. 
    6. Запустить приложение. 
    Форма будет выглядеть примерно так (заголовки созданных мастером элементов 
управле ния изменены): 

    '   № заказа	fl024?l Клиент                    JWJET Составил              
  J5 ' ' '""" "" Дата заказа           |Q4.CR94    ~" Грузоотправитель   jVins 
etalcools Chevalier I     I     OrderlD|     ProductlDl                 
UnitPricel     Quantity!        Discount! 
    Добавить J      Удалить J     Обновить      Сохранить       Закрыть 
    [и I -<I^^"~~_"_2~^	И'м 

    Рис. 2.6. Форма для работы с данными отношения "один-к-многим". 

    Созданную таким образом форму в дальнейшем можно модернизировать и 
расширять формируя на основе нее приложение базы данных. 
    Полезно исследовать форму, созданную Data Form Wizard. Для этого нужно 
выйти и; приложения и просмотреть следующие свойства и события формы: 
    а)  Свойства DatabaseName и RecordSource элемента управления Data. 
    б) Процедуры обработки событий элемента управления Data, в особенности 
событи< Reposition, которое гарантирует, что записи отношения "один-к-многим" 
будут синхро низированы.	" ••
    в) Свойства DataSpurce и DataField каждого из текстовых полей. 


    Глава 2. Работа с данными через элемент управления Data	41 

    г)   Процедуру обработки события Click для каждой из командных кнопок. 
    д) Свойство_ра1аЗоигсе элемента управления DBGrid. 

    2.4. События элемента управления Data 

    Элемент управления Data поддерживает три события, которые можно 
использовать для расширения приложения базы данных: Validate, Reposition и 
Error. Эти события позволяют переопределять некоторые моменты умолчательного 
поведения элемента управления Data. 

    2.4.1. Событие Validate 

    Чтобы проверить данные до того, как запись будет сохранена в базе данных, 
можно использовать событие Validate. Это событие происходит непосредственно 
перед тем, как Visual Basic переносит изменения из связанных элементов 
управления в базу данных и перемещает указатель текущей записи на другую 
запись базы данных. 
    Событие Validate можно использовать для вывода пользователям запроса на 
подтверждение изменений. 
    Объявление процедуры события Validate имеет следующий синтаксис: Private 
Sub Data1_Validate (Action As Integer, Save As Integer) 

    Параметр Action 

    Параметр Action указывает операцию, которая обусловила событие Validate. 
Событие Validate может произойти в результате одной из следующих операций: 
    »	метод MoveFirst, MovePrevious, MoveNext, MoveLast; 
    •	метод AddNew; 
    •	метод Update; 
    .   •	метод Delete; 
    '   •	метод Find; 
    »	установка свойства Bookmark; 
    •	закрытие базы данных; 
    •	вызгрузка формы. 
    Чтобы отменить эти действия, нужно установить для параметра Action 
значение vbDataActionCancel. 

    Параметр Save 

    Параметр Save указывает, изменены ли связанные данные. Если Save — True, 
связанные данные были изменены. Чтобы отменить сохранение, можно установить 
Save в False. В следующем фрагменте кода у пользователя запрашивается 
подтверждение изменений в ;   базе данных. Если пользователь отвечает Нет, 
изменения отменяются. 

Private Sub Datal_Validate( Action As Integer, Save As Integer) 
Dim  iResponse  As   Integer 
If  Save  =  True  Then 
    iResponse   =  MsgBox   ("Сохранить   изменения?",   vbYesNo) 
If   iResponse  =  vbNo  Then Save  =   False 
    Datal.UpdateControls   '   Восстановить   значения   полей 
End   
If End   
If End  Sub 


    42	События элемента управления D, 


    2.4.2. Событие Reposition 

    Событие Reposition используется для изменения вида формы или выполнения 
некотор действий при перемещении к новой записи. 
    Это событие происходит, когда Visual Basic перемещает указатель текущей 
записи другую запись в базе данных либо при первоначальном открытии базы данных. 
    В следующем фрагменте показано, как вывести на экран номер текущей записи 
с исполь ванием свойства AbsolutePosition объекта Recordset:	—— 

    Private  Sub  Datal_Reposition() 
    Datal.Caption   =   "Запись   №   "   &  _ 
    Datal.Recordset.AbsolutePosition  +   1 End  Sub 

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

Private   Sub  Datal_Reposition () 
    Datal.Caption=Datal.Recordset.AbsolutePosition 
    If Datal.Recordset("EmployeelD") > 5   Then ' Если  №  служащего > 5 
	Optionl.Value   =  True   '   Служащий  -   руководитель 
    Else 
    	Option2.Value = True ' Иначе, служащий - подчиненный 
    End If 
    Datal.Caption  =   "Запись   №   "   &  _ 
    Datal.Recordset.AbsolutePosition  +   1 
End  Sub 

    Форма, содержащая эту процедуру, выглядит следующим образом: 

    № служащего          [^ '   ~71Г'	Статус служащего 
    Имя                         [Сергей	**" Руководитель 
    .,....,„..,———	! f Подчиненный 
    !   Фамилия                (Степанков	[ 
    I      Добавить        Удалить  1     Обновить J    Сохранить 1     
Закрыть 1 1 .ijTjT Запись №7	T"TQ 
    | 

    Рис. 2.7. Использование события Reposition. 


    Глава 2. Работа с данными через элемент управления Data	43 

    2.4.3. Событие Error 

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

    Бь/eod на экран сообщения об ошибке 

    Если к событию Error не добавлен код обработки ошибок и, когда 
пользователь взаимодействует с элементом управления Data, возвращается ошибка, 
Visual Basic выведет на экран сообщение об ошибке и продолжит выполнение приложения. 
    Если требуется подавить вывод стандартного сообщения об ошибке, можно 
установить параметр Response процедуры ErrorQ в ноль и выводить на экран 
пользовательское сообщение об ошибке, как показано в следующем фрагменте: 

Private   Sub   Datal_Error(DataErr  As   Integer,   Response  As   Integer) 
If  DataErr = 3022 Then ' Дублирование ключевого значения   -  ошибка 
	MsgBox   "Введите  уникальный  номер   служащего" 
	txtEmpID.SetFocus 
	Response   =   О 
Else 
    Response  =   1   '   Вывести   стандартное   сообщение 
End  If 
End Sub 


    2.5. Использование связанных элементов управления ActiveX 

    В дополнение к встроенным связанным элементам управления, Visual Basic 
обеспечивает ряд подключаемых связанных элементов управления ActiveX. 

    2.5.1. Элемент управления DBGrid 

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

    Вывод на экран нескольких записей 

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


    44     Использование связанных элементов управления Acth 

    Чтобы подключить элемент управления DBGrid к проекту: 
    1. В меню Project выбрать Components. 
    2. Во вкладке Controls окна диалога Components (см. рис. 1.3) выбрать 
Microsoft Data Boi Grid Control и нажать OK или Apply. 
    Пользователи могут установить фокус на отдельные ячейки и редактировать 
данные неп редственно в ячейке. Можно также выбрать все строки или ячейки 
(щелкнув загола столбца). Во время разработки можно установить ширину столбца 
и высоту строки. Крс того, для пользователей можно установить запрет изменять 
форматирование в nepi выполнения. 
    В период выполнения текущую ячейку в сетке определяют свойства Row и Col. 
Текуш ячейку можно указать в программном коде, либо пользователь может 
изменить ее, испо, зуя мышь или клавиши курсора. Когда пользователь изменяет 
текущую ячейку, указате записи соответствующего элемента управления Data 
автоматически перемещается к за, си, содержащей выбранную ячейку. 
    Ячейки можно отредактировать в интерактивном режиме, вводя данные в ячейку 
т программным способом, изменяя свойство Value текущего объекта Column (см. ниже). 
    Будучи создан, элемент управления DBGrid содержит единственный столбец и 
единств! ную строку. В нем также имеется пустая строка, обозначенная 
звездочкой (*), котор используется для добавления новых записей. 
    Окно свойств содержит свойства элемента управления DBGrid в целом; элемент 
ynpaei ния можно перемещать и устанавливать по размеру. Чтобы установить 
свойства для i дельных объектов Column, необходимо щелкнуть элемент управления 
правой кнопн мыши и выбрать Edit из контекстного меню. Используя контекстное 
меню, можно вставл? или удалять столбцы или вырезать и вставлять их через 
буфер обмена. Можно так создать столбец и скрыть его, назначив для него 
нулевую ширину. 
    Элемент управления DBGrid имеет несколько свойств, определяющих его 
поведение. Нап[ мер, если в True установлено свойство AllowUpdate, 
пользователь может изменять данньк элементе управления. Свойства можно 
установить также для отдельных столбцов. 
    Чтобы установить свойства столбца: 
    1. Щелкнуть элемент управления DBGrid правой кнопкой мыши. 
    2. В контекстном меню выбрать Properties. 
    3. В окне диалога Property Pages открыть вкладку Columns. 
    Здесь можно изменить заголовок столбца, назначить связанное поле данных, 
установи значение по умолчанию и так далее. 
    Чтобы установить заголовки столбцов элемента управления DBGrid, нужно во 
время разр ботки щелкнуть элемент управления правой кнопкой мыши и в 
контекстном меню выбра Retrieve Fields. 

    Получение и установка содержимого текущей ячейки 

    Для получения значения выбранной ячейки в период выполнения используется 
семейст! Columns элемента управления DBGrid. Например: 

    MsgBox DBGridl.Columns(DBGridl.Col).Text 

    Чтобы изменить информацию в элементе управления DBGrid, следует изменить 
ассоциир ванный объект Recordset. Например, если элемент управления DBGrid 
связан с наборе записей элемента управления Data'1, потребовалось бы выполнить 
следующий код: 


    Глава 2. Работа с данными через элемент управления Data	45 

    Da tal.Recordset.Edit 
    Datal.Recordset.Fields("Product Name") = "Дискета" 
    Datal.Recordset.Update 
    

    Использование события BeforeUpdate 

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

    2.5.2. Элемент управления MSFIexGrid 

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

OrderlD      (№ заказа) в таблице Order Details (позиции заказа). 
    ..^^.__^ProduciipJ	Q^pT^ej"^ua^^	Discount 3 
    !	11	14                12	0 ^J 
    10248!	42	9.8                10	0 
    !	72	34.8                 5	0 
    ^111>      m      10        о 
    ,B	|              51             4Z4J      _       40                 0 
    ••—-1-———'41	'~7.7J~~"~~~ 10                о 
    10250f	51             4Z4r35             0.15 __J              65          
   16.8                15             0.15 zl 
    US Datal	J_5 

    Рис. 2.8. Представление данных в элементе управления MSFIexGrid. 
    
    Чтобы объединить ячейки: 
    1. Установить для свойства MergeCells значение константы, отличное от нуля. 
    2. Установить в True элементы массивов свойств MergeRow () и MergeCol () 
для строк и столбцов, которые требуется объединить. 
    Например, чтобы объединить ячейки в таблице Order Details, нужно к форме, 
которая содержит элемент управления MSFIexGrid, добавить следующий код: 

Private   Sub   Form_Load() 
    MSFlexGridl.MergeCells = flexMergeFree 
    MSFlexGridl.MergeCol(0)    = True      
End  Sub 

    Подключить элемент управления MSFIexGrid к проекту можно через окно 
диалога Components (меню Project | Components). 


    46 Использование связанных элементов управления Activ 

    2.5.3. Элемент управления DBCombo 

    Элементы управления связанное поле со списком (DBCombo) и связанный 
простой спи^ (DBList) можно использовать для автоматического вывода на экран 
списка значений набора записей. С помощью этих элементов управления списки 
можно ограничивать дог стимыми значениями. 
    Например, если пользователь должен ввести для заказа номер 
грузоотправителя, мож использовать элемент управления DBList для вывода на 
экран списка всех грузоотправт лей из таблицы Shippers (база данных Nwind.mdb). 

    Получение информации из подстановочной таблицы 

    Эти элементы управления можно использовать также в приложениях с 
подстановочны» данными. 
    Например, можно вывести на экран список допустимых наименований групп 
(вместо ном ров), но когда пользователь добавляет или изменяет данные, 
использовать для сохранен! соответствующий числовой идентификатор. 
    На следующей иллюстрации показана форма, в которой элемент управления 
DBComt используется для вывода на экран названий групп для таблицы товаров 
Products, а таю* установка свойств: 

    ц Forml	•^^^^^^••LdQl^y	1 
    Товар Группа М- поставщика N- товара		•*• 
    JDncle Bob's Organic Dried Pears 
    [Produce                 _?j 
    13 
    |7 
    к	<	Группы товаров	> 1 м| 
    
    
    м	4	Товары	__       ±]1У 
    /, 
    / 
    Отображать: 
    RowSource=DatCategor ~ 'List Field=Categogy Name 
    Модифицировать: 
    /DataSource=DatProducfv DataField=Categoryld (из таблицы Products) 
BoundColumn=Categoryld (из таблицы Categories) 

    Рис. 2.9. Использование DBCombo в приложении с подстановочными данными. 


    Установка свойств элемента управления DBCombo 

    Чтобы определить, какое значение должно быть показано в элементе 
управления DBCombo, нужно ассоциировать свойство RowSource с именем элемента 
управления Data, а в свойство ListField внести имя поля.	' " " " " 
    Связанное поле со списком будет содержать все значения соответствующего 
поля. Чтобы указать, какое поле базы данных должно обновляться, когда 
пользователь изменяет знач~-ние, нужно установить свойства DataSource и 
DataField. Установить отношение межлу таблицей, обеспечивающей подстановочные 
значения, и фактически редактируемой таблицей можно назначением свойства BoundColumn. 
    Обычно при работе с элементами управления DBList и DBCombo используются 
два элеме— та управления Data — один для заполнения списка, как определено 
свойствами ListField •/. RowSource, и другой —для модификации поля базы 
данных, специфицированного свойствами DataSource и DataField. 


    Глава 2. Работа с данными через элемент управления Data	47 

    Таким образом:     

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

DataSource      
Имя элемента управления Data, через который список или 
комбинированный блок связан с базой данных.

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

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

BoundColumn 
Имя поля набора записей, специфицированного свойством RowSource. Это поле должно 
иметь тот же тип, что и DataField, и используется для заполнения списка другого 
элемента управления специфицированного свойством DataSource. 

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

    I	.11 

    Свойство ListField определяет поле, данными которого заполняется список. 
Второй элемент управления Data, определенный свойством DataSource, управляет 
набором записей, содержащим поле, обновляемые значения которого передаются в 
базу данных. Когда пользователь выбирает элемент списка, значение поля, 
специфицированного свойством BpundColumn, передается в поле элемента 
управления Data, определенного свойствами DataSource и DataField. Таким 
образом, можно определить одно поле (внешнее) для заполнения списка 
(RowSource.ListField) и второе поле (RowSource.BoundColumn из того же набора 
записей) для передачи значения во второй набор записей для модификации поля 

    DataSource.DataField в базе данных. 


