Динамическая фильтрация данных

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

  • с помощью интерфейса Access (соответствующих кнопок на панели инструментов Режим формы (Form View), команд стандартного меню и контекстного меню поля формы);
  • с помощью изменения значений свойств формы.

Первый способ применения фильтра в форме во многом аналогичен подобным действиям в режиме Таблицы, которые были рассмотрены . Здесь мы рассмотрим второй способ.
В этом случае применяются свойства формы Фильтр (Filter) и Фильтр включен (Filter On). Свойство Фильтр (Filter) содержит строковое значение — предложение WHERE на языке SQL (без ключевого слова WHERE). Свойство Фильтр включен (Filter On) определяет, применен ли фильтр, указанный в свойстве Фильтр (Filter), к форме. В отличие от свойства Фильтр включен (Filter On), свойство Фильтр (Filter) можно задать и в режиме Конструктора, в окне свойств формы, чтобы фильтр применился в момент загрузки формы. Но нам нужно изменять фильтр динамически — в процессе работы с формой в режиме Формы. Мы реализуем это с помощью процедуры VBA. : .
И хоть данная глава не предназначена для описания программирования на VBA, мы приведем пример соответствующей процедуры VBA, поскольку он обеспечивает несложное решение довольно типичной задачи.
Рассмотрим решение этой проблемы на примере формы "Типы" (Categories), содержащей подчиненную форму "Список товаров" (Product List). Организуем отбор товаров в подчиненной форме в зависимости от наличия их поставок:

  1. Откройте форму "Типы" (Categories) базы данных "Борей" (Northwind) в режиме Конструктора.
  2. Создайте в главной форме элемент Поле со списком (Combo Box), содержащий два столбца с фиксированным набором значений. Метку списка назовите Условие:. Свойства списка должны иметь значения, описанные в.

Таблица 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), которая является источником данных для подчиненной формы в настоящем примере. По этому полю и будет проводиться фильтрация данных в подчиненной форме.

  1. В окне свойств созданного списка раскройте вкладку События (Events) и нажмите кнопку Построителя слева от свойства После обновления (After Update).
  2. В появившемся диалоговом окне выделите элемент списка Программы (Code Builder) и нажмите кнопку ОК.
  3. Откроется редактор 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].

  1. Закройте редактор VBA. Сохраните форму.

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