В комментарии lamcro замечает относительно вопроса о том, есть ли в гребенке набор записей:
Когда я взламываю код VB форм и «Добавляю часы» в элемент управления CB, свойство набора записей находится там. Я даже могу войти и увидеть его собственные свойства.
Я вижу это, когда устанавливаю список наблюдения, но набор записей поля со списком недоступен или не может быть изменен с помощью кода. Чтобы отфильтровать поле со списком, вам нужно работать с его Rowsource.
Это может быть выполнено одним из двух способов:
- используйте событие, чтобы назначить новый источник строк вашим полям со списком на лету, ИЛИ
- используйте ссылку на элемент управления, значение которого вы хотите отфильтровать, в предложении WHERE Rowsource других ваших полей со списком.
Допустим, у вас есть cmbComboBox1, и когда вы выбираете в нем значение, вы хотите, чтобы значения, перечисленные в cmbCombBox2, были отфильтрованы в соответствии со значением, выбранным в cmbComboBox1. Для метода 1 вы должны использовать AfterUpdate первого поля со списком, чтобы установить источник строк второго:
Private Sub cmbComboBox1_AfterUpdate()
Dim strRowsource As String
strRowsource = "SELECT * FROM MyTable"
If Not IsNull(Me!cmbComboBox1) Then
strRowsource = strRowsource & " WHERE MyField = " & Me!cmbComboBox1
End If
Me!cmbComboBox2.Rowsource = strRowsource
End Sub
Чтобы использовать второй метод, вместо этого вы должны определить Rowsource второго поля со списком, чтобы оно основывалось на проверке значения первого:
SELECT * FROM MyTable
WHERE (MyField=[Forms]![MyForm]![cmbComboBox1]
AND IsNull([Forms]![MyForm]![cmbComboBox1])=False)
OR IsNull([Forms]![MyForm]![cmbComboBox1])=True
Это фильтрует источник строк, если в первом поле со списком есть значение, и не фильтрует его, если значение есть. То есть вы получаете нефильтрованный список до тех пор, пока не будет выбрано значение для первого поля со списком.
Затем в событии Afterupdate для cmbComboBox1 вы должны повторно запросить второе поле со списком:
Private Sub cmbComboBox1_AfterUpdate()
Me!cmbComboBox2.Requery
End Sub
Также, вероятно, неплохо определить параметр, чтобы убедиться, что ссылка на элемент управления формы правильно разрешена, поэтому ваш Rowsource будет таким:
PARAMETERS [Forms]![MyForm]![cmbComboBox1] Long;
SELECT * FROM MyTable
WHERE (MyField=[Forms]![MyForm]![cmbComboBox1]
AND IsNull([Forms]![MyForm]![cmbComboBox1])=False)
OR IsNull([Forms]![MyForm]![cmbComboBox1])=True
(при условии, что вы фильтруете Autonumber PK - если тип данных другой, вы, конечно, будете использовать другой тип данных)
Я бы предпочел использовать динамическое назначение Rowsource просто потому, что я обнаружил, что оно менее проблематично в разных версиях Access (т. е. ссылки на элементы управления в формах не разрешаются одинаково во всех версиях Access).
person
David-W-Fenton
schedule
08.11.2008