2010-05-19 2 views
4

Я хочу, чтобы запрос параметра Access запрашивал у пользователя значение (место в этом случае). Когда я ввожу в поле Criteria, он отлично работает: я получаю диалоговое окно (Enter Parameter Value) с текстовым полем и текстом (Enter Location). Все идет нормально. Это работает (результат тоже).Выпадающий запрос в Access 2007

Но теперь я хочу выпадающий список/combobox (вместо текстового поля), чтобы пользователь мог выбрать местоположение. Я сделал форму и тип Forms![Form1]![CmbLocation] в поле «Критерии».

Как это: http://office.microsoft.com/en-us/access/HA011170771033.aspx

Но я все еще получаю текстовое поле (с ссылкой как TextLabel).

Что я делаю неправильно? Есть ли у кого-нибудь совет?

ответ

2

Если вы удалили параметр из своего запроса, а затем перепечатали в приведенной выше форме exprsison в построитель запросов, тогда он должен работать.

Так, в построитель запросов, в критериях раздела просто введите

[forms]![form1]![Combo4] 

Убедитесь, что вы имеете право имя формы и управления имя в поле со списком.

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

Теперь откройте форму, выберите поле со списком, и теперь попробуйте открыть запрос, он должен открыться без каких-либо подсказок. Обратите внимание, что этот подход означает, что форма должна быть открыта, и в поле со списком будет выбрано значение ДО того, как вы попытаетесь запустить запрос. Итак, если вы основываете отчет на этом запросе, то нажмите кнопку, чтобы запустить отчет в той же форме, что и в поле со списком. Это довольно многое гарантирует, что форма будет открыта до того, как вы попытаетесь запустить запрос или отчет, основанный на этом запросе

+0

Спасибо, открывая форму перед запуском запроса, имеет значение. Но я должен сделать свою собственную форму, что я на самом деле, действительно то, что является стандартным диалоговым окном MS-Access «Введите значение параметра», чтобы показывать комбинированное поле вместо текстового поля. Это возможно? – waanders

+0

Вы можете выполнить это, если вы перевернете вопрос. Вероятно, этот параметр для отчета. Итак, просто запустите форму в поле со списком, а затем запустите отчет. Например: docmd.OpenReport «имя отчета», acViewPreview ,, «some id =» & me.MyComboBox Так что гораздо лучше удалить параметр из запроса, иначе он будет огромным образом контролировать вашу жизнь здесь. Вы не сможете использовать этот запрос где-либо еще с этим жестко закодированным параметром. Извлечение всех параметров из запроса значительно увеличивает гибкость здесь и позволяет вам указать любой параметр в коде, как показано выше. –

+0

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

3

В дополнение к предложению Альберта вы можете сделать эту работу внутри самого запроса, "bootstrappable." Для этого вам нужно будет написать функцию, которая возвращает значение, выбранное в поле со списком формы. Было бы что-то вроде этого:

Public Function ReturnMyCriterion() As Variant 
    DoCmd.OpenForm "dlgGetCriterion", , , , , acDialog 
    With Forms!dlgGetCriterion 
     If .Tag <> "Cancel" Then 
     ReturnMyCriterion = Nz(!cmbMyCombo, "*") 
     End If 
    Else 
     ReturnMyCriterion = "*" 
    End With 
    Close acForm, "dlgGetCriterion" 
    End Function 

(при открытии формы с переключателем acDialog, код приостанавливается до тех пор, как форма открыта или видимая, чтобы получить значение из выпадающего списка, вы должны установите для свойства формы .Visible значение False. Это можно сделать в событии AfterUpdate в поле со списком или в кнопке OK. Вам также потребуется кнопка «Отмена», которая устанавливает свойство .Tag формы для «Отмена», а затем устанавливает свойство .Visible для False, это относительно стандартный подход к работе с диалоговыми формами в Access).

Вы бы затем сделать критерий в запросе быть:

Like ReturnMyCriterion() 

То есть, если вы хотите вернуть все записи, если значение не выбрано в поле со списком.

+0

И где я должен разместить код ReturnMyCriterion? – waanders

+0

В том же месте вы помещаете параметр, который вы пытаетесь заменить. –

+0

David> спасибо! – waanders

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