VBA, MS Access MS Access в примерах

Фильтрация подчинённой формы по трём иерархическим ComboBox-ам (+ Пример)


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


Private Sub cbGood_AfterUpdate()
    esFormUpd 3 ' см процедурку ниже
End Sub

Private Sub cbManufacturer_AfterUpdate()
    esFormUpd 2 ' см процедурку ниже
End Sub

Private Sub cbType_AfterUpdate()
    esFormUpd 1 ' см процедурку ниже
End Sub

Private Sub cmdClearGood_Click()
'Отмена фильтрации по товару
    Me!cbGood = Null
    esFormUpd 3
End Sub

Private Sub cmdClearManufacturer_Click()
'Отмена фильтрации по производителю
    Me!cbManufacturer = Null
    esFormUpd 2
End Sub

Private Sub cmdClearType_Click()
'Отмена фильтрации по типу
    Me!cbType = Null
    esFormUpd 1
End Sub

Private Sub esFormUpd(updPoint As Integer)
'es 24.02.2010
' процедура каскадного обновления данных формы
' как реакция на ввод данных от пользователя
' Аргумент: updPoint = указывает какой объект был обновлен
'   1= Тип Товара ; 2 - Производитель; ... и т.д.
'выведено отдельной процедурой для экономии т.к. при обновлении
'полей "Тип Товара" и "Производитель" - производятся аналогичные операции
'==============================================================


On Error GoTo esFormUpdErr
'Определяем какие операции производить
    Select Case updPoint
        Case 1: GoTo Point001 ' ... по обновлению поля: Тип Товара
        Case 2: GoTo Point002 ' ... по обновлению поля: Производитель
        Case 3: GoTo Point003 ' ... по обновлению поля: Товара
    
    End Select
    
Point001: ' После обновления типа товара
' Обновляем поле со списком "Производитель"
    Me!cbManufacturer = Null                       'Зачистка старого значения ПРОИЗВОДИТЕЛЯ
    ' ...
    If IsNull(Me!cbType) = False Then        'Если тип товара указан то:
        Me!cbManufacturer.Enabled = True           'открываем доступ к полю ПРОИЗВОДИТЕЛЯ
        Me!cbManufacturer.Requery                  'обновляем список значений ПРОИЗВОДИТЕЛЯ (по Поставщику)
        Me!cbManufacturer.SetFocus                 'Переводим фокус (курсор) на поле ПРОИЗВОДИТЕЛЯ
    Else
        Me!cbManufacturer.Enabled = False          'Тип не указан = запрет доступа к полю ПРОИЗВОДИТЕЛЯ
    End If
    

Point002: ' После обновления ПРОИЗВОДИТЕЛЯ
' Обновляем поле со списком "Товар"
    Me!cbGood = Null                                'Зачистка старого значения
    ' ...
    If IsNull(Me!cbManufacturer) = False Then  'Если тип товара указан то:
        Me!cbGood.Enabled = True                    'открываем доступ к полю ТОВАРА
        Me!cbGood.Requery                           '... дальше полностью аналогично
        Me!cbGood.SetFocus
    Else
        Me!cbGood.Enabled = False
    End If


Point003: ' После обновления ТОВАРА

'Только Фильтрация подчиненной формы:
    FilterSubForm ' см процедурку ниже

esFormUpdBye:
    Exit Sub

esFormUpdErr:
    MsgBox "Error " & Err.Number & vbCrLf & Err.Description & vbCrLf & _
    "in procedure esFormUpd of VBA Document Form_000Order", vbCritical, "Error!"
    Resume esFormUpdBye
End Sub


Private Sub FilterSubForm()
Dim strFilter As String
'Фильтрация подчиненной формы:
On Error GoTo FilterSubFormErr

'Пишем фильтр по полю ТИП ТОВАРА (если указано)
    If IsNull(Me!cbType) = False Then 'если тип товара установлен
        strFilter = " AND PTypeID = " & Me!cbType
    End If

'Пишем фильтр по полю ПРОИЗВОДИТЕЛЬ (если указано)
    If IsNull(Me!cbManufacturer) = False Then 'если тип товара установлен
        strFilter = strFilter & " AND ManufacturerID = " & Me!cbManufacturer
    End If

'Пишем фильтр по полю ТОВАР (если указано)
    If IsNull(Me!cbGood) = False Then 'если тип товара установлен
        strFilter = strFilter & " AND GoodID = " & Me!cbGood
    End If

'Применяем полученный фильтр к подчиненной форме: (внутри обьекта "objSubForm")
    If Not strFilter = "" Then
        strFilter = Mid(strFilter, 6) 'Обрезка первого " AND "
        Me!objSubForm.Form.Filter = strFilter
        Me!objSubForm.Form.FilterOn = True
    Else
        Me!objSubForm.Form.Filter = ""
        Me!objSubForm.Form.FilterOn = False
    End If

FilterSubFormBye:
    Exit Sub

FilterSubFormErr:
    MsgBox "Error " & Err.Number & vbCrLf & Err.Description & vbCrLf & _
    "in procedure FilterSubForm of VBA Document Form_000Order", vbCritical, "Error!"
    Resume FilterSubFormBye
End Sub

Picture




Скачать

MSA-2003 ( 120 kB) Пример


Назад ToTop
L.E. 05.02.2021
Рейтинг@Mail.ru