09/10/2018, 17:37
[Q] Làm sao phân trang Dữ liệu trong ASP nhỉ?
Làm sao phân trang Dữ liệu trong ASP nhỉ?
Mình thấy có những trang ASP thể hiện việc Recordset ra thành nhiều trang. Và cho phép xem qua nhiều link 1,2,3,....
Bạn nào biết chỉ mình nhé.
Xin cám ơn trước
Mình thấy có những trang ASP thể hiện việc Recordset ra thành nhiều trang. Và cho phép xem qua nhiều link 1,2,3,....
Bạn nào biết chỉ mình nhé.
Xin cám ơn trước
Bài liên quan
http://207.150.221.94/ws-ihatelov/vbasp/vbasp.asp?id=6
<--- hướng dẫn đầy đủ nha.
<%
pageno = request.form("page")'-----Trang cần xem là trang mấy
set rstemp=oConn.execute("SELECT count(*) FROM tbl ")
Rowsview = 15 '---------Mỗi trang 15 record
Rowtotal= rstemp(0) '--------Tong so record trong tbl
pagetota= rowtotal\Rowsview '------Tinh tong so trang, moi trang 15 record
IF (rowtotal Mod Rowsview) > 0 THEN
pagetota = pagetota + 1
'------nếu xem trang cuối thì số record là phần thừa của rowtotal/15
IF pageno = pagetota THEN Rowsview = (rowtotal Mod Rowsview)
END IF
'------Chon ra 15 record cho trang muon xem
mySQL = "SELECT TOP " & Rowsview & " ID, field1, field2 FROM tbl "
MySQL = MySQL & "WHERE ID IN (SELECT TOP " & (pageno * rowsview) ID FROM tbl ORDER BY ID ASC))"
MySQL = MySQL & "ORDER BY ID DESC "
set rstemp=oConn.execute(mySQL)
%>
Tuy có vẻ dài dòng nhưng nó chạy nhanh gấp nhiều lần so với dùng Recordset để đếm trang. Nhất là trường hợp data lớn (vài nghìn dòng trở lên)
Kết quả lệnh SQL đó ta được đúng 15 record cần xem.
và việc áp dụng giải thuật trên cho RecordSet vẫn được phải không bạn?
-------
Hơn nữa các record lấy ra lại theo thứ tự ngược với thứ tự lưu trữ --> thứ tự này nhiều khi khá quan trọng như thứ tự post trong diễn đàn này chẳng hạn.
:p Dù sao thì nhờ bạn mà mình cũng rút ngắn được một số câu lệnh trong chương trình của mình.
set oRs=Server.CreateObject("ADODB.Recordset")
oRs.PageSize = 15
.... top:
oRs.AbsolutePage = 1
.... moving:
oRs.AbsolutePage = PageNo
....end:
oRs.AbsolutePage = oRs.PageCount
(AbsolutePage: chỉ đinh trang hiện thời ; PageCount: tổng số trang)
Sau đó:
howmanyrecs=0
DO UNTIL rstemp.eof OR howmanyrecs>=cint(oRs.pagesize)
----- cho in ra các dòng -----
rstemp.movenext
howmanyrecs=howmanyrecs+1
LOOP
---------------------------------
To White-Rose:
Nếu bảng không có 1 cột (hoặc tổ hợp của nhiều cột) để làm Index thì không xài câu lệnh SQL đó được. Nhưng vấn đề không ổn là table đó đã được thiết kế vi phạm quy tắc rất quan trọng của việc lập database. Phải tồn tại 1 cột (hoặc tổ hợp nhiều cột) mà giá trị các record là duy nhất thì sau này mới có thể truy xuất chính xác record mà ta cần được.
Còn chuyện thứ tự lấy ra bị ngược với thứ tự lưu trữ thì dùng GetRows để đổ ra mảng và từ đó duyệt ngược từ dưới lên. Chắc là cách này không xa lạ với bạn. Phải không? Vả lại ta dùng Connection Object để thực hiện query là để tránh dùng Recordset Object mà. Như vậy đâu có ngại vấn đề duyệt ngược từ dưới lên.
<%
myarray=rstemp.GetRows
'đóng ngay database lại để cho nhẹ máy
rstemp.close
set rstemp=nothing
numcols=ubound(alldata,1)
maxcounter=ubound(alldata,2)
FOR counter= maxcounter TO 0 STEP -1
'------chỉ số của mảng bắt đầu từ 0 (base 0)
response.write myarray(1,counter) '------cột thứ 2 dòng m
response.write myarray(2,counter) '------cột thứ 3 dòng m
... ... ...
NEXT
%>