我在MS Access中使用SQL从表中检索数据但是根据我是运行查询还是使用VBA,我得到两个不同的结果用于同一查询。
很简单,我想要表格中单个列的最大值。我认为问题是列数据类型是文本吗?该表主要由6位数字组成,其中散布着其他格式,例如&x; 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 :(得分:0)
ADO SQL使用ANSI 92版本的LIKE运算符(允许使用通配符:_
表示单个字符,%
表示多个字符。)
MS Access和DAO使用不同形式的LIKE运算符(有关允许的通配符,请参阅this MSDN page)
如果您想使用这样的比较,我建议您切换到DAO(如果您没有特定的理由使用ADO)
另一种方法(以及我喜欢的方法)是将PN转换为实际数字:
SELECT Max(CLng(Replace(par.PN, "-", ""))) AS PN
FROM par
WHERE CLng(Replace(par.PN, "-", "")) Between 100000 And 999999