2016-04-08 4 views
0

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

Данные для этой сетки данных обеспечиваются с помощью обновления-функции, которая использует параметризованный запрос, чтобы установить RecordSource в сетке данных:

Dim query  As DAO.QueryDef 
Dim recordSet As DAO.Recordset 

Set query = CurrentDb.QueryDefs("DatagridQuery") 
query.Parameters("one").Value = combobox_1_value 
query.Parameters("two").Value = combobox_2_value 
Set recordSet = query.OpenRecordSet 
Set Me.subform.From.Recordset = recordSet 

В этом контексте combobox_1_value и combobox_2_value соответственно обеспечены два различных Наримера в родительской форме.

Проблема, которая возникает сейчас, заключается в том, что datagrid, по-видимому, повторно проверяет базовый запрос каждый раз, когда устанавливается свойство сортировки или фильтра, запрашивая пользователя для ввода вручную параметров, вместо того, чтобы извлекать значения параметров из значений combobox.

Есть ли способ связать значения моих списков с параметрами запроса или переопределить функции сортировки и фильтрации, чтобы я мог выполнять сортировку набора записей непосредственно в vba?

ответ

0

Если вы (повторно) установили набор записей, форма всегда будет отправлена.

Что вы можете сделать, это установить фильтр свойство формы:

Me!subform.Form.Filter = "[SomeField] = somevalue" 
Me!subform.Form.FilterOn = True 

Для сортировки это OrderBy свойство:

Me!subform.Form.OrderBy = "[SomeField] Asc" 
Me!subform.Form.OrderByOn = True 
+0

Это не поймает событие сортировки из datagrid, если я не ошибаюсь. – narain

+0

Сортировка в пользовательском интерфейсе не требуется. Если это то, что вы видите, что-то еще происходит. – Gustav

+0

Да, это проблема, которую я испытываю. Когда я выбираю столбец и заказываю его восходящий или нисходящий, базовый запрос переоценивается. – narain

0

Я нашел решение, которое по-видимому, приводит к более длительному времени работы.

Я переписал запрос для подчиненной использовать глобальную функцию в качестве параметра запроса:

Public Function GetComboboxValue() 
    GetComboboxValue = Forms!Form1!Combobox.Value 
End Function 

Соответствующий запрос будет выглядеть следующим образом:

SELECT * FROM sampleTbl 
WHERE ForeignID = GetComboboxValue() 

Кроме того я поставил afterUpdateEvent от Combobox для запроса подформы:

Private Sub combobBox_AfterUpdate() 
    Me.subform.Requery 
End Sub 

В то время как thi s работает так, как я хочу, кажется, что параметризация запроса больше не работает должным образом. По-видимому, запрос возвращает все записи из запрошенной таблицы и фильтрует recordSet только после этого.

+0

Было бы гораздо проще использовать свойства «MasterLinkFields» и «ChildLinkFields» элемента управления подформы - со значением combox для master и ForeignID для дочернего элемента. – Gustav

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