Подтвердить что ты не робот

Можно ли программным образом передавать параметры в запросе на обновление Microsoft Access?

У меня есть запрос, который довольно большой, соединяющий более десятка таблиц, и я хочу отменить записи на основе поля id (, например.: between nStartID and nEndID).

Я создал два параметра и протестировал их как критерии, и они отлично работают.

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

Кто-нибудь знает, как это можно сделать?

Спасибо.

4b9b3361

Ответ 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