03. oktober 2005 - 13:17Der er
30 kommentarer og 1 løsning
Paging med ASP
Kan det lade sig gøre at bygge paging på dette, hvor der i forvejen er do while og loop?
<% if not rs.eof then %> <table border="0" width="175" cellpadding="2" style="margin-left: -10"> <tr> <% AntalKolonner = 4 ' Juster denne hvis der skal være et andet antal kolonner counter = 0 do while not rs.eof %> <td width="<%=Int(100/AntalKolonner)%>%" style="padding:5 12px"> <div align="center">
counter = counter + 1 if counter mod AntalKolonner = 0 then response.Write " </tr>" & vbCrLf if not rs.eof then response.Write " <tr>" & vbCrLf end if end if loop rs.close set rs = nothing
' udfyld resten af cellerne i den aktuelle række do while counter mod AntalKolonner <> 0 response.Write "<td> </td>" counter = counter + 1 loop %> </tr>
Jeg kan godt få paging scriptet til at virke, men visningen tilter fuldstændig når jeg prøver at sætte det andet ind, dels tror jeg det er ObjRs og 2 gange do while der driller. Kan ikke overskue det :(
<html><head> <title>Paging af et recordset</title> </head><body>
<% intPage = Request("page") If isNumeric(intPage) = False Or intPage < 1 Then intPage = 1 End If
Set rs = Server.CreateObject("ADODB.RecordSet") strSQL = "SELECT LinkURL FROM Links" strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("/aspdigital/db/demo.mdb") rs.Open strSQL, strDSN, 1 If Not (rs.BOF Or rs.EOF) Then rs.PageSize = 10 rs.AbsolutePage = intPage intRecCount = rs.PageSize intPageCount = rs.PageCount Response.Write "<p><b>Side " & intPage & " af " & intPageCount & "</b></p>" %> <table border="0" width="175" cellpadding="2" style="margin-left: -10"> <tr>
<% AntalKolonner = 4 ' Juster denne hvis der skal være et andet antal kolonner counter = 0 Do While Not rs.EOF And intRecCount > 0 %> <td width="<%=Int(100/AntalKolonner)%>%" style="padding:5 12px"> <div align="center">
intRecCount = intRecCount - 1 rs.MoveNext counter = counter + 1 if counter mod AntalKolonner = 0 then response.Write " </tr>" & vbCrLf if not rs.eof then response.Write " <tr>" & vbCrLf end if end if Loop %> </tr> </table> <%
End If rs.Close Set rs = Nothing
Response.Write "<p>Gå til side " For intNum = 1 To intPageCount Response.Write "<a href=paging.asp?page=" & intNum & ">" & intNum & "</a> " Next
Response.Write "<p>" If Clng(intPage) > 1 Then Response.Write "<a href=paging.asp?page=" & intPage - 1 & "><<</a>" Else Response.Write "<<" End If
Response.Write " "
If Clng(intPage) < Clng(intPageCount) Then Response.Write "<a href=paging.asp?page=" & intPage + 1 & ">>></a> " Else Response.Write ">>" End If %>
Så er det noget i denne stil (ikke testet). Husk at rette SQL'en:
<% pageSize = 10 currentPage = 0 if isnumeric(Request.querystring("Page")&"") then currentPage = cInt(Request.querystring("Page")) set rs = conn.execute("select * from DinTabel where xxx order by xxx LIMIT "& currentPage &","& pageSize &"") if not rs.eof then %> <table border="0" width="175" cellpadding="2" style="margin-left: -10"> <tr> <% AntalKolonner = 4 ' Juster denne hvis der skal være et andet antal kolonner counter = 0 do while not rs.eof %> <td width="<%=Int(100/AntalKolonner)%>%" style="padding:5 12px"> <div align="center">
counter = counter + 1 if counter mod AntalKolonner = 0 then response.Write " </tr>" & vbCrLf if not rs.eof then response.Write " <tr>" & vbCrLf end if end if loop rs.close set rs = nothing
' udfyld resten af cellerne i den aktuelle række do while counter mod AntalKolonner <> 0 response.Write "<td> </td>" counter = counter + 1 loop %> </tr> </table> <a href="dinSide.asp?Page=<%= currentPage-pageSize %>">prev</a> <a href="dinSide.asp?Page=<%= currentPage+pageSize %>">next</a> <% Set conn = Nothing end if %>
På den første side må der ikke kunne navigeres tilbage og det samme gælder jo ved den sidste side, hvis der ikke er flere poster i databasen, må der ikke kunne navigeres frem. Kan det laves?
<% if currentPage > 0 then %> <a href="dinSide.asp?Page=<%= currentPage-pageSize %>">prev</a> <% end if set rs = conn.execute("select count(*) from DinTabel where xxx") if not rs.eof then if isnumeric(rs(0)&"") then if rs(0) > currentPage+pageSize then %> <a href="dinSide.asp?Page=<%= currentPage+pageSize %>">next</a> <% end if end if end if %>
Hm, jeg kan ikke helt se hvordan, glemte også at nævne at navigering frem naturligvis først må vises når eks. 12 poster er vist på siden. ellers navigeres der ud i ingenting.
currentPage springer i samme interval som der er elementer på siden. I dette tilfælde åbentbart 12 ("pageSize = 12")
hvis currentPage > 0 er du på en side som ikke er den første side, også skal der være en tilbage knap: <% if currentPage > 0 then %> <a href="dinSide.asp?Page=<%= currentPage-pageSize %>">prev</a> <% end if %>
Hvis currentPage + pageSize er mindre end det totale antal i database (kræver selvfølgelig den samme WHERE betingelse som "hoved selecten"), er der flere elementer end der vises, og der skal være en next:
<%'Tæl antal records set rs = conn.execute("select count(*) from DinTabel where xxx") if not rs.eof then if isnumeric(rs(0)&"") then if rs(0) > currentPage+pageSize then %> <a href="dinSide.asp?Page=<%= currentPage+pageSize %>">next</a> <% end if end if end if %>
**DENNE** set rs = conn.execute("select * from DinTabel where xxx order by xxx LIMIT "& currentPage &","& pageSize &"") if not rs.eof then %> <table border="0" width="175" cellpadding="2" style="margin-left: -10"> <tr> <%
Den skal bare ikke have ORDER og LIMIT med også skal det være en count(*). De to du select du skal bruge er altså:
set rs = conn.execute("select * from DinTabel where xxx order by xxx LIMIT "& currentPage &","& pageSize &"") set rs = conn.execute("select count(*) from DinTabel where xxx")
Din WHERE generere du højestsansynlig dynamisk, så du kan trække de enkelte mærker ud, og du skal have samme dynamik ned i den sidste også, så WHERE er den samme på begge select.
<% pageSize = 12 currentPage = 0 if isnumeric(Request.querystring("Page")&"") then currentPage = cInt(Request.querystring("Page")) set rs = conn.execute("select * from DinTabel where xxx order by xxx LIMIT "& currentPage &","& pageSize &"") if not rs.eof then %> <table border="0" width="175" cellpadding="2" style="margin-left: -10"> <tr> <% AntalKolonner = 4 ' Juster denne hvis der skal være et andet antal kolonner counter = 0 do while not rs.eof %> <td width="<%=Int(100/AntalKolonner)%>%" style="padding:5 12px"> <div align="center">
counter = counter + 1 if counter mod AntalKolonner = 0 then response.Write " </tr>" & vbCrLf if not rs.eof then response.Write " <tr>" & vbCrLf end if end if loop rs.close set rs = nothing
' udfyld resten af cellerne i den aktuelle række do while counter mod AntalKolonner <> 0 response.Write "<td> </td>" counter = counter + 1 loop %> </tr> </table> <a href="dinSide.asp?Page=<%= currentPage-pageSize %>">prev</a> <a href="dinSide.asp?Page=<%= currentPage+pageSize %>">next</a> <% Set conn = Nothing end if %>
Dette set rs = conn.execute("select * from DinTabel where xxx order by xxx LIMIT "& currentPage &","& pageSize &"")
skal ændres til: set rs = conn.execute("select * from DinTabel LIMIT "& currentPage &","& pageSize &"")
og dette: <a href="dinSide.asp?Page=<%= currentPage-pageSize %>">prev</a> <a href="dinSide.asp?Page=<%= currentPage+pageSize %>">next</a>
skal ændres til: <% if currentPage > 0 then %> <a href="dinSide.asp?Page=<%= currentPage-pageSize %>">prev</a> <% end if set rs = conn.execute("select count(*) from DinTabel") if not rs.eof then if isnumeric(rs(0)&"") then if rs(0) > currentPage+pageSize then %> <a href="dinSide.asp?Page=<%= currentPage+pageSize %>">next</a> <% end if end if end if %>
Husk at rette "DinTabel" til navnet på den tabel du skal selecte fra i databasen.
Det er hermed forsøgt, får denne fejl i linien: set rs = conn.execute("select * from DinTabel LIMIT "& currentPage &","& pageSize &"")
[MySQL][ODBC 3.51 Driver][mysqld-4.0.17-nt]You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
[MySQL][ODBC 3.51 Driver][mysqld-4.0.17-nt]You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '´data´ LIMIT ,' at line 1
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.