Avatar billede kaptajnknas Nybegynder
03. oktober 2005 - 13:17 Der 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">

<p style="margin-bottom: 2">

        <center>
        <table border="1" width="20" height="20" bordercolorlight="#ffffcc" bordercolordark="#iiookk" cellpadding="0" cellspacing="0">
          <tr>
            <td width="100%" bgcolor="#000000">
              <p align="center">
              <%
              response.write  ("data")
              %>
              </td>
          </tr>
        </table>
        </center>
      </div>
    </td>
<%
    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
  rs.close
  set rs = nothing

  ' udfyld resten af cellerne i den aktuelle række
  do while counter mod AntalKolonner <> 0
    response.Write "<td>&nbsp;</td>"
    counter = counter + 1
  loop
%>
  </tr>

<%
Set conn = Nothing
end if
%>
Avatar billede fennec Nybegynder
03. oktober 2005 - 13:25 #1
Det skulle nok kunne lade sig gøre, men det er nemmere at bygge dit script ind i et paging script. Du kan finde et script her:
http://activedeveloper.dk/artikler/default.asp?articleid=31

Start med at få det til at virke, og koncentrer dig som om visning bagefter.
Avatar billede kaptajnknas Nybegynder
03. oktober 2005 - 13:45 #2
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 :(
Avatar billede fennec Nybegynder
03. oktober 2005 - 13:56 #3
Jeg vil gætte på noget i denne stil:

<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">

<p style="margin-bottom: 2">

        <center>
        <table border="1" width="20" height="20" bordercolorlight="#ffffcc" bordercolordark="#iiookk" cellpadding="0" cellspacing="0">
          <tr>
            <td width="100%" bgcolor="#000000">
              <p align="center">
              <%
              response.write  ("data")
              %>
              </td>
          </tr>
        </table>
        </center>
      </div>
    </td>
<% 
 
  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 & ">&lt;&lt;</a>"
Else
  Response.Write "&lt;&lt;"
End If

Response.Write "&nbsp;"

If Clng(intPage) < Clng(intPageCount) Then
  Response.Write "<a href=paging.asp?page=" & intPage + 1 & ">&gt;&gt;</a> "
Else
  Response.Write "&gt;&gt;"
End If
%>
Avatar billede kaptajnknas Nybegynder
03. oktober 2005 - 14:04 #4
Tja, nu skulle MySql sættet ind i stedet for Accees
Avatar billede kaptajnknas Nybegynder
03. oktober 2005 - 14:13 #5
MySql kører også, så det er fint.
Men jeg blev nød til at fjerne "  'rs.AbsolutePage = intPage  "
Det udløste en objektfejl??
Avatar billede kaptajnknas Nybegynder
03. oktober 2005 - 14:16 #6
Jeg var lidt for hurtig, det virker ikke når 'rs.AbsolutePage = intPage ikke er tilstede, men linien giver fejlen:

Den ønskede handling understøttes ikke af objektet
Avatar billede fennec Nybegynder
03. oktober 2005 - 14:16 #7
Hvis du bruger MySQL kan du ikke bruge dette script da MySQL ikke under støtter "paging" funktionerne.

Der skal du til at selecte med LIMIL x,x i stedet. F.eks sådan:
"select * from enTabel limit 20,10" <-- Viser viser post 20-29

Jeg har ikke lige et script liggende til MySQL, så der går lige et par minutter inden jeg har lavet et :o)
Avatar billede kaptajnknas Nybegynder
03. oktober 2005 - 14:22 #8
Super :O)
Avatar billede fennec Nybegynder
03. oktober 2005 - 14:28 #9
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">

<p style="margin-bottom: 2">

        <center>
        <table border="1" width="20" height="20" bordercolorlight="#ffffcc" bordercolordark="#iiookk" cellpadding="0" cellspacing="0">
          <tr>
            <td width="100%" bgcolor="#000000">
              <p align="center">
              <%
              response.write  ("data")
              %>
              </td>
          </tr>
        </table>
        </center>
      </div>
    </td>
<%
    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
  rs.close
  set rs = nothing

  ' udfyld resten af cellerne i den aktuelle række
  do while counter mod AntalKolonner <> 0
    response.Write "<td>&nbsp;</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
%>
Avatar billede kaptajnknas Nybegynder
07. oktober 2005 - 10:01 #10
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?
Avatar billede fennec Nybegynder
07. oktober 2005 - 10:16 #11
Jeps. Det er noget i denne stil:

<% 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 %>
Avatar billede fennec Nybegynder
07. oktober 2005 - 10:20 #12
Læg mærke til at din WHERE skal være den samme, som den bruges i den "hoved" selecten.
Avatar billede kaptajnknas Nybegynder
07. oktober 2005 - 10:40 #13
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.
Avatar billede fennec Nybegynder
07. oktober 2005 - 10:56 #14
Det skulle den også gerne tage højde for.

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 %>
Avatar billede kaptajnknas Nybegynder
07. oktober 2005 - 10:58 #15
Så må det være min "set rs = conn.execute("select count(*) from DinTabel where xxx")" der er forkert.

Kan du sige præcis hvordan linien skal se ud?
Avatar billede kaptajnknas Nybegynder
07. oktober 2005 - 11:05 #16
jeg får et link på next der hedder:
dinSide.asp?Page=0

uanset hvor mange poster der er, starter den på første side
Avatar billede fennec Nybegynder
07. oktober 2005 - 11:18 #17
Den skal være magen til den du har tidligere:

**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.
Avatar billede kaptajnknas Nybegynder
07. oktober 2005 - 11:22 #18
Nu skal alle poster ud, så det må være noget med:

set rs = conn.execute("select count(*) from DinTabel")

men det virker ikke, som sagt får jeg et link på "next"
dinSide.asp?Page=0

uanset hvor mange poster der er, linkes til PAGE=0
Avatar billede fennec Nybegynder
07. oktober 2005 - 11:46 #19
Kan du ikke smide hele din kode herind som den se ud nu...
Avatar billede kaptajnknas Nybegynder
07. oktober 2005 - 11:49 #20
Jo, det er faktisk den her:


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

<p style="margin-bottom: 2">

        <center>
        <table border="1" width="20" height="20" bordercolorlight="#ffffcc" bordercolordark="#iiookk" cellpadding="0" cellspacing="0">
          <tr>
            <td width="100%" bgcolor="#000000">
              <p align="center">
              <%
              response.write  ("data")
              %>
              </td>
          </tr>
        </table>
        </center>
      </div>
    </td>
<%
    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
  rs.close
  set rs = nothing

  ' udfyld resten af cellerne i den aktuelle række
  do while counter mod AntalKolonner <> 0
    response.Write "<td>&nbsp;</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
%>
Avatar billede fennec Nybegynder
07. oktober 2005 - 11:53 #21
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.
Avatar billede kaptajnknas Nybegynder
07. oktober 2005 - 12:06 #22
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
Avatar billede fennec Nybegynder
07. oktober 2005 - 12:15 #23
Hvad er navnet på den tabel i databasen du vil hente fra??
Det er vel ikke "DinTabel". Udskift det med navnet på din tabel.
Avatar billede kaptajnknas Nybegynder
07. oktober 2005 - 12:37 #24
Det har jeg naturligvis gjort, den hedder data.
set rs = conn.execute("select * from data LIMIT "& currentPage &","& pageSize &"")
Avatar billede fennec Nybegynder
07. oktober 2005 - 12:47 #25
Prøv lige med:
set rs = conn.execute("select * from ´data´ LIMIT "& currentPage &","& pageSize &"")
Avatar billede kaptajnknas Nybegynder
07. oktober 2005 - 12:51 #26
Så får jeg denne fejl:

[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
Avatar billede fennec Nybegynder
07. oktober 2005 - 13:22 #27
Prøv lige at udskrive den til skærmen, og fortæl mig hvad den siger:

response.write "SQL: select * from ´data´ LIMIT "& currentPage &","& pageSize &""
response.end
set rs = conn.execute("select * from ´data´ LIMIT "& currentPage &","& pageSize &"")
Avatar billede kaptajnknas Nybegynder
07. oktober 2005 - 13:31 #28
Den skriver:

SQL: select * from ´data´ LIMIT ,
Avatar billede fennec Nybegynder
07. oktober 2005 - 13:39 #29
Det kunne se ud som om du ikke har dette med:

pageSize = 12
currentPage = 0
if isnumeric(Request.querystring("Page")&"") then currentPage = cInt(Request.querystring("Page"))

Da currentPage og pageSize ikke har en værdi.
Avatar billede kaptajnknas Nybegynder
07. oktober 2005 - 13:47 #30
Ja åbenbart, nu virker det
Avatar billede kaptajnknas Nybegynder
07. oktober 2005 - 13:49 #31
Perfekt :O)
Her er points
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester