2015-01-05 6 views
0

Я пытаюсь запустить этот оператор SQL в VBA, и по какой-то причине он говорит, что есть слишком мало параметров и что он ожидал 1. Я не могу понять, на какой строке он включен. Любая помощь будет принята с благодарностью.Слишком мало параметров в Access VBA

strCount = "INSERT INTO MarketSegmentTotals([State Medicaid], [Commercial], [HIX], [MMP], [CMS Part D (CY " & intYear & ")], [CMS Part D (CY " & (intYear + 1) & ")]) " & _ 
"SELECT A.cnt, B.cnt, C.cnt, D.cnt, E.cnt, F.cnt " & _ 
"FROM (" & _ 
    "SELECT COUNT([FORMULARY ID]) as cnt " & _ 
    "FROM ImportMetricsIDs " & _ 
    "WHERE [Market Segment]= 'State Medicaid' " & _ 
") AS A " & _ 
", (" & _ 
    "SELECT COUNT([FORMULARY ID]) as cnt " & _ 
    "FROM ImportMetricsIDs " & _ 
    "WHERE [Market Segment]= 'Commercial' " & _ 
") as B " & _ 
", (" & _ 
    "SELECT COUNT([FORMULARY ID]) as cnt " & _ 
    "FROM ImportMetricsIDs " & _ 
    "WHERE [Market Segment]= 'HIX' " & _ 
") AS C " & _ 
", (" & _ 
    "SELECT COUNT([FORMULARY ID]) as cnt " & _ 
    "FROM ImportMetricsIDs " & _ 
    "WHERE [Market Segment]= 'MMP' " & _ 
") AS D " 

strCount2 = strCount & _ 
", (" & _ 
    "SELECT COUNT([FORMULARY ID]) as cnt " & _ 
    "FROM ImportMetricsIDs " & _ 
    "WHERE [Market Segment]= 'CMS Part D (CY ' & (intYear) & ')'" & _ 
") AS E " & _ 
", (" & _ 
    "SELECT COUNT([FORMULARY ID]) as cnt " & _ 
    "FROM ImportMetricsIDs " & _ 
    "WHERE [Market Segment]= 'CMS Part D (CY ' & (intYear + 1) & ')'" & _ 
") AS F " 
+3

Я предполагаю, что '(CY '& (intYear) &')' должен был быть '(CY" & (intYear) & ")' (а также для '(intYear + 1)'), но на самом деле скорее всего, вы должны использовать хранимую процедуру. –

+3

Можете ли вы запустить этот запрос напрямую с вашим источником данных, не вовлекая VBA и правильно ли работая? В этом запросе есть некоторые странности (например, нет соединений в ваших подзапросах). Простым способом сделать это было бы добавить Debug.Print strCount2 в строку db.Execute, а затем в ближайшее окно вы можете скопировать полученный запрос и запустить его против вашего источника данных. – KevenDenen

+1

Красота предложения Кевена заключается в том, что при копировании текста инструкции из окна «Немедленное» вставьте его в SQL View нового запроса в конструкторе запросов и попытайтесь запустить его, Access отобразит окно ввода, в котором будет предложено указать значение для параметра. И это поле ввода содержит имя параметра. Что такое имя параметра? – HansUp

ответ

1

Я думаю, что у вас есть проблема с кавычками в тексте вашего заявления. Посмотрите на этом отрывке на основе коды, когда я тестировал в открывшемся окне:

intYear = 2015 
? "WHERE [Market Segment]= 'CMS Part D (CY ' & (intYear) & ')'" 
WHERE [Market Segment]= 'CMS Part D (CY ' & (intYear) & ')' 

Это не может быть правильным. И когда Access пытается выполнить запрос и видит intYear, он интерпретирует это как параметр, потому что движок db ничего не знает о переменной VBA с именем intYear.

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

? "WHERE [Market Segment]= 'CMS Part D (CY " & (intYear) & ")'" 
WHERE [Market Segment]= 'CMS Part D (CY 2015)' 

Я призываю вас следовать совету KevenDenen, чтобы добавить Debug.Print strCount2 в код после того, как он закончил строительство strCount2 строку. Затем вы можете запустить код и просмотреть текст завершенной инструкции в окне «Немедленное». (Вы можете использовать Ctrl + g, чтобы перейти в окно Immediate.) Это очень помогает проверить фактическое утверждение, которое ваш код запрашивает для доступа к исполнению.