 Källkoden för /anders.enges/asp/db2o3a.asp
 Källkoden för /anders.enges/asp/db2o3a.asp 
<!--#include file="../inc/navstuff.asp" -->
<!--  
        Denna rad inkuderar en fil som innehåller min strConn konstant
        Se kapitlet "Enkel Listning" för dess innehåll 
-->
<!--  #include file="../inc/connection.asp" -->
<!--
        Nedan kommer texterna som sätts på knapparna. Ändra INTE i själva knappen
        utan ändra här om du vill ha en annan text.
        Texternas betydelse:
          nav_RADANTAL - hur många rader som skall visas per sida
          nav_SQL - den SQL SELECT sats som ger resultattabellen som skall listas
-->
<%
  Const nav_RADANTAL = 3
  Const nav_SQL = "SELECT * FROM EXEMPELDATA ORDER BY aTEXT"
%>
<!--  
        Nedanstående kodblock skall du INTE ändra på. Fungerar med ALLA tabeller
        förutsatt att du ändrar på SELECT statsen ovan
-->
<!--  GENERELL KOD FÖR BLÄDDRING -->
<!--  Skulle gå att sätta i en skild fil som inkluderas vid behov -->
<%
' Först en "normal" öppnade av connection o recordset
Set nav_Conn = Server.CreateObject("ADODB.Connection")
nav_Conn.Open strConn
' Kan INTE använda en Exeute för att öppna tabellen
' eftersom vi måste kunna bläddra i tabellen
' vi använder istället följande konstruktion
Set nav_RS = Server.CreateObject("ADODB.RecordSet")
' Den första ettan (1) betyder att vi öppnar tabellen som en
' KeySet. I den kan vi bläddra. Den andra ettan betyder att 
' vi öppnar som ReadOnly...
nav_RS.Open nav_SQL, nav_Conn, 1, 1
' Några användbara värden
' En tabell kan hanteras i lite större block genom att
' säga att den har en PageSize (= rader per sida )
nav_RS.PageSize = nav_RADANTAL
' Vikan även kontrollera hur många sidor det blir med
' den PageSize vi gav
nav_MAX = nav_RS.PageCount
' Om det fanns ?PAGE=n på adressraden så antar vi att 
' vi vill gå till sidan n
if Not IsEmpty(Request("PAGE")) Then
        ' kan väl kontollera att det var en siffra
     	' just in case...
     	if IsNumeric(Request("PAGE")) Then
          		nav_PAGENO = CInt(Request("PAGE"))
     	Else
          		' i annat fall så får det bli sidan 1
          		nav_PAGENO = 1
     	End If
else
     	' första gången till sidan - ta fram rad ett
     	nav_PAGENO = 1
end if
' Vi kanske är intresserade av vilken rad som är först i listan
' detta kan räknas ut på följande sätt
nav_ROW = (nav_PAGENO - 1) * nav_RADANTAL + 1
' Stöder databasen bookmark (Access borde göra detta)
harBookmark= nav_RS.Supports(8192)
If harBookmark Then
        ' gå direkt till rätt sida
     	nav_RS.AbsolutePage = nav_PAGENO
Else
     	' Annars (klumpigare o långsammare)
     	nav_RS.MoveFirst
        nav_RS.Move nav_PAGENO - 1
End If
%>
<!--  GENERELL KOD FÖR BLÄDDRING TOG SLUT -->
<!--  
        Vi har tillgång till variablerna:
          nav_PAGENO - säger vilken sida vi är på
          nav_MAX - säger vilken sida som är den sista
          nav_RS - det recordset som ger tabellens innehåll
          nav_ROW - tabellrad för den första visade raden 
-->
<!--  
     	Idén är att om vi vet vilken sida vi är på kan vi alltid 
     	lista ut vilken som kommer nästa o tidigare. Man skulle
     	kunna använda bilder för länkarna om man orkar rita bilderna
-->
<table width="400" bgcolor="FFFF00" border="2"><tr>
<td width="100" align="center" bgcolor="FFFFCC">
<!--  vi vill inte visa länk till första om vi redan är där -->
<%  IF nav_PAGENO > 1 Then %>
<a href="<%  =Request.ServerVariables("URL")%>?PAGE=1">Första</a>
<%  Else %>
Första
<%  End If %>
</td>
<td width="100" align="center" bgcolor="FFFFCC">
<!--  vi vill inte visa länk till föregående om vi är på första -->
<%  IF nav_PAGENO > 1 Then %>
<a href="<%  =Request.ServerVariables("URL")%>?PAGE=<%  =nav_PAGENO - 1 %>">Föregående</a>
<%  Else %>
Föregående
<%  End If %>
</td>
<td width="100" align="center" bgcolor="FFFFCC">
<%  If nav_PAGENO <  nav_MAX Then %>
<a href="<%  =Request.ServerVariables("URL")%>?PAGE=<%  =nav_PAGENO + 1 %>">Nästa</a><br>
<%  Else %>
Nästa
<%  End If %>
</td>
<td width="100" align="center" bgcolor="FFFFCC">
<%  If nav_PAGENO <  nav_MAX Then %>
<a href="<%  =Request.ServerVariables("URL")%>?PAGE=<%  =nav_MAX %>">Sista</a><br>
<%  Else %>
Sista
<%  End If %>
</tr></table>
<!--  
        Följande rad sätter in nav_PAGENO och nav_MAX innan vi
        börjar listningen.
-->
Sidan <%  =nav_PAGENO %>  av <%  =nav_MAX %><br>
<!--  
        Eftersom vi vet at första sida är 1 och den sista sidan finns att få
     	från variabeln nav_MAX så är det enkelt att loopa fram en altavista 
     	liknande lista över sidor. Upprepas även efter tabellen
-->
<%  For sida = 1 To nav_MAX %>
     	<%  if sida = nav_PAGENO Then %>
          		<b>[ <%=sida%>  ]</b>
     	<%  Else %>
          		<a href="<%  =Request.ServerVariables("URL")%>?PAGE=<%  =sida %>">[ <%=sida%>  ]</a>
     	<%  End If %>
<%  Next %>
<hr>
<!--  Vi skapar en tabell att sätta data i -->
<table border="1" cellspacing="0" cellpadding="5" width="400">
<!--  Nedanstående två rader skall du inte ändra -->
<%    
  raden = 0
  Do While Not nav_RS.EOF And raden <  nav_RADANTAL 
%>
<!--  
      Här börjar en tabellrad. Kommer att upprepas 
      Se nav_rowColor funktionen längre ner på sidan 
      för förklaring till denn asp kod
-->  
          		<tr bgcolor="<%  =nav_rowColor %>">
               			<!--  Först en cell med en radnummer -->
               			<td align="right">
                    				<%  =nav_ROW + raden %>
               			</td>
               			<!--  och sedan innehållet i ett fält med namnet aTEXT -->
               			<td>
                    				<%  =nav_RS("aTEXT") %>
               			</td>
          		</tr>
<!--  Tabellraden tog slut -->
<!--  Ändra inte nedanstående rader -->
<%  
     	raden = raden + 1
     	nav_RS.MoveNext
  Loop
%>
</TABLE>
<!--  tabelllistningen tog slut -->
<!--  DU KAN ÄVEN SÄTTA NAVIGATIONSFORMEN I SIN HELHET PÅ DENNA PLATS -->
<!--  Vi måste stänga våra objekt -->
<%
  nav_RS.Close
  nav_Conn.Close
  Set nav_RS = nothing
  Set nav_Conn = nothing
%>
<!--  Nu är de stängda och frigjorda -->
<!--  
      Nedanstående funktion används för att byta färg på tabellraderna .
      Den första raden sätts till #FFFFCC
      den andra till #CCFFFF
      sedan upprepas dessa färgväxlingar
-->
<%
  Dim	nav_ColorSwitcher
  Function nav_rowColor()
     	if nav_ColorSwitcher Then
          		nav_rowColor = "#CCFFFF"
     	Else
          		nav_rowColor = "#FFFFCC"
     	End If
     	nav_ColorSwitcher = Not nav_ColorSwitcher
  End Function
%>
<hr>
Det är inte alltid så intressant att bläddra i en LÅNG lista. För att 
dela upp datat i mer "lättsvalda" delar kan man välja att visa ett fast
antal rader per sida och sedan ge bläddringsmöjligheter<p>
För att göra detta möjligt måsta några ändringar komma in från föregående listningsexempel<ol>
<li>Vi kan inte använda <span class=asp><i>connection</i>.Execute</span> eftersom den 
skapar ett "ForwardOnly" resultat och vi behöver kunna bläddra.
<li>Vi måste säga åt Recordset objektet hur många rader det skall vara på en sida.
<li>Vi måste kunna säga åt sidan att den skall bläddra
<li>Vi måste kunna säga åt tabellen vilken sida (vilka rader) som skall visas
</ol>
Lösningarna på dessa problem är:<ol>
<li>Vi skapar ett recordset objekt med<br>
<span class=asp>Set <i>recordset</i> = Server.CreateObject("ADODB.RecordSet")</span><br>
och använder sedan<br>
<span class=asp><i>recordset</i>.Open <i>SQL SATS</i>, <i>Connection</i>, <b>1</b>, <b>1</b></span><br>
för att öppna en "bläddringsbar" KeySet
<li>Vi kan använda <span class=asp><i>recordset</i>.PageSize = <i>RADANTAL</i></span> för att säga 
hur många rader som skall visas
<li>Vi kan sända via URL:n vilken sida som skall visas. T.ex <b>?PAGE=3</b> skall ta
fram sidan 3
<lI>Vi kan använda <span class=asp><i>recordset</i>.AbsolutePage</span> för att ta 
fram en viss sida
</ol>
Detta leder till: <ol>
<li>För att kontakta databasen och tabellen skriver vi<br>
<div class=code>
<FONT COLOR=#006400><!-- #include file="connection.asp" --></font><br>
<span class=asp>
Const <i>RADANTAL</i> = 3<br>
Const <i>SQL</i> = "SELECT * FROM <i>EXEMPELDATA</i> ORDER BY <i>aTEXT</i>"<br>
<br>
' Först en "normal" öppnade av connection o recordset<br>
Set <i>Conn</i> = Server.CreateObject("ADODB.Connection")<br>
<i>Conn</i>.Open <i>strConn</i><br>
<br>
' Kan INTE använda en Exeute för att öppna tabellen<br>
' eftersom vi måste kunna bläddra i tabellen<br>
' vi använder istället följande konstruktion<br>
Set <i>RS</i> = Server.CreateObject("ADODB.RecordSet")<br>
<br>
' Den första ettan (1) betyder att vi öppnar tabellen som en<br>
' KeySet. I den kan vi bläddra. Den andra ettan betyder att <br>
' vi öppnar som ReadOnly...<br>
<i>RS</i>.Open <I>SQL</i>, <i>Conn</i>, <b>1</b>, <b>1</b><br>
<br>
' En tabell kan hanteras i lite större block genom att<br>
' säga att den har en PageSize (= rader per sida )<br>
<i>RS</i>.PageSize = <i>RADANTAL</i><br>
<br>
' Vikan även kontrollera hur många sidor det blir med<br>
' den PageSize vi gav<br>
<i>MAX</i> = <i>RS</i>.PageCount<br>
</span></div><br>
<li>För att få sidan vi vill till på URL:n kan vi göra följande<br>
<div class=code>
<a href="<span class=asp><% =Request.ServerVariables("URL")%></span>?PAGE=1">Första</a><br>
<br>
<a href="<span class=asp><% =Request.ServerVariables("URL")%></span>?PAGE=<br>
      <span class=asp><% = <i>nuvarande sida</i> - 1%></span>">Föregående</a><br>
<br>
<a href="<span class=asp><% =Request.ServerVariables("URL")%></span>?PAGE=<br>
      <span class=asp><% = <i>nuvarande sida</i> + 1%></span>">Nästa</a><br>
<br>
<a href="<span class=asp><% =Request.ServerVariables("URL")%></span>?PAGE=<br>
      <span class=asp><% = <i>sista sidan</i>%></span>">Sista</a><br>
</div>
Istället för text i href:arna kan vi självklart lägga in bilder<br>
Men även följande lösning kan vara användbar för att sätta upp en länklista.<br>
<div class=code>
<span class=asp><% For <i>sida</i> = 1 To <i>MAX</i> %><br>
   <% if sida = <i>PAGENO</i> Then %></span><br>
      <b>[ <span class=asp><%=sida%></span> ]</b><br>
   <span class=asp><% Else %></span><br>
      <a href="<span class=asp><% =Request.ServerVariables("URL")%></span>?PAGE=<br>
         <span class=asp><% =sida %></span>">[ <span class=asp><%=sida%></span> ]</a><br>
   <span class=asp><% End If %></span><br>
<span class=asp><% Next %></span><br>
</div><br><br>
<li>För att sedan göra någonting av den PAGE=n som kommer kan vi skriva följande:<br>
<div class=code><span class=asp>
<%<br>
' Om det fanns ?PAGE=n på adressraden så antar vi att <br>
' vi vill gå till sidan n<br>
if Not IsEmpty(Request("<i>PAGE</i>")) Then<br>
   ' kan väl kontollera att det var en siffra<br>
   ' just in case...<br>
   if IsNumeric(Request("<i>PAGE</i>")) Then<br>
      <i>PAGENO</i> = CInt(Request("<i>PAGE</i>"))<br>
   Else<br>
      ' i annat fall så får det bli sidan 1<br>
      <i>PAGENO</i> = 1<br>
   End If<br>
else<br>
   ' första gången till sidan - ta fram rad ett<br>
   <i>PAGENO</i> = 1<br>
end if<br>
<br>
' Vi kanske är intresserade av vilken rad som är först i listan<br>
' detta kan räknas ut på följande sätt<br>
<i>ROW</i> = (<i>PAGENO</i> - 1) * <i>RADANTAL</i> + 1<br>
<br>
' Stöder databasen bookmark (Access borde göra detta)<br>
<i>harBookmark</i>= <i>RS</i>.Supports(8192)<br>
<br>
If <i>harBookmark</i> Then<br>
   ' gå direkt till rätt sida<br>
   <i>RS</i>.AbsolutePage = <i>PAGENO</i><br>
Else<br>
   ' Annars (klumpigare o långsammare)<br>
   <i>RS</i>.MoveFirst<br>
   <i>RS</i>.Move <i>PAGENO</i> - 1<br>
End If<br>
%></span>
</div><br>
<li>För att visa själva listningen kan man skriva följande<br>
<div class=code>
<table border="1" cellspacing="0" cellpadding="5" width="400"><br>
<span class=asp><%  <br>
  <i>raden</i> = 0<br>
  Do While Not <i>RS</i>.EOF And <i>raden</i> < <i>RADANTAL</i> <br>
%></span><br>
<FONT COLOR=#006400><!--<br>
   Här börjar en tabellrad. Kommer att upprepas <br>
   för förklaring till denn asp kod<br>
--></font><br>
   <tr><br>
   <FONT COLOR=#006400><!-- Först en cell med en radnummer --></font><br>
      <td align="right"><br>
         <span class=asp><% =<i>ROW</i> + <i>raden</i> %</span>><br>
      </td><br>
      <FONT COLOR=#006400><!-- och sedan innehållet i ett fält med namnet aTEXT --></font><br>
      <td><br>
         <span class=asp><% =<i>RS</i>("<i>aTEXT</i>") %></span><br>
      </td><br>
   </tr><br>
<FONT COLOR=#006400><!-- Tabellraden tog slut --></font><br>
<span class=asp><% <br>
   <i>raden</i> = <i>raden</i> + 1<br>
   <i>RS</i>.MoveNext<br>
  Loop<br>
%></span><br>
</TABLE><br>
</div>
</ol>
Koden är kanske inte optimal ur prestandasynvinkel, utan jag har försökt 
göra en kod som enkelt går att modifiera för sina egna behov<p>
Klicka på "Visa ASP koden för denna sida" länken nedan för ytterligare förklaringar<p>
<!--  den följande raden inkluderar min standard footer -->
<!--#include file="../inc/footer.asp" -->