dポイントプレゼントキャンペーン実施中!

開発言語:VB2010
データベース:アクセス2010

VB2010でDAOを使用して、ACCDBに接続しています。
以下のテーブルに対して、SQLで、Snapshotで開いているのですが、クエリの結果とレコードセットの結果が違ってしまい困っております。
クエリだと濁点は抽出しませんが、レコードセットで開くと濁点も抽出されてしまいます。

レコードセットでもクエリと同じように濁点を拾わず抽出するにはどのようにしたらよいのでしょうか?

ご存知の方がいましたらご教授していただけるとありがたいです。

**テーブル名**
MST_得意先

*MST_得意先フリガナフィールド
1.ガイコク
2.カカシ

*参照設定
Microsoft.Office.Interop.Access

*SQL文
SELECT MST_得意先.* FROM MST_得意先 WHERE (MST_得意先.得意先フリガナ Like '*カ*');
OpenRecordset(SQL, Dao.RecordsetTypeEnum.dbOpenSnapshot)

*結果
・クエリ=2.カカシのみ抽出(濁点抽出なし)
・レコードセット=1.ガイコク、2.カカシ(濁点抽出)

A 回答 (3件)

こんにちは。



Access内でないとできないようですね。

無理やりソースを書くしかないかと。
ひらがな、カタカナ1文字の時に有効で、
その他の文字列は、そのまま抽出できると思います。

Dim select_str As String = ""

If Len(変数) = 1 Then '変数が1文字の時
'カナに変換
Dim Kana_cng As String = StrConv(変数, VbStrConv.Katakana)
'半角カナに変換
Dim En_str As Short = System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount(StrConv(Kana_cng, vbNarrow))

'半角カナ変換できた時のバイト数
If En_str = 1 Then '1バイトの時は濁点がないので、濁音を含まない処理が必要
select_str = "select * from MST_得意先 where MST_得意先.得意先フリガナ Like '*" & Kana_cng & "*'" & Sql_Str(Kana_cng)
Else '2バイト以上は完全一致できる
select_str = "select * from MST_得意先 where MST_得意先.得意先フリガナ Like '*" & 変数 & "*'"
End If
Else '変数が2文字以上
select_str = "select * from MST_得意先 where MST_得意先.得意先フリガナ Like '*" & 変数 & "*'"
End If
ここから先は、DAOのselectコマンドにセットして下さい。


Private Function Sql_Str(ByVal str As String) As String
Dim ten_str As String = ""
Dim maru_str As String = ""

Select Case str
Case "カ"
ten_str = "ガ"
Case "キ"
ten_str = "ギ"
Case "ク"
ten_str = "グ"
Case "ケ"
ten_str = "ゲ"
Case "コ"
ten_str = "ゴ"
Case "サ"
ten_str = "ザ"
Case "シ"
ten_str = "ジ"
Case "ス"
ten_str = "ズ"
Case "セ"
ten_str = "ゼ"
Case "ソ"
ten_str = "ゾ"
Case "タ"
ten_str = "ダ"
Case "チ"
ten_str = "ヂ"
Case "ツ"
ten_str = "ヅ"
Case "テ"
ten_str = "デ"
Case "ト"
ten_str = "ド"
Case "ハ"
ten_str = "バ"
maru_str = "パ"
Case "ヒ"
ten_str = "ビ"
maru_str = "ピ"
Case "フ"
ten_str = "ブ"
maru_str = "プ"
Case "ヘ"
ten_str = "ベ"
maru_str = "ペ"
Case "ホ"
ten_str = "ボ"
maru_str = "ポ"
End Select

If ten_str = "" Then '濁音、半濁音がないものは何もしない
Return ""
Else
If maru_str = "" Then '濁音あり、半濁音なし
Return " and MST_得意先.得意先フリガナ Not Like '*" & ten_str & "*'"
Else 'は行は、ば行とぱ行があるので含まない処理追加
Return " and MST_得意先.得意先フリガナ Not Like '*" & ten_str & "*' and MST_得意先.得意先フリガナ Not Like '*" & maru_str & "*'"
End If
End If


End Function

もっと簡単な方法があるかもですが。。。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
希望通りのものができました。
いろいろご教示していただきありがとございました。

しかし、同じMS商品なのに、アクセスとVBで違いがでるとは。。

お礼日時:2013/02/14 22:36

こんにちは。



半濁点も追加します。

SELECT MST_得意先.* FROM MST_得意先 WHERE InStr(StrConv(MST_得意先.得意先フリガナ,4),'゛')=0 and InStr(StrConv(MST_得意先.得意先フリガナ,4),'゜')=0

文字列を全角にしているので大丈夫かと。

この回答への補足

いろいろ試してみたところ、2文字以上はLike演算子で正常に動作するようです。
1文字で濁点・半濁点なしの文字の場合(静音)のみ、濁点や半濁点を抽出してしまうようです。

ご教示していただいた方法ですと、濁点・半濁点をのぞく全てのレコードを抽出してしまいます。
大変お手数ですが、指定した文字だけの部分一致を抽出する方法をご教示していただけるとありがたいです。

補足日時:2013/02/11 23:26
    • good
    • 0
この回答へのお礼

返事が遅くなり申し訳ありません。
さらに私の説明不足だったようで、検索部分は変数で持ち、Like演算子をしようして部分一致検索をしようと思っています。
よって濁点、半濁点がついた文字列も検索対象になる場合があります。(例:「*ガ*」という文字列を検索するときもあり、「*カ*」という文字列を検索する時もます。)

現在の私のSQL文ですと「*ガ*」を検索した時は正常に抽出されますが、「*カ*」を検索した時は、「*カ*」+「*ガ*」が抽出されてしまいます。

私の説明不足と勉強不足で申し訳ないのですが、ご教示していただいたSQL文ですと、濁点+半濁点を除いた形での抽出方法になると思われます。

お礼日時:2013/02/11 15:04

こんにちは。



これとか。

SELECT MST_得意先.* FROM MST_得意先 WHERE InStr(StrConv(MST_得意先.得意先フリガナ,4),'゛')=0

この回答への補足

本日会社に戻りまして、処理を実行しました。
結果、濁点は取り除かれて抽出されました。
ありがとうございます。

しかしながら私の説明不足でして、申し訳ないのですが、濁点と半濁点も含む文字等も(例:パタゴニア等)検索する予定です。そのような場合はかなり長いコードを書かないといけないような気がします。

そもそもなぜクエリとレコードセットに違いがあるのでしょうか・・・
何かいい解決案があればよいのですが。。。

補足日時:2013/02/07 23:00
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
急な出張が入りまして現在試せないのですが、戻り次第結果を報告させていただきます。

お礼日時:2013/02/06 12:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!