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

32

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

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

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

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

Спасибо.

  • 1
    У меня есть решение для моих нужд, но я не уверен, что оно лучшее. Я создал глобальные переменные для nStartID и nEndID, а затем просто создал функцию для каждого, как в getStartID () и getEndID (), которые читают эти значения. Затем я просто использую эти функции в предложении where исходного запроса. Не самое элегантное из решений, но оно работает. Я оставляю это открытым, если у кого-то еще есть опыт, которым он хотел бы поделиться, на благо других. Спасибо за ваш полезный вклад.
Теги:
ms-access
ms-access-2010
parameters

4 ответа

55
Лучший ответ

Я только что протестировал это, и он работает в 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
  • 0
    Спасибо, что поделились, я нашел похожий код, но ничего не объяснил.
  • 1
    Это также работает, если вы создаете запрос в VBA; например Dim qdf As DAO.QueryDef; Set qdf = db.CreateQueryDef("", "UPDATE Members SET Members.age = [age]+1")
18

Попробуйте использовать 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
  • 2
    Я думаю, что вы также можете ссылаться на .Parameters по номеру, например, qdf.Parameters(1).Value = "Parameter Value" . Не уверен, если это основано на нуле.
  • 2
    Это верно, и я подтверждаю, что это основано на нуле.
4

Большое спасибо за информацию об использовании коллекции 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.

1

Вы также можете использовать TempVars - note '!' синтаксис необходим Изображение 3785

  • 0
    Как это используется?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню