<入力、結果表示を1つに、Subで関数分割> こんにちは、Ken3です。 前回まで、 世の中、外見、外見、男性も化粧する時代(オイオイ、ホントか?) で、いろいろと書いてました。(上の一行じゃ意味不明だけど) 今回は、 アンケート処理の入力、結果出力を1つにまとめてみたいと思います。 まとめると、良い面や悪い面あるので参考にして下さい。 あまり期待しないでね。 /* * 1.アンケート入力後、途中経過の表示 */ 通常やってる簡単なアンケートのページって、 だいたいのパターンが、 アンケートを入力すると、途中経過が表示されます。 利用しているユーザーは自分の感想と他人の意見が見れて、 親切なページですよね。 そんなページに少しでも近づけるために、 アンケートの入力とファイルへの書き込み、 結果の表示を1つにまとめてみます。 動作仕様は簡単に、 test016.aspがパラメータ無しで呼ばれたら、 <FORM>タグで入力する画面を表示 パラメータ有りの時、 パラメータをチェックして 0〜6の時は、データ書き込み後結果表示 99の時は、結果だけを表示 その他はパラメータエラーにする。 /* * 2.Subで関数分割 */ 元々分割されたプログラムとHTMLを1つにするので、 Subで分割して書きたいと思います。 メインの流れを考えると、 HTMLヘッダ処理 まずは、パラメータの判断かぁ IF バラメーター有り then パラメータの処理へ飛ばす ELSE フォームの入力処理を書く END IF /HTML -- パラメータの処理 IF 0から6か? THEN データを書きこむ 結果の表示 ELSE IF 99か? THEN 結果の表示 ELSE エラーの時はエラーメッセージを表示 END IF 何か長いけど、こんな感じで行くか。 おっと、その前にサブ関数って?だよね。 えっ、知ってる?なんだぁ、でも聞いた事無い人も居ると思うので。 Sub aaa() 処理 処理 End Sub Sub bbb() 処理B 処理B End Sub Call aaa() とやると、 Sub aaa()を呼んで(流れが移って)、 終了すると戻ってくる。 Sub ccc() Call bbb() Call aaa() End Sub と、関数から関数を呼んで、処理することも出来ます。 まぁ、慣れてください。 (えっ、逃げるなって?) /* * 3.こんな感じに長くまとまりました */ -- test016-1.asp -- <%@LANGUAGE=VBScript%> <html> <head> <title>入力、結果表示を1つのASPファイルにまとめた</title> </head> <body> <h2>入力、結果表示を1つのASPファイルにまとめた</h2> test016-1.asp<br> <hr> <% 'まずは、パラメータ有無の判断を行う If IsEmpty(Request.QueryString("a")) = False Then 'バラメーター有りの時 If Request.QueryString("a") = "99" Then Call test016_SUM() '結果表示の関数を呼ぶ Else Call test016_WRITE() '書き込みの関数を呼ぶ End If Else '↓フォームの入力処理を書く(普通のHTML) %> <FORM ACTION="test016-1.asp" METHOD="GET"> このメルマガの満足度は?選択後、送信ボタンを押してください。<br> <INPUT TYPE="RADIO" NAME="a" VALUE="6">6.大変満足、知人に教えます<br> <INPUT TYPE="RADIO" NAME="a" VALUE="5">5.満足<br> <INPUT TYPE="RADIO" NAME="a" VALUE="4">4.まぁまぁ<br> <INPUT TYPE="RADIO" NAME="a" VALUE="3">3.どちらとも言えない<br> <INPUT TYPE="RADIO" NAME="a" VALUE="2">2.少し不満<br> <INPUT TYPE="RADIO" NAME="a" VALUE="1">1.不満<br> <INPUT TYPE="RADIO" NAME="a" VALUE="0">0.かなり不満、解除します<br> <br> <INPUT TYPE="submit" VALUE="送 信"> <INPUT TYPE="reset" VALUE="入力クリア"> </FORM> <% End If %> <hr> </body> </html> <% 'ここから下にSUB関数をまとめてみました。 Sub test016_WRITE() '入力値を判断して書き込む 'アンケートの結果をまず判断する strMSG = "不正なパラメーターです" 'エラーメッセージを初期値として代入 if Request.QueryString("a") = "6" then strMSG = "大変満足" 'asp013追加 if Request.QueryString("a") = "5" then strMSG = "満足" if Request.QueryString("a") = "4" then strMSG = "まぁまぁ" if Request.QueryString("a") = "3" then strMSG = "どちらとも言えない" if Request.QueryString("a") = "2" then strMSG = "少し不満" if Request.QueryString("a") = "1" then strMSG = "不満" if Request.QueryString("a") = "0" then strMSG = "かなり不満" 'asp013追加 If strMSG = "不正なパラメーターです" Then 'エラーパラメータのままか?チェック Response.Write "データを正しく受け取れませんでした<br>" Else 'FileSystemObjectを生成します。 Set objFS = Server.CreateObject("Scripting.FileSystemObject") 'test016.txt を追加モードで開く Set ts = objFS.OpenTextFile(Server.MapPath("test016.txt"), 8, True) 'ファイルにアンケート結果のデータを書き込む ts.write Request.QueryString("a") & "," '結果0〜6を書く ts.write strMSG & "," 'ファイルに結果を書き込む ts.write Now '時刻を書く ts.write chr(13) & chr(10) '改行する '使ったファイルは閉じようよ ts.close Response.Write "あなたの回答は<b>" & strMSG & "</b>でした<BR>" Call test016_SUM() '結果表示を呼ぶ 016追加 End if End Sub Sub test016_SUM() '結果の表示関数 dim strRECORD 'レコード内容を一時保存 dim nCNT(10) 'カウンター 変数 10個もいらないけど dim nSUM '回答の合計数 nSUM = 0 '初期化する 'カウンター変数をループで初期化しておく For i = 0 to 10 nCNT(i) = 0 Next 'FileSystemObjectを生成します、、って英文、そのままジャン。 Set objFS = Server.CreateObject("Scripting.FileSystemObject") 'test016.txt 結果ファイルを読取専用モードで開く Set ts = objFS.OpenTextFile(Server.MapPath("test016.txt"), 1, True) Do While ts.AtEndOfStream = False 'ファイルの終端になってない間ループする strRECORD = ts.ReadLine 'ファイルからデータを一行を読む 'Left関数を使って左から1文字目をCintで数値変換 i = Cint(Left(strRECORD, 1)) '読みこんだレコードの1文字目を数値変換 'nCNT(i番目)をカウントアップ nCNT(i) = nCNT(i) + 1 '*2合計数は無条件にカウントアップ nSUM = nSUM + 1 Loop ts.close '使ったファイルは閉じようよ Response.Write "<hr><h3>アンケート集計結果</h3><hr>" Response.Write "アンケート回答数<b> " & nSUM & "</b>人です" '*4回答数表示 'Array関数を使用して、評価コメントを初期化 strBOX = Array("かなり不満", "不満", "少し不満", "どちらとも言えない", _ "まぁまぁ", "満足", "大変満足") '結果の表示を<TABLE>タグを使用して表示 Response.Write "<TABLE border=1>" 'border=1で境界線(ワクを表示) Response.Write "<TR><TD>評価</TD><TD>コメント</TD><TD>人数</TD>" Response.Write "<TD>%</TD></TR>" '*3 %の見出しを追加 'ループで回して評価の集計データを表示する For i = 6 To 0 Step -1 '6〜0のループを作る Response.Write "<TR><TD>" & i & "</TD>" Response.Write "<TD>" & strBOX(i) & "</TD>" Response.Write "<TD ALIGN=RIGHT>" & nCNT(i) & "</TD>" 'ALIGN=RIGHT追加 '%を計算して、表示する strMSG = FormatNumber((nCNT(i) / nSUM) * 100, 1) '計算と変換処理 Response.Write "<TD ALIGN=RIGHT>" & strMSG & "%</TD></TR>" Next Response.Write "</TABLE>" '忘れずにテーブルを終わりにする End Sub %> --- 長い(笑)、 なんか見るほうも疲れるし、これから解説する私も疲れそう。 なんて言って無いで、ポイントを簡単に書くと、 <% 'まずは、パラメータ有無の判断を行う If IsEmpty(Request.QueryString("a")) = False Then 'バラメーター有りの時 If Request.QueryString("a") = "99" Then Call test016_SUM() '結果表示の関数を呼ぶ Else Call test016_WRITE() '書き込みの関数を呼ぶ End If Else '↓フォームの入力処理を書く(普通のHTML) %> <FORM ACTION="test016-1.asp" METHOD="GET"> の部分ですが、 IsEmpty(Request.QueryString("a")) = False でaパラが入っているかチェックして、 さらに、それが=99か判断、99なら結果表示関数に処理を飛ばしてます。 99以外の時はパラメータの書き込み関数を呼んでます。 と 何かしらパラメータをもらった時は、上記の判断をします。 で、パラメータをもらわない呼び出しの時は、 フォームを表示します。 ここでのポイントは、なぜかACTIONで自分自身を呼んでるんですよね。 <FORM ACTION="test016-1.asp" METHOD="GET"> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ これは、回答を選択して、 <INPUT TYPE="submit" VALUE="送 信"> 送信を押すと、再度test016-1.aspが呼ばれた時は、 パラメータ?a=Xが付いているので、 2回目に来た時は上のIF文で書き込み関数の流れに行ってくれます。 RPGでアイテムを持って帰り、再度スタート地点に戻ると 違う道が開けるみたいで、面白いでしょ。 *チョット表現が違うけど フォームの出力が終わったら </FORM> <% End If %> と、End If でIF文を終わらせるのを忘れないで、 <hr> </body> </html> まぁ自然な流れで、HTMLが終了します。 自作関数は、下にまとめて書きました。 <% 'ここから下にSUB関数をまとめてみました。 Sub test016_WRITE() '入力値を判断して書き込む ほとんど、前の講座で作成したASPの頭にSubと付けただけかなぁ。 変わってるのは、test016_WRITEの中で、test016_SUMを呼んでるとこかなぁ。 これで、書き込み後、結果表示を行ってます。 /* * 4.テスト */ http://www.ken3.org/cgi-bin/test/test016-1.asp をそのまま呼ぶと、 何とか、入力画面が表示されたね。 適当に回答を選んで送信。 データが書き込まれて、結果も無事表示されました。 次は、URLからクリックのテストと http://www.ken3.org/cgi-bin/test/test016-1.asp?a=3 のURLにパラメータ付きをクリック。 データが書き込まれて、結果も無事表示されました。 ほっと一息ついて、 結果表示の99パラメータのテストは http://www.ken3.org/cgi-bin/test/test016-1.asp?a=99 これも、なんとか表示されました。 /* * 5.終わりの挨拶 */ 今回は、 ・入力、結果表示を1つにまとめる ・Subで関数を作成 でした。 う〜ん、 死語な例だと、 アッシー君、メッシー君が1人ってのも(まとめてみるのも) 一つの手だったけど、 まとめないで、別れている方が(別々に一人一人なほうが) 機能が1つでわかりやすかったかも。 まぁ、別々に居ても管理が大変な時もあるし、 どちらとも言えないか? *管理がうまい女性にコツを聞いてみるか、 メンテナンス方法もいろいろなテクがあったんだろうなぁ??? 三流君、アッシー君、メッシー君って?何? えっと、話すと長くなるので、 30代おっさんの先輩や お父さんに聞くときは、 「お父さんはお母さんのアッシー君だったってホント?」 と聞いてみな(嘘ですよ) そんな若い人、このメルマガ見てないと思いつつ、 今日も逃げるようにサヨナラかな。 読者層のアンケートやその他、 可変のアンケート処理をやらないとなぁ。 (でも、そろそろ、アンケート系も飽きてきたのも事実、 違うネタも考えないと、、、) 最強ページへの道のりは遠いなぁ〜。 またね(笑) 何か質問・感想があったら、気軽に、 メール、掲示板に書き込んでくださいね。 三流プログラマーのKen3でした。
ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、
感想や質問・要望・苦情など 三流君へメッセージを送る。
下記のフォームからメッセージを送ることができます。
[三流君(TOP ken3.org へ戻る)]
/ [ASPで遊ぶ、失敗する]
/ [ASP記事 バックナンバー目次]
まぁ、基本はデータの受け取りかなぁ。
・[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記事 バックナンバー目次]