Вот решение, к которому я пришел.У него есть некоторые недостатки, но он позволяет мне сохранять свои запросы обычным способом в Access, в то же время сохраняя ссылки на конкретные формы из моих запросов:
Я создал модуль с именем Param, и он имеетследующий код:
Option Compare Database
Private m_params As Collection
Public Function ParamLookup(paramName As String) As Variant
If Not m_params Is Nothing Then
ParamLookup = m_params(paramName)
End If
End Function
Public Function FeedParamsTo(reportName As String, theParams As Collection)
Set m_params = theParams
If Application.CurrentProject.AllReports(reportName).IsLoaded Then
DoCmd.Close acReport, reportName
End If
DoCmd.OpenReport reportName, acViewPreview
End Function
Затем в форме, содержащей мои элементы управления вводом, у меня есть, например, кнопка со следующим обработчиком нажатия:
Private Sub Button_Click()
Dim params As Collection
Set params = New Collection
params.Add Me!AnInputControl, "param1"
params.Add Me!AnotherInputControl, "param2"
Param.FeedParamsTo "nameOfSomeReport", params
End Sub
Наконец, в запросечто в отчете я могу ссылаться на параметры param1 и param2 с помощью функции ParamLookup, например:
SELECT * FROM someTable WHERE someColumn = ParamLookup("param1") AND someOtherColumn = ParamLookup("param2")
Некоторые недостатки:
- Это глобальный модуль, поэтому естьтолько один набор параметров может быть прочитан за один раз.Если вы загрузите два отчета, параметры первого отчета будут перезаписаны, и обновление формы может привести к странным ошибкам.Конечно, должна быть возможность распространить эту идею на класс и создать один экземпляр для каждой формы, но на данный момент мне не нужно ничего особенного.
- Если открыть отчет в представлении отчетабез использования кнопки и, следовательно, метода FeedParamsTo (например, с панели «Объекты доступа») сбой ParamLookups и отчет отображается без записей