2013-05-22 75 views
1
忽視

我有一個VBA模塊中的下面的SQL語句:MS查詢條件由VBA

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" 

然而,一旦插入SQL語句運行;數據被插入到不屬於SQL Where子句中指定的日期範圍的新表中!我沒有看到錯誤在哪裏。

回答

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 + 克去那裏)。您可以複製語句文本並將其粘貼到新的Access查詢的SQL視圖中進行測試。如果您需要進一步的幫助,將該語句粘貼到您的問題中

作爲一個方面來看,這2個查詢條件是等價的:

[PA2001].[Subtype] = "0100" Or [PA2001].[Subtype] = "0200" Or [PA2001].[Subtype] = "0300" 
[PA2001].[Subtype] In ("0100","0200","0300") 

這沒有什麼關係,爲什麼你的查詢是沒有做你想要什麼。但第二種形式更爲簡潔,可能會使聲明變得更容易。不過,我不知道是否值得更改你的GetListOfInclusionTypes函數。