2017-10-12 179 views
1

我在MS Access中使用SQL从表中检索数据,但取决于我是运行查询还是使用VBA,我为同一个查询得到两个不同的结果。为什么我的SQL查询返回两个不同的结果?

很简单,我想从表中的单个列的最大值。麻烦的是,我认为列数据类型是文本?该表格主要由6位数字组成,其中包含其他格式,如“xx-xxxxx”。

首先,我需要能够做到这一点的VBA,所以我有这样的:

Private Function Create() As String 

Dim rs As New ADODB.Recordset 
Dim cn As New ADODB.Connection 
Dim strSQL As String 

Set cn = CurrentProject.Connection 
cn.CursorLocation = adUseClient 

strSQL = "SELECT Max(par.PN) AS PN FROM par WHERE ((PN Between CLng('100000') And CLng('999999')) And (PN Not Like '##-#####'));" 

Set rs = cn.Execute(strSQL) 

If (rs.RecordCount > 0) Then 
    'Create = rs("PN") 
    Debug.Print rs("PN") 
End If 

End Function 

结果是10-0000,所以我的第一个是,虽然查询是错误的,所以我化险为夷了到查询生成器并输入:

SELECT Max(par.PN) AS PN 
FROM par 
WHERE ((PN Between CLng('100000') And CLng('999999')) And (PN Not Like '##-#####')); 

它在我运行它时返回745864。所以从这里我可以看到这里出现了一些错误。

现在,这令我的另一件事是,我不认为我应该需要And (PN Not Like '##-#####')为了得到一个六位数字,因为我将不得不虽然WHERE ((PN Between CLng('100000') And CLng('999999'))就已经足够了......

我有怀疑这是因为数字存储为文本,因此,函数之间不能在文本上工作 - 如果这确实是真的,我会进一步期望CLng函数已成功转换为数字为了这个查询工作。

在任何情况下,我需要能够使用vba获取最新的六位数字。任何人都可以解释问题出在哪里?

由于

+0

顺序:1,2,3, 4,5,10,111,123,345,4000等数字的顺序为文本:1,10,11,111,2 ,23,3,4,5,8,89等。max和数字存储为文本不能很好地工作...访问知道这一点,但喜欢做错误的事情无论如何。转换为int然后找到最大值 – Twelfth

+0

不确定,但查询生成器和ADODB之间的通配符char可能会不同?我认为你可能不得不使用下划线,否则尝试使用'NOT LIKE'% - %'',它将删除任何破折号。 – JohnRC

回答

0

ADO SQL使用ANSI 92版本LIKE运算符的(允许通配符:_为单个字符,%用于多个字符)。

MS Access和DAO使用不同形式的LIKE操作符(见this MSDN page为允许使用通配符)

如果你想用这样的比较,我建议您切换到DAO(如果你没有一个使用ADO)

另一种方法(这将有我的喜好之一)具体原因将铸造PN到实际号码:号码为INT的

SELECT Max(CLng(Replace(par.PN, "-", ""))) AS PN 
FROM par 
WHERE CLng(Replace(par.PN, "-", "")) Between 100000 And 999999 
+0

刚刚在VBA(使用DAO)和查询编辑器中尝试过这两种方法,它们都给出了标准表达式中的数据类型不匹配错误。 不确定哪个部分是错误的数据类型:0 – cosmarchy

+0

可能是'Between'部分,你可以回到你的CLng('100000')等等。 –

相关问题