|
|
|
| Здравствуйте!
Имеется запрос iABC_Product
INSERT INTO abc ( id, total )
SELECT invoice_sub_sub.product_id AS id, Sum(price*(Nz([amount],0)-Nz([return],0))) AS total
FROM invoice_sub INNER JOIN invoice_sub_sub ON invoice_sub.id=invoice_sub_sub.invoice_sub_id
WHERE (((invoice_sub.[dt]) Between [Forms]![Main]![txtDateStart] And [Forms]![Main]![txtDateEnd]))
GROUP BY invoice_sub_sub.product_id;
|
Запрос работает, но при попытке запустить его через VBA
CurrentDb.Execute "iABC_Product"
|
выходит ошибка:
Слишком мало параметров. Требуется 2.
В чем тут ошибка?
Помогите, пожалуйста.
Спасибо! | |
|
| |
|
|
|
|
...Between [Forms]![Main]![txtDateStart] And [Forms]![Main]![txtDateEnd])...
|
Если собираете строку SQL кодом, подставляйте вместо ссылок на поля формы их значения в правильном формате.
Дочитал вопрос. А форма то загружена? и поля имеют значения? | |
|
| |
|
|
|
| Да, форма с двумя полями, в которые вводится дата, открыта
В этих полях используется маска ввода:
00.00.0000;0;# | |
|
| |
|
|
|
| Соберите строку SQL кодом, где вместо ссылок на поля формы подставьте их значения.
Private Const SQLDATE As String = "\#mm\/dd\/yyyy\#"
Dim strSQL As string
strSQL="INSERT INTO ... WHERE ... Between " & Format$([Forms]![Main]![txtDateStart], SQLDATE) & " And " & Format$([Forms]![Main]![txtDateEnd], SQLDATE) & " GROUP BY ... "
Затем выполняйте:
CurrentDb.Execute strSQL | |
|
| |
|
|
|
| Не дождался ответа, и так и сделал
Правда, у меня так:
"#" & Month(dt) & "/" & Day(dt) & "/" & Year(dt) & "#"
но сейчас переделаю в Ваш вариант | |
|
| |
|
|
|
| А все таки, как в подобных ситуациях можно выделить код запроса в запрос, а не держать его в коде VBA?
Может есть какой-нибудь подход, выход? | |
|
| |
|
|
|
| Можно выполнить запрос через DoCmd.RunSQL, но не рекомендую.
Можно через запрос с параметрами. | |
|
| |
|
|
|
| А где можно прочитать про запрос с параметрами в Access 2007? | |
|
| |
|
|
|
|
А где можно прочитать про запрос с параметрами
|
Если использовать DAO:
s = "INSETR INTO..."
Set qdf = CreateQueryDef("", s)
qdf.Parametres("[Forms]![Main]![txtDateStart]") = [Forms]![Main]![txtDateStart]
qdf.Parametres("[Forms]![Main]![txtDateEnd]")=[Forms]![Main]![txtDateEnd]
Set rst = qdf.OpenRecordset | |
|
| |
|
|
|
| А как передать программно значения для параметров сохраненного запроса и запустить его?
Например, если запрос называется iABC, то запускаем его
CurrentDB.Execute "iABC"
но как передать параметры? | |
|
| |
|
|
|
| Смотрите мой ответ выше, только Set rst = qdf.OpenRecordset - это для запросов на выборку. Для вас (и в моем примере) нужен метод qdf.Exequte.
Если запрос на выборку и результат нужно показать на экране, и параметры в виде ссылок на элементы открытой формы, то можно выполнить DoCmd.OpenQuery "ИмяЗапроса".
Этот метод подходит и для запросов на изменения, но нужно бороться с лишними сообщениями. Не рекомендую. | |
|
| |
|
|
|
| Имеется в БД запрос iABC_Product, в котором следующее:
INSERT INTO abc ( id, total )
SELECT product_id AS id, Sum(price*(Nz(amount,0)-Nz(return,0))) AS total
FROM invoice_sub INNER JOIN invoice_sub_sub ON invoice_sub.id=invoice_sub_sub.invoice_sub_id
WHERE dt Between dtStart And dtEnd
GROUP BY product_id;
|
На основе Ваших советов написал следующий код в VBA:
sSQL = "iABC_Product"
Set qdf = CurrentDb.CreateQueryDef("", sSQL)
With qdf
.Parameters("dtStart") = SQLDate(dtStart)
.Parameters("dtEnd") = SQLDate(dtEnd)
.Execute
End With
|
Однако выходит ошибка:
Ошибочная инструкция SQL; Предполагалось DELETE, INSERT, ...
Как быть? | |
|
| |