2017-10-12 11 views
1

MS AccessでSQLを使用してテーブルからデータを取得していますが、クエリを実行するかVBAを使用するかによって、同じクエリに対して2つの異なる結果が得られます。SQLクエリが2つの異なる結果を返すのはなぜですか?

単純に、テーブルの単一の列から最大値を求めます。問題は、私は、列のデータ型がテキストだと思いますか?表は主に、 'xx-xxxxx'のような他のフォーマットが散在している6桁の数字で構成されています。私はオーバーオフ頭

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ががあるクエリが間違っているということです。

まず、私はVBAでこれを行うことができるようにする必要があるので、私はこれを持っています

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

これを実行すると745864が返されます。だから私はここに何か不調があるのを見ることができます。

今、私を打つ他の事は、私は私がWHERE ((PN Between CLng('100000') And CLng('999999'))が十分であったであろうけれどもだろうとして、6桁の番号を取得するためにAnd (PN Not Like '##-#####')を必要としなければならないとは思わないことです...

私が持っていますこれは、数値がテキストとして保存されているためです。このため、関数間の関数はテキストでは機能しません。これが本当であれば、CLng関数がこのために正常に変換されているはずです動作するクエリ。

いずれにしても、vbaを使用して最新の6桁の番号を取得する必要があります。問題がどこにあるのか誰にでも光を当てることができますか?

おかげで

+0

順序:1,2,3、 4,5,10,111,123,345,4000など。テキストとしての数字の順序:1,10,11,111,2 、23,3,4,5,8,89など最大とテキストとして格納されている数字はうまくいきません...アクセスはこれを知っていますが、とにかく間違ったことをやりたいです。 intに変換して最大値を見つける – Twelfth

+0

わかりませんが、クエリビルダとADODBの間でワイルドカード文字が異なる可能性がありますか?私はあなたがアンダースコアを使用しなければならないと思うかもしれません、そうでなければ 'NOT LIKE '% - %''を試してください。 – JohnRC

答えて

0

ADO SQLは、LIKE演算子(:単一の文字、複数の文字のための%ため_許さワイルドカード)のANSI 92バージョンを使用しています。

MS AccessとDAOは、LIKE演算子の異なる形式を使用します(許可ワイルドカード用this MSDN pageを参照)

あなたは、このような比較を使用する場合は、持っていない場合、私はあなたがDAO(への切り替えをお勧めします)

代替アプローチ(と私の好みを持っています1)で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') 'などに戻ることができます。 –

関連する問題