[三流君] −−> [ASPで遊ぶ、失敗する] −−> [バックナンバー一覧]
−−> No.093 FORM CHECKBOXから受け取った値を使用してWHERE句の作成

FORM CHECKBOXから受け取った値を使用してWHERE句の作成



本文(発行内容)


<FORM CHECKBOXから受け取った値を使用してWHERE句の作成>

こんにちは、三流プログラマーのKen3です。 今回は、 FORM CHECKBOXから受け取ったデータ を使用して、WHERE句を作成してみます。 ※いろいろなパターンが考えられるのでお好きなやつで。  (みなさんの丸秘テクニックがあったら、教えてください)

/* * 1.今回のキッカケ */

入力フォームのチェックボックスでチェックされた値の使用方法を見直したいなぁ〜 と 思い、今回の発行となりました。 SQLのWHERE句を数パターン作ったので、参考になれば幸いです。

/* * 2.名前(name="xxx")が一緒のパターンと違うパターン */

自分のライブラリを見ると、チェックボックスの事例は、 No.45 HTML FORM INPUT TYPE="CHECKBOX" チェックボックスの入力 http://www.ken3.org/backno/backno_asp10.html#45 で簡単な解説をしてますが、 TYPE="CHECKBOX"で name="xxxx"が違うパターン <INPUT TYPE="CHECKBOX" NAME="c1">HTMLから詳しく丁寧に<BR> <INPUT TYPE="CHECKBOX" NAME="c2" VALUE="VBScript">VBScriptをもっと詳しく<BR> <INPUT TYPE="CHECKBOX" NAME="c3" VALUE="GAME">ゲーム作ろうよ<BR> name="xxxx"が同じパターン <INPUT TYPE="CHECKBOX" NAME="kibou" VALUE="HTML">HTMLから詳しく丁寧に<BR> <INPUT TYPE="CHECKBOX" NAME="kibou" VALUE="VBScript">VBScriptをもっと詳しく<BR> <INPUT TYPE="CHECKBOX" NAME="kibou" VALUE="GAME">ゲーム作ろうよ<BR> 実際に、 http://www.ken3.org/cgi-bin/test/test045-1.asp で、テストすると、 c1,c2,c3と違う場合はそれぞれ、 c1 on (Value=設定無し) c2 VBScript (Value="VBScript"と値を指定) など、 チェックした値をRequest.Form("c1")など項目別に取得することができます。 NAME="kibou"と各チェックボックスの名前が同じ場合は、 Request.Form("kibou")の共通の項目名で取得すると、 Valueで指定した値がVBScript, GAMEとカンマで区切られて取得できます。

/* * 3.TYPE="CHECKBOX"でname="xxxx"が違うパターン */

値の受け渡しがなんとなくわかったので、 TYPE="CHECKBOX"でname="xxxx"が違うパターン で Where句を作成してみます。 入力は、 □VBA,□ASP,□24H,□GUCHI と区分をチェックさせチェックありのデータをWhere句でor指定して取り出します。 <INPUT TYPE="CHECKBOX" NAME="ASP">ASP<br> <INPUT TYPE="CHECKBOX" NAME="VBA">VBA<br> <INPUT TYPE="CHECKBOX" NAME="24H">コンビニ系<br> <INPUT TYPE="CHECKBOX" NAME="GUCHI">愚痴系<br> と、NAME=の部分を4つ作成して、フォームを作りました。 ア.Ifの連続でWHERE句を作成してみた ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ オマエ何年プログラマーやってんの?  と  読者の心の声が聞こえる書き方で、WHERE句を作成すると、 'WHERE句を作成する strWHERE = "" '条件を初期化する '4つの区分をそれぞれ判断する If Request.Form("VBA") = "on" Then 'VBAの判断 If strWHERE = "" Then strWHERE = " Where KUBUN='VBA' " Else strWHERE = strWHERE & " Or KUBUN='VBA'" End If End If If Request.Form("ASP") = "on" Then 'ASPの判断 If strWHERE = "" Then strWHERE = " Where KUBUN='ASP' " Else strWHERE = strWHERE & " Or KUBUN='ASP'" End If End If If Request.Form("24H") = "on" Then '24Hの判断 If strWHERE = "" Then strWHERE = " Where KUBUN='24H' " Else strWHERE = strWHERE & " Or KUBUN='24H'" End If End If If Request.Form("GUCHI") = "on" Then 'GUCHIの判断 If strWHERE = "" Then strWHERE = " Where KUBUN='GUCHI' " Else strWHERE = strWHERE & " Or KUBUN='GUCHI'" End If End If 'SQL文を作成する (作成したWHERE句を組み合わせる) strSQL = "Select * From KANSOU " '感想(KANSOU)テーブルから全項目(*) strSQL = strSQL & strWHERE strSQL = strSQL & "ORDER BY WriteTime DESC" '並べ替えは時間の降順 こんな感じかな。  テストは、 http://www.ken3.org/cgi-bin/test/test093-1.asp で、実行できます。(カスイ 工夫無しのソースの全てもここで見れます。) ポイントは、If文でRequest.Form("xxxx")それぞれの区分がonかチッェクして、  さらに前の条件が無ければWHERE あれば or にしただけです。  なんの工夫も無い、よく見かけるプログラムですよね。 イ.同じ処理なんだからループで回そうよ さてと、みっともないプログラムを見せてしまいましたね。  お口直しのデザートじゃないのですが、 ArrayとUboundで項目名を管理して、同様のWhere句を作成してみました。 'WHERE句を作成する strKUBUN = Array("VBA", "ASP", "24H", "GUCHI") '区分を配列にする strWHERE = "" '条件を初期化する '区分の数だけループさせる For n = 0 To Ubound(strKUBUN) If Request.Form(strKUBUN(n)) = "on" Then '区分n番目の項目がonか? If strWHERE = "" Then '初めの項目か?チェックする strWHERE = " Where F_KUBUN='" & strKUBUN(n) & "' " Else '2番目以降はorでつなぐ strWHERE = strWHERE & " Or F_KUBUN='" & strKUBUN(n) & "' " End If End If Next 'SQL文を作成する (作成したWHERE句を組み合わせる) strSQL = "Select * From KANSOU " '感想(KANSOU)テーブルから全項目(*) strSQL = strSQL & strWHERE strSQL = strSQL & " ORDER BY WriteTime DESC" '並べ替えは時間の降順  テストは、 http://www.ken3.org/cgi-bin/test/test093-2.asp で、実行できます。(少し工夫したソースの全てもここで見れます。) ポイントは、Array("VBA", "ASP", "24H", "GUCHI") で項目名の配列作成 For n = 0 To Ubound(strKUBUN)で0番目からループを作成して、  あとは、Request.Form(strKUBUN(n))やstrKUBUN(n)と使用しただけです。  少しはまとまったし、項目増やすだけで変更対応も容易になりました。 まぁ、なんだかんだ言っても、 If Request.Form("ASP") = "on" If Request.Form(strKUBUN(n)) = "on" など、項目単位にチェックして、Where句を作る方法でした。

/* * 4.TYPE="CHECKBOX"でname="xxxx"を同じにしてVALUE=を区分とする */

個別にチェックする方法はどうでしたか? 次は、name="KUBUN"と同一にしてValueの値を使ってみます。 入力は、 □VBA,□ASP,□24H,□GUCHI と区分をチェックさせまでは一緒ですが(見た目は一緒) NAME="KUBUN"にしてVALUE="XXXX"を下記のように指定してみます。 <INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="ASP">ASP<br> <INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="VBA">VBA<br> <INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="24H">コンビニ系<br> <INPUT TYPE="CHECKBOX" NAME="KUBUN" VALUE="GUCHI">愚痴系<br> と、VALUE=の部分を4つ作成して、フォームを作りました。 ウ.Replaceで途中のカンマを置き換え WHERE IN句を使用する Request.Form("KUBUN")とすると、 選択された項目がVBA, 24Hとカンマとスペースで区切られて渡ります。 これを利用して、 VBA, 24H を WHERE F_KUBUN IN ('VBA','24H') と、IN句で条件を作ってみます。 'WHERE句を作成する strKUBUN = Request.Form("KUBUN") 'フォームから区分を受け取る If strKUBUN = "" Then '区分が選択されていなかったら strWHERE = "" 'データ無しの時は条件をカラにする Else ',を変換してWHERE句を作成する ' ASP, 24Hの文字を", "(カンマとスペース1つ)を','に変換する strWORK = Replace(strKUBUN, ", ", "','") '置き換える strWHERE = " Where F_KUBUN IN ('" & strWORK & "') " End If http://www.ken3.org/cgi-bin/test/test093-3.asp でテストできます。(ソースの全ても見れます。) ポイントは特に無く、 ", "(カンマとスペース1つ)を','にReplace関数を使って変換してみました。 エ.Request.Form(xxx).Countで複数チェック  いろいろと探っていた副産物なのですが、 If Request.Form("KUBUN").Count > 0 Then '項目数をチェック  と、.Countで同じNAMEで送られて来たデータの個数を取得できます。  それと同時に、 項目名Name="KUBUN"と同一のデータが送られてきたときに、  Request.Form("KUBUN")(1) や Request.Form("KUBUN")(2) とすると、個別に値を取得することが出来ます。  ※(1)からデータが始まります。  ※※(0)にはVBA, 24Hとカンマ区切りの値が格納されています。  これを利用して、 'WHERE句を作成する If Request.Form("KUBUN").Count > 0 Then '項目数をチェック '複数の時、1番目(最初の条件をまず代入) strWHERE = " Where F_KUBUN = '" & Request.Form("KUBUN")(1) & "' " '次の条件((2)から)をループで追加する For n = 2 To Request.Form("KUBUN").Count 'Orで条件をつなげる strWHERE = strWHERE & " Or F_KUBUN = '" & Request.Form("KUBUN")(n) & "' " Next Else strWHERE = "" 'データ無しの時は条件をカラにする End If http://www.ken3.org/cgi-bin/test/test093-4.asp でテストできます。(ソースの全ても見れます。) ポイントは、Request.Form("KUBUN").Countで1以上の時はデータありと判断。  まず、一番目を代入して、 " Where F_KUBUN = '" & Request.Form("KUBUN")(1) & "' " 頭のWhereを付けて作成。  あとは、ループで2番目から数分ORを頭につけて作成してみました。 ※Orで条件をつなげたけど、Where INで書くなら、下記のようにしてください strWHERE = " Where F_KUBUN IN ('" & Request.Form("KUBUN")(1) & "'" '次の条件((2)から)をループで追加する For n = 2 To Request.Form("KUBUN").Count 'Orで条件をつなげる strWHERE = strWHERE & ",'" & Request.Form("KUBUN")(n) & "'" Next strWHERE = strWHERE & ")" '最後忘れずに)で閉じてね。

/* * 5.終わりの挨拶 </HTML> */

今回は、 CHECKBOXの値を使って、複数の条件を受け取り、 WHERE句を作成する方法を数パターン書いてみました。 自分にあった方法を使ってみてください。 次回は、 やっと質問の処理、プルダウンとチェックボックスの組み合わせをやってみます。 いろいろと問題点や疑問点を残しつつ、脱線・寄り道の多いメルマガですが、 今後とも、よろしくお願いします。 何かの参考となれば幸いです。 ASP、VBScript勉強中の三流プログラマーのKen3でした。


ページフッター

ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、

三流君へ メッセージを送る

感想や質問・要望・苦情など 三流君へメッセージを送る。
返信例 XXXXさんへ
下記のフォームからメッセージを送ることができます。


あなたのお名前(ニックネーム):さん
返信は?:

アドレス:に返事をもらいたい
感想や質問↓:


(感想や質問・要望・苦情はHPで記事に載せることがあります。)

種類別のリンク や 広告など

[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]


Blogとリンク:[三流君のMemo別館]/ [ASP 三流君のソースコード置き場]/ [Ken3Video YouTubeで動画解説]
広告:

気になった ジャンル ↓を選択してください。

まぁ、基本はデータの受け取りかなぁ。
・[Form等を使用したデータのやり取り]・・・ASPと言っても、HTMLの入力フォームからデータを受け取ります。POSTやGETでやりとりを押さえますか。

次は、データの入出力 で ADOを使った(ADOで接続) と SQLの解説を少々
・[ADOでMdbファイルを使う]・・・MDBと接続して、簡単な追加・更新・削除を行った。
・[ADOでExcelと接続してみた]・・・.xlsと接続してSQLを使ってみた。
・[ADOでCSVと接続してみた]・・・.CSV テキストを読み出した。※更新・削除はできません

広告:



DBが使えるので、あまり使用しないけど、普通のテキストファイル処理
・[テキストファイル処理]・・・ファイルを開いて、書き込む。1行読み込みなどを軽く

VBScriptでFormat関数が無いなど、微妙にVBAと違うけど
[VBScript関数関係の説明]・・・少し、処理を書いてみた。
[その他処理サンプル]・・・あまり良いサンプル作れなかったけど。。。
何かの参考となれば幸いです。



[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]


広告: