2010-06-22 25 views
0
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语句包括拼写错误或丢失的保留字或参数名称的运行时错误,或标点符号不正确。VBA: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; 
+0

@HansUp ....我用你的建议和查询工作。但是当我尝试使用完全相同的SELECT语句时,我收到此错误消息或参数错误消息太少 – Edmond 2010-06-24 14:18:09

+0

您是如何执行查询的?你使用的是querydef吗? – THEn 2010-06-24 14:30:54

回答

2

您需要查看您正试图执行的完成的SQL语句。像这样在mydb.Execute之前添加一行:

Debug.Print sQ 
mydb.Execute sQ 

Debug.Print将在立即窗口中打印语句。 (你可以使用CTRL + g来达到目的。)复制语句,然后打开一个新的查询,切换到SQL视图并将其粘贴到那里,然后尝试它。希望这种努力能帮助你发现问题。如果您无法解决问题,请编辑您的问题以包含该声明,以便我们也可以看到它。

更新:你的问题的最新版本包含在你的领域列表中的最后一个域之后逗号:

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

消除R12之后的逗号。

Update2:David Fenton在您所包含的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

“参数太少......”是VBA在不存在的SQL查询中引用字段时所说的内容。实质上,VBA期望您传递一个参数来替换查询中的未知值。由于所有这些动态字段名称中的一个或多个必须无效...... – Tahbaza 2010-06-23 02:52:15

+0

@HansUp现在我收到错误消息条件表达式中的数据类型不匹配 – Edmond 2010-06-24 16:01:28

+0

@Edmond向我们显示产生该错误的实际SQL语句。 – HansUp 2010-06-24 16:09:28

1

在SQL语句的SELECT子句中你有这样的:

HistoryData2.NDATA as U12 Revenue.M1 as R1 

它应该是这样的:

HistoryData2.NDATA as U12, Revenue.M1 as R1 

也就是说,缺少逗号。

但是,我看到在连接字符串的代码中,尾随逗号在那里。我无法解释这种差异,除非您更改了代码,或者没有从正确的来源获得SQL。

+0

当我尝试执行sQ时,我得到一个INVALID ARGUMENT错误消息 – Edmond 2010-06-30 21:43:31

+0

经过很多来回之后,我们仍然不确切知道您尝试的SQL字符串执行,因为你的代码确实包含了逗号,但是你的结果报告没有。这不可能是真实的,除非你发布的连接结果来自其他地方。在我们实际执行SQL字符串之前,我们甚至无法开始查看它的问题。 – 2010-07-01 01:20:30