
- •Создание запросов sql
- •Зарезервированные слова Jet sql
- •Функции и операторы Access, используемые вместо ключевых слов ansi sql
- •Зарезервированные слова Jet sql и функции, не входящие в ansi sql
- •Эквивалентные типы данных Jet sql и ansi sql
- •Подстановочные знаки при сравнении строк
- •Зарезервированные слова distinctrow и distinct
- •Использование разделителей и символов sql
- •Создание запросов на объединение записей
- •Создание запроса к серверу
- •Управляющие запросы
- •Создание подчиненных запросов
- •Глава 9 .
- •Панель элементов
- •Разновидности элементов управления по типу содержимого
- •Элемент управления Надпись
- •Элемент управления Поле
- •Элементы управления выбора: Выключатель, Переключатель, Флажок и Группа
- •Элемент управления Список
- •Элемент управления Поле со списком
- •Элемент управления Кнопка
- •Элементы управления Свободная рамка объекта и Присоединенная рамка объекта
- •Элемент управления Рисунок
- •Элемент управления Разрыв страницы
- •Элемент управления Набор вкладок
- •Элемент управления Подчиненная форма/отчет
- •Элементы управления Линиям Прямоугольник
- •Преобразование одного элемента управления в другой
- •Создание многотабличных форм
- •Использование Мастера форм для создания главной и подчиненной форм
- •Добавление подчиненной формы в главную форму
- •Синхронизация данных в элементах формы
- •Создание многостраничных форм
- •Добавление и удаление страниц в наборе вкладок
- •Изменение порядка следования страниц
- •Свойства элемента управления Набор вкладок
- •Всплывающие формы и диалоговые окна
- •Вычисления в формах
Синхронизация данных в элементах формы
В этом разделе приведены некоторые типичные примеры, иллюстрирующие отображение в форме данных в соответствии со значениями некоторых ее элементов. Вообще говоря, подобные приемы можно применить для синхронизации данных как в простых, так и в составных формах, содержащих подчиненные формы. Примеры подобраны, исходя из наиболее часто встречающихся вопросов у наших читателей. Мы надеемся, что изучение этого раздела, а также применение комбинаций описанных приемов, помогут читателям решить основные задачи при проектировании интерактивных форм.
Переход на определенную запись в форме
Типичной задачей является организация более удобного чем последовательный перебор перехода по записям в форме, задавая значения каких-то полей записи, для ее поиска по ним. Например, в форме с информацией для большого количества сотрудников хотелось бы быстро перейти к карточке сотрудника с известной фамилией. Это можно сделать с помощью специального списка для выбора фамилии.
В разд. "Создание элементов управления с помощью панели элементов" гл. 5 мы упомянули о том, что при создании списка/поля со списком с помощью Мастера в форме, привязанной к источнику данных, Access предлагает сделать его средством перехода к нужной записи в форме. Рассмотрим пример создания такого списка:
Откройте в режиме Конструктора форму "Сотрудники" (Employees) базы данных "Борей" (Northwind).
Убедитесь, что на панели инструментов Панель элементов (Toolbox) нажата кнопка Мастера (Control Wizards). Нажмите кнопку Поле со списком (Combo Box) и разместите новый элемент в разделе заголовка формы, начертив мышью прямоугольник нужного размера.
Появится первое диалоговое окно Мастера списков. Выберите переключатель Поиск записи в форме на основе значения, которое содержит поле со списком (Find a record on my form based on the value I selected in my combo box) и нажмите кнопку Далее (Next).
В следующем диалоговом окне мастера выберите поля, которые образуют столбцы элементов списка: "КодСотрудника" (EmployeeID), "Фамилия" (LastName) и "Имя" (FirstName). Нажмите кнопку Далее (Next).
В следующем диалоговом окне Мастера списков предлагается настроить ширину столбцов списка. Столбец с ключевым полем "КодСотрудника" рекомендуется сделать скрытым (установите флажок Скрыть ключевой столбец (Hide key column)). Оставьте предложенные параметры и нажмите кнопку Далее (Next).
В последнем диалоговом окне мастера требуется ввести текст метки, поясняющей назначение списка. Введите текст: Фамилия: и нажмите кнопку Готово (Finish).
Форма готова. Откройте ее в режиме Формы и убедитесь, что при выборе желаемых фамилии и имени в созданном поле со списком осуществляется переход к информации об этом сотруднике. Такое поле со списком удобно и тем, что значение в нем можно не только выбрать, но и просто ввести первые буквы фамилии — необходимый элемент будет выбран автоматически. Останется нажать клавишу <Enter>, чтобы отобразить информацию о выбранном сотруднике.
Действие созданного поля со списком обеспечивается процедурой обработки события После обновления (After Update), сгенерированной мастером (см. также разд. "Создание процедур обработки событий"гл. 13).
Динамическая фильтрация данных
Предположим, у нас есть форма, содержащая подчиненную форму, в которой отображается много записей, и вы хотели бы интерактивно задать в главной форме какое-нибудь условие для отбора интересующих записей в подчиненной форме, чтобы упростить их визуальный анализ.
Это несложно сделать с помощью применения фильтра для источника данных формы (в данном случае — подчиненной). Фильтр можно применить двумя способами:
с помощью интерфейса Access (соответствующих кнопок на панели инструментов Режим формы (Form View), команд стандартного меню и контекстного меню поля формы);
с помощью изменения значений свойств формы.
Первый способ применения фильтра в форме во многом аналогичен подобным действиям в режиме Таблицы, которые были рассмотрены в разд. "Фильтрация данных" гл. 2. Здесь мы рассмотрим второй способ.
В этом случае применяются свойства формы Фильтр (Filter) и Фильтр включен (Filter On). Свойство Фильтр (Filter) содержит строковое значение — предложение WHERE на языке SQL (без ключевого слова WHERE). Свойство Фильтр включен (Filter On) определяет, применен ли фильтр, указанный в свойстве Фильтр (Filter), к форме. В отличие от свойства Фильтр включен (Filter On), свойство Фильтр (Filter) можно задать и в режиме Конструктора, в окне свойств формы, чтобы фильтр применился в момент загрузки формы. Но нам нужно изменять фильтр динамически — в процессе работы с формой в режиме Формы. Мы реализуем это с помощью процедуры VBA. : .
И хоть данная глава не предназначена для описания программирования на VBA, мы приведем пример соответствующей процедуры VBA, поскольку он обеспечивает несложное решение довольно типичной задачи.
Рассмотрим решение этой проблемы на примере формы "Типы" (Categories), содержащей подчиненную форму "Список товаров" (Product List). Организуем отбор товаров в подчиненной форме в зависимости от наличия их поставок:
Откройте форму "Типы" (Categories) базы данных "Борей" (Northwind) в режиме Конструктора.
Создайте в главной форме элемент Поле со списком (Combo Box), содержащий два столбца с фиксированным набором значений (см. гл. 5). Метку списка назовите Условие:. Свойства списка должны иметь значения, описанные в табл. 9.1.
Таблица 9.1. Свойства фильтрующего элемента
|
|
|
|
|
Свойство |
Значение |
|
|
Тип источника строк (Row Source Type) |
Список значений (Value List) |
|
|
Количество столбцов (Column Count) |
2 |
|
|
Ширина столбцов (Column Widths) |
Ост; 2, 5cm |
|
|
Данные (ControlSource) |
оставьте поле свойства пустым |
|
|
Имя (Name) |
Отбор |
|
|
Присоединенный столбец (Bound Column) |
1 |
|
|
Источник строк (Row Source) |
0; "Поставки выполняются";— 1 ; "Поставки прекращены" ; 2 ; "Все товары" |
|
Замечание
Обратите внимание на значения созданного элемента в свойстве Источник строк — 0, -1 и 2. Первые два значения выбраны в соответствии с возможными вариантами значений поля "ПоставкиПрекращены" (Discontinued) таблицы "Товары" (Products), которая является источником данных для подчиненной формы в настоящем примере. По этому полю и будет проводиться фильтрация данных в подчиненной форме.
В окне свойств созданного списка раскройте вкладку События (Events) и нажмите кнопку Построителя слева от свойства После обновления (After Update).
В появившемся диалоговом окне выделите элемент списка Программы (Code Builder) и нажмите кнопку ОК.
Откроется редактор VBA со сгенерированным заголовком процедуры обработки события. Вставьте в процедуру следующий код:
Private Sub Отбор_А£terUpdate() If Me!Отбор = 2 Then
[Список товаров].Form.Filter = ""
[Список товаров].Form.FilterOn = False Else
? [Список товаров].Form.Filter = _
"[ПоставкиПрекращены] = " & Me!Отбор
[Список товаров].Form.FilterOn = True End If
End Sub
В английской версии "Борей" вместо русских названий подчиненной формы
[Список товаров] и поля [ПоставкиПрекращены] используйте их английские
аналоги: [Product List] и [Discontinued].
Закройте редактор VBA. Сохраните форму.
Откройте форму "Типы" (Categories) в режиме Формы. Попробуйте выбирать в созданном списке разные значения и переходить от записи к записи. Вы увидите, что в соответствии с выбранным в списке значением, в подчиненной форме отображаются только товары с выполняющимися поставками, только товары с прекращенными поставками или все товары (см. также разд. "Синхронизация данных в связанных формах" гл. 13).
Автоматическая подстановка значения в поле ввода
Частсг для заполнения некоторых полей таблиц требуется вычислить выражение на основе данных в других полях этой таблицы и, возможно, связанных с ней таблиц. Чтобы при вводе данных не вычислять это значение каждый раз самостоятельно, требуется создать форму для ввода данных, выполняющую необходимые вычисления автоматически. Это позволит застраховаться от ошибок при вычислениях и сократит время ввода данных.
Представим себе такой пример. Есть таблица "Товары" со списком товаров, где для каждого товара указана его цена (таблица содержит поля "НаименованиеТовара" и "Цена", и первое поле является ключевым). Есть другая таблица "Заказы" со списком заказов на эти товары, содержащая информацию о типе и количестве заказанного товара (поля "НаименованиеТовара" и "Количество"), а также о его стоимости (поле "Сумма"). Таблица "Заказы" связана с таблицей "Товары" по полю "НаименованиеТовара" отношением "один-ко-многим". Требуется создать форму для добавления новых заказов так, чтобы при выборе необходимого товара из предложенного списка и после ввода заказанного количества в поле "Сумма" автоматически подставлялось значение стоимости всего заказа для данного товара.
Для решения поставленной задачи требуется выполнить следующие действия:[ Реализация этого примера — небольшая база данных Заказы.mdb — есть на компакт-диске, который является дополнительным приложением к комплекту книг о Microsoft Office 2002 издательства "БХВ-Петербург" и распространяется отдельно. ]
Создайте запрос, содержащий поле "Цена" из таблицы "Товары" и все поля из таблицы "Заказы". Сохраните его с именем "Заказано".
Создайте форму "Заказы" на основе запроса "Заказано".
Поместите в форму элемент управления Список, связанный с полем "НаименованиеТовара" источника данных формы.
Замечание
Это можно выполнить с помощью окна Список полей (Filed List) (см. гл. 5), предварительно указав в режиме Конструктора таблицы "Заказы" для поля "НаименованиеТовара" на вкладке Подстановка (Lookup) значение Поле со списком (Combo Box) для свойства Тип элемента управления (Display Control) и имя таблицы "Товары" в качестве значения свойства Источник,строк (Row Source).
Поместите в форму текстовые поля, связанные с полями "Количество" и "Сумма" источника данных формы.
Для поля "Количество" в окне свойств раскройте вкладку События (Events). Для события После обновления (After Update) создайте процедуру обработки события (см. разд. "Динамическая фильтрация данных" этой главы) со следующим содержанием:
Private Sub Количество_А£terUpdate()
Сумма = Цена * Количество End Sub
Таким образом, после ввода значения в поле "Количество" в поле "Сумма" будет автоматически подставлена вычисленная стоимость заказа. А поскольку поле "Сумма" является присоединенным к одноименному полю в таблице "Заказы", вычисленное значение автоматически попадет в таблицу.
Совет
Не всегда вычисляемые значения требуется сохранять в самих таблицах. Чаще всего достаточно только отобразить результат вычисления в вычисляемом поле формы или запроса для информирования пользователя. Ведь это значение можно вычислить в любой момент на основе данных, хранящихся в таблицах, и не потребуется выполнять проверку на правильность сохраненного значения при изменении значений полей, использованных в его вычислении, в других формах или непосредственно в таблице (см. также разд. "Создание вычисляемых полей" данной главы и разд. "Вычисления на выделенных данных таблицы" гл. 8).