Задать фильтр перед установкой источника записей в ms-access? - PullRequest
0 голосов
/ 25 сентября 2018

Я работаю над проблемой производительности в унаследованном приложении vba, которое - по какой-либо причине, о которой я не знаю, - устанавливает источник записей непрерывной формы через

myForm.RecordSource = newRecordsource

после того, как форма уже открыта.Фильтр применяется после нажатия кнопки:

DoCmd.ApplyFilter , "my filter sql"

Я думал об установке фильтра по умолчанию до того, как будет установлен RecordSource, чтобы форма отображалась быстрее.Но я получил сообщение об ошибке 2491:

The action or method is invalid because the form or report isn't bound to a table or query.@You tried to use the ApplyFilter or SearchForRecord action or method. However, the form or report you applied the filter to is not based on a table or query, so the form or report doesn't have any records to apply a filter to.@Use the SelectObject action or method to select the desired form or report before you run the ApplyFilter action. To base a form or report on a table or query, open the form or report in Design view, and enter the table or query name in the RecordSource property.

Так что я должен установить фильтр! После!RecordSource установлен.Но в тот момент, когда я установил RecordSource, мое приложение отправляет запрос.Так что в моем случае строка ("myForm.RecordSource = newRecordsource") потребуется около 13 секунд для выполнения.А настройка фильтра впоследствии приводит к еще большему времени ожидания.

Есть ли способ предотвратить загрузку формой всех наборов данных, пока я не применил фильтр?Поскольку все приложение (и несколько других) работает, как описано, я не могу просто изменить запрос в RecordSource или установить его в режиме разработки.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

На самом деле, есть несколько способов сделать это.

Во-первых, вы можете (и должны) просто запустить форму, используя предложение “where”.Это отфильтрует форму.Таким образом, по сути, не используйте формы «фильтр», а используйте выражение «где» при открытии формы.

Если у вас есть несколько текстовых полей и кнопок для «фильтрации» после загрузки формы, затем оставьте источник записи формы пустым, а затем скажите, что для фильтра города:

Dim strSQL     as string

strSQL = "select * from MyTable where city = '" & me.txtCity & "’"

me.RecordSource = strSQL

Итак, все, что вам нужно, - это просто удалить источник записи формы, затем получить критерии и затем установитьисточник записи форм, как указано выше.

Как уже отмечалось, вы можете также запросить / получить эти критерии ДО того, как откроете форму, и открытая форма с предложением «где» будет работать с источником данных, связанным с формами, ифильтр будет срабатывать только один раз, и форма будет извлекать только те данные, которые соответствуют предложению where, указанному в команде open form.Этот подход устраняет необходимость устанавливать источник записи форм на лету.

Любой подход будет одноразовым фильтром данных.

0 голосов
/ 25 сентября 2018

Это не может быть сделано.

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

Вместо этого настройте источник записи так, чтобы он включал условие фильтра, если фильтр статический.

Пример (на Northwind.accdb)

DoCmd.OpenForm "Inventory List"
Forms![Inventory List].Filter = "[Product ID] = 5"
Forms![Inventory List].FilterOn = True
Debug.Print Forms![Inventory List].FilterOn 'True
Forms![Inventory List].RecordSource = "Inventory"
Debug.Print Forms![Inventory List].FilterOn 'False, displays all records
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...