Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Execute, Insert, мало параметров
 
 автор: sCandal   (21.09.2010 в 13:45)   личное сообщение
 
 

Здравствуйте!
Имеется запрос 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.
В чем тут ошибка?
Помогите, пожалуйста.
Спасибо!

  Ответить  
 
 автор: Lukas   (21.09.2010 в 13:49)   личное сообщение
 
 


...Between [Forms]![Main]![txtDateStart] And [Forms]![Main]![txtDateEnd])...

Если собираете строку SQL кодом, подставляйте вместо ссылок на поля формы их значения в правильном формате.

Дочитал вопрос. А форма то загружена? и поля имеют значения?

  Ответить  
 
 автор: sCandal   (21.09.2010 в 17:58)   личное сообщение
 
 

Да, форма с двумя полями, в которые вводится дата, открыта
В этих полях используется маска ввода:
00.00.0000;0;#

  Ответить  
 
 автор: Lukas   (21.09.2010 в 18:09)   личное сообщение
 
 

Соберите строку 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

  Ответить  
 
 автор: sCandal   (21.09.2010 в 18:33)   личное сообщение
 
 

Не дождался ответа, и так и сделал
Правда, у меня так:
"#" & Month(dt) & "/" & Day(dt) & "/" & Year(dt) & "#"
но сейчас переделаю в Ваш вариант

  Ответить  
 
 автор: sCandal   (21.09.2010 в 18:54)   личное сообщение
 
 

А все таки, как в подобных ситуациях можно выделить код запроса в запрос, а не держать его в коде VBA?
Может есть какой-нибудь подход, выход?

  Ответить  
 
 автор: Lukas   (21.09.2010 в 19:05)   личное сообщение
 
 

Можно выполнить запрос через DoCmd.RunSQL, но не рекомендую.
Можно через запрос с параметрами.

  Ответить  
 
 автор: sCandal   (21.09.2010 в 19:26)   личное сообщение
 
 

А где можно прочитать про запрос с параметрами в Access 2007?

  Ответить  
 
 автор: Анатолий (Киев)   (21.09.2010 в 20:22)   личное сообщение
 
 


А где можно прочитать про запрос с параметрами


Если использовать 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

  Ответить  
 
 автор: sCandal   (24.09.2010 в 09:48)   личное сообщение
 
 

А как передать программно значения для параметров сохраненного запроса и запустить его?
Например, если запрос называется iABC, то запускаем его
CurrentDB.Execute "iABC"
но как передать параметры?

  Ответить  
 
 автор: Анатолий (Киев)   (24.09.2010 в 10:55)   личное сообщение
 
 

Смотрите мой ответ выше, только Set rst = qdf.OpenRecordset - это для запросов на выборку. Для вас (и в моем примере) нужен метод qdf.Exequte.

Если запрос на выборку и результат нужно показать на экране, и параметры в виде ссылок на элементы открытой формы, то можно выполнить DoCmd.OpenQuery "ИмяЗапроса".
Этот метод подходит и для запросов на изменения, но нужно бороться с лишними сообщениями. Не рекомендую.

  Ответить  
 
 автор: scandal   (25.09.2010 в 10:13)   личное сообщение
 
 

Имеется в БД запрос 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, ...
Как быть?

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList