VBA: ошибка выполнения оператора SELECT - PullRequest
0 голосов
/ 22 июня 2010
Private Sub CmdPharmacy_Click()

Dim myM(11) As String

Set mydb = CurrentDb

If PMNM = "" Then
    PMNM = UCase(Left(cboMonth.Value, 3))
End If

sQ = "SELECT mN FROM PharDate WHERE mT = '" & PMNM & "';"
Set myrec = mydb.OpenRecordset(sQ, dbOpenDynaset)
myrec.MoveFirst
myC = myrec.Fields("mN")

For i = 0 To myC - 1
    myM(i) = "M" & i + 1
Next i

For i = myC To 11
    myM(i) = "NDATA"
Next i

'mydb.TableDefs.Delete ("PHAR_REPORT")

sQ = "SELECT HistoryData2.PR, HistoryData2.CC, " & _
       "HistoryData2." & myM(0) & " as U1, HistoryData2." & myM(1) & " as U2, HistoryData2." & myM(2) & " as U3, HistoryData2." & myM(3) & " as U4, " & _
       "HistoryData2." & myM(4) & " as U5, HistoryData2." & myM(5) & " as U6, HistoryData2." & myM(6) & " as U7, HistoryData2." & myM(7) & " as U8, " & _
       "HistoryData2." & myM(8) & " as U9, HistoryData2." & myM(9) & " as U10, HistoryData2." & myM(10) & " as U11, HistoryData2." & myM(11) & " as U12," & _
       "Revenue." & myM(0) & " as R1, Revenue." & myM(1) & " as R2, Revenue." & myM(2) & " as R3, Revenue." & myM(3) & " as R4, Revenue." & myM(4) & " as R5, " & _
       "Revenue." & myM(5) & " as R6, Revenue." & myM(6) & " as R7, Revenue." & myM(7) & " as R8, Revenue." & myM(8) & " as R9, Revenue." & myM(9) & " as R10, " & _
       "Revenue." & myM(10) & " as R11, Revenue." & myM(11) & " as R12, " & _
       "INTO PHAR_REPORT FROM HistoryData2, Revenue WHERE (((HistoryData2.PR) = Revenue.PR) And " & _
       "((Revenue.PR)>=76700000 And (Revenue.PR)<=76900000)) ORDER BY HistoryData2.PR;"

Когда я пытаюсь выполнить sQ, я получаю ошибку во время выполнения, что ..... Оператор SELECT включает зарезервированное слово или имя аргумента, которое написано с ошибкой или отсутствует, или пунктуация неправильная.

SELECT HistoryData2.PR, HistoryData2.CC, HistoryData2.M1 as U1, HistoryData2.M2 as U2, HistoryData2.M3 as U3, HistoryData2.M4 as U4, HistoryData2.M5 as U5, HistoryData2.M6 as U6, HistoryData2.M7 as U7, HistoryData2.M8 as U8, HistoryData2.NDATA as U9, HistoryData2.NDATA as U10, HistoryData2.NDATA as U11, HistoryData2.NDATA as U12 Revenue.M1 as R1, Revenue.M2 as R2, Revenue.M3 as R3, Revenue.M4 as R4, Revenue.M5 as R5, Revenue.M6 as R6, Revenue.M7 as R7, Revenue.M8 as R8, Revenue.NDATA as R9, Revenue.NDATA as R10, Revenue.NDATA as R11, Revenue.NDATA as R12 
   INTO PHAR_REPORT 
FROM HistoryData2, Revenue 
WHERE (((HistoryData2.PR) = Revenue.PR) And ((Revenue.PR)>=76700000 And (Revenue.PR)<=76900000)) 
ORDER BY HistoryData2.PR;

Ответы [ 2 ]

2 голосов
/ 23 июня 2010

Вам нужно увидеть законченный оператор SQL, который вы пытаетесь выполнить. Добавьте строку перед mydb.Execute следующим образом:

Debug.Print sQ
mydb.Execute sQ

Debug.Print напечатает инструкцию в окне немедленного действия. (Вы можете использовать CTRL + g, чтобы туда попасть.) Скопируйте инструкцию, затем откройте новый запрос, переключитесь на SQL View, вставьте его туда и попробуйте. Надеюсь, что эти усилия помогут вам определить проблему. Если вы не можете решить эту проблему, отредактируйте свой вопрос, включив это утверждение, чтобы мы могли его увидеть.

Обновление : последняя редакция вашего вопроса включает запятую после последнего поля в списке полей:

"Revenue." & myM(10) & " as R11, Revenue." & myM(11) & " as R12, " & _

Удалите запятую после R12.

Update2 : Дэвид Фентон обнаружил пропущенную запятую в предложении SQL, которое вы включили. Я ожидаю, что пропущенная запятая вызовет ошибку 3075, «Синтаксическая ошибка (отсутствует оператор) в выражении запроса ...». Однако в вашем последнем отчете указывалось, что полученное вами сообщение об ошибке «Несоответствие типов данных в выражении критериев». Я подозреваю, что мы имеем дело с движущейся целью. Вы сообщили как минимум 3 разных сообщения об ошибках. И опубликованный вами оператор SQL не соответствует коду VBA, который вы нам показали.

Если ваше сообщение об ошибке по-прежнему «Несоответствие типов данных в выражении критерия», попробуйте этот запрос и покажите нам, что оно дает вам:

SELECT "HistoryData2" AS table_name, TypeName(PR) AS pr_data_type
FROM HistoryData2
UNION ALL
SELECT "Revenue" AS table_name, TypeName(PR) AS pr_data_type
FROM Revenue;
1 голос
/ 25 июня 2010

В предложении SELECT вашего оператора SQL есть следующее:

HistoryData2.NDATA as U12 Revenue.M1 as R1

Это должно быть так:

HistoryData2.NDATA as U12, Revenue.M1 as R1

То есть пропущенная запятая.Я вижу в коде, который объединяет строку, конечная запятая есть.Я не могу объяснить расхождение, если вы не изменили код или не получили SQL из правильного источника.

...