Лабораторная работа Динамическое изменение источника строк для элемента управления Поле со списком.
Цель: Научиться программно формировать источник строк для элемента управления поле со списком, согласовывать данные в нескольких полях со списком.
Условие задания:
Создать форму ПросмотрКонтактов для отбора данных о контактах фирмы (клиентах или поставщиках), с возможность задания критериев выбора (все контакты заданной группы, контакты заданной группы расположенные в указанной стране, заданный контакт из указанной группы). Форма в режиме Формы представлена на рис. 1.
Рис.1. Форма в режиме Формы с настройкой значений элементов управления по умолчанию
Спецификация элементов управления
№ |
Тип |
Имя |
Назначение |
1 |
Группа |
grpContactType |
Выбор типа контактной группы |
2 |
Кнопка |
cmdOpenContact |
Открытие формы Клиенты или Поставщики в соответствии с выбранным типом контактной группой |
3 |
Кнопка |
cmdDefault |
Установка значений элементов управления в форме по умолчанию |
4 |
Кнопка |
cmdClose |
Закрыть форму |
5 |
Группа |
grpCriteria |
Выбор критерия для просмотра данных о |
6 |
Надпись |
lbl1 |
Вывод количества строк в поле со списком КодСтраны |
7 |
Надпись |
lbl2 |
Вывод количества строк в поле со списком cbContact |
8 |
Поле со списком |
cbContact |
Вывод названий контактов из контактной группы |
9 |
Поле со списком |
КодСтраны |
Вывод стран контактной группы |
Примеры процедур обработки событий:
'------------------------------------------------------------------------
'заголовок модуля формы Просмотр контактов
Option Explicit
Dim strFormName As String 'имя открываемой формы
Dim strNameControl As String 'имя элемента управления
'в открываемой форме,
'по которому осуществляется отбор
'------------------------------------------------------------------------
Private Sub Form_Open(Cancel As Integer)
DoCmd. Restore
cmdDefault_Click
End Sub
'------------------------------------------------------------------------
Private Sub cmdClose_Click()
DoCmd. Close
End Sub
'------------------------------------------------------------------------
Private Sub cmdDefault_Click()
grpContactType = 1
grpContactType_AfterUpdate
End Sub
'------------------------------------------------------------------------
Private Sub grpContactType_AfterUpdate()
grpCriteria = 1
If grpContactType = 1 Then
strNameControl = "КодКлиента"
strFormName = "Клиенты"
Else
strNameControl = "КодПоставщика"
strFormName = "Поставщики"
End If
InitControl
End Sub
'------------------------------------------------------------------------
Private Sub InitControl()
With КодСтраны
.RowSource = "SELECT Страны. КодСтраны, Страны. Страна" _
& " FROM Страны" _
& " INNER JOIN " & strFormName _
& " ON Страны. КодСтраны =" & strFormName & ".КодСтраны" _
& " UNION" _
& " SELECT 0, '<Все>'" _
& " FROM Страны"
.Value = .ItemData(0)
.Enabled = False
lbl1.Caption =.ListCount - 1
End With
With cbContact
.RowSource = "SELECT " & strNameControl & ", Название" _
& " FROM " & strFormName _
& " UNION" _
& " SELECT '0', '<Все>' FROM " & strFormName
.Value = .ItemData(0)
.Enabled = False
lbl2.Caption = .ListCount - 1
End With
End Sub
'------------------------------------------------------------------------
Private Sub cmdOpenContact_Click()
Dim strWhere As String, strWhere1 As String
Dim blFlag As Boolean
blFlag = False
strWhere = ""
If Not КодСтраны = 0 Then
strWhere = strWhere & "КодСтраны =" & КодСтраны
End If
If Not CbContact. Column(1) = "<Все>" Then
blFlag = True
If Not strWhere = "" Then strWhere = strWhere & " AND "
If strNameControl = "КодКлиента" Then
strWhere = strWhere & strNameControl & "=" & "'" & cbContact & "'"
Else
strWhere = strWhere & strNameControl & "=" & cbContact
End If
End If
DoCmd. OpenForm strFormName, , , strWhere
If blFlag Then
With Forms(strFormName)
'не выводить кнопки перехода по записям
.NavigationButtons = False
'запретить добавление записей
.AllowAdditions = False
End With
End If
End Sub
'------------------------------------------------------------------------
Private Sub КодСтраны_AfterUpdate()
With CbContact
If Not КодСтраны = 0 Then
.RowSource = "SELECT " & strNameControl & ", Название" _
& " FROM " & strFormName _
& " WHERE КодСтраны=" & КодСтраны _
& " UNION" _
& " SELECT '0', '<Все>'" _
& " FROM " & strFormName
Else
.RowSource = "SELECT " & strNameControl & ", Название" _
& " FROM " & strFormName _
& " UNION" _
& " SELECT '0', '<Все>'" _
& " FROM " & strFormName
End If
lbl2.Caption = .ListCount – 1
End With
End Sub
'------------------------------------------------------------------------
Private Sub grpCriteria_AfterUpdate()
If grpCriteria = 1 Then
InitControl
Else
КодСтраны. Enabled = True
CbContact. Enabled = True
End If
End Sub
'------------------------------------------------------------------------
Private Sub CbContact_AfterUpdate()
Dim strWhere As String
With КодСтраны
If Not CbContact. Column(1) = "<Все>" Then
If strNameControl = "КодКлиента" Then
strWhere = "'" & CbContact & "'"
Else
strWhere = CbContact
End If
.RowSource = "SELECT DISTINCT Страны. КодСтраны, Страны. Страна" _
& " FROM Страны" _
& " INNER JOIN " & strFormName _
& " ON Страны. КодСтраны =" & strFormName & ".КодСтраны" _
& " WHERE " & strNameControl & "=" & strWhere _
& " UNION" _
& " SELECT 0, '<Все>'" _
& " FROM Страны"
Else
.RowSource = "SELECT DISTINCT Страны. КодСтраны, Страны. Страна" _
& " FROM Страны" _
& " INNER JOIN " & strFormName _
& " ON Страны. КодСтраны =" & strFormName & ".КодСтраны" _
& " UNION" _
& " SELECT 0, '<Все>'" _
& " FROM Страны"
End If
lbl1.Caption = .ListCount – 1
End With
End Sub
'------------------------------------------------------------------------
Примеры режимов отображения данных в форме
Рис. 2 Рис. 3