三流君ASPで遊ぶ、失敗する

[三流君] Top ken3.orgへ
[ASP解説] ASPの解説TOP
[ASP記事 バックナンバー] 番号順のバックナンバー
[SOHO/在宅プログラマー/派遣] 派遣のお話ほか
[...サイトマップ(総合案内へ)]




分類別ガイド
ADOで[ADO Mdb接続] ,[ADO Excel接続] ,[ADO CSV接続]

[ASP Form データのやりとりPOSTとGET]
[ASPでTextFile操作]
[ASPでVBScriptを使う]
[その他サンプル]

バックナンバー No.40 〜 No.44


No.40 2003/03/23
MDBへのSQL文 Format関数使用
[ページTOPへ戻る]

<MDBへのSQL文 Format関数使用>

こんにちは、三流プログラマーのKen3です。 今回は、SQL文の中で関数を使ってみます。 *少しハマりました。笑ってください。。。 何かの参考となれば幸いです。

/* * 1.日付別にデータをカウントしたくて */

前回まで、GROUP BYで、グループ化して、データを集計してました。 http://www.ken3.org/cgi-bin/test/test039-1.asp で、 Select URL, Count(URL) As URLCNT From log GROUP BY URL ORDER BY Count(URL) DESC とSQL文を発行して、訪問者のURL単位の集計をとりました。 日付別のアクセス数をカウントしたくて、少し悩みました。 悩みの理由は、テーブルの構造が、 cnt.mdb テーブル名:log IP URL referrer WriteTime と項目があって、WriteTimeに2003/03/23 13:20:23と時刻まで入ってます。 そのままグループ化できないしなぁ、、、

/* * 2.ADO から MDB へのアクセス(SQL文)でFormat関数使用 */

なんて、深く考えていたのですが、 SQL文の中でFormat関数が使えるみたいなので、使ってみました。 えっ、過去のメルマガで、VBScriptでは使えないって言ってたよね? In message "[ASPで遊ぶ No.019] - 001行目と表示したくてRight関数を使う", >

/* > * 2.あれ?Format関数って使えないの? >*/

> >VBAも少し知ってる私は、 >有名なFormat関数を使用して、 >Format(カウンター,"000") >にすればOKだと思い軽く修正しました。 > >Do While ts.AtEndOfStream = False '*6ファイルの終端になってない間ループ > strDATA = ts.ReadLine 'ファイルからデータを一行を読む > nLINE = nline + 1 '行カウンタを+1する > Response.Write Format(nLINE,"000") & "行目 " '*1行番号の表示 > Response.Write strDATA '読み込んだデータを表示 > Response.Write "<BR>" '改行のタグを入れる > '行カウンタが5、10、15、、5で/って余りが0なら > '<HR>タグを挿入する > If nLINE Mod 5 = 0 Then > Response.Write "<HR>" 'タグを入れる > End If >Loop > >の表示部分を、 > Response.Write Format(nLINE,"000") & "行目 " '*1行番号の表示 >に変えました、余裕でしょ。 > >あれ? > >エラー タイプ >Microsoft VBScript 実行時エラー (0x800A000D) >型が一致しません。: 'Format' >/test/test019-1.asp, line 26 > >ウソでしょ?エラーだよ。 >なんで? > >何でジャねぇダロ三流君、 >ASP(VBScript)に、 >Format関数は無いんだよ。存在しないの。 > >またまたぁ。 >と >思い、少し調べてみると、やはり無いみたい。 --- と解説してたのに? あっ、VBScriptでは無いんだけど、MDBへのSQL文では使えるみたいです。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 下記のようなSQLを作りました。 strSQL = "Select Format(WriteTime, 'YYYYMMDD') AS YYYYMMDD, Count(*) AS CNT" strSQL = strSQL & " From log" strSQL = strSQL & " GROUP BY Format(WriteTime, 'YYYYMMDD')" 普通にFormat(WriteTime, 'YYYYMMDD')と使ってます。 http://www.ken3.org/cgi-bin/test/test040-1.asp でテスト可能です。 <%@LANGUAGE=VBScript%> <html> <head> <title>ADO から MDB へのアクセスでFormat関数使用</title> </head> <body> <h2>ADO から MDB へのアクセスでFormat関数使用</h2> test040-1.asp<br> <hr> <b>YYYYMMDDでデータをまとめて集計表示します。</b><br> <font color="red">GROUP BY Format(WriteTime, 'YYYYMMDD')でまとめてみた。</font><br> <hr> <% 'ADO DB Connection オブジェクトを作成する、英文そのままじゃん Set db=Server.CreateObject("ADODB.Connection") '.Provider?プロバイダー?通信会社?じゃなくって 'データアクセスにはJet.OLEDB.4.0を使うことを設定 db.Provider = "Microsoft.Jet.OLEDB.4.0" '次に、接続DBの位置を渡すので、Server.MapPathで変換して渡す db.ConnectionString = Server.MapPath("cnt.mdb") 'やっとデータベースを開ける db.open 'FORMAT関数を使用して、テーブル名logからデータを集計する 'SQL文を発行する strSQL = "Select Format(WriteTime, 'YYYYMMDD') AS YYYYMMDD, Count(*) AS CNT" strSQL = strSQL & " From log" strSQL = strSQL & " GROUP BY Format(WriteTime, 'YYYYMMDD')" 'オマケで画面にデータ表示 Response.Write "<hr>発行する(した)SQL文は<br><B><font color='green'>" Response.Write strSQL & "</font></B><br>です<hr>" Set rs = db.Execute(strSQL) 'データの表示をテーブルで行う Response.Write "<TABLE Border='1'>" '見出しをバカっぽく、そのまま書き込む Response.Write "<TR>" Response.Write "<TD>NO.</TD>" Response.Write "<TD>日付</TD>" Response.Write "<TD>閲覧ページ数</TD>" Response.Write "</TR>" 'EOFまでループ nCNT = 1 Do While rs.EOF = False '.EOFがFalseの間 Response.Write "<TR>" '内容を表示する Response.Write "<TD>" & nCNT & "</TD>" Response.Write "<TD>" & rs.Fields.Item("YYYYMMDD") & "</TD>" Response.Write "<TD ALIGN='RIGHT'>" & rs.Fields.Item("CNT") & "</TD>" Response.Write "</TR>" & Chr(13) & Chr(10) '次のレコードにポインタを移動する rs.MoveNext 'これを忘れると悲惨なことに、、、 'カウンタを増やす nCNT = nCNT + 1 Loop Response.Write "</TABLE>" 'テーブルは終わりです '開いていたレコードセットを閉じる rs.Close 'データベースも閉じようよ db.Close 'お行儀よくオブジェクトも開放しましょう(通常は自動的に解放されるけど) Set db = Nothing %> <hr> 終了です。<br> </body> </html> http://www.ken3.org/cgi-bin/test/test040-1.asp の出力結果は、 NO. 日付 閲覧ページ数 1 20030316 384 2 20030317 1528 3 20030318 1555 4 20030319 1621 5 20030320 1484 6 20030321 609 7 20030322 516 8 20030323 173 みたいな感じで集計・表示してます。 なんだぁ、Format関数使えるのかぁ、、、って感じですね。

/* * 3.当日の時間帯別アクセス数を表示してみる */

あまり意味のない集計なのですが、 当日の時間帯別のアクセス数を表示してみます。 発行するSQL文は、 ~~~~~~~~~~~~~~~~~~ Select Format(WriteTime, 'HH') AS HH, Count(*) AS CNT From log Where WriteTime >= #2003/03/23# GROUP BY Format(WriteTime, 'HH') で、 strSQL = "Select Format(WriteTime, 'HH') AS HH, Count(*) AS CNT" strSQL = strSQL & " From log" strSQL = strSQL & " Where WriteTime >= #" & Date & "#" '当日を条件に strSQL = strSQL & " GROUP BY Format(WriteTime, 'HH')" で作成しました。 ポイントは、 Format(WriteTime, 'HH')で時間の取りだし と " Where WriteTime >= #" & Date & "#"の当日指定の部分かなぁ。 http://www.ken3.org/cgi-bin/test/test040-2.asp でテスト可能です。(あんまり訪問者居ないなぁ(笑)) <%@LANGUAGE=VBScript%> <html> <head> <title>当日の時間帯別アクセス数を表示してみる SQLでFormat関数使用</title> </head> <body> <h2>当日の時間帯別アクセス数を表示してみる SQLでFormat関数使用</h2> test040-2.asp<br> <hr> <b>当日の時間帯別アクセス数を表示してみる</b><br> <font color="red">GROUP BY Format(WriteTime, 'HH')でまとめてみた。</font><br> <hr> <% 'ADO DB Connection オブジェクトを作成する、英文そのままじゃん Set db=Server.CreateObject("ADODB.Connection") '.Provider?プロバイダー?通信会社?じゃなくって 'データアクセスにはJet.OLEDB.4.0を使うことを設定 db.Provider = "Microsoft.Jet.OLEDB.4.0" '次に、接続DBの位置を渡すので、Server.MapPathで変換して渡す db.ConnectionString = Server.MapPath("cnt.mdb") 'やっとデータベースを開ける db.open 'FORMAT関数を使用して、テーブル名logからデータを時間帯別に集計する 'SQL文を発行する strSQL = "Select Format(WriteTime, 'HH') AS HH, Count(*) AS CNT" strSQL = strSQL & " From log" strSQL = strSQL & " Where WriteTime >= #" & Date & "#" '当日を条件に strSQL = strSQL & " GROUP BY Format(WriteTime, 'HH')" 'オマケで画面にデータ表示 Response.Write "<hr>発行する(した)SQL文は<br><B><font color='green'>" Response.Write strSQL & "</font></B><br>です<hr>" Set rs = db.Execute(strSQL) 'データの表示をテーブルで行う Response.Write Date & "の時間帯別のアクセス集計<br>" Response.Write "<TABLE Border='1'>" '見出しをバカっぽく、そのまま書き込む Response.Write "<TR>" Response.Write "<TD>時間帯</TD>" Response.Write "<TD>閲覧ページ数</TD>" Response.Write "</TR>" 'EOFまでループ Do While rs.EOF = False '.EOFがFalseの間 Response.Write "<TR>" '内容を表示する Response.Write "<TD>" & rs.Fields.Item("HH") & "時〜</TD>" Response.Write "<TD ALIGN='RIGHT'>" & rs.Fields.Item("CNT") & "</TD>" Response.Write "</TR>" & Chr(13) & Chr(10) '次のレコードにポインタを移動する rs.MoveNext 'これを忘れると悲惨なことに、、、 'カウンタを増やす nCNT = nCNT + 1 Loop Response.Write "</TABLE>" 'テーブルは終わりです '開いていたレコードセットを閉じる rs.Close 'データベースも閉じようよ db.Close 'お行儀よくオブジェクトも開放しましょう(通常は自動的に解放されるけど) Set db = Nothing %> <hr> 終了です。<br> </body> </html> http://www.ken3.org/cgi-bin/test/test040-2.asp の実行結果 2003/03/23の時間帯別のアクセス集計 時間帯 閲覧ページ数 00時〜 27 01時〜 14 ・  ・  ・ 12時〜 13 13時〜 28 みたいな感じで表示されます。

/* * 4.終わりの挨拶 */

SQL文でいろいろと処理ができます。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ いろいろな切り口から、集計してみたいと思います。 今日、少し驚いたのは、MDBへのSQL文でFormat関数が使えたことでした。 素朴な疑問あったら、気軽に、 メール、掲示板に書き込んでくださいね。 掲示板 : http://www.ken3.org/asp/bbs-asp.html ASP、VBScript勉強中の三流プログラマーのKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- [No.37 訪問者のログをMDBで管理] ( http://www.ken3.org/backno/backno_asp08.html#37 を参照) では、 IPアドレスURLをAccess MDBへ保存しました。 [No.38 SQL GROUP BY句 で グループ化する] ( http://www.ken3.org/backno/backno_asp08.html#38 を参照) では、 URLでグループ化して、集計関数Count(項目名)で集計しました。

No.41 2003/03/27
POST(Request.Form)/GET(Request.QueryString) で 送られてきた値を表示する
[ページTOPへ戻る]

<POST(Request.Form)/GET(Request.QueryString) で 送られてきた値を表示する>

こんにちは、三流プログラマーのKen3です。 今回は、 質問やHP訪問者が多い、ASPでフォームを使用したデータのやり取りです。 何かの参考となれば幸いです。

/* * 1.いきなりサンプルを出す(笑) */

http://www.ken3.org/cgi-bin/test/test041-1.asp でテスト実行できます。 <%@LANGUAGE=VBScript%> <html> <head> <title>POST(Request.Form)/GET(Request.QueryString) で 送られてきた値を表示する</title> </head> <body> <!-- Ken3 --><!-- #include file="info.inc" --> <h2>POST(Request.Form)/GET(Request.QueryString) で 送られてきた値を表示する</h2> test041-1.asp<br> <hr> <b>フォームから送られて来た値を表示します</b><br> <font color="red">Request.ServerVariables("REQUEST_METHOD")でPOST/GETを判断</font><br> <font color="blue">For Each で 値を表示する</font><br> <hr> Request.ServerVariables("REQUEST_METHOD")=<b><%=Request.ServerVariables("REQUEST_METHOD")%></b><br> <% 'データの表示をテーブルで行う Response.Write "<TABLE Border='1'>" Response.Write "<TR><TD>項目名</TD><TD>値</TD></TR>" 'タイトル行 'Request.ServerVariables("REQUEST_METHOD")でPOST/GETを判断 If Request.ServerVariables("REQUEST_METHOD") = "POST" Then 'POST判断 'For Each で Request.Formの値を取出す For Each RF In Request.Form Response.Write "<TR><TD>" & RF & "</TD>" '名称表示 Response.Write "<TD>" & Request.Form(RF) & "</TD></TR>" '値の表示 Next Else 'GET 'For Each で Request.QueryStringの値を取出す For Each RQ In Request.QueryString Response.Write "<TR><TD>" & RQ & "</TD>" '名称表示 Response.Write "<TD>" & Request.QueryString(RQ) & "</TD></TR>" '値の表示 Next End If Response.Write "</TABLE>" %> <hr> 終了です。<br> <hr> <h3>METHOD="POST"で送信するテストです</h3> 好きに入力して、送信ボタンを押してください。<br> <FORM ACTION="test041-1.asp" METHOD="POST"> <font color="blue">TYPE="text" テキストの入力テスト</font><br> お名前:<INPUT TYPE="text" SIZE="20" NAME="USER-NAME" VALUE="匿名希望"><br> E-Mail:<INPUT TYPE="text" SIZE="20" NAME="EMAIL" VALUE="****@**.co.jp"><br> <br> <font color="blue">TYPE="password" パスワードの入力テスト</font><br> パスワード:<INPUT TYPE="password" NAME="pass1" SIZE="20"><br> パスワード:<INPUT TYPE="password" NAME="pass2" SIZE="20">(同じのを(笑))<br> <br> <font color="blue">TYPE="CHECKBOX" チェックボックスの入力テスト</font><br> このメルマガでやってほしいことにチェックを入れてください<br> <INPUT TYPE="CHECKBOX" NAME="c_1" VALUE="on">HTMLから詳しく丁寧に<BR> <INPUT TYPE="CHECKBOX" NAME="c_2" VALUE="on">VBScriptをもっと詳しく<BR> <INPUT TYPE="CHECKBOX" NAME="c_3" VALUE="on">ゲーム作ろうよ<BR> <br> <font color="blue">TYPE="RADIO" ラジオボタンの入力テスト</font><br> このメルマガの満足度を5段階で(笑)<br> 不満 ------ 満足<br> 1<INPUT TYPE="RADIO" NAME="q_5" VALUE="1"> 2<INPUT TYPE="RADIO" NAME="q_5" VALUE="2"> 3<INPUT TYPE="RADIO" NAME="q_5" VALUE="3" CHECKED> 4<INPUT TYPE="RADIO" NAME="q_5" VALUE="4"> 5<INPUT TYPE="RADIO" NAME="q_5" VALUE="5"> <br> <font color="blue">TEXTAREA ROWS=10 COLS=40 の入力テスト</font><br> 感想:<TEXTAREA NAME="HONBUN" ROWS=5 COLS=40>複数文章をテスト</TEXTAREA><br> <br> <font color="blue">TYPE="submit" 送信ボタンのテスト</font><br> <INPUT TYPE="submit" NAME="btn1" VALUE="送信1"> <INPUT TYPE="submit" NAME="btn2" VALUE="送信2"> <INPUT TYPE="reset" VALUE="入力し直す"> </FORM> <hr> <h3>METHOD="GET"で送信するテストです</h3> 好きに入力して、送信ボタンを押してください。<br> <FORM ACTION="test041-1.asp" METHOD="GET"> <font color="blue">TYPE="text" テキストの入力テスト</font><br> お名前:<INPUT TYPE="text" SIZE="20" NAME="USER-NAME" VALUE="匿名希望"><br> E-Mail:<INPUT TYPE="text" SIZE="20" NAME="EMAIL" VALUE="****@**.co.jp"><br> <br> <font color="blue">TYPE="password" パスワードの入力テスト</font><br> パスワード:<INPUT TYPE="password" NAME="pass1" SIZE="20"><br> パスワード:<INPUT TYPE="password" NAME="pass2" SIZE="20">(同じのを(笑))<br> <br> <font color="blue">TYPE="CHECKBOX" チェックボックスの入力テスト</font><br> このメルマガでやってほしいことにチェックを入れてください<br> <INPUT TYPE="CHECKBOX" NAME="c_1" VALUE="on">HTMLから詳しく丁寧に<BR> <INPUT TYPE="CHECKBOX" NAME="c_2" VALUE="on">VBScriptをもっと詳しく<BR> <INPUT TYPE="CHECKBOX" NAME="c_3" VALUE="on">ゲーム作ろうよ<BR> <br> <font color="blue">TYPE="RADIO" ラジオボタンの入力テスト</font><br> このメルマガの満足度を5段階で(笑)<br> 不満 ------ 満足<br> 1<INPUT TYPE="RADIO" NAME="q_5" VALUE="1"> 2<INPUT TYPE="RADIO" NAME="q_5" VALUE="2"> 3<INPUT TYPE="RADIO" NAME="q_5" VALUE="3" CHECKED> 4<INPUT TYPE="RADIO" NAME="q_5" VALUE="4"> 5<INPUT TYPE="RADIO" NAME="q_5" VALUE="5"> <br> <font color="blue">TEXTAREA ROWS=10 COLS=40 の入力テスト</font><br> 感想:<TEXTAREA NAME="HONBUN" ROWS=5 COLS=40>複数文章をテスト</TEXTAREA><br> <br> <font color="blue">TYPE="submit" 送信ボタンのテスト</font><br> <INPUT TYPE="submit" NAME="btn1" VALUE="送信1"> <INPUT TYPE="submit" NAME="btn2" VALUE="送信2"> <INPUT TYPE="reset" VALUE="入力し直す"> </FORM> <hr> </body> </html> http://www.ken3.org/cgi-bin/test/test041-1.asp でテスト実行できます。

/* * 2.フォームの送信モード */

HTMLで入力フォームを作る時、 <FORM ACTION="test041-1.asp" METHOD="POST"> と <FORM ACTION="test041-1.asp" METHOD="GET"> のパターンがあります。 何?って感じですが、2つのパターンの簡単な使い方と違いは、 METHOD="GET"のモードで送ると、 ~~~~~~~~~~~~ URLにパラメータを付けた形式でASP(CGI)にパラメータを渡します。 利点は、URLにパラメータがついているので、 ・お気に入りにパラメータ付きで保存可能 ・<A Href=でも使用可能 http://www.ken3.org/cgi-bin/test/test041-1.asp?P=2&Z=ON など、送信ボタンを押すと、URLに?を付けて送信します。 *よくみかけますよね。 ASP側の受取りは、 Request.QueryString("項目名")です。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >[No.08 URLに付けたパラメータを参照(クエリ情報)] >( http://www.ken3.org/backno/backno_asp02.html#8 を参照) >では、 >URLに付けた情報 test007-2.asp?ID=123 ?の後ろがパラメーターを取出す >Request.QueryString("項目名")をやりました。 >[No.09 URLに付けたパラメータを参照(クエリ情報)] >( http://www.ken3.org/backno/backno_asp02.html#9 を参照) >では、 >フォームのMETHOD="GET"で送ると、 >フォームの値をURLに載せて、ASPが呼ばれてることを説明しました。 次に、 METHOD="POST"のモードで送ると、 ・GETより大量のデータを送信できる(URLにデータ載せないので) あとなんだろう?私もそんなに気にしてない。 ASP側の受取りは、 Request.Form("項目名")です ^^^^^^^^^^^^^^^^^^^^^^ >[No.04 フォームから値を受け取りたい] >( http://www.ken3.org/backno/backno_asp01.html#4 を参照) >では、 >フォームを作成し、モードPOSTで送信 >受け取りの基本は簡単で、 >Request.Form("フォームの項目名") >で受け取りました。 POSTが標準で、GETはパラメータなどをURLに載せたい場合(検索条件など) と軽く考えてますが、、、

/* * 3.Request.ServerVariables("REQUEST_METHOD")でPOST/GETを判断 */

受取り方法が違うので、どうしましょう? まぁ、普通はどちらで送るか(送ったほうが良いか)、 設計段階で決まっているので、どちらか判断しなくてもよいのですが、 今回、Request.ServerVariables("REQUEST_METHOD")でPOST/GETを判断してみました。 'Request.ServerVariables("REQUEST_METHOD")でPOST/GETを判断 If Request.ServerVariables("REQUEST_METHOD") = "POST" Then 'POST判断 'For Each で Request.Formの値を取出す For Each RF In Request.Form Response.Write "<TR><TD>" & RF & "</TD>" '名称表示 Response.Write "<TD>" & Request.Form(RF) & "</TD></TR>" '値の表示 Next Else 'GET 'For Each で Request.QueryStringの値を取出す For Each RQ In Request.QueryString Response.Write "<TR><TD>" & RQ & "</TD>" '名称表示 Response.Write "<TD>" & Request.QueryString(RQ) & "</TD></TR>" '値の表示 Next End If 意外と簡単で、 Request.ServerVariables("REQUEST_METHOD") にPOST/GETが入っているので、それで判断しました。 判断後、項目名、値の表示を For Each XX IN オブジェクト で取りだし、表示しました。

/* * 4.実際の値を送ってみる */

値の受取りテストでいろいろなTYPEを使ってみました。 TYPE="text" でテキストの入力テスト ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ お名前:<INPUT TYPE="text" SIZE="20" NAME="USER-NAME" VALUE="匿名希望"><br> E-Mail:<INPUT TYPE="text" SIZE="20" NAME="EMAIL" VALUE="****@**.co.jp"><br> よく使うテキストボックスです。 パラメータも見たままですね(笑) TYPE="password" パスワードの入力テスト ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ パスワード:<INPUT TYPE="password" NAME="pass1" SIZE="20"><br> パスワード:<INPUT TYPE="password" NAME="pass2" SIZE="20">(同じのを(笑))<br> 入力すると*****と中身が見えません が、 GETで送ると、URLにデータが載っているので、 IEの履歴なんかみると一発です。 *POSTで送っても、URLに載らないだけで、生データが送られているのですが。 TYPE="CHECKBOX" チェックボックスの入力テスト ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ このメルマガでやってほしいことにチェックを入れてください<br> <INPUT TYPE="CHECKBOX" NAME="c_1" VALUE="on">HTMLから詳しく丁寧に<BR> <INPUT TYPE="CHECKBOX" NAME="c_2" VALUE="on">VBScriptをもっと詳しく<BR> <INPUT TYPE="CHECKBOX" NAME="c_3" VALUE="on">ゲーム作ろうよ<BR> チェックボックスのON/OFFです。 レのチェックが付くと、Valueの値を渡します。 TYPE="RADIO" ラジオボタンの入力テスト ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ このメルマガの満足度を5段階で(笑)<br> 不満 ------ 満足<br> 1<INPUT TYPE="RADIO" NAME="q_5" VALUE="1"> 2<INPUT TYPE="RADIO" NAME="q_5" VALUE="2"> 3<INPUT TYPE="RADIO" NAME="q_5" VALUE="3" CHECKED> 4<INPUT TYPE="RADIO" NAME="q_5" VALUE="4"> 5<INPUT TYPE="RADIO" NAME="q_5" VALUE="5"> ラジオボタンです。 作成のポイントは、NAME="XXX"を一緒にすることです。 CHECKEDは、初期状態でチェックしたい項目がある時に使用します。 TEXTAREA ROWS=10 COLS=40 の入力テスト ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 感想:<TEXTAREA NAME="HONBUN" ROWS=5 COLS=40>複数文章をテスト</TEXTAREA><br> 簡単に言うと複数行のテキストボックスです。 TYPE="submit" 送信ボタンのテスト ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <INPUT TYPE="submit" NAME="btn1" VALUE="送信1"> <INPUT TYPE="submit" NAME="btn2" VALUE="送信2"> ごく最近知ったのですが、送信ボタンに名前を付けて押されたボタンを判断できます。 *同じフォームに削除実行ボタン、印刷ボタンなど作れます http://www.ken3.org/cgi-bin/test/test041-1.asp でテスト実行できるので、遊んでみてください。

/* * 5.終わりの挨拶 */

フォームを使ったデータのやり取りの参考になれば幸いです。 素朴な疑問あったら、気軽に、 メール、掲示板に書き込んでくださいね。 掲示板 : http://www.ken3.org/asp/bbs-asp.html ASP、VBScript勉強中の三流プログラマーのKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- [No.04 フォームから値を受け取りたい] ( http://www.ken3.org/backno/backno_asp01.html#4 を参照) では、 フォームを作成し、モードPOSTで送信 受け取りの基本は簡単で、 Request.Form("フォームの項目名") で受け取りました。 [No.08 URLに付けたパラメータを参照(クエリ情報)] ( http://www.ken3.org/backno/backno_asp02.html#8 を参照) では、 URLに付けた情報 test007-2.asp?ID=123 ?の後ろがパラメーターを取出す Request.QueryString("項目名")をやりました。 [No.09 URLに付けたパラメータを参照(クエリ情報)] ( http://www.ken3.org/backno/backno_asp02.html#9 を参照) では、 フォームのMETHOD="GET"で送ると、 フォームの値をURLに載せて、ASPが呼ばれてることを説明しました。

No.42 2003/03/31
Application("XXXX") Application変数のテスト
[ページTOPへ戻る]

<Application("XXXX") Application変数のテスト>

こんにちは、三流プログラマーのKen3です。 今回は、 Application("XXXX") 共通変数のテスト です。 何かの参考となれば幸いです。

/* * 1.簡単な共通変数 */

ページ単位で値の受け渡しをする方法を探っていたところ、 Application変数を見つけました。 使い方は簡単で、 Application("変数名") = 値 でセット(代入) xxx = Application("変数名")で参照可能です。 へぇ〜と感心してないで、 簡単なテストを行ってみます。 内容は、文字をフォームから受けとって、その値を Application変数に保存しておきます。 http://www.ken3.org/cgi-bin/test/test042-1.asp でテスト実行できます。 <%@LANGUAGE=VBScript%> <% '頭でパラメータのチェックとセット処理 If IsEmpty(Request.QueryString("SETDATA")) = False Then Application("test042data") = Request.QueryString("SETDATA") 'データセット Application("test042time") = Now '現在時刻のセット End If Application("test042cnt") = Application("test042cnt") + 1 '+1する %> <html> <head> <title>Application("XXXX") 共通変数のテスト</title> </head> <body> <h2>Application("XXXX") 共通変数のテスト</h2> test042-1.asp<br> <hr> Application("test042data")=[<b><%=Application("test042data")%></b>]が<br> Application("test042time")=[<b><%=Application("test042time")%></b>]に書きこまれました<br> Application("test042cnt")=[<b><%=Application("test042cnt")%></b>]回目のアクセスです<br> (がセットされてます。) <hr> <br> <b>好きな文字を入れて送信して下さい</b><br> <FORM ACTION="test042-1.asp" METHOD="GET"><!-- 自分自身を呼ぶ --> <font color="blue">セットする文字は</font><br> <INPUT TYPE="text" SIZE="40" NAME="SETDATA" VALUE="ABCDE好きな文字"><br> <br> <INPUT TYPE="submit" VALUE="データセット(送信)"> </FORM> <hr> </body> </html> 簡単な解説 ~~~~~~~~~~ まず、頭でデータの受取りのチェックを行い、データアリの時はセットします。 <% '頭でパラメータのチェックとセット処理 If IsEmpty(Request.QueryString("SETDATA")) = False Then Application("test042data") = Request.QueryString("SETDATA") 'データセット Application("test042time") = Now '現在時刻のセット End If Application("test042cnt") = Application("test042cnt") + 1 '+1する %> 普通に、 Application("test042data") = 値として、セットしてます。 Application("test042cnt") = Application("test042cnt") + 1 みたいなカウントアップ的な使い方も出来ます。 <hr> Application("test042data")=[<b><%=Application("test042data")%></b>]が<br> Application("test042time")=[<b><%=Application("test042time")%></b>]に書きこまれました<br> Application("test042cnt")=[<b><%=Application("test042cnt")%></b>]回目のアクセスです<br> (がセットされてます。) <hr> ここも、<%=で値を表示してるだけです。 http://www.ken3.org/cgi-bin/test/test042-1.asp でテスト実行できます。

/* * 2.Application変数 値の保持期間、参照範囲 */

値のセットと取出しが無事にできました。 気になるのが、 Application変数 値の保持期間 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ です。 IISが起動中の間は保持されてます。 再起動や一定時間のアクセスが無く停止した時は、 メモリがクリアされます。 簡単なカウンタに使えるかなぁと思ったけど、 値を保持する処理はファイルやDBなどに保存しないとダメみたいです。 参照範囲 ~~~~~~~~ アプリケーションの共通変数なので、 同じ仮想ディレクトリ内に格納されているプログラムから共通に使えます。 共通なので、各ユーザー別に値を処理したい時は、まだ説明していない セッション変数を使う必要があります。 共通に参照可能のサンプルを兼ねて、 現在使用中のアプリケーション変数をFor Eachで表示するテストプログラムを書きます。 http://www.ken3.org/cgi-bin/test/test042-2.asp でテスト実行できます。 <%@LANGUAGE=VBScript%> <html> <head> <title>For Each で 使用中の Application 変数を表示</title> </head> <body> <h2>For Each で 使用中の Application 変数を表示</h2> test042-2.asp<br> <hr> <TABLE Border='1'> <TR><TD>項目名</TD><TD>値</TD></TR> <% 'For Each で Applicationの値を取出す For Each ITEM In Application.Contents Response.Write "<TR><TD>" & ITEM & "</TD>" '名称表示 Response.Write "<TD>" & Application.Contents(ITEM) & "</TD></TR>" '値の表示 Next %> </TABLE> <hr> </body> </html> 簡単な解説 ~~~~~~~~~~ For Each ITEM In Application.Contents でオブジェクトのループを作り、 Application.Contents(ITEM)で参照してます。 Application.Contents(1)などインデックスで参照することもできます。 レンタルサーバーなので、再起動後のテストなどできないのですが、 私が使っているアプリケーション変数の表示テストは、 http://www.ken3.org/cgi-bin/test/test042-2.asp でテスト実行できます。 テストの時、 <% 'For Each で Applicationの値を取出す For Each ITEM In Application.Contents Response.Write "<TR><TD>" & ITEM & "</TD>" '名称表示 Response.Write "<TD>" & Application.Contents(ITEM) & "</TD></TR>" '値の表示 Next %> でデバック表示すると楽な時あるので、使ってみてください。

/* * 3.力技の一言伝言板 */

一時的に消えてしまってもいい、、、そんなサンプルかぁ。 あっ、今では使われなくなった駅の伝言板じゃないけど、 伝言板もどきを作成してみます。 簡単なプログラムの仕様 伝言は10個までとし、古い伝言から上書きされる。 ファイルには残さないで、Application変数に保存する 変数は、 test042-0,test042-1...test042-9と10個の変数 と カウンタ用にtest042-no をApplicationで用意します。 <%@LANGUAGE=VBScript%> <% '頭でパラメータのチェックとセット処理 If IsEmpty(Request.QueryString("SETDATA")) = False Then 'データセット位置を決める no = Application("test042-no") + 1 '番号をカウントアップ Application("test042-no") = no 'noの代入 setno = no Mod 10 'Modで10で割った余りを計算 'セットするデータを作る no + 時刻 + 書き込みデータ setdata = no & " " & Now & " - " & Request.QueryString("SETDATA") Application("test042-" & setno) = setdata 'データのセット End If %> <html> <head> <title>ASP Application("XXXX")変数 を使った伝言板</title> </head> <body> <!-- Ken3 --><!-- #include file="info.inc" --> <h2>ASP Application("XXXX")変数 を使った伝言板</h2> test042-3.asp<br> <hr> <% 'アプリケーション変数を表示する sno = Application("test042-no") '表示スタート番号 For n = 0 To 9 '10回ループするぞ putno = (sno - n) Mod 10 '表示する変数を計算 32なら2を表示したい putdata = Application("test042-" & putno) '値を取出す Response.Write putdata Response.Write "<HR>" & Chr(13) & Chr(10) Next %> <br> <b>伝言メッセージを入れて送信して下さい</b><br> <FORM ACTION="test042-3.asp" METHOD="GET"><!-- 自分自身を呼ぶ --> <font color="blue">メッセージ</font><br> <INPUT TYPE="text" SIZE="40" NAME="SETDATA" VALUE="メッセージ"><br> <br> <INPUT TYPE="submit" VALUE="書き込み(送信)"> </FORM> <hr> </body> </html> ポイントは ~~~~~~~~~~ 頭のデータチェック後、 'データセット位置を決める no = Application("test042-no") + 1 '番号をカウントアップ Application("test042-no") = no 'noの代入 で、連番をtest042-noで管理します。 setno = no Mod 10 'Modで10で割った余りを計算 ここで、下1桁を計算します(10で割ったあまりが1桁目なので) 'セットするデータを作る no + 時刻 + 書き込みデータ setdata = no & " " & Now & " - " & Request.QueryString("SETDATA") と文字列を作成後、 Application("test042-" & setno) = setdata 'データのセット で、33番目なら、setno = 33 Mod 10で3となっているので、 test042-3にセットされます。 次に表示部分 sno = Application("test042-no") '表示スタート番号 とスタートの番号を取出します。 説明では、33番目とします。 For n = 0 To 9 '10回ループするぞ と普通に0から9のカウンターを使ったループにします。 putno = (sno - n) Mod 10 '表示する変数を計算 32なら2を表示したい ここでは、 1回目は33-0 Mod 10 で3 2回目は33-1 Mod 10 で2 ・  ・ となり、 putdata = Application("test042-" & putno) '値を取出す で、test042-X のデータを取り出し、 Response.Write putdata で表示してます。 http://www.ken3.org/cgi-bin/test/test042-3.asp でテストして、流れを確認して下さい(見て下さい) デバックじゃないけど、 http://www.ken3.org/cgi-bin/test/test042-2.asp で変数の確認をすると、わかり易いかも。 *私の失敗した変数が残っていたりして笑えるよ。

/* * 5.終わりの挨拶 */

今回は、 共通で使える変数 Application("XXXX") Application変数のサンプル解説でした。 データのやり取りの参考になれば幸いです。 素朴な疑問あったら、気軽に、 メール、掲示板に書き込んでくださいね。 掲示板 : http://www.ken3.org/asp/bbs-asp.html ASP、VBScript勉強中の三流プログラマーのKen3でした。

No.43 2003/04/01
SQL文 HAVING句でGroup化されたレコードに条件設定する
[ページTOPへ戻る]

<SQL文 HAVING句でGroup化されたレコードに条件設定する>

こんにちは、三流プログラマーのKen3です。 今回は、 SQL Select文でグループ化したデータに対して、 条件を付ける HAVING句 を使用してみます。 何かの参考となれば幸いです。

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

ログのカウント処理でグループ化していろいろと集計を行っていました。 http://www.ken3.org/cgi-bin/test/test039-1.asp で、発行する(した)SQL文は Select URL, Count(URL) As URLCNT From log GROUP BY URL ORDER BY Count(URL) DESC No. URL 訪問者 1 http://www.ken3.org/backno/backno_vba_mokuji.html 548人 2 http://www.ken3.org/backno/backno_vba12.html 344人 3 http://www.ken3.org/backno/backno_vba01.html 238人 4 http://www.ken3.org/ 207人 ・  ・  ・ 177 http://www.ken3.org/backno/backno_guchi11.html 1人 178 http://www.ken3.org/cgi-bin/test/test001.asp 1人 179 http://www.ken3.org/backno/hosoku/008/ 1人 180 http://www.ken3.org/backno/backno_guchi31.html 1人 と、集計されて表示されています。 全てのデータ表示も必要なのですが、 人気のある上位ページだけチェックしたいので、 訪問者数50人以上のある程度訪問者の居るページを表示させたいと思いました。 さて、どうしようかなぁ。 単純なのは、 'EOFまでループ nCNT = 1 Do While rs.EOF = False '.EOFがFalseの間 の表示のループで、訪問者数をチェックして、ループを抜ければできそうです。

/* * 2.SQL文 HAVING句でGroup化されたレコードに条件設定する */

それだと少し面白くないので、SQL文で探してみました SQL SELECT文にHAVING句があって、 GROUP BY でグループ化されたレコードに対して条件を付けられます。 Select URL, Count(URL) As URLCNT -- URLとURLをCount関数で集計した項目URLCNT From log -- テーブルはlogから GROUP BY URL -- URLでグループ化 HAVING Count(URL) >= 50 -- Count(URL)が50以上のデータに絞り込む ORDER BY Count(URL) DESC -- Count(URL)の降順でレコードを作成 作成はこんな感じのSQLを作成、それを発行します。 グループ化されてできたレコードに HAVING 条件 ~~~~~~~~~~~ と書くことによって、グループ化されたレコードを絞ることができます。 使い方はいつものSQL文字列の作成に入れて、 strSQL = "Select URL, Count(URL) As URLCNT " strSQL = strSQL & "From log " strSQL = strSQL & "GROUP BY URL " strSQL = strSQL & "HAVING Count(URL) >= 50 " strSQL = strSQL & "ORDER BY Count(URL) DESC" でSQL文の文字列を作成、 Set rs = db.Execute(strSQL) で発行、レコードセットを作り表示しました。 http://www.ken3.org/cgi-bin/test/test043-1.asp でテスト可能です。動きを見て下さい。 SQL文しか変わってないけど、下記がソースです。 *逆に言うとSQL文を変えると、定型パターンでいろいろとできますね。 SQLのマジシャンと呼ばれるくらいになりたいですよね。 <%@LANGUAGE=VBScript%> <html> <head> <title>SQL文 HAVING句でGroup化されたレコードに条件設定する</title> </head> <body> <h2>SQL文 HAVING句でGroup化されたレコードに条件設定する</h2> test043-1.asp<br> <hr> cnt.mdb から訪問されたURLをグループ化して集計、降順に表示<br> <b>HAVING句で訪問者50人以上を表示</b><br> <hr> <% 'ADO DB Connection オブジェクトを作成する、英文そのままじゃん Set db=Server.CreateObject("ADODB.Connection") '.Provider?プロバイダー?通信会社?じゃなくって 'データアクセスにはJet.OLEDB.4.0を使うことを設定 db.Provider = "Microsoft.Jet.OLEDB.4.0" '次に、接続DBの位置を渡すので、Server.MapPathで変換して渡す db.ConnectionString = Server.MapPath("cnt.mdb") 'やっとデータベースを開ける db.open 'お約束のレコードセットの作成 テーブル名URLを指定 'GROUP BY句 で グループ化 Count関数で集計 ORDER BY句で並べ替え strSQL = "Select URL, Count(URL) As URLCNT " strSQL = strSQL & "From log " strSQL = strSQL & "GROUP BY URL " strSQL = strSQL & "HAVING Count(URL) >= 50 " 'グループ化集計50人以上 strSQL = strSQL & "ORDER BY Count(URL) DESC" 'オマケで画面にデータ表示 Response.Write "<hr>発行する(した)SQL文は<br><B><font color='green'>" Response.Write strSQL & "</font></B><br>です<hr>" Set rs = db.Execute(strSQL) 'データの表示をテーブルで行う Response.Write "<TABLE Border='1'>" '見出しをバカっぽく、そのまま書き込む Response.Write "<TR>" Response.Write "<TD>No.</TD>" Response.Write "<TD>URL</TD>" Response.Write "<TD>訪問者</TD>" Response.Write "</TR>" 'EOFまでループ nCNT = 1 Do While rs.EOF = False '.EOFがFalseの間 Response.Write "<TR>" '内容を表示する Response.Write "<TD>" & nCNT & "</TD>" Response.Write "<TD><A HREF='" & rs.Fields.Item("URL") & "' Target='_blank'>" Response.Write rs.Fields.Item("URL") & "</A></TD>" Response.Write "<TD ALIGN=RIGHT>" & rs.Fields.Item("URLCNT") & "人</TD>" Response.Write "</TR>" & Chr(13) & Chr(10) '次のレコードにポインタを移動する rs.MoveNext 'これを忘れると悲惨なことに、、、 'カウンタを増やす nCNT = nCNT + 1 Loop Response.Write "</TABLE>" 'テーブルは終わりです '開いていたレコードセットを閉じる rs.Close 'データベースも閉じようよ db.Close 'お行儀よくオブジェクトも開放しましょう(通常は自動的に解放されるけど) Set db = Nothing %> <hr> 終了です。<br> <A HREF="test039-1.asp">URLでグループ化した集計値を全て表示</A><br> <A HREF="test037-1.asp">cnt.mdb 最近訪問した人のデータ30件を表示</A><br> <br> </body> </html>

/* * 3.終わりの挨拶 */

今回は、 SQL文のHAVING句でGroup化されたレコードに条件設定する のサンプル解説でした。 SQL文の参考になれば幸いです。 素朴な疑問あったら、気軽に、 メール、掲示板に書き込んでくださいね。 掲示板 : http://www.ken3.org/asp/bbs-asp.html ASP、VBScript勉強中の三流プログラマーのKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- [No.39 SQL GROUP BY句 で グループ化 集計結果を並べ替えする] http://www.ken3.org/backno/backno_asp08.html#39 では、URLをグループ化して訪問者数を数えてました。

No.44 2003/04/04
MDBを使ったアンケート集計を作る
[ページTOPへ戻る]

<MDBを使ったアンケート集計を作る>

こんにちは、三流プログラマーのKen3です。 今回は、 MDBファイルへアンケートの集計結果を貯めてみたいと思います 何かの参考となれば幸いです。

/* * 1.やりたいこと */

発行しているメルマガの評価を5段階で集計したいと思います。 種類(ASP,VBA,愚痴,コンビニ) と 発行した発行No別に、 5 満足(参考になった) 4 まぁまぁ(一部参考になった) 3 普通(どちらとも言えない) 2 なんかなぁ(期待と違った) 1 不満(読んで損した気分) の投票数を管理したいと思います。 また、簡単な連続投票の防止機能を付けてみたいと思います。 (投票されたIPアドレスを記録して、連続投票の防止)

/* * 2.仕様 */

テーブル仕様 ~~~~~~~~~~~~ データはDBへ保存管理します。 db044.mdb (Access2000で作成したDB) へADO,SQLでアクセスします。 テーブル名 ans フィールドは、 ID オートナンバー KUBUN テキスト型 MNO 数値型 A5 数値型 A4 数値型 A3 数値型 A2 数値型 A1 数値型 IP テキスト型 WriteTime 日付型 で、投票数をカウントアップしていきます(詳細は取らないで累積加算します) 入力仕様 ~~~~~~~~ データをURLに載せた形式で受取ります。(METHOD="GET") 受取り項目は KUBUN=ASPなどの区分 NO=10 XX号 A=5〜1の評価 の3項目を受取ります。 出力仕様 ~~~~~~~~ データを受取ったら、累積加算します。 加算後の結果とアンケートありがとうのメッセージを表示します。 主な処理の流れは、 ~~~~~~~~~~~~~~~~~~ パラメータのチェック Aが1〜5の間か? 重複登録のチェック And 初回の時はレコードを新規作成 累積加算を行う 結果の表示 です。

/* * 3.まずはパラメータのチェック */

エラーのパターンを洗い出すと、 エラー条件は、 KUBUN が 無し(スペース) NO が無し Or 0の時 A か 1〜5以外の時(範囲外の時) です。 正常パターンテスト用 http://www.ken3.org/cgi-bin/test/test044-1.asp?KUBUN=ASP&NO=44&A=5 http://www.ken3.org/cgi-bin/test/test044-1.asp?KUBUN=ASP&NO=44&A=4 http://www.ken3.org/cgi-bin/test/test044-1.asp?KUBUN=ASP&NO=44&A=3 http://www.ken3.org/cgi-bin/test/test044-1.asp?KUBUN=ASP&NO=44&A=2 http://www.ken3.org/cgi-bin/test/test044-1.asp?KUBUN=ASP&NO=44&A=1 エラーテスト用 http://www.ken3.org/cgi-bin/test/test044-1.asp?NO=44&A=1 区分無し http://www.ken3.org/cgi-bin/test/test044-1.asp?KUBUN=ASP&A=2 NO無し http://www.ken3.org/cgi-bin/test/test044-1.asp?KUBUN=ASP&NO=44 評価無し http://www.ken3.org/cgi-bin/test/test044-1.asp?KUBUN=ASP&NO=44&A=6 評価範囲外 でテスト可能です。 <%@LANGUAGE=VBScript%> <html> <head> <title>パラメータをチェックする</title> </head> <body> <h2>パラメータをチェックする</h2> test044-1.asp<br> <hr> エラー条件は、<br> KUBUN が 無し(スペース)<br> NO が無し Or 0の時<br> A か 1〜5以外の時(範囲外の時)<br> <hr> <% '値の代入 KUBUN = Request.QueryString("KUBUN") NO = Request.QueryString("NO") A = Request.QueryString("A") 'テストで値を表示 Response.Write "<Font Color='BLUE'>受取った値は</Font><BR>" 'For Each で Request.QueryStringの値を取出す For Each RQ In Request.QueryString Response.Write RQ & "=" '名称表示 Response.Write Request.QueryString(RQ) & "<BR>" '値の表示 Next 'パラメータのチェックを行う ret = errchk() 'チェック用の関数を呼ぶ If ret = -1 Then 'エラーか? Response.Write "<Font Color='red'>" Response.Write "受取ったパラメータが異常です" Response.Write "</Font>" Else '正常時 Response.Write "パラメータは正常です" End If %> <hr> </body> </html> <% '外側に関数を書いてます(どこでもいいんだけど)
Function errchk()  'パラメータのエラーをチェックします 0:正常 -1:エラー

  errchk = 0  'エラーを無しにする(初期値で代入)

  'KUBUN が 無し(スペース)
  If Len(KUBUN) = 0 Then errchk = -1

  'NO が無し Or 0の時
  If Len(NO) = 0 Then errchk = -1
  If CInt(NO) = 0 Then errchk = -1

  'A か 1〜5以外の時(範囲外の時)
  If A < 1 Or 5 < A Then errchk = -1 

End Function
%>
処理の解説 ~~~~~~~~~~ '値の代入 KUBUN = Request.QueryString("KUBUN") NO = Request.QueryString("NO") A = Request.QueryString("A") GETでデータを受取るので、.QueryStringで値を取出します。 'テストで値を表示 Response.Write "<Font Color='BLUE'>受取った値は</Font><BR>" 'For Each で Request.QueryStringの値を取出す For Each RQ In Request.QueryString Response.Write RQ & "=" '名称表示 Response.Write Request.QueryString(RQ) & "<BR>" '値の表示 Next 確認の意味で、受取ったパラメータを表示してます。 'パラメータのチェックを行う ret = errchk() 'チェック用の関数を呼ぶ とチェックの関数を呼んでます (チェック処理を関数にまとめました) If ret = -1 Then 'エラーか? Response.Write "<Font Color='red'>" Response.Write "受取ったパラメータが異常です" Response.Write "</Font>" Else '正常時 Response.Write "パラメータは正常です" End If リターン値を見て、結果を判断してます。 肝心のチェック処理は、各エラーパターンに対して、チェックを行い、 エラーの時はリターン値に-1をセットしてます。
Function errchk()  'パラメータのエラーをチェックします 0:正常 -1:エラー

  errchk = 0  'エラーを無しにする(初期値で代入)

  'KUBUN が 無し(スペース)
  If Len(KUBUN) = 0 Then errchk = -1

  'NO が無し Or 0の時
  If Len(NO) = 0 Then errchk = -1
  If CInt(NO) = 0 Then errchk = -1

  'A か 1〜5以外の時(範囲外の時)
  If A < 1 Or 5 < A Then errchk = -1 

End Function

/* * 4.連続登録のチェック と データ加算 */

次は、連続登録のチェックと初回の時はレコードを作成です。 KUBUNとMNOを条件にして、 ansテーブルからデータを読み込みます。 該当データ無しの時(新規レコード時)、データ0のレコードを作成します データが読めた時は、IPアドレスを比べて、同じ時はエラーを返します。
Function cntDATA()  '連続登録のチェックとデータ加算 0:正常 -1:エラー

  'ADO DB Connection オブジェクトを作成する
  Set db=Server.CreateObject("ADODB.Connection")

  'データアクセスにはJet.OLEDB.4.0を使うことを設定
  db.Provider = "Microsoft.Jet.OLEDB.4.0"

  '次に、接続DBの位置を渡すので、Server.MapPathで変換して渡す
  db.ConnectionString = Server.MapPath("db044.mdb")

  'やっとデータベースを開ける
  db.open

  '検索するSQLを作成する
  strSQL = "Select * From ans "
  strSQL = strSQL & "Where KUBUN = '" & KUBUN & "' And MNO = " & NO

  'オマケで画面にデータ表示
  Response.Write "<hr>発行する(した)SQL文は<br><B><font color='green'>"
  Response.Write strSQL & "</font></B><br>です<hr>"

  Set rs = db.Execute(strSQL)  'SQL文を発行してレコードセットを作成

  If rs.EOF = True Then  'データが見つからなかった時
    strINSSQL = "INSERT INTO ans (KUBUN, MNO) VALUES ("
    strINSSQL = strINSSQL & "'" & KUBUN & "'"  '区分
    strINSSQL = strINSSQL & ", " & NO & ")"    'NO
    'オマケで画面にデータ表示
    Response.Write "<hr>発行する(した)SQL INSERT文は<br><B><font color='green'>"
    Response.Write strINSSQL & "</font></B><br>です<hr>"
    'SQL INSERT文を発行
    db.Execute(strINSSQL)
  Else 'データ在りの時
    '前回のIPアドレスと同じかチェックする
    If rs("IP") = Request.ServerVariables("REMOTE_ADDR") Then
        cntDATA = -1   'エラーにする
        rs.Close
        Exit Function  '関数を途中で抜ける
    End If
  End If

  rs.Close 'レコードセットを閉じる

  'UPDATEのSQL文を作成する
  strUSQL = "UPDATE ans Set "  'ansテーブルを更新
  strUSQL = strUSQL & "IP = '" & Request.ServerVariables("REMOTE_ADDR") & "'"
  strUSQL = strUSQL & ", WriteTime = #" & Now & "#"
  strUSQL = strUSQL & ", A" & A & " = A" & A & " + 1" 'カウントアップ
  strUSQL = strUSQL & " Where KUBUN = '" & KUBUN & "' And MNO = " & NO '条件

  'オマケで画面にデータ表示
  Response.Write "<hr>発行する(した)SQL UPDATE文は<br><B><font color='green'>"
  Response.Write strUSQL & "</font></B><br>です<hr>"
  'SQL文を発行
  db.Execute(strUSQL)

  '更新結果を読み直す
  Set rs = db.Execute(strSQL)  'SQL文を発行してレコードセットを作成
  Response.Write "更新結果<br>"
  Response.Write "KUBUN=<b>" & rs("KUBUN") & "</b><br>"
  Response.Write "MNO=<b>" & rs("MNO") & "</b><br>"
  Response.Write "A5=<b>" & rs("A5") & "</b><br>"
  Response.Write "A4=<b>" & rs("A4") & "</b><br>"
  Response.Write "A3=<b>" & rs("A3") & "</b><br>"
  Response.Write "A2=<b>" & rs("A2") & "</b><br>"
  Response.Write "A1=<b>" & rs("A1") & "</b><br>"
  Response.Write "IP=<b>" & rs("IP") & "</b><br>"
  Response.Write "WriteTime=<b>" & rs("WriteTime") & "</b><br>"

  'リターン値をセットして関数終了
  cntDATA = 0  '正常終了

End Function
ポイント解説 ~~~~~~~~~~~~ http://www.ken3.org/cgi-bin/test/test044-2.asp?KUBUN=ASP&NO=6&A=2 を貰ったら、 '検索するSQLを作成する strSQL = "Select * From ans " strSQL = strSQL & "Where KUBUN = '" & KUBUN & "' And MNO = " & NO で、 Select * From ans Where KUBUN = 'ASP' And MNO = 6 とSQL文を発行します。 If rs.EOF = True Then 'データが見つからなかった時 もしデータが見つからなかったら、 初めての投票なので、区分とNOでレコードを作ります(作りたいです) strINSSQL = "INSERT INTO ans (KUBUN, MNO) VALUES (" strINSSQL = strINSSQL & "'" & KUBUN & "'" '区分 strINSSQL = strINSSQL & ", " & NO & ")" 'NO で、 INSERT INTO ans (KUBUN, MNO) VALUES ('ASP', 6) とSQL INSERT文を作成して、レコードを作ります。 Else 'データ在りの時 は、 読みこんだレコードの前回IPが現在のアドレスと一緒かチェックします。 '前回のIPアドレスと同じかチェックする If rs("IP") = Request.ServerVariables("REMOTE_ADDR") Then cntDATA = -1 'エラーにする rs.Close Exit Function '関数を途中で抜ける End If End If rs.Close 'レコードセットを閉じる ここまでで、IPアドレスが同じ時は関数を抜け、 初投票の時はデータレコードが作成されました。 次は、 ・投票されたAをカウントアップ ・投票者のIPアドレスをセット ・投票時間のセットです SQLのUPDATE文更新処理で行ってみようと思います。 'UPDATEのSQL文を作成する strUSQL = "UPDATE ans Set " 'ansテーブルを更新 strUSQL = strUSQL & "IP = '" & Request.ServerVariables("REMOTE_ADDR") & "'" strUSQL = strUSQL & ", WriteTime = #" & Now & "#" strUSQL = strUSQL & ", A" & A & " = A" & A & " + 1" 'カウントアップ strUSQL = strUSQL & " Where KUBUN = '" & KUBUN & "' And MNO = " & NO '条件 で UPDATE ans Set IP = '203.182.79.243', WriteTime = #2003/04/04 23:47:35#, A2 = A2 + 1 Where KUBUN = 'ASP' And MNO = 6 とUPDATEのSQL文を作成しました。 ここの一番のポイントが、 A2 = A2 + 1 ^^^^^^^^^^^^^ の更新方法です。 このように項目(フィールド)を使った計算を書くことが出来ます。 KUBUN と MNOで初めにレコードを読み、 レコードが無い時は、レコードを作る、 在った時は前回のIPアドレスと比べる。 重複チェックと新規のレコード作成が終了しているので、 UPDATE文で、投票された項目を+1して、 同時に、IPアドレスと時刻を更新しました。 なんか複雑ですが、流れはほぼ一直線なので、 一歩一歩見て下さい。

/* * 4.終わりの挨拶 */

今回は、DBを使ったカウント処理でした。 ポイントの A2 = A2 + 1の更新SQL と 新規レコードの追加 そこだけ押さえてください カウント処理の参考になれば幸いです。 素朴な疑問あったら、気軽に、 メール、掲示板に書き込んでくださいね。 掲示板 : http://www.ken3.org/asp/bbs-asp.html ASP、VBScript勉強中の三流プログラマーのKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- [No.41 POST(Request.Form)/GET(Request.QueryString) で 送られてきた値を表示する] http://www.ken3.org/backno/backno_asp09.html#41 のGET(Request.QueryString) を参考に [No.27 SQL INSERT INTO文でデータの追加] http://www.ken3.org/backno/backno_asp06.html#27 のSQL INSERT INTO文作成方法 [No.33 SQL UPDATE文でデータを更新する] http://www.ken3.org/backno/backno_asp07.html#33 のSQL UPDATE文



ページフッター リンクや広告、質問送信など

三流解説を読んでいただき、どうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。

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

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

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

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

ニガテな環境設定系など
[Win2003 Server に IIS を Setup]・・・ポイントの無い、ほぼ一本道解説だけど。
[IIS 仮想ディレクトの作成とASP動作TEST]・・・Web拡張でASPを有効にしただけです。

Blog:[三流君の作業日記]/ [サンプルコードのゴミ箱]/ 広告-[通販人気商品の足跡]

質問や要望など メッセージを送る(三流君に連絡する)

質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。

あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



(感想や質問・要望 メッセージはHPで記事に載せることがあります。)


急ぎで連絡がほしい、そんな時は:[三流君連絡先アドレス]を見て連絡してください。



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