Как передать параметры во внутреннее предложение WHERE запроса Access, если зависимый отчет необходимо загрузить из нескольких форм? - PullRequest
0 голосов
/ 03 декабря 2011

Мой вопрос очень похож на этот один, и я бы прокомментировал последний, но у меня еще недостаточно представителей, чтобы комментировать, так что ...

Что если я хочу, чтобы мой параметризованный отчет мог загружаться различными формами? Наличие ссылки на форму непосредственно в запросе исключает это, не так ли? Мне кажется, что это жесткая связь.

Нет ли способа передать параметры в запрос без ссылки на форму? (И, как в приведенном выше связанном вопросе, соответствующее предложение WHERE встроено во вложенный SELECT, поэтому подача предложения WHERE в DoCmd не помогает.)

Ответы [ 3 ]

2 голосов
/ 03 декабря 2011

Посмотрите на аргументы FilterName и WhereCondition метода OpenReport. В качестве альтернативы вы можете установить RecordSource отчета на строку SQL, которую вы строите с использованием OpenArgs отчета; когда вы вызываете OpenReport, вы передаете имена формы и элементов управления, которые вы хотите использовать для параметров, параметру OpenArgs, а затем у вас есть доступ к этим данным через свойство OpenArgs отчета.

У меня есть бывший коллега, который старательно избегал использования строк SQL для RecordSource, потому что «скомпилированные запросы выполняются быстрее». Однако я никогда не встречал случая, когда разница в скорости была бы достаточной, чтобы заметить.

0 голосов
/ 07 декабря 2011

Вот решение, к которому я пришел.У него есть некоторые недостатки, но он позволяет мне сохранять свои запросы обычным способом в 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 и отчет отображается без записей
0 голосов
/ 03 декабря 2011
what are you coding this in C# ..? 
if so have a Switch statement perhaps to check the form type 
or what ever it is you are passing and 
dynamically build the where clause based on that should not be to difficult

you can still use code to do this assuming you know VB
or create a Macro do utilize the vb script code behind
...