Paging! Hur man delar upp ett recordset på flera sidor
Förord
Ett av de vanligaste problem som återkommer med jämna mellanrum är: PAGING, hur delar man upp ett recordset på flera sidor. Varför vill man då dela upp ett recordset på flera olika sidor? Tänk dig att du har tex ett nyhets script och besökaren har ett alternativ att se alla nyheter. Till en början är det inte så farligt eftersom det ligger ett fåtal nyheter. Men efter ett tag, då det har fyllts på med ett antal nyheter (flera hundra) är det inte speciellt roligt att komma till den sidan. Dels kommer den att ladda långsamt, man måste scrolla flera "skärm fönster" etc. Pagingen i denna artikel fungerar INTE på chilliASP!
Skapa och öppna recordsetet för paging
<%
'## -- skapa connection object och öppna databasen --
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "DSN"
'## -- hur många poster ska visas per sida --
intPageSize = 10 '## -- byt ut till hur många poster du vill ska visas per sida --
'## -- vilken sida ska visas --
intPage = Request.QueryString("page")
*## -- kontrollera så att inte intPage variabeln är tom --
If intPage = "" Then intPage = 1 '## -- visa första sidan som default --
'## -- sql-fråga för att hämta data från databasen --
strSQL = "SELECT fld_news_id, fld_news_header, fld_news_body FROM tbl_news ORDER BY fld_news_date DESC"
'## -- skapa och öppna recordsetet --
Set objRS = Server.CreateObject("ADODB.Recordset")
With objRS
.ActiveConnection = objConn
.Source = strSQL
'## -- bestämmer hur många poster som varje sida ska bestå av i recordsetet --
.PageSize = intPageSize
.CursorType = 3
.LockType = 1
.Open
End Wit
'## -- kontrollera om några poster har returnerats eller inte --
If Not objRS.EOF Then
'## -- poster har returnerats --
'## -- visa rätt sida i recordsetet --
objRS.AbsolutePage = intPage
'## -- hur många sidor består recordsetet av --
intTotalPages = objRS.PageCount
'## -- visa sidnavigeringen --
Call PageNavigation(intPage, intTotalPages)
'## -- loopa igenom recordsetet och visa posterna för besökaren/användaren --
Do Until objRS.EOF OR intCounter >= intPageSize
intCounter = intCounter + 1
'## -- printa ut informationen till besökare/användaren --
objRS.MoveNext
Loop
Else
'## -- inga poster returnerades --
'## -- visa meddelande att inga poster hittades för användaren --
End If
'## -- rensa up --
objRS.Close
Set objRS = Nothing
objConn.Close
Set objconn = Nothing
'## -- visa sidnavigeringen --
Call PageNavigation(intPage, intTotalPages)
'## -- include filen nedan innehåller själva subrutinen för sidnavigeringen --
%>
Subrutinen för sidnavigeringen
Och slutligen själva subrutinen som visar själva sidnavigeringen genom recordsetet.Spara denna sub i en egen fil för att kunna återanvändas på andra sidor, andra siter etc.
<%
Sub PageNavigation(ByVal Page, TotalPages)
Dim strScriptName
'## -- denna sidas namn --
strScriptName = Request.ServerVariables("SCRIPT_NAME")
'## -- länk till föregående sida --
'## -- kontrollera att det inte är första sidan som visas --
If CInt(Page) > 1 Then
'## -- inte första sidan som visas så gör en länk --
Response.Write "<< Föregående "
Else
'## -- det är första sidan som ska visas. gör ingen länk --
Response.Write "<< Föregående "
End If
'## -- bygg upp själva pagebaren, dvs varje sidnummer ska ha en länk
'## -- så att besökaren snabbt kan ta sig till rätt sida --
For N = 1 To CInt(TotalPages)
If N <> CInt(Page) Then
'## -- ej aktuell sida, länka --
Response.Write "" & N & " "
Else
'## -- aktuell sida, länka ej --
Response.Write "" & N & " "
End If
Next
'## -- länk till nästa sida. om vi står på sista sidan ska den ej vara länkad --
If CInt(Page) < CInt(TotalPages) Then
'## -- vi är inte på sista sidan --
Response.Write "Nästa >>"
Else
'## -- vi är på sista sidan. länka ej --
Response.Write "Nästa >>"
End If
End Sub
Hoppas att detta har rätat ut ett par frågetecken som ni eventuellt kunde ha angående Paging.
Var denna artikeln användbar?
Om du gör någon intressant (eller kanske något konstigt fel) på grund av detta material så skicka gärna det med ett mail eller bifoga en länk till mig så presenterar jag detta som ytterligare exempelfiler för kursen. Om detta innehållet är felaktigt eller du lärt dig fler finesser så skriv gärna en rad eller varför inte en egen kurs baserat på dina erfarenheter. Sänd gärna in dina tips till denna kurs./Patrik Berggren - Pastille Interactive AB
0 Kommentarer