У меня есть запрос, который довольно большой, соединяющий более десятка таблиц, и я хочу отменить записи на основе поля id (, например.: between nStartID and nEndID
).
Я создал два параметра и протестировал их как критерии, и они отлично работают.
Проблема заключается в том, что мне нужно запустить запрос вставки из этого основного запроса и в параметрах, где они находятся, в основном запросе нужны параметры. Поэтому мне нужно передавать параметры программно.
Кто-нибудь знает, как это можно сделать?
Спасибо.
Я только что протестировал это, и он работает в Access 2010.
Скажем, у вас есть запрос SELECT с параметрами:
PARAMETERS startID Long, endID Long;
SELECT Members.*
FROM Members
WHERE (((Members.memberID) Between [startID] And [endID]));
Вы запускаете этот запрос в интерактивном режиме и запрашиваете у вас [startID] и [endID]. Это работает, поэтому вы сохраняете этот запрос как [MemberSubset].
Теперь вы создаете запрос UPDATE на основе этого запроса:
UPDATE Members SET Members.age = [age]+1
WHERE (((Members.memberID) In (SELECT memberID FROM [MemberSubset])));
Вы запускаете этот запрос в интерактивном режиме, и снова вам предлагается ввести [startID] и [endID], и он работает хорошо, поэтому вы сохраняете его как [MemberSubsetUpdate].
Вы можете запустить [MemberSubsetUpdate] из кода VBA, указав значения [startID] и [endID] в качестве параметров [MemberSubsetUpdate], даже если они фактически являются параметрами [MemberSubset]. Эти значения параметров "просачиваются" туда, где они нужны, и запрос работает без вмешательства человека:
Sub paramTest()
Dim qdf As DAO.QueryDef
Set qdf = CurrentDb.QueryDefs("MemberSubsetUpdate")
qdf!startID = 1 ' specify
qdf!endID = 2 ' parameters
qdf.Execute
Set qdf = Nothing
End Sub
Dim qdf As DAO.QueryDef; Set qdf = db.CreateQueryDef("", "UPDATE Members SET Members.age = [age]+1")
Попробуйте использовать QueryDefs. Создайте запрос с параметрами. Затем используйте что-то вроде этого:
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
Set dbs = CurrentDb
Set qdf = dbs.QueryDefs("Your Query Name")
qdf.Parameters("Parameter 1").Value = "Parameter Value"
qdf.Parameters("Parameter 2").Value = "Parameter Value"
qdf.Execute
qdf.Close
Set qdf = Nothing
Set dbs = Nothing
.Parameters
по номеру, например, qdf.Parameters(1).Value = "Parameter Value"
. Не уверен, если это основано на нуле.
Большое спасибо за информацию об использовании коллекции QueryDefs! Мне было интересно об этом некоторое время.
Я сделал это по-другому, без использования VBA, используя таблицу, содержащую параметры запроса.
например: SELECT a_table.a_field FROM QueryParameters, a_table WHERE a_table.a_field BETWEEN QueryParameters.a_field_min И QueryParameters.a_field_max
Где QueryParameters - это таблица с двумя полями: a_field_min и a_field_max
Его можно даже использовать с GROUP BY, если вы включаете поля параметров запроса в предложение GROUP BY и оператор FIRST в полях параметров в предложении HAVING.
Вы также можете использовать TempVars - note '!' синтаксис необходим