แบ่งข้อมูล แสดงทีละหน้า
โดย: สุรัตน์ บัณฑิตลักษณะ
ที่มา: www.thaiasp.net
     มีหลายคนที่ฝากคำถามไว้ที่เว็บบอร์ดนะครับ อยากทราบวิธีการแสดงผลข้อมูล ที่มีจำนวนมาก แต่ถูกแบ่งออกเป็นหน้าละ 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 ใหม่ที่แบ่งหน้าครับ



Home | ASP Board | Coldfusion Board | Source Code | Lesson(beginner)
Lesson(Professional) l My Jobs | E-card |About Us


Copyright © 2000 www.ThaiASP.net All rights reserved.