投稿者 an  (社会人) 投稿日時 2014/1/31 11:16:04
> すると、生産者番号のみでの検索が可能になりましたが
> 生産者番号以外の条件を入力すると全件表示されなくなりました。

とありますが、前回の自分の投稿では

> > sql += " WHERE (生産者名 Like '%" & TextBox2.Text.Trim & "&')"
> 「&」を利用されていますが、「%」の間違いではないでしょうか?
> (DB環境が記載されていないため、間違いとは言い切れませんが、
> 自分は聞いたことが無い気がします。)

と記載しましたが、これが分かりにくい表現でしたね。

これに対して

> &についての指摘はこちらの入力ミスでした

とありますが、
こちらについては、魔界の仮面弁士さんが以下のようにフォローしてます。

> 指摘があったのは、「&」ではなく「&」についてです。
> そしてその「&」については、未だに直っていないように見受けられます。


> 「&」を利用されていますが
この「&」というのは、VBの文字列連結の「&」ではなく、
SQLの文字列曖昧比較を行う際の「Like」の右辺の文字列の「&」のことです。
「Like」直後の先頭を曖昧にするための記号は「%」で指定してますよね?
なのに、それに対して最後を曖昧にするための記号はなぜか「&」を指定しています。
[code]
sql += " WHERE (生産者名 Like '%" & TextBox2.Text.Trim & "&')" 'これだと前方ななんでも良くて、後方に「&」という文字が含まれるという意味になる。
sql += " WHERE (生産者名 Like '%" & TextBox2.Text.Trim & "%')" '前方後方なんでも良いになる。
                                                          ↑これ!
[/code]

(VBとSQLが混じった形でプログラムし、記号もそれぞれ意味を持つのでややこしいので、
 混同してしまう気持ちはよくわかります^^;)



> anさん、るきおさんの指摘通りにコードを修正しました

るきおさんの指摘が含まれていないような・・・。
るきおさんの指摘では
・変数wOKの存在意義
・ベースのSQLとWHERE句のSQLの変数の分割
・StringBuilderの使用(自分が省略した部分のフォローとして)
だったと思います。

もし、るきおさんの指摘通りやってみたけどうまくいかなかったというのであれば、
SQL文の最後に連結しているところで「WHERE」が抜けているからかもしれません。
Dim sql As String
sql = sqlBody & sqlWhere.ToString()

ここを
Dim sql As String
If sqlWhere.Length = 0 Then
    sql = sqlBody 
Else
    sql = sqlBody & " WHERE " & sqlWhere.ToString()
End If

こうするといいかもしれません。
最後に" WHERE "を付加する処理を行う事により、
途中での" WHERE "の処理がなくなり、コンパクトになります。


また、自分の指摘した個所は結構対応されていましたが、
追加でもう一点。
「生産者番号」の条件を設定するIf文の部分ですが、
よく見ると、前回指摘した「生産者名」の部分と一部同じようなロジックに
見えませんか?
こちらもコンパクトにできるでしょう。