2012-05-28 2 views
1

Я пытаюсь запустить следующий запрос в функции VBA. Я продолжаю получать «Слишком мало параметров. Ожидаемый 1.»Запуск запроса параметра в Access VBA

strSQL = "Parameters [Report Date] DateTime;" & vbCrLf & _ 
        "SELECT SCF.code AS [Stock Code], " & vbCrLf & _ 
        "SCF.desc AS [Description], " & vbCrLf & _ 
        "SCF.grp AS [Product Group]," & vbCrLf & _ 
        "SCF.qCurr AS [Closing Stock], " & vbCrLf & _ 
        "SCF.abp AS [Avg Price], " & vbCrLf & _ 
        "Sum(([Closing Stock]*[Avg Price])) AS [STOCK VALUE], " & vbCrLf & _ 
        "MaxDate.tDate AS [Last Transaction Date], " & vbCrLf & _ 
        "Sum(IIf(([Last Transaction Date]>[Report Date]),([Closing Stock]*[Avg Price]),0)) AS [After Report Date], " & vbCrLf & _ 
        "DateDiff(""d"",[Last Transaction Date],[Report Date]) AS [Days since Last Transaction], " & vbCrLf & _ 
        "[Report Date]" & vbCrLf & _ 
      "INTO [FinReport] " & vbCrLf & _ 
      "FROM SCF RIGHT JOIN MaxDate ON MaxDate.parent = SCF.this " 
strSQL = strSQL & _ 
      "WHERE (SCF.qCurr <> 0) " & vbCrLf & _ 
      "GROUP BY SCF.code, " & vbCrLf & _ 
         "SCF.desc, " & vbCrLf & _ 
         "SCF.grp, " & vbCrLf & _ 
         "SCF.qCurr, " & vbCrLf & _ 
         "SCF.abp, " & vbCrLf & _ 
         "MaxDate.tDate" & vbCrLf & _ 
      "ORDER BY MaxDate.tDate;" 

Set qdf = db.CreateQueryDef("", strSQL) 
qdf.Parameters("[Report Date]").Value = Form_IO_Form.ReportDate_TB.Value 
qdf.Execute 

Я проверил, что все поля (кроме [Report Date], конечно) существуют и запрос выполняется сам по себе в качестве запроса доступа (всплывают просит [Report Date]).

Помощь!

Редактировать 1: Как запрошено здесь файл DB как ZIP. Это файл Access 2007. .accdb
DB File

+0

Замечу, что вы не должны действительно требовать '& vbCrLf' в каждой строке. Компилятор не заботится о новых строках. Если, конечно, вам не нужно распечатывать запрос для просмотра. В любом случае, vbNewLine будет предпочтительным в любом случае. – BIBD

+0

@codeslave: vbcrlf должен сделать строку запроса более понятной и понятной для меня и любого будущего программиста. Я буду изменять свой код и использовать vbnewline ... – 147

+1

@CodeSlave Почему вы предпочитаете 'vbNewLine' вместо' vbCrLf'? – HansUp

ответ

1

Ваш SQL заявление вызовет ошибку # 3122 от дб двигателя:

You tried to execute a query that does not include the specified expression 'DateDiff("d",[Last Transaction Date],[Report Date])' as part of an aggregate function.

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

Когда вы строите инструкцию SQL с VBA, лучше начать с того, что примет двигатель db. Затем вы также должны следовать рекомендациям по звуку от @ mwolfe02 до Debug.Print strSQL ..., чтобы дать вам возможность изучить завершенное заявление, которое вы просите запустить db-движок.

Редактировать: Изучив ACCDB-файл, который вы загрузили, я до сих пор не понимаю, почему ваш запрос не вызывает ошибку # 3122. Однако запрос работает как сохраненный запрос и может работать, когда вы выполняете его из кода VBA. Причина, по которой вы получили жалобу на «слишком мало параметров», заключается в том, что вы фактически не выполняли временный QueryDef, который вы создали. Вместо этого вы пытались выполнить текст SQL, как это:

' Execute created Query ' 
CurrentDb.Execute strSQL, dbFailOnError 

При изменении этого подхода (как указано в вашем вопросе), он работает без ошибок:

qdf.Execute 
+0

vbcrlf существует именно по этой причине - я использую его, чтобы сделать строку запроса прочитанной для отладки. Обратите внимание, что объявление, которое я выделил, запрос выполняется просто отлично при запуске как обычный запрос доступа – 147

+0

Спасибо. Это сработало. Я не знаю, почему ошибка 3122 тоже не срабатывает, но предыдущий администратор баз данных написал запрос так, чтобы он работал. – 147

1

Я предполагаю, что у вас есть опечатка в одном из ваших полей. Самый простой способ найти это - бросить линию Debug.Print strSQL непосредственно перед вашей линией Set qdf....

Затем создайте новый запрос в пользовательском интерфейсе доступа, переключитесь на представление SQL, вставьте текст SQL из непосредственного окна и выполните запрос. Access запросит у вас Report Date (который вы ожидаете) и ошибочное имя одного из полей.

+0

см. Мой комментарий к @HansUp. Я еще раз повторюсь для опечаток ... – 147

+1

Если вы скорректировали дату (например, '# 5/28/2012 #') вместо вашей ссылки на текстовое поле формы (то есть, 'Form_IO_Form.ReportDate_TB.Value '), вы все еще получаете сообщение об ошибке? – mwolfe02

+0

Да. Пробовал это - та же ошибка. Даже когда я использую 'Form_IO_From.ReportDate_TB.value = Date' , чтобы получить текущую системную дату. – 147