为什么我的RecordCount 0应该不是?

时间:2015-07-16 12:27:56

标签: vba excel-vba ms-access excel

我正在尝试从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文件可以查询的内容的选项?

1 个答案:

答案 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'

的条件