我正在尝试从Access数据库中进行的查询中获取结果。但是,当我在excel中查询数据库时,查询没有返回值。为什么是这样?当我尝试查询(从excel)普通表或其他查询时,值按预期返回。
我的代码:
Sub sqlCode()
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim StrDBPath As String
Dim strSQL As String
strSQL = "SELECT * FROM qryHeadsA_ExcelOutput"
StrDBPath = Application.ActiveWorkbook.Path & "\Daily Closing Report V997.accdb"
cnn.Open "Provider=Microsoft.Ace.OLEDB.12.0;" & _
"Data Source=" & StrDBPath & ";" & _
"Jet OLEDB:Engine Type=5;" & _
"Persist Security Info=False;"
rst.Open strSQL, cnn, adOpenStatic, adLockOptimistic
CopyText (strSQL)
MsgBox rst.RecordCount
rst.Close
cnn.Close
Set rst = Nothing
Set cnn = Nothing
End Sub
查询中的SQL:
SELECT [Heads A].[Date Entered], [Heads A Issues].Department, [Heads A Issues].Equipment, [Heads A Issues].[Operation Issues], Sum([Heads A Issues].Downtime) AS SumOfDowntime1, IIf([Head A Crew]='3','C-Crew',IIf([Head A Crew]='2','B-Crew','A-Crew')) AS Crew
FROM [Heads A] INNER JOIN [Heads A Issues] ON [Heads A].[HeadLineA ID] = [Heads A Issues].[HeadLineA ID]
GROUP BY [Heads A].[Date Entered], [Heads A Issues].Department, [Heads A Issues].Equipment, [Heads A Issues].[Operation Issues], IIf([Head A Crew]='3','C-Crew',IIf([Head A Crew]='2','B-Crew','A-Crew'))
HAVING ((([Heads A Issues].Department)='9240A-F') And ((IIf([Head A Crew]='3','C-Crew',IIf([Head A Crew]='2','B-Crew','A-Crew'))) Like IIf('ALL'='all','*-Crew','ALL')))
ORDER BY [Heads A Issues].Department, [Heads A Issues].Equipment;
同样,在Access DB中,此查询提供了符合此条件的超过10k条记录。 Access中是否有可以限制我的Excel文件可以查询的内容的选项?
答案 0 :(得分:4)
HAVING
子句包括这个条件......
Like IIf('ALL'='all','*-Crew','ALL')
但是,您正在使用ADO中的查询,该查询需要使用不同的通配符:%
而不是*
。因此,您可以将其更改为ADO ...
Like IIf('ALL'='all','%-Crew','ALL')
但这意味着您需要相同基本查询的2个版本:一个用于Access中的设计和测试;和另一个用于ADO。如果您更喜欢在两种情况下都运行相同的查询,请将ALike
与%
外卡而不是Like
一起使用...
ALike IIf('ALL'='all','%-Crew','ALL')
虽然查询应该在两种情况下返回相同的结果,但我不确定IIf
表达式的逻辑。由于Access SQL中的文本比较不区分大小写,因此'ALL'='all'
将始终为True ...这意味着条件等同于ALike '%-Crew'
。换句话说,该表达式永远不会给你一个相当于ALike 'ALL'