Можно ли программным образом передавать параметры в запросе на обновление Microsoft Access?
У меня есть запрос, который довольно большой, соединяющий более десятка таблиц, и я хочу отменить записи на основе поля id (, например.: between nStartID and nEndID
).
Я создал два параметра и протестировал их как критерии, и они отлично работают.
Проблема заключается в том, что мне нужно запустить запрос вставки из этого основного запроса и в параметрах, где они находятся, в основном запросе нужны параметры. Поэтому мне нужно передавать параметры программно.
Кто-нибудь знает, как это можно сделать?
Спасибо.
Ответы
Ответ 1
Я только что протестировал это, и он работает в 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
Ответ 2
Попробуйте использовать 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
Ответ 3
Большое спасибо за информацию об использовании коллекции QueryDefs! Я долго об этом думал.
Я сделал это по-другому, без использования VBA, с помощью таблицы, содержащей параметры запроса.
Например:
SELECT a_table.a_field
FROM QueryParameters, a_table
WHERE a_table.a_field BETWEEN QueryParameters.a_field_min
AND QueryParameters.a_field_max
Где QueryParameters
- это таблица с двумя полями, a_field_min
и a_field_max
Его можно использовать даже с GROUP BY
, если вы включите поля параметров запроса в предложение GROUP BY
и оператор FIRST
в поля параметров в предложении HAVING
.
Ответ 4
Вы также можете использовать TempVars - note '!' синтаксис необходим
![You can also use TempVars - note '!' syntax is essential]()
Ответ 5
Уже много ответов, но вы можете использовать это:
Sub runQry(qDefName)
Dim db As DAO.Database, qd As QueryDef, par As Parameter
Set db = CurrentDb
Set qd = db.QueryDefs(qDefName)
On Error Resume Next
For Each par In qd.Parameters
Err.Clear
par.Value = Eval(par.Name) 'try evaluating param
If Err.Number <> 0 Then 'failed ?
par.Value = InputBox(par.Name) 'ask for value
End If
Next par
On Error GoTo 0
qd.Execute dbFailOnError
End Sub
Sub runQry_test()
runQry "test" 'qryDef name
End Sub