<ページ単位の表示にチャレンジしてみた>
こんにちは、三流プログラマーのKen3です。 今回は、 データが100件あって、20行単位で画面にデータを表示したい、 そんなよく見かけるページ処理に挑戦してみたいと思います。/* * 1.今回のキッカケ */
掲示板で下記の質問をもらいました ------ 質問2:検索キーワードから表示したデータの改ページ処理機能 (検索結果が30件あったら、とりあえず20件まで 表示させ”次ページ”ボタン等で残り結果を表示させる ように・・・) ------ と、 ページ単位の表示について、質問をもらいました。/* * 2.単純に考えて、ページ番号をもらい空送りする */
う〜ん、どうしましょう。 いつもは、 DBと接続して、 strDB = "../test/cnt_etc.mdb" db.ConnectionString = Server.MapPath(strDB) db.open で、無事DBと接続したら、 下記のように、レコードセットをSQL文作って作成したなぁ。 'ORDER BY WriteTime DESC で書き込み時刻の降順にする Set rs = db.Execute("Select * From log ORDER BY WriteTime DESC") あとは、ループで、 'EOFまでループ or データ20件まで nCNT = 1 Do While rs.EOF = False And nCNT <= 20 '.EOFがFalseで20以下の間 なんて、やってたなぁ。 こいつを1ページ20単位で切り替えるのかぁ。 単純にページ番号をもらったら、空送りしてみますか。 test082-1.asp?page=5 とか、ページ番号をもらって、 5ページ目からスタートだから、 20*(page-1)分、80空読みして、 81からスタートすればOKかなぁ。 で、前後のページへの移動ボタンをつけるのかぁ。 test082-1.asp?page=5 だったら、 test082-1.asp?page=4 と test082-1.asp?page=6 へのリンクを作成するのかな。 何にも考えないで、そんな処理を作成してみます。 http://www.ken3.org/cgi-bin/test/test082-1.asp?page=5 や http://www.ken3.org/cgi-bin/test/test082-1.asp?page=21 と、指定ページに飛べるので、 テストして遊んでみてください。 下記が何も考えないで、空読みした処理のソースデータです。 <%@LANGUAGE=VBScript%> <% '頭でページのパラメータをチェックする nPAGE = Cint("0" & Request.QueryString("page")) If nPAGE = 0 Then 'パラメータ無しなら強引に1ページにする nPAGE = 1 End IF %> <html> <head> <title>20行単位でページ送りするテストプログラム</title> </head> <body> <h1>20行単位でページ送りするテストプログラム</h1> test082-1.asp?page=99とページ番号を受け取り、該当ページを表示する<br> 単純にループで空読みしてみました(オイオイ手抜きか?)<br> 前ページ・次ページのリンクも作ってみました。 <hr> <% 'テストで開始時刻の表示 Response.Write "開始:" & Now() & "<hr><br>" 'リンクを表示する、先頭ページのチェックpage=1だけは行う Response.Write "<b>" & nPAGE & "ページ</b> 表示中 -- " If nPAGE <> 1 Then '1ページ以外かチェックする Response.Write "[<a Href='test082-1.asp?page=" & (nPAGE - 1) & "'>" Response.Write "前ページへ</a>]" Else Response.Write "[前ページへ]" '押せないリンクじゃないけど、そのまま文字表示 End IF '次ページは手抜きで+1を必ず表示する '(最終ページのチェックぐらいしろよコラ)すみません手抜きで・・・ Response.Write "[<a Href='test082-1.asp?page=" & (nPAGE + 1) & "'>" Response.Write "次ページへ</a>]" Response.Write "<br>" 'ADO DB Connection オブジェクトを作成 Set db=Server.CreateObject("ADODB.Connection") db.Provider = "Microsoft.Jet.OLEDB.4.0" '接続DBの位置を渡し、DBオープン strDB = "cnt_etc.mdb" db.ConnectionString = Server.MapPath(strDB) db.open 'データベースをオープンする 'お約束のレコードセットの作成 テーブル名logから全項目(*)を指定 'ORDER BY WriteTime DESC で書き込み時刻の降順にする Set rs = db.Execute("Select * From log ORDER BY WriteTime DESC") 'データの頭だし 芸無く空読みする nCNT = 1 'EOFまでループ or データが(nPAGE-1)*20まで空読み Do While rs.EOF = False And nCNT <= (nPAGE-1) * 20 '.EOFがFalseで件数以下 '次のレコードにポインタを移動する(何もしてないのに・・・(笑)) rs.MoveNext 'これを忘れると悲惨なことに、、、 'カウンタを増やす nCNT = nCNT + 1 Loop 'データの表示をテーブルで行う Response.Write "<TABLE Border='1'>" '見出しをバカっぽく、そのまま書き込む Response.Write "<TR>" Response.Write "<TH>NO.</TH>" Response.Write "<TH>日付</TH>" Response.Write "<TH>来てもらった場所</TH>" Response.Write "<TH>リンク元</TH>" Response.Write "</TR>" 'EOFまでループ or nPAGE*20 件まで Do While rs.EOF = False And nCNT <= (nPAGE*20) '.EOFがFalseで30以下の間 Response.Write "<TR>" '1行、1レコードの内容を表示する Response.Write "<TD>" & nCNT & "</TD>" 'カウンタ表示 Response.Write "<TD>" & rs.Fields.Item("WriteTime") & "</TD>" '時刻 '訪問場所の表示 Response.Write "<TD><A HREF='" & rs.Fields.Item("URL") & "'>" Response.Write rs.Fields.Item("URL") & "</A></TD>" 'リンク元の表示 Response.Write "<TD><A HREF='" & rs.Fields.Item("referrer") & "'>" If Left(rs.Fields.Item("referrer"), 15) = "http://www.ken3" Then Response.Write Mid(rs.Fields.Item("referrer"), 20, 30) & "</A>...</TD>" Else Response.Write Left(rs.Fields.Item("referrer"), 30) & "</A>...</TD>" End If Response.Write "</TR>" & Chr(13) & Chr(10) 'データ表示終了(行の終わり) '次のレコードにポインタを移動する rs.MoveNext 'これを忘れると悲惨なことに、、、 'カウンタを増やす nCNT = nCNT + 1 Loop Response.Write "</TABLE>" 'テーブルは終わりです '開いていたレコードセットを閉じる rs.Close 'データベースも閉じようよ db.Close 'お行儀よくオブジェクトも開放しましょう(通常は自動的に解放されるけど) Set db = Nothing 'テストで終了時刻の表示 Response.Write "<hr>終了:" & Now() & "<hr>" %> こんな感じで、20単位で1ページを単純に管理してみました。<br> えっ、手抜き処理が多いって?<br> </body> </html>/* * 3.意外と速かったけど・・・結果オーライの処理なんだよね */
http://www.ken3.org/cgi-bin/test/test082-1.asp?page=1 と http://www.ken3.org/cgi-bin/test/test082-1.asp?page=40 時間がかかるかなぁと思ったら、 1つのテーブルでOrderByぐらいしか使っていないSQLだったので、 1ページ目と40ページ目(20行*40ページで800の空読み)あまり時間差が無かった。 ネタ的には、もっと時間がかかってほしくて。 なんで? マシーン速度に頼ったプログラムなんですよね。 ※たまたま、借りてたレンタルサーバーの性能がよかったのと、 共有サーバーで、負荷がたまたまかかっていなかった、 一番は、SQLが単純なので、比べられなかった など、いろいろと要因はあるんだけど。 だから?何が言いたいのアンタは? いいじゃん、動いてるんだから? まず、1点目、 たぶん皆さんも疑問に思うのが、 [<a Href='test082-1.asp?page=39'>前ページへ</a>] [<a Href='test082-1.asp?page=41'>次ページへ</a>] と 自分自身を呼んでます。 いいじゃん、ページが変わって、頭出しをするんだから。自分を呼んだって。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ そこなんですよ、そこ。 頭から処理が走るので、 DBに再接続、レコードセットを再構築(SQLの再発行) してるんですよ。 これを、レコードセットを保持したまま、処理を継続できないかなぁ? そんなことを考えたり。 えっ、レコードセット、ずっと開きっぱなしなの? 複数人がレコードセット開きっぱなしで、 そっちのほうがサーバーに負荷かかるんじゃないの? でも、前ページ・次ページで何回も送っていくき、空読みするのもなぁ。/* * 4.問題点 */
最終ページのチェックが入っていないので、 http://www.ken3.org/cgi-bin/test/test082-1.asp?page=999 など、データが無いページを指定することができます。 う〜ん、チャントレコード数数えないとね。/* * 5.終わりの挨拶 </HTML> */
今回は、 ページ送りの処理に挑戦してみました。 いろいろと問題点を残しつつ。 次回以降の先送りが多くって。 あっ、先送りといえば、 前回のCVSへのアクセス処理、接続はOKで行のDELETE処理・・・ ^^^^^^^^^^^^^^^^^^^^^^^^^^^ >QA ASP - No.80 >返信は、noreturn >二宮金次郎さん <xxxx@xxx.xxx> から >残念、途中で終わってしまった。csvファイルのデータ削除方法を、待っています。 >丁度、業務で、このことが必要になりましたので、よろしくお願いいたします。 なんて、書き込みいただいて、チャレンジしてみたけど、 .Deleteでエラーが発生するんですよね。 やはり、テキストドライバで途中の行を削除はムリなのかなぁ。 ※DBじゃないので、追加以外はできなくて、 削除や更新は、全体の再保存って処理を別に作成しないといけないのか・・ ハヤメに探らないと。 いつも、積み残しが多いメルマガですが、 何かの参考となれば幸いです。 ASP、VBScript勉強中の三流プログラマーの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記事 バックナンバー目次]