2016-10-25 3 views
0

ФОНMS Access - Написание SQL в VBA

Разработка модуля MS Access, который выполняет код SQL при OnClick() событие вызвало.

КОД

Dim sqlString As String 

sqlString = "SELECT [Table - Summary - All Item Forecasts, Sales, and POs].[COMPANY ID], " _ 
     & "[Table - Summary - All Item Forecasts, Sales, and POs].[COMPANY NAME], " _ 
     & "[Table - Summary - All Item Forecasts, Sales, and POs].ITEM, " _ 
     & "[Table - Summary - All Item Forecasts, Sales, and POs].STYLE, " _ 
     & "[Table - Summary - All Item Forecasts, Sales, and POs].DESCRIPTION, " _ 
     & "[Table - Summary - All Item Forecasts, Sales, and POs].[SALE PRICE], " _ 
     & "[Table - Summary - All Item Forecasts, Sales, and POs].[ON-HAND QTY], " _ 
     & "[Table - Summary - All Item Forecasts, Sales, and POs].[FORECAST QTY], " _ 
     & "[Table - Summary - All Item Forecasts, Sales, and POs].[MaxOfLATEST PO DATE] " _ 
    & "FROM [Table - Active Product Catalog] " _ 
    & "LEFT JOIN [Table - Summary - All Item Forecasts, Sales, and POs] " _ 
     & "ON [Table - Active Product Catalog].STYLE = [Table - Summary - All Item Forecasts, Sales, and POs].STYLE " _ 
    & "GROUP BY [Table - Summary - All Item Forecasts, Sales, and POs].[COMPANY ID], " _ 
     & "[Table - Summary - All Item Forecasts, Sales, and POs].[COMPANY NAME] , " _ 
     & "[Table - Summary - All Item Forecasts, Sales, and POs].Item, " _ 
     & "[Table - Summary - All Item Forecasts, Sales, and POs].Style, " _ 
     & "[Table - Summary - All Item Forecasts, Sales, and POs].Description, " _ 
     & "[Table - Summary - All Item Forecasts, Sales, and POs].[SALE PRICE], " _ 
     & "[Table - Summary - All Item Forecasts, Sales, and POs].[ON-HAND QTY], " _ 
     & "[Table - Summary - All Item Forecasts, Sales, and POs].[FORECAST QTY], " _ 
     & "[Table - Summary - All Item Forecasts, Sales, and POs].[MaxOfLATEST PO DATE]" _ 
    & "HAVING ((([Table - Summary - All Item Forecasts, Sales, and POs].[COMPANY NAME]) Like ' * ' & [Enter Company Name:] & ' * '));" 


DoCmd.RunSQL sqlString 

ОШИБКА

Ошибка выполнения '2342': акция RunSQL требует аргумент, состоящий из инструкции SQL.

ВОПРОС (S)

  1. Я следовал следующий tutorial но получаю ошибку. Похоже, что команда RunSQL не распознает sqlString как команду SQL. Однако я уверен, что SQL-запрос корректно работает в MS Access. Есть идеи?
  2. В последней строке инструкции SQL у меня есть приглашение MsgBox («[Enter Company Name:]»). Я не совсем уверен, что это отбрасывает оператор SQL, но, как указывалось ранее, синтаксис выполняется в MS Access; даже если я заменю приглашение жестко закодированным значением, я получаю такое же сообщение об ошибке.

Примечание: Я, скорее всего, создать inputBox, который просит для company name, а затем поместить переменную в последней строке заявления SQL.

+1

Смотрите здесь: http://stackoverflow.com/questions/27421873/select-query-does-not-work-when-converted-to-vba-invalid-sql-statement – OpiesDad

+0

Рассмотрим используя псевдонимы таблиц в вашем SQL ('SELECT Summary. [ИДЕНТИФИКАТОР КОМПАНИИ] ИЗ [Таблица - Сводка - Все товарные прогнозы, продажи и ПО] Сводная информация»); это сделает ваши заявления как более короткими, так и более легкими для анализа. –

ответ

1

Как указано в DoCmd.RunSQL documentation, он используется для запуска «запроса действия». То есть, SQLStatement является

Строкового выражения, что это допустимый оператор SQL для запроса действий или запроса в данном определении. Он использует INSERT INTO, DELETE, SELECT ... INTO, UPDATE, CREATE TABLE, ALTER TABLE, DROP TABLE, CREATE INDEX или DROP INDEX.

Обратите внимание, что в приведенном списке включен SELECT...INTO, но не равный SELECT. Чтобы выполнить простую SELECT и возвращает набор записей, что вам нужно сделать что-то вроде

Dim cdb As DAO.Database 
Set cdb = CurrentDb 
Dim rst As DAO.Recordset 
Set rst = cdb.OpenRecordset(sqlString, dbOpenSnapshot) 
' loop through the Recordset contents 
-1

Кроме того, в ваших последних 2 строки вам не хватает пространства между ... [MaxOfLATEST ПО ДАТА] и HAVING. Он упадет, когда он попытается запустить это как SQL.
Я ударил это сам несколько раз, так как я очень новичок в VBA. Я всегда добавляю debug.print SQLstring после команды запуска, так как легче найти эти пробелы и т. Д. В окне Immediate.

НТН, Дженни