Форма загрузки и фильтра вопросов - PullRequest
3 голосов
/ 17 июня 2011

Я делаю форму поиска. Кроме того, есть несколько комбинированных списков для пользователей, чтобы выбрать комбинацию критериев. Затем я создаю строку Where, чтобы отфильтровать подформу, отображающую результаты.

Me.sub.SourceObject = "subResultType_1"
Me.sub.Form.Filter = strWhere
Me.sub.Form.FilterOn = True

Этот код находится в событии нажатия кнопки «Поиск».

Проблема в том, что при выполнении Me.sub.SourceObject = "subResultType_1" подчиненная форма отображает все записи. Тогда это фильтруется. Но я хочу, чтобы подчиненная форма ничего не отображала, пока не будет отфильтрована. Это потому, что моя программа будет использоваться в качестве внешнего / внутреннего интерфейса в довольно медленной сети.

PS: Я думаю, что когда SQL-предложение с частью WHERE или форма с фильтром, оно фильтруется на серверной части. Таким образом, только небольшое количество данных будет передаваться по сети на внешний интерфейс. Если я ошибаюсь, скажи мне ...

Ответы [ 4 ]

3 голосов
/ 17 июня 2011

Альтернативой, которую я часто использую, является сохранение подчиненной формы с источником данных, который создает одну пустую, не редактируемую запись. SQL, который я обычно использую, выглядит примерно так:

  SELECT TOP 1 Null As Field1, Null As Field2, 0 As Field3
  FROM MyTable;

Это отображает одну пустую запись со значениями Null для некоторых полей, 0 для других (при необходимости). Я нахожу это косметически более привлекательным, чем альтернатива.

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

2 голосов
/ 17 июня 2011

Вы сказали: " моя программа будет использоваться в качестве внешнего / внутреннего интерфейса в довольно медленной сети ".

Какая у вас база данных для хранения данных? Это файл базы данных Access (Jet / ACE)?

Если да, вы должны знать, что сетевые базы данных Access действительно подходят только для быстрой, надежной, проводной локальной сети. Если какое-либо из следующих условий выполняется, вам следует изменить свое хранилище данных на что-то отличное от Access.

  1. глобальная сеть (WAN)
  2. беспроводное сетевое соединение
  3. проводное соединение с ненадежной локальной сетью (LAN)

Общий риск в этих ситуациях заключается в том, что разорванное соединение может повредить вашу базу данных Access. Это может происходить не при каждом сброшенном соединении, но в конечном итоге вы испортите свою 1018 * базу данных Access.

2 голосов
/ 17 июня 2011

Если вы хотите заставить пользователей фильтровать форму, прежде чем показывать какие-либо результаты, не связывайте SubForm с запросом (оставьте RecordSource формы пустым) и делайте это вместо этого в коде: вы можете просто установить это в своем Событие нажатия кнопки поиска:

Me.Sub.RecordSource = "subResultType_1"

Еще приятнее, сделайте Subform невидимой (установите ее свойство Visible = No в режиме разработки) и покажите ее, как только пользователь нажмет Поиск:

Private Sub btSearch_Click()
  Me.Sub.RecordSource = "subResultType_1"
  Me.Sub.Visible = True
End Sub

Если вы хотите сделать более сложные фильтры, вы также можете сделать что-то вроде:

Private Sub btSearch_Click()
  Me.Sub.RecordSource = "SELECT * FROM subResultType_1 WHERE " + strWhere
  Me.Sub.Visible = True
End Sub

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

Затем вы строите предложение WHERE из содержимого этих текстовых полей, например:

image

Это происходит, когда пользователь ввел некоторые критерии фильтрации:

image

0 голосов
/ 17 июня 2011

Я думаю, что вы ответили на свой вопрос там. Предложение where фильтрует запрос на сервере SQL.

Доступ к SQL: предложение WHERE

...