PDA

View Full Version : [Q] Làm sao phân trang Dữ liệu trong ASP nhỉ?



Allbegins
25-10-2002, 01:40
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

footprint
25-10-2002, 03:59
Coi thử =>tại đây (http://ttvn.vnforge.com/showthread.php?s=&threadid=1905)<= coi có giúp được bạn không.

White_Rose
25-10-2002, 04:24
Vô http://goin.to/vbasp tìm và có kết quả là

http://207.150.221.94/ws-ihatelov/vbasp/vbasp.asp?id=6

<--- hướng dẫn đầy đủ nha.

footprint
25-10-2002, 04:28
way cool!

DTB
26-10-2002, 03:10
Nếu thích dùng SQL thì :


<%
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.

Allbegins
26-10-2002, 10:38
Cám ơn nhé,

và việc áp dụng giải thuật trên cho RecordSet vẫn được phải không bạn?

-------

White_Rose
26-10-2002, 13:36
To DTB: Cách này hay thật đấy, nhưng nó phải sử dụng đến ID để làm key. Nếu sử dụng với một bảng không có primary key thì có vẻ không ổ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.

DTB
29-10-2002, 00:25
Nếu dùng Recordset Object thì không cần tính tóan gì cả. Chỉ đơn giàn là khai báo một trang bao nhiêu record rồi muốn xem trang mấy thì nhảy đến đó:
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
%>

White_Rose
29-10-2002, 02:43
:P đúng là table nào cũng có 1 tập các field làm Index thật. Tại mình cũng học ASP & SQL chưa lâu nên chưa hề thử dùng IN với một tập các field cả. Mình vẫn nghĩ nó chỉ sử dụng với 1 field duy nhất.:)

DTB
30-10-2002, 02:13
Đúng là trong IN thì kết quả của SELECT lồng trong nó chỉ có 1 field thôi. Nhưng ta có nối (cộng, tổ hợp) nhiều fiel lại thành 1. Hoặc là dùng query (Access Database) hoặc Stored Procedure (SQL-Server) để tính toán cho thuận tiện.