1

我在 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 子句中指定的日期范围的新表中!我没有看到错误在哪里..

4

1 回答 1

1

我无法发现该INSERT声明的问题。该WHERE子句引用了一个名称中有 2 个空格的字段,[PA2001].[Cal days]乍一看似乎很可疑。但是,如果这不是实际的字段名称,您应该会收到一个错误...您不是。

给自己一个机会来检查您要求数据库引擎执行的已完成语句。

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功能。

于 2013-05-22T14:04:52.543 回答