2013-11-22 4 views
2

Я не работал с Access через 8 лет - я думаю, что забыл больше, чем когда-либо знал. Кто-то попросил меня изменить отчет, чтобы список чертежей, на которых в настоящее время отображаются все чертежи, будет отображать чертежи для конкретного клиента (или для всех клиентов).MS Access: как фильтровать отчет по не-отчетному полю?

Я нашел вложенные запросы, используемые в отчете, и я изменил внутренний запрос, чтобы принять параметр (первая ошибка?). Затем я добавил новую форму для отображения имени клиента и получения связанного первичного ключа customerId. Теперь мне нужно передать идентификатор клиента из формы в отчет. DoCmd.OpenReport и добавление whereCmd не похоже на условие where с параметром.

Итак, я удалил параметр в запросе и попытался просто указать условие. Только внешний запрос не знает, что такое customerId. Должен ли я раскрывать это во внутреннем запросе и во внешнем запросе, а затем просто не использовать его в окончательном отчете, чтобы я мог отфильтровать его в предложении where?

У них есть другой пример кода, который использует VBA в форме, чтобы перестроить запрос (добавляя любые критерии для фильтрации) перед запуском отчета. Конечно, это не может быть рекомендуемой практикой, не так ли?

+0

* «... перестроить запрос (добавление каких-либо критериев для фильтрации) перед запуском отчета» * Этот запрос используется в качестве источника записи отчета? – HansUp

+0

Источник записи отчета - это внешний запрос, да. Но это внутренний запрос, который вызывается внешним запросом, который способен идентифицировать клиента. Эта информация не является полем в результатах внутреннего и, следовательно, недоступна во внешнем, и, следовательно, я не думаю, что могу ее фильтровать. – knockNrod

+0

Из того, что я читал, фильтр предпочтительнее, чем параметр. Хорошо, я добавил, я заберу это. Но я не могу заставить фильтр работать, и я считаю, что это потому, что это не поле в источнике записи отчета. Итак, если я добавлю поле в список полей внутреннего запроса и внешний запрос, он должен использоваться в отчете? Если он не будет использоваться в отчете, смогу ли я по-прежнему фильтровать его? – knockNrod

ответ

2

Включите поле фильтра в источник записи отчета. Затем вы можете фильтровать это поле при открытии отчета.

DoCmd.OpenReport "rptFoo", View:=acViewPreview, _ 
    WhereCondition:="[id]=1" 

Поле источника записи, используемое в WhereCondition не должен отображаться на любом из управления докладом ... до тех пор, пока он присутствует в источнике записи он может быть использован в WhereCondition ,

0

Я бы бросил это на отчет в OpenArgs. От вашей формы, сделать что-то вроде:

DoCmd.OpenReport strReportName, , , , , Me.CustomerID 

Затем, в случае нагрузки доклада, читать OpenArgs и изменить RecordSource отчета:

Me.RecordSource = "SELECT * FROM MyTable WHERE CustomerID = '" & Me.OpenArgs & "'" 

Это «aircode» и будет скорее всего, нужно немного подкорректировать, но это должно стать очень близким. Очевидно, что если CustomerID является полем INT, удалите одинарные кавычки из SQL в событии Load report.

+1

Я подозреваю, что если OP не смог заставить его работать с использованием аргумента 'WhereCondition', они вряд ли будут намного лучше использовать' OpenArgs'. –

+0

Я подозреваю, что я вызываю неправильное условие, но я не понимаю, как помогут открытые аргументы. Может ли он передать значение параметра без запроса пользователя?И тогда есть все статьи, в которых говорится о том, чтобы не выполнять параметры в источниках отчета и записи формы. Я сделаю снимок в понедельник. – knockNrod

+0

Да, передача OpenArgs не будет запрашивать у пользователя ни о чем, вы просто передаете переменные через код, чтобы все было за кулисами. –

Смежные вопросы