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