[三流君] −−>
[ASPで遊ぶ、失敗する] −−>
[バックナンバー一覧]
−−> No.082 ページ単位の表示にチャレンジしてみた
ページ単位の表示にチャレンジしてみた
本文(発行内容)
<ページ単位の表示にチャレンジしてみた>
こんにちは、三流プログラマーの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
など、データが無いページを指定することができます。
う〜ん、チャントレコード数数えないとね。
-【けんぞう!】---------------------------------------------------------
ASPが利用可能なレンタルサーバーをお探しのアナタ、
http://www.ken3.org/asp/server.html ← けんぞうも使っているサーバーの紹介
『おっIISでbasp21でメール送信、mdbも使えるよ』(三流PG:31歳)
------------------------------------------------------------------------
/*
* 5.終わりの挨拶 </HTML>
*/
今回は、
ページ送りの処理に挑戦してみました。
いろいろと問題点を残しつつ。
次回以降の先送りが多くって。
あっ、先送りといえば、
前回のCVSへのアクセス処理、接続はOKで行のDELETE処理・・・
^^^^^^^^^^^^^^^^^^^^^^^^^^^
>QA ASP - No.80
>返信は、noreturn
>二宮金次郎さん <xxxx@xxx.xxx> から
>残念、途中で終わってしまった。csvファイルのデータ削除方法を、待っています。
>丁度、業務で、このことが必要になりましたので、よろしくお願いいたします。
なんて、書き込みいただいて、チャレンジしてみたけど、
.Deleteでエラーが発生するんですよね。
やはり、テキストドライバで途中の行を削除はムリなのかなぁ。
※DBじゃないので、追加以外はできなくて、
削除や更新は、全体の再保存って処理を別に作成しないといけないのか・・
ハヤメに探らないと。
いつも、積み残しが多いメルマガですが、
何かの参考となれば幸いです。
ASP、VBScript勉強中の三流プログラマーのKen3でした。
フィードバック
ASP系の→[掲示板]←を覗く、質問を書き込む
評価・感想
三流君の主なリンク先
[アクセスランキング]
[サイトマップ]
[リンク先・相互リンク先など]
Ken3の日記(weblog) --
[広告・副収入系]
[プログラマー業務の愚痴]
[VBA系の話題]
[ASP系の話題]
[コンビニ系ネタ]
[その他]
その他 宣伝広告