ACCESSのSQLをVBで使用するには?


mkk  2004-07-26 17:45:34  No: 84786  IP: [192.*.*.*]

はじめまして。
VB6で、DBに接続する際のSQLで悩んでいます。
ACCESSで、SQLを作成したのですが、それをVB6(ADODB)で
利用するとエラーとなります。以下のSQLは、VBで使用する
ことは出来るのでしょうか?また、別の方法で可能でしょうか?
(VBでmid等使用できるのでしょうか?)

・SQL(ACCESS)
 SELECT [フィールド名]  FROM [テーブル名]
 WHERE (left([フィールド名],(instr([フィールド名],"-"))))<"130"
        And (mid([フィールド名],instr(1,[フィールド名],"-")+1)>="130")

フィールドのデータ
110
105
102-110
110-130
120-140
110-200

初心者なので、どのように説明していいのかわからず
質問内容がわかりづらいかも・・・申し訳ないです。

よろしくお願いします。

編集 削除
nanashi  2004-07-26 17:55:41  No: 84787  IP: [192.*.*.*]

エラーってどんなエラーが出るんでしょうか?
ダブルクォーテーションをシングルクォーテーションに変えてもエラーが出ますか?

編集 削除
mkk  2004-07-27 08:50:45  No: 84788  IP: [192.*.*.*]

nanashiさま
  ご返答ありがとうございます。
  実際に試したSQLですが、where以下をこのように書いてみました。
  txt2に任意の数値を入力し、txt2が範囲内にあるかを判断するものです。

(Left(fieldname, (InStrfieldname, '-')))) < " & txt2 & " And (Mid(fieldname, InStr(1,fieldname, '-') + 1) >= " & txt2 & ")"

以上、よろしくお願いします。

編集 削除
mkk  2004-07-27 08:52:50  No: 84789  IP: [192.*.*.*]

上記のSQLに間違いがありました。
正しくは
(Left(fieldname, (InStr(fieldname, '-')))) < " & txt2 & " And (Mid(fieldname, InStr(1,fieldname, '-') + 1) >= " & txt2 & ")"

よろしくお願いします。

編集 削除
nanashi  2004-07-27 10:59:33  No: 84790  IP: [192.*.*.*]

もう一度質問します。
エラーってどんなエラーが出るんでしょうか?

また下記のように直した場合はどうですか?

"(Left(fieldname, (InStr(fieldname, '-'))) < '" & txt2 & "') And (Mid(fieldname, InStr(1,fieldname, '-') + 1) >= '" & txt2 & "')"

編集 削除
mkk  2004-07-27 16:57:45  No: 84791  IP: [192.*.*.*]

nanashiさま

ご返答ありがとうございます。
エラーの件ですが、私の認識が間違っていました。
申し訳ありません。正しくは、VB実行時に応答なし
になります。

また、ご享受していただいた文で実行したところ
応答なしにならなかったものの、抽出結果が
違っていました。これは、Mid,Left,InStrなどの
関数が使用できないということでしょうか?

お手数をおかけしますが、よろしくお願いします。

編集 削除
nanashi  2004-07-27 17:43:55  No: 84792  IP: [192.*.*.*]

> VB実行時に応答なしになります。

私の環境でテストしてみましたが応答なしにはなりません。
ブレークポイントを置いてデバッグしてみて下さい。
SQL文に問題があればOpen時にエラーが起きます。
どこか別の個所で無限ループになってたりしませんか?

> 抽出結果が違っていました。

全く同じSQL文を投げて、VB上とACCESS上で得られる値が違うというのはありえないと思います。
違っていたというのは期待と違っていたということでしょうか?
であるならSQL文での条件の書き方に問題があるかと思います。
またOpen時のSQL文があってるかどうか、キチンと確認してみてください。

> これは、Mid,Left,InStrなどの関数が使用できないということでしょうか?

DBがACCESSなら、VBからSQLを投げてもMid, Left, InStr は正常に作動します。


ちなみにmkkさんがwhere文内で書いてる条件なんですが、たぶんまともに動かないと思います。

編集 削除
mkk  2004-07-29 17:33:56  No: 84793  IP: [192.*.*.*]

nanashiさま、ご返答ありがとうございます。

>私の環境でテストしてみましたが応答なしにはなりません。
>ブレークポイントを置いてデバッグしてみて下さい。
>SQL文に問題があればOpen時にエラーが起きます。
>どこか別の個所で無限ループになってたりしませんか?

  これは、シングルクォーテーションを追加したことにより
  解決できました。

>DBがACCESSなら、VBからSQLを投げてもMid, Left, InStr は正常に作動します。

  DBはACCESSなので、動作には問題ないということですね。

>ちなみにmkkさんがwhere文内で書いてる条件なんですが、たぶんまともに動かないと思います。

  確かに思い通りの抽出結果が得られません。後半のMidのみですと、ほぼ
  期待通りの結果が得られるので、前半のLeftの条件が問題ありだと
  思っているのですが・・・  いろいろ試してはみるものの、いい案が
  浮かびません。

編集 削除
nanashi  2004-07-29 18:44:08  No: 84794  IP: [192.*.*.*]

ハイフンありの条件とハイフン無しの条件を分けた方が良いです。
iifを使って二つの条件を書いてみて下さい。

編集 削除
だい  2004-07-30 08:22:07  No: 84795  IP: [192.*.*.*]

現象が確認できる最小限のコードを提示したほうがよいでしょう。
単純なSQL文の問題では無い可能性もあります。
#例)MoveNext入れ忘れて永久ループ等

編集 削除