![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Как это работает
Частью процедуры инициализации формы является вызов содержащихся в ней элементов управления данными. Первая запись таблицы Publishers становится текущей. При навигации по набору записей Publishers в связанном поле ввода с помощью элемента управления данными Datal отображается название издательства из текущей записи. Заметьте, что текст метки Label2 изменяется в соответствии с названием издательства. Во время инициализации элемента Datal и при каждом перемещении к новой записи происходит событие Reposition (Изменение позиции) и вызывается его обработчик. Следовательно, это самое подходящее место для кода, с помощью которого извлекаются названия книг, опубликованных текущим издательством. Вы динамически создаете текст SQL-запроса и указываете его в качестве значения свойства RecordSource элемента Data2. Затем вызываете метод Refresh элемента Data2 для выполнения запроса. Поскольку элемент Data2 - это значение свойства DataSource элемента MS FlexGrid, все записи из набора, созданного Data2, автоматически отображаются в табличном поле. В результате выполнения процедуры Datal_Reposition, срабатывающей при смене текущей записи, изменяется значение в поле ввода. А это влечет за собой инициализацию события Change для поля Textl. Следовательно, запускается на выполнение и процедура Textl_Change, которая берет содержимое поля ввода, то есть название издательства, и отображает его в тексте метки Label2.
Дополнительная информация Для некоторых издательств в базе данных не указано ни одной книги. Найдите такие, двигаясь по набору записей с помощью навигационных кнопок. К сожалению, некорректный ввод информации - недостаток всех унаследованных баз данных.
Еще раз взглянем на код обработчика события Reposition для элемента Datal.
Private Sub Data1_Reposition() Dim IPubID As Long IPubID = Data1.Recordset! PubID Data2.RecordSource = " SELECT * FROM TITLES WHERE PubID = " & IPubID Data2.Refresh End Sub
Помните, в предыдущих главах говорилось о первичных и внешних ключах? Так вот, поле PubID является первичным ключом для таблицы Publishers - в разных записях оно имеет несовпадающие значения. Следовательно, нужно взять значение этого поля для некоторого издательства и найти в таблице Titles все записи, связанные с этой организацией. В таблице Titles поле PubID является внешним ключом. В каждой записи о книге в таблице Titles хранится значение идентификатора PubID издательства, опубликовавшего книгу. Всякий раз, когда изменяется позиция указателя в элементе управления данными Datal, значение поля PubID в новой текущей записи считывается в переменную IPubID. Восклицательный знак показывает, что вы хотите обратиться (прочитать или записать) к некоторому полю в наборе записей; он отделяет название набора от названия поля - Recordset! field. Эта нотация (обозначение) используется и в DAO, и в ADO, так что в следующих уроках будет рассмотрена более подробно. Получив значение PubID, вы создаете простое предложение на языке SQL и присваиваете его в качестве значения свойству RecordSource элемента управления данными Data2. Тем самым элементу Data2 сообщается о необходимости извлечь из таблицы Titles все записи, в которых поле PubID равно значению переменной IPubID - уникальному идентификатору издательства. Затем выполняется метод Refresh, и в результате создается новый набор записей в соответствии с только что установленным значением свойства RecordSource. По сути дела, вы создали динамический SQL-запрос, то есть сформировали запрос «на лету», во время выполнения программы, подставив значение переменной IPubID, а не вставляли текст запроса в код. Таким образом, запрос изменяется в зависимости от значения поля PubID в текущей записи об издательстве. Того же результата можно добиться и без временной переменной IPubID. Достаточно подставить значение идентификатора издательства PubID непосредственно в текст запроса:
Data2. RecordSource = «SELECT * FROM TITLES WHERE PubID = " & _ Datal.Recordset! PubID Data2.Refresh
Как видите, формирование динамического SQL-запроса заняло всего одну строчку кода. Однако для отладки лучше оставить первоначальный вариант. А когда вы получше освоитесь с Visual Basic, второй способ, который экономит время на одном присваивании переменной, будет казаться вам проще и удобнее. РАБОТА С ДАННЫМИ ЧЕРЕЗ ИНТЕРФЕЙС DAO
|