2016-09-09 3 views
0
Set db = CurrentDb 
Set qdf = db.CreateQueryDef("Unique_Address1_qry", strSQL) 
Application.RefreshDatabaseWindow 

strSQL = "SELECT field1 AS field1, field2 as field2 " & vbCrLf & _ 
"'" & strScenario & "'" & "AS Scenario, " & vbCrLf & _ 
"FROM table_tbl " & vbCrLf & _ 
"GROUP BY field1,....; " 

strScenario содержит формулу расчета, как «[поле2]/2 + 3» результатом является то, что в каждой записи для рассчитывается по формуле Fied, «[поле2]/2 + 3» демонстрирует инстинкт вычисления.доступа динамическое создание запросов в VBA

+0

Удалить одиночные кавычки '' 'вокруг переменной? '' 'сообщает запросу, что это буквальная текстовая строка для возврата. –

ответ

1

Запрос действительно должен быть параметризован ... но у вас есть strScenario, цитируемый как буквальный. Вам также не хватает запятой после «field2» и пробела после strScenario.

Он должен выглядеть следующим образом:

strSQL = "SELECT field1 AS field1, field2 as field2, " & _ 
    strScenario & " AS Scenario FROM table_tbl GROUP BY field1,....; " 

Обратите внимание, что вы можете увидеть от результата SQL вы строите просто положить Debug.Print strSQL после вашего назначения и смотрит на него в открывшееся окно.

+0

, когда я использую простую формулу, она работает, но когда я начинаю использовать такие вещи, как: IIF ([SumOfVolume]> = 5; [SumOfLDM] * 1750; 0), это создает проблемы. Является ли функция IIF, создающая isse. – Dirk

+1

@Dirk - Посмотрите на результат в непосредственном окне. Действительно ли это SQL для MS Access? В этом случае это не - ';' завершает оператор - они должны быть ','. Если есть сомнения, скопируйте его в конструктор Access SQL и попробуйте выполнить его. Доступ позволит вам узнать, где синтаксическая ошибка. – Comintern

+0

Я изменил; с, для заявления IIF и 1,2 в 1.2, и он работает. Thx много для помощи. :-) – Dirk

2

Я не буду повторять то, что сказал @Comintern, но я могу дать вам удочку:

  • Поместите точку останова (F9) на линии сразу после strSQL = задания.
  • Запустите код.
  • Когда выполнение достигает точки останова, нажмите Ctrl + G, чтобы вызвать немедленной панель и типа:

    ?strSQL 
    

Это будет выводить значение строки (? представляет собой сокращенный для Print), который вы можете проверить самостоятельно, скопировать в буфер обмена, вставить в новый запрос и попытаться выполнить.

Затем вы можете исправить код, переместить текущую строку обратно в модифицированном strSQL = задания, попробуйте ?strSQL снова прополоскать & повторить, пока код не генерирует правильный запрос SQL - то вы можете удалить точку останова и нажмите F5 к возобновить выполнение, и у вас есть рабочий код.


Дайте человеку рыбу, он будет сыт один день. Дайте человеку удочку, он будет есть всю оставшуюся жизнь.

+1

Так верно. Ссылки для этого: [Как отлаживать код VBA] (http://www.cpearson.com/excel/DebuggingVBA.aspx) и [Как отлаживать динамический SQL в VBA] (http://stackoverflow.com/questions/418960/managing-and-debugging-sql-queries-in-ms-access/1099570#1099570) – Andre

Смежные вопросы