我在VBA模块中有以下SQL语句:
dbs.Execute "INSERT INTO PA2001CustomReportingTable ([Personnel No], [Subtype], [Start Date], [End Date], [CalDays]) " & _
"SELECT [Personnel No], [Subtype], [Start Date], [End Date], [CalDays] FROM PA2001 " & _
"WHERE ([PA2001].[Cal days] > 0) AND ([PA2001].[Start Date]>=#" & StartDatePA2001Lower & "#) AND ([PA2001].[End Date]<=#" & EndDatePA2001Upper & "#) AND (" & GetListOfInclusionTypes() & ");"
GetListOfInclusionTypes调用函数是一个简单的字符串构建器,它使用用户表单上的列表框上的用户选择来构建字符串。
Function GetListOfInclusionTypes() As String
Dim i As Integer
Dim isFirst As Boolean
isFirst = True
'Convert Listbox into String of Selected Leave Types
For i = 0 To Forms("MainReport").Controls("SelLeaveTypes").ListCount - 1
If Forms("MainReport").Controls("SelLeaveTypes").Selected(i) Then
If isFirst = True Then
GetListOfInclusionTypes = "[PA2001].[Subtype]=" & Chr(34) & Forms("MainReport").Controls("SelLeaveTypes").Column(0, i) & Chr(34)
isFirst = False
Else
GetListOfInclusionTypes = GetListOfInclusionTypes & " OR [PA2001].[Subtype]=" & Chr(34) & Forms("MainReport").Controls("SelLeaveTypes").Column(0, i) & Chr(34)
End If
End If
Next i
End Function
它构建的示例字符串是:
[PA2001].[Subtype] = "0100" Or [PA2001].[Subtype] = "0200" Or [PA2001].[Subtype] = "0300"
但是,一旦运行Insert into SQL语句;数据被插入到新表中,该表不属于SQL Where子句中指定的日期范围!我没看到错误在哪里..
答案 0 :(得分:1)
我无法用INSERT
语句发现问题。 WHERE
子句引用名称为[PA2001].[Cal days]
的字段中有2个空格的字段,乍一看似乎是可疑的。但是,如果那不是实际的字段名称,那么你应该得到一个错误......你不是。
给自己一个机会来检查你要求db引擎执行的已完成语句。
Dim strInsert As String
strInsert = "INSERT INTO PA2001CustomReportingTable ([Personnel No], [Subtype], [Start Date], [End Date], [CalDays]) " & _
"SELECT [Personnel No], [Subtype], [Start Date], [End Date], [CalDays] FROM PA2001 " & _
"WHERE ([PA2001].[Cal days] > 0) AND ([PA2001].[Start Date]>=#" & StartDatePA2001Lower & "#) AND ([PA2001].[End Date]<=#" & EndDatePA2001Upper & "#) AND (" & GetListOfInclusionTypes() & ");"
Debug.Print strInsert
dbs.Execute strInsert, dbFailOnError
然后,您可以在立即窗口中查看已完成的语句(使用 Ctrl + g )。您可以复制语句文本并将其粘贴到新的Access查询的SQL视图中以进行测试。如果您需要进一步的帮助,请将该声明粘贴到您的问题
作为一个侧面点,这两个查询条件是等价的:
[PA2001].[Subtype] = "0100" Or [PA2001].[Subtype] = "0200" Or [PA2001].[Subtype] = "0300"
[PA2001].[Subtype] In ("0100","0200","0300")
这与您的查询没有按照自己的意愿行事的原因无关。但第二种形式更简洁,可能会更容易解决问题。不过,我不知道是否值得更改GetListOfInclusionTypes
功能。