Хорошо, ваше описание формы и подчиненной формы немного расплывчато, поэтому позвольте мне изложить то, что, по вашему мнению, вы описываете, а затем представить решение, и вы можете сообщить нам, правильно ли это или нет.
Ваша основная форма с именем Review
привязана к таблице Company
в качестве RecordSource и отображает подробные поля для отдельной компании.В этой главной форме у вас также есть поле со списком всех компаний.
У вас есть подчиненная форма с именем ReviewDetail
, связанная с таблицей Reviews
, которая содержит ВСЕ отзывы.для ВСЕХ компаний.В подчиненной форме используется связывание подчиненной формы, чтобы связать компанию в основной форме с компанией в подчиненной форме, чтобы во время выполнения подчиненная форма отображала только отзывы о текущей компании, отображаемые в главной форме.
Когда пользователь выбираетКомпания из Combobox, у вас есть код в событии [OnChange], который фактически вызывает две вещи.Во-первых, основная форма переходит к выбранной компании, чтобы показать детали этой компании (через ваш код).Во-вторых, подчиненная форма, которая связана с главной формой по компании, немедленно фильтрует для отображения только отзывов для выбранной компании.
Теперь вы хотите добавить комбинированный список в подчиненную форму для дальнейшей фильтрации подчиненной формы дляопределенный месяц.
Я не уверен, как вы получаете список месяцев в вашем комбинированном ящике, но я бы сделал следующее: у меня была бы маленькая таблица с месяцами под названием tblMonths
с двумя столбцами,MonthID
и MonthName
MonthID MonthName
======= =============
1 January
2 February
3 March
etc...
12 December
Тогда я бы установил в строке со списком RowSource of The Months Months значение:
SELECT 0 AS MonthID, "(ALL)" AS MonthName FROM tblMonths
UNION SELECT MonthID, MonthName FROM tblMonths
ORDER BY MonthID;
Это даст вам Combobox со всемиМесяцы И опция «ВСЕ» вверху, чтобы пользователь мог отображать Все месяцы или только один месяц.И ваш Combobox будет иметь два столбца, поэтому вам нужно будет отформатировать его соответствующим образом, чтобы отобразить только 2-й столбец, со свойствами, подобными следующим:
Теперь в событии [AfterUpdate] вашего ComboBox, которое находится в вашей подчиненной форме, вы будете использовать следующий код (предположим, что имя Combobox cboMonth
)
Dim mssql As String
'Note, by concatenating a zero length string to the current value of the
' Combox and making sure the length is greater than zero, we can
' easily confirm that the user actually selected one of the items
' in the list, as opposed to accidentally clearing out the Combobox
'If we did not check this before relying on the value of the Combobox,
' our code would produce an error at runtime if the user did clear the Combobox
If Len(Me.cboMonth & "") > 0 Then
If Me.cboMonth = 0 Then 'They chose "ALL"
Me.FilterOn = False
Else
mssql = "[Month] = """ & Me.cboMonth.Column(1) & """"
Me.Filter = mssql
Me.FilterOn = True
End If
Else
'Since the user cleared the Combobox, let's set the value
'back to "ALL" and display ALL records
Me.cboMonth = 0
Me.FilterOn = False
End If
С этим кодом,подчиненная форма будет фильтроваться по выбранному месяцу, ИЛИ показывать все месяцы в зависимости от того, что выберет пользователь.Если поле в подчиненной форме, содержащее «Месяц», не имеет названия Month
, как вы, вероятно, указываете в своем примере кода, тогда вам нужно изменить [Month]
в моем коде выше на правильное имя в квадратных скобках.
Наконец, чтобы улучшить ваш корпоративный список в главной форме, я бы изменил и событие, и код, который вы используете для перехода к определенной компании.Опять же, я бы использовал событие AfterUpdate вместо события OnChange .Гораздо надежнее в таких ситуациях.И я бы использовал следующий код (предположим, что компания Combobox названа cboCompany
):
Dim rst As DAO.RecordSet
Dim mssql As String
If Len(Me.cboCompany & "") > 0 Then
Set rst = Me.RecordsetClone
mssql = "[Company]=""" & Me.cboCompany & """"
rst.FindFirst mssql
Me.Bookmark = rst.Bookmark
'If you then want to default the "Months" Combobox on the Subform to "ALL"
Me.ReviewDetail.Form.cboMonth = 0
me.cboCompany = Null
End If
Set rst = Nothing
С этим кодом главная форма переходит к выбранной компании (или ничего не делает, если пользователь просто очищаетCombobox) и устанавливает Months
Combobox в подчиненной форме обратно в значение «ALL», чтобы изначально отображались все отзывы.Затем он очищает корпоративный комбинированный список, чтобы он был готов к следующему выбору пользователем.