 Källkoden för /anders.enges/asp/db2o3b.asp
 Källkoden för /anders.enges/asp/db2o3b.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 = 4
  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
nav_PreviousPage = Request("PREV_PAGE")
Set nav_Conn = Server.CreateObject("ADODB.Connection")
nav_Conn.Open strConn
Set nav_RS = Server.CreateObject("ADODB.RecordSet")
nav_RS.Open nav_SQL, nav_Conn, 1, 1
' Några användbara värden
nav_RS.PageSize = nav_RADANTAL
nav_MAX = nav_RS.PageCount
' Om det fann ?PAGE=n på adressraden så antar vi att 
' vi vill gå till sidan n
if Not IsEmpty(Request("PAGE")) Then
     	if IsNumeric(Request("PAGE")) Then
          		nav_PAGENO = CLng(Request("PAGE"))
     	Else
          		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
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
     	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">
<%  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">
<%  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 %><p>
<!--  
        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>
                    				<!--  
                         					Vi sätter även in en länk till en anna sida
                         					det enda denna sida behöver veta är vilken post 
                         					vi vill visa...
                    				-->
                    				<a href="db2o3res.asp?AUTONUMBER=<%  =nav_RS("aAUTONUMBER") %>"><%  =nav_RS("aTEXT") %></a>
               			</td>
          		</tr>
<!--  Tabellraden tog slut -->
<!--  Ändra inte nedanstående rader -->
          		<%  raden = raden + 1
          		nav_RS.MoveNext
        Loop
%>
</TABLE>
<!--  tabelllistningen tog slut -->
<!--  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 #F5F5DC
        den andra till #F0F8FF
        sedan upprepas dessa färgväxlingar
-->
<%
Dim	nav_ColorSwitcher
Function nav_rowColor()
     	if nav_ColorSwitcher Then
          		nav_rowColor = "#F0F8FF"
     	Else
          		nav_rowColor = "#F5F5DC"
     	End If
     	nav_ColorSwitcher = Not nav_ColorSwitcher
End Function
%>
<p>
Eftersom vi alltid skall ha ett fält som är unikt (<a href="#FOOT">se fotnoten nedan</a>) 
så är det lätt att lägga in en länk till en annan sida och sända över 
via URL:n vilken post den sidan skall arbeta med.<p>
Detta kan vi gör agenom att modifiera koden son gör en listning så att den 
även sätter en länk till den sida som skall visa (eller ändra) datat.<p>
Detta kan ske på följande sätt<br>
<div class=code>
<a href="<i>resultatsida</I>.asp?<i>AUTONUMBER</i>=<br>
<span class=asp><% =<i>RS</i>("<i>AUTONUMBER</i>") %></span>"><br>
<span class=asp><%% =<i>RS</i>("<i>TEXT</i>") %></span></a><br>
</div><br>
I princip gäller det att få en href till resultatsidan för varje rad i 
listningen. Denna referens måste få unikt fältvärde som parameter för att 
kunna ta fram rätt post<p>
När vi klickar på länken öppnas den andra sidan och tar fram rätt 
post. Detta kan du prova genom at klicka på någon av textraderna i 
ovanstående lista.<p>
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>
För att inte beföva skriva samma sak två gånger så har jag 
kommenterat koden.<br> Klicka på "Visa ASP koden för denna sida" 
länken nedan för förklaringar<p>
<a name="FOOT">Fotnot:</a><br>
Man kan använda s.k. <i>Compund Index</i> i de flesta databassystem. 
Detta betyder att man har flera fält som <b>tillsammans</b> bildar en unik 
kombination. I ASP kod med ADO är det dock mycket enklare att sätta en s.k.
  <i>Surrogate Key</i>, d.v.s. en Counter som nyckel. Detta eftersom vi ofta 
har behov av att säga åt en anna sida <b>exakt</b> vilken post som avses.<br>
Ju mindre man måste sända till den andra sidan desto gladare är man.<p>
<!--  den följande raden inkluderar min standard footer -->
<!--#include file="../inc/footer.asp" -->