มีหลายคนที่ฝากคำถามไว้ที่เว็บบอร์ดนะครับ
อยากทราบวิธีการแสดงผลข้อมูล ที่มีจำนวนมาก แต่ถูกแบ่งออกเป็นหน้าละ
20 (หรือ จำนวน เท่าใดก็ตามใจ) อย่างที่เห็นกัน ชัดเจน ก็อย่างพวก
Search Engine ผมก็ไม่รู้จะเอาข้อมูลอะไรมาเป็นตัวอย่างดี มองไปมองมา
ก็นี่แหละ เว็บบอร์ด เรา ลองมาดูกันนะครับ ว่า ผมจะแบ่งข้อมูลที่
แสดงบนเว็บบอร์ด ออกเป็นหน้า ละ 20 Record ได้อย่างไร |
เข้าใจระบบแสดงผลของเว็บบอร์ด
เว็บบอร์ดของผมก็เหมือนทั่วไปนะครับ
วิธีการแสดงข้อมูล ก็จะ run ออกมาทั้งหมดตามคำสั่ง
ดังนี้ |
<%
' ---- ส่วนติดต่อกับฐานข้อมูลเพื่อแสดงรายการคำถาม
On error
resume next
Set Conn=Server.CreateObject("ADODB.Connection")
conn.open "DRIVER={Microsoft Access
Driver (*.mdb)};DBQ="&Server.mappath("webboard.mdb")
Sql="Select * from question order
by QNumber desc"
Set RS =Server.CreateObject("ADODB.Recordset")
RS.open Sql,Conn,1,3
RS.MoveFirst
Do While Not RS.EOF%>
<!--
แสดงข้อมูลทีละ Record -->
<%RS.MoveNext
Loop
rs.close
conn.close %> |
|
|
สังเกตได้ว่า
ในกรณีนี้ ข้อมูลมีทั้งหมดเท่าไหร่ก็ ออกมาหมด ครับ
ไม่มีเงื่อนไขอะไร ดังนั้นถ้าเราต้องการ ให้ ข้อมูล
แสดงออกมา แค่ 20 Record เราจะต้องบังคับ ให้
Loop ทำงานเพียง แค่ 20 รอบเท่านั้น |
|
|
กำหนดตัวแปร
และจำกัดการทำงาน
ผมขออนุญาต
ชี้แจงเกี่ยวกับตัวแปรที่จะเกิดขึ้นใหม่ก่อนที่
จะลงมือสร้างกันจริงๆ นะครับ อาจจะไม่ต้องเข้าใจหมดก็ได้
ใช้เป็นเหมือนกัน หัวข้ออ้างอิงครับ ลืมเมื่อไหร่ก็ดู
ตรงนี้ว่า ตัวแปร ชื่อนี้ มี คุณสมบัติอะไร :-)
1.
Total
จำนวน Record ทั้งหมดที่มี จะมีค่าเท่ากับ
Rs.RecordCount |
2.
PageSize จำนวน
Record ที่เราจะกำหนดให้มีภายใน 1 หน้า
เช่นเราต้องการให้แสดงหน้าละ 20 PageSize
ก็จะมีค่า เท่ากับ 20 |
3.
TotalPage มีค่าเท่ากับ
จำนวนหน้าทั้งหมดที่เรามี อย่างเช่น เรามั
Record ทั้งหมด 100 Record กำหนดแสดงออกหน้าละ
20 Record จำนวนหน้าก็จะเท่ากับ 5 หน้า
(มาจาก Total/PageSize
= TotalPage) |
***
แต่การหาค่า TotalPage อาจจะยุ่งยากสักหน่อยนะครับ
อย่างเช่น 101 Record หน้าละ 20 TotalPage
ควรจะมีค่าเท่ากับ 6 ซึ่ง ผมจะทำดังนี้ครับ
totalpage=total\pagesize
if (total mod pagesize) <> "0"
then '
ถ้าหารแล้วเหลือเศษให้บวกอีกหนึ่ง
totalpage= totalpage+1
end if |
|
4.PageNo
คือหมายเลขหน้าครับ
อย่างเช่นถ้าเราอยู่หน้าแรก PageNo จะเท่ากับ
1 |
5.EndRecord
คือ
ตำแหน่ง Record ที่สิ้นสุดครับ วิธีการหามีดังนี้ครับ |
If
trim(PageNo) <> trim(TotalPage)
Then
'ปกติถ้าไม่ใช้หน้าสุดท้ายที่เป็นเศษ
จุดสิ้นสุดจะเท่ากับจำนวน Record
ที่แสดงในแต่ละหน้า
EndRecord
= PageSize
Else
'กรณีที่เป็นหน้าสุดท้าย
จุดสิ้นสุดจะเท่ากับเศษ
EndRecord=(Total Mod PageSize)
End If |
|
หากผู้อ่านไม่ค่อยใจก็
ไม่ต้องตกใจนะครับ ลองดูจาก Source Code ดูแล้ว
ค่อยๆ ทำความเข้าใจไปนะครับ ไม่ยากหรอก |
|
|
แก้ไขไฟล์
webboard ให้แสดงเป็นหน้า
ผมอยากให้สังเกตที่ตอนต้นของไฟล์
จะมีการ ตรวจสอบตัวแปร PageNo ก่อนนะครับ ว่า ตอนนี้ อยู่หน้าที่เท่าไหร่
ส่วนตอนกลาง จะเป็นส่วนแสดงผลของ ข้อมูล ซึ่งเดิม ผมจะให้
Loop และ Do While แต่ในตอนนี้ จะแก้เป็น For เพื่อให้มันวนการทำงานเพียง
20 รอบเท่านั้น คำสั่ง Rs.Move จะเป็นคำสั่งที่ให้ไปยัง
Record ที่กำหนด เช่น Rs.Move 5 ก็จะไปยัง Record ที่
5 ครับ
ในตอนท้ายของไฟล์ยังมี คำสั่ง
For อีกอันหนึ่ง เพื่อให้วนแสดง หมายเลขหน้าทั้งหมดที่มี
อยากให้สังเกตตรง Link ไปยังหน้า แต่ละหน้านะครับ จะมีตัวแปร
no เพื่อส่งค่าหมายเลขเพจ ให้ ไฟล์นี้ทำการตรวจสอบอีกครั้งครับ
ว่า จะให้ไปที่หน้าไหน |
ไฟล์
เว็บบอร์ดที่ถูกแก้ไข |
<!--ตอนบนของเพจจะตรวจสอบหมายเลขหน้า-->
<%if request("no") =""
then
pageno =1
else
pageno=request("no")
end if%>
<!--จบการตรวจสอบหมายเลขหน้า-->
<!--ติดต่อฐานข้อมูล นำ Record
ออกมาแสดง-->
<%On error resume next
Set Conn=Server.CreateObject("ADODB.Connection")
conn.open "DRIVER={Microsoft Access
Driver (*.mdb)};DBQ="&Server.mappath("webboard.mdb")
Sql="Select * from question order
by QNumber desc"
Set RS =Server.CreateObject("ADODB.Recordset")
RS.open Sql,Conn,1,3
total=RS.Recordcount
pagesize=20
totalpage=total\pagesize
if (total mod pagesize) <> "0" then
totalpage= totalpage+1
end if
RS.Move pagesize*(pageno-1)
if trim(pageno) <> trim(totalpage)
then endrecord = pagesize
else endrecord=(total mod pagesize)
end if
a=1
For
a=1 to endrecord%>
<!--จบการติดต่อฐานข้อมูล
และประกาศตัวแปร-->
แสดงข้อมูลออดมา ทีละ Record
<!--วนการทำงาน-->
<%RS.MoveNext
Next
rs.close
conn.close%>
<!--จบการวนการทำงาน-->
<!--แสดงหมายเลขหน้าให้คลิก-->
<%For b=1 to totalpage%>
<a href="index.asp?no=<%=b%>"><%=b%></a>|
<%Next%>
<!--จบการแสดงหมายเลขหน้าให้
Click-->
|
|
|
|
ตัวอย่างข้างบนนี้เป็นเพียง
Concept ครับ ผู้อ่านอยากเห็นการใช้งานจริง ให้ดูได้ที่เว็บบอร์ด
ASP ของ ผมครับ หรือ ถ้าอยากเอา Source Code
ไปศึกษากรุณา
Click ที่นี่ครับ จะเป็น webboard version ใหม่ที่แบ่งหน้าครับ
|
|
|