質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Visual Studio 2012

Microsoft Visual Studio 2012は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2010の次のバージョンです

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

3回答

9954閲覧

[VB.NET]複合検索でのSQLの書き方

reeeo

総合スコア42

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Visual Studio 2012

Microsoft Visual Studio 2012は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2010の次のバージョンです

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2017/08/12 15:15

windowsフォームで商品登録プロクラムを作成しています。
やっていること
・DBと接続してデータグリットビューに表示
・日付検索で商品を抽出して表示

やりたいこと
・検索条件に「注文番号」「商品名」「小計」を追加して複数条件での検索ができるようにしたい

できていること
・検索項目全部を入力すればちゃんと検索できる

できないこと
・条件を全部ではなく2個とかに絞って検索ができない

下のソースを見ればわかるのですが、日付を入力しないで、例えば注文番号と商品名だけを入力したらWHERE句がなくなってしまいSQL文がおかしくなってしまいます。
かといって全てにWHEREと書いてしまったら連結した時にSQL文がおかしくなってしまいます。
上手く検索できるようにSQL文を作りたいのですがわかりませんでした。

お願いします。

Dim sqlselect As String = "" _ + "SELECT NUMBER,USER_ID,T_ITEM.ITEM_ID,ITEM_NAME,ITEM_PRICE,COUNT,ITEM_PRICE * COUNT AS sum" _ + " FROM M_ITEM JOIN T_ITEM ON M_ITEM.ITEM_ID = T_ITEM.ITEM_ID" Dim sqlwhere As String = "" Dim sqloreder As String = "AND USER_ID = '" & LoginForm1.userid & "' ORDER BY NUMBER" '日付 If DateTimePicker1.Text = "" And DateTimePicker2.Text = "" Then Else sqlwhere += "" _ + " WHERE registTIME BETWEEN '" & DateTimePicker1.Text & "' AND '" & DateTimePicker2.Text & "'" End If '注文番号 If itemnumber_text1.Text = "" And itemnumber_text2.Text = "" Then Else sqlwhere += " AND " _ + " NUMBER BETWEEN '" & itemnumber_text1.Text & "' AND '" & itemnumber_text2.Text & "'" End If '商品名 If itemName_text1.Text = "" Then Else sqlwhere += " AND " _ + " ITEM_NAME = '" & itemName_text1.Text & "'" End If '小計 If sum_text1.Text = "" And sum_text2.Text = "" Then Else sqlwhere += " AND " _ + " ITEM_PRICE * COUNT BETWEEN '" & sum_text1.Text & "' AND '" & sum_text2.Text & "'" End If Dim sql As String = sqlselect + sqlwhere + sqloreder adapter = New MySqlDataAdapter(sql, cn) Dim data As New DataSet adapter.Fill(data) DataGridView1.DataSource = data.Tables(0) End If

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

原因は理解してらっしゃるので、もう一息ですね。

VB.net

1'日付 2If DateTimePicker1.Text = "" And DateTimePicker2.Text = "" Then 3Else 4 sqlwhere += IIF( sqlwhere = "", " WHERE ", " AND " ) _ 5 + " registTIME BETWEEN '" & DateTimePicker1.Text & "' AND '" & DateTimePicker2.Text & "'" 6End If 7 8'注文番号 9If itemnumber_text1.Text = "" And itemnumber_text2.Text = "" Then 10Else 11 12 sqlwhere += IIF( sqlwhere = "", " WHERE ", " AND " ) _ 13 + " NUMBER BETWEEN '" & itemnumber_text1.Text & "' AND '" & itemnumber_text2.Text & "'" 14End If 15 16'商品名 17If itemName_text1.Text = "" Then 18Else 19 sqlwhere += IIF( sqlwhere = "", " WHERE ", " AND " ) _ 20 + " ITEM_NAME = '" & itemName_text1.Text & "'" 21 22End If 23 24'小計 25If sum_text1.Text = "" And sum_text2.Text = "" Then 26Else 27 sqlwhere += IIF( sqlwhere = "", " WHERE ", " AND " ) _ 28 + " ITEM_PRICE * COUNT BETWEEN '" & sum_text1.Text & "' AND '" & sum_text2.Text & "'" 29 30End If

条件句生成の部分のみ切り出しです。
テストしていないので参考程度に。

投稿2017/08/12 15:36

crowmt

総合スコア402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

crowmt

2017/08/12 15:46

saziさんのみて漏れ気づきです。 Dim sqloreder As String = "AND USER_ID = '" & LoginForm1.userid を配慮してなかったですね、すみません。
reeeo

2017/08/17 05:35

回答ありがとうございました。無事に解決できました!
crowmt

2017/08/17 13:32

無事に解決できたようで何よりです。 いいもの作ってくださいね!
guest

0

そんなに複雑な条件では無いので、ちょっとロジックを弄れば大丈夫ですね。

先ず、USER_IDは必ず条件となるようですから、これをwhereの次に来るようにして固定にします。
それから可変条件は全てANDで始まるようにして、最後に結合する。

変更した箇所にコメントしています。

--VB.NET Dim sqlselect As String = "" _ + "SELECT NUMBER,USER_ID,T_ITEM.ITEM_ID,ITEM_NAME,ITEM_PRICE,COUNT,ITEM_PRICE * COUNT AS sum" _ + " FROM M_ITEM JOIN T_ITEM ON M_ITEM.ITEM_ID = T_ITEM.ITEM_ID" Dim sqlwhere As String = "" Dim sqloreder As String = " ORDER BY NUMBER" '←ココ '日付 If DateTimePicker1.Text = "" And DateTimePicker2.Text = "" Then Else sqlwhere += " AND " _ '←ココ + " registTIME BETWEEN '" & DateTimePicker1.Text & "' AND '" & DateTimePicker2.Text & "'" '←ココ End If '注文番号 If itemnumber_text1.Text = "" And itemnumber_text2.Text = "" Then Else sqlwhere += " AND " _ + " NUMBER BETWEEN '" & itemnumber_text1.Text & "' AND '" & itemnumber_text2.Text & "'" End If '商品名 If itemName_text1.Text = "" Then Else sqlwhere += " AND " _ + " ITEM_NAME = '" & itemName_text1.Text & "'" End If '小計 If sum_text1.Text = "" And sum_text2.Text = "" Then Else sqlwhere += " AND " _ + " ITEM_PRICE * COUNT BETWEEN '" & sum_text1.Text & "' AND '" & sum_text2.Text & "'" End If sqlwhere += " WHERE USER_ID = '" & LoginForm1.userid & "'" + sqlwhere '←ココ Dim sql As String = sqlselect + sqlwhere + sqloreder adapter = New MySqlDataAdapter(sql, cn) Dim data As New DataSet adapter.Fill(data) DataGridView1.DataSource = data.Tables(0) End If

投稿2017/08/12 15:35

編集2017/08/12 15:51
sazi

総合スコア25184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reeeo

2017/08/17 05:36

回答ありがとうございました。とても参考になりました。
guest

0

おかしくなる原因を理解されているみたいなので、そこをしっかり判定してしまえばよいだけです。

各if文のElseところでsqlwhereが空であれば”where”、空ではない場合は”and”を追加するようにすればいいのではないでしょうか。

投稿2017/08/12 15:27

YAmaGNZ

総合スコア10251

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reeeo

2017/08/17 05:37

回答ありがとうございました。よく考えればできました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問