bra initiativ PatrikB, nu kanske vi slipper alla dessa frågor om paging!
MVH
------------------
nakoz :)
19 svar · 740 visningar · startad av PatrikB
[r]
OBS!!!! funkar ej under chilliASP
[r[
Ok,
kolla in koden under.
Den visar en enkel listning utav alla inlägg rakt upp och ner, utan paging, i en mycket enkel gästbok där recordsetet är skapat genom connection-objektet.
<%
Option Explicit
Dim objConn
Dim strConnString
Dim strSQL
Dim objRS
Dim strName
Dim strComment
Dim dteDate
'## -- connection string, vilken provider och db ska användas --
strConnString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath("/db-folder/my-db.mdb")
%>
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</HEAD>
<BODY>
<%
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open strConnString
strSQL = "SELECT G_Id, G_Name, G_Comments, G_Date " & _
"FROM Gbook " & _
"ORDER BY G_Date DESC"
'## -- skapa ett recordset --
Set objRS = objConn.Execute(strSQL)
If objRS.EOF Then
Response.Write "Det finns inga inlägg."
Else
'## -- lista alla inlägg som finns i db --
Do Until objRS.EOF
strName = objRS(1)
strComment = objRS(2)
dteDate = objRS(3)
Response.Write "<B>Namn:</B> " & strName & "<BR>" & _
"<B>Datum:</B> " & dteDate & "<BR>" & _
"<B>Kommentar:</B><BR>" & _
strComment & _
"<HR size=""1"" noshade>"
objRS.MoveNext
Loop
End If
objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
%>
</BODY>
</HTML>
Denna kod fungerar alldeles förträffligt, fast kan bli lite jobbig när det börjar närma sig en massa inlägg.
Hur kan man då ändra den befintliga koden för att kunna skapa en sk paging?
Vi börjar med att skapa en funktion/sub som ska skriva ut själva sid navigerningen.
Vi behöver dock tänka på följande.
- Vilken sida ska visas?
- Hur många sidor finns det totalt i uppdelningen.
Dessa värden "passar" vi in i själva suben.
'## -- skapa sid-navigering --
Sub PageNavigation(ByVal WichPage, ByVal HowManyPages)
Dim strScriptName
'## -- vilken sida ska navigeringen länka till --
strScriptName = Request.ServerVariables("SCRIPT_NAME")
'## -- visa föregående, länkat eller olänkat beroende på vilken sida som visas --
If CInt(WichPage) > 1 Then
Response.Write "<A href='" & strScriptName & "?" & _
"page=" & WichPage - 1 & "'><< Föregående</A> "
Else
Response.Write "<< Föregående "
End If
'## -- lista ut alla sidnummer --
For I = 1 To HowManyPages
If CInt(WichPage) <> I Then
Response.Write "<A href='" & strScriptName & "?" & _
"page=" & I & "'>" & I & "</A> "
Else
Response.Write "[ <B>" & I & "</B> ]"
End If
Next
'## -- visa Nästa, länkad eller olänkad beroende på vilken sida som visas --
If CInt(WichPage) < CInt(HowManyPages) Then
Response.Write "<A href='" & strScriptName & "?" & _
"page=" & WichPage + 1 & "'>Nästa >>"
Else
Response.Write "Nästa >>"
End If
End Sub
Nu när vi har själva funktionen/sub för att kunna skriva ut sidnavigeringen kommer den jobbigaste biten, den där vi måste skapa om recordsetet med hjälp av adodb.recordset, lägga till lite fler variabler för att kunna styra vilken sida som ska visas, hålla reda på hur många sidor det finns i recordsetet etc.
Studera koden under och jämför med koden övers.
Denna kod är ändrad så att det finns en sidnavigering där endast 10 poster per sida kommer att visas.
<%
Option Explicit
Dim objConn
Dim strConnString
Dim strSQL
Dim objRS
Dim strName
Dim strComment
Dim dteDate
Dim intPageSize
Dim intPage
Dim intTotalPages
Dim intRecordCount
'## -- connection string, vilken provider och db ska användas --
strConnString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Server.MapPath("/db-folder/my-db.mdb")
'## -- hur många inlägg ska visas per sida --
intPageSize = 10
'## -- vilken sida ska visas --
intPage = Request.QueryString("page")
'## -- om ingen querystring med sidvärde hittas, visa då första sidan --
If intPage = "" Then intPage = 1
%>
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</HEAD>
<BODY>
<%
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open strConnString
strSQL = "SELECT G_Id, G_Name, G_Comments, G_Date " & _
"FROM Gbook " & _
"ORDER BY G_Date DESC"
'## -- skapa ett recordset --
Set objRS = Server.CreateObject("ADODB.Recordset")
'## -- hur många poster ska visas per sida --
objRS.PageSize = intPageSize
'## -- öppna och hämta alla records --
objRS.Open strSQL, objConn, 3, 1
'## -- vilken sida i recordset uppdelningen ska visas --
objRS.AbsolutePage = intPage
'## -- hur många sidor finns i recordset uppdelningen --
intTotalPages = objRS.PageCount
If objRS.EOF Then
Response.Write "Det finns inga inlägg."
Else
'## -- lista alla inlägg som finns i db --
Do Until objRS.EOF or intRecordCount >= intPageSize
intRecordCount = intRecordCount + 1
strName = objRS(1)
strComment = objRS(2)
dteDate = objRS(3)
Response.Write "<B>Namn:</B> " & strName & "<BR>" & _
"<B>Datum:</B> " & dteDate & "<BR>" & _
"<B>Kommentar:</B><BR>" & _
strComment & _
"<HR size=""1"" noshade>"
objRS.MoveNext
Loop
End If
'## -- clean up --
objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
'## -- visa sidnavigeringen --
'## -- intPage = vilken sida som ska visas --
'## -- intTotalPages = hur många sidor som recordsetet är uppdelat i --
Call PageNavigation(intPage, intTotalPages)
%>
</BODY>
</HTML>
<%
'## -- skapa sid-navigering --
Sub PageNavigation(ByVal WichPage, ByVal HowManyPages)
Dim strScriptName
Dim I
'## -- vilken sida ska navigeringen länka till --
strScriptName = Request.ServerVariables("SCRIPT_NAME")
'## -- visa föregående, länkat eller olänkat beroende på vilken sida som visas --
If CInt(WichPage) > 1 Then
Response.Write "<A href='" & strScriptName & "?" & _
"page=" & WichPage - 1 & "'><< Föregående</A> "
Else
Response.Write "<< Föregående "
End If
'## -- lista ut alla sidnummer --
For I = 1 To HowManyPages
If CInt(WichPage) <> I Then
Response.Write "<A href='" & strScriptName & "?" & _
"page=" & I & "'>" & I & "</A> "
Else
Response.Write "[ <B>" & I & "</B> ] "
End If
Next
'## -- visa Nästa, länkad eller olänkad beroende på vilken sida som visas --
If CInt(WichPage) < CInt(HowManyPages) Then
Response.Write "<A href='" & strScriptName & "?" & _
"page=" & WichPage + 1 & "'>Nästa >>"
Else
Response.Write "Nästa >>"
End If
End Sub
%>
Studera de olika koderna så ser ni vad som har ändrats och inte har ändrats och hoppas att det i framtiden inte kommer att vara några som helst problem för er att skapa en paging på era sidor,
cya all l8er,
------------------
Private Function OutPut(ByRef sString)
OutPut = "Who gives ..." & sString
End Function
[Redigerat av PatrikB den 12 mar 2001]
bra initiativ PatrikB, nu kanske vi slipper alla dessa frågor om paging!
MVH
------------------
nakoz :)
Bara det här nu hamnar på något bra ställe så att det inte glöms bort bland alla inlägg... ;)
Själv har jag kopierat det till mitt skrivbord så att jag kan läsa det när jag vill.
Nu ska jag bara ägna mig några veckor åt att förstå det... :l
------------------
Jägermeister Cykel
Mycket bra Partik... har lagt in en länk till detta inlägg i nästa version av ASP-FAQ.
OT: Viste ni att FAQ nu officiellt nu heter VOFF på svenska? Väldigt ofta frågade frågor... :e
------------------
Jourhavande @e SweQuake.com
en sak e lite synd ... den funkar inte under chilliASP.
Är det någon som vet en annan lösning där??
cya,
------------------
Private Function OutPut(ByRef sString)
OutPut = "Who gives ..." & sString
End Function
Jag får hela tiden upp felet
ADODB.Recordset fel '800a0bb9'
Parametrarna är felaktiga, ligger utanför tillåtet intervall eller skapar en inbördes konflikt.
[kod]
/XcClassifiedLite12/hundannons/pagingviewads-1.asp, rad 56
koden som jag skrivit ser ut så här
<!-- #include file="classlib.asp" -->
<%
catID = Request.Querystring("CatID")
'## -- hur många inlägg ska visas per sida --
intPageSize = 10
'## -- vilken sida ska visas --
intPage = Request.QueryString("page")
'## -- om ingen querystring med sidvärde hittas, visa då första sidan --
If intPage = "" Then intPage = 1
'This is where we specify the datasource.
Set GobjConnect = server.createobject("ADODB.Connection")
GobjConnect.open gsConnect
Call DoPageHeader
gsSQL = ""
gsSQL = gsSQL & "Select ID, TopicID, adtitle, content, price, image, name, address, city, zip, state, phone, email, dateposted, "
gsSQL = gsSQL & "link FROM adcontent WHERE TopicID = " & SQLVal(catID) & " ORDER BY dateposted "
Set rs = GobjConnect.Execute(gsSQL)
tSQL = ""
tSQL = tSQL & "SELECT ID, CategoryName FROM categories WHERE ID = " & SQLVal(catID)
Set Categoryrs = GobjConnect.Execute(tSQL)
Response.Write("<FONT FACE =" & chr(34) & sFont & chr(34) & ">")
Response.Write("<blockquote><table border=0 cellpadding=3 cellspacing=0><tr><td><B>" & Categoryrs.Fields("CategoryName") & "</td></tr></table></B>")
Response.Write("<TABLE WIDTH=""600"" BORDER=""0"" CELLSPACING=""1"" CELLPADDING=""6"">")
Response.Write("<TR bgcolor=" & chr(34) & tablecolor & chr(34) & "><TD> <B>Annons</B> </TD><TD><B>Kontakt info.</B></TD></TR>")
If rs.eof then
Response.Write("<TR bgcolor=""#FFFFFF"" valign=""top""><TD COLSPAN=""2"" valign=""top"">")
Response.Write("<B>Inga annonser</B>")
Response.Write("</TD></TR>")
Else
iswitch = TRUE
Do While Not rs.eof
If iswitch = TRUE then
scolor = "#E9E9E9"
iswitch = False
Else scolor = "#E0E8ED"
iswitch = TRUE
End If
'## -- skapa ett recordset --
Set objRS = Server.CreateObject("ADODB.Recordset")
'## -- hur många poster ska visas per sida --
objRS.PageSize = intPageSize
'## -- öppna och hämta alla records --
objRS.Open strSQL, objConn, 3, 1
'## -- vilken sida i recordset uppdelningen ska visas --
objRS.AbsolutePage = intPage
'## -- hur många sidor finns i recordset uppdelningen --
intTotalPages = objRS.PageCount
intRecordCount = intRecordCount + 1
Response.Write("<TR bgcolor =" & chr(34) & scolor & chr(34) & ">")
Response.Write("<TD><A HREF=" & chr(34) & "viewdetail.asp?id=" & rs.fields("ID") & chr(34) & "><B>" & rs.fields("adtitle") & "</B></A> ")
Response.Write(LEFT(rs.Fields("content"), 75) & "... </TD><TD><B>Region:</B> " & rs.fields("state") & "<BR><B>Kontakt e-post:</B> <A HREF = ")
Response.Write(chr(34) & "MAILTO:" & rs.fields("email") & chr(34) & ">" & rs.fields("name") & "</A><BR>")
Response.Write("<B>Telefonnummer:</B> " & rs.fields("price") & "</TD></TR>")
rs.MoveNext
Loop
rs.close
Set rs = Nothing
Categoryrs.close
Set Categoryrs = Nothing
Set GobjConnect = Nothing
'## -- vilken sida ska navigeringen länka till --
strScriptName = Request.ServerVariables("SCRIPT_NAME")
'## -- visa föregående, länkat eller olänkat beroende på vilken sida som visas --
If CInt(WichPage) > 1 Then
Response.Write "<A href='" & strScriptName & "?" & _
"page=" & WichPage - 1 & "'><< Föregående</A> "
Else
Response.Write "<< Föregående "
End If
'## -- lista ut alla sidnummer --
For I = 1 To HowManyPages
If CInt(WichPage) <> I Then
Response.Write "<A href='" & strScriptName & "?" & _
"page=" & I & "'>" & I & "</A> "
Else
Response.Write "[ <B>" & I & "</B> ] "
End If
Next
'## -- visa Nästa, länkad eller olänkad beroende på vilken sida som visas --
If CInt(WichPage) < CInt(HowManyPages) Then
Response.Write "<A href='" & strScriptName & "?" & _
"page=" & WichPage + 1 & "'>Nästa >>"
Else
Response.Write "Nästa >>"
End If
End If
Response.Write("<TR bgcolor=" & chr(34) & tablecolor & chr(34) & "><TD COLSPAN=""2"">")
Response.Write("<A HREF=""default.asp"">Tillbaka till förstasidan</A>")
Response.Write(" | ")
Response.Write("<A HREF=" & chr(34) & "newaddform.asp?catID=" & catID & chr(34) & ">Lägg in en ny annons</A>")
Response.Write("</TD></TR></TABLE></blockquote>")
%>
den är väldigt men om någon ser någonting som är rent uppåtväggarna i den så skulle det hjälpa mig väldigt mycket på traven,
------------------
Mvh Martin Persson
www.Costodia.com
Hello,
koden från exemplet ovan är just bara exempel kod.
Det du behöver göra är att byta ut objRS i exemplet så att det stämmer överens med vad ditt recordset heter + att du måste öppna recordsetet genom adodb.recordset och ej som nu genom conn-objektet.
denna bit kod som du har i rs-loopen:
'## -- skapa ett recordset --
Set objRS = Server.CreateObject("ADODB.Recordset")
'## -- hur många poster ska visas per sida --
objRS.PageSize = intPageSize
'## -- öppna och hämta alla records --
objRS.Open strSQL, objConn, 3, 1
'## -- vilken sida i recordset uppdelningen ska visas --
objRS.AbsolutePage = intPage
är den kod som ska ersätta ditt rs som skapas nästan längst upp i din kod.
cya,
PatrikB
------------------
Ingenting är omöjligt.
Det omöjliga tar bara något längre tid att genomföra.
[Redigerat av PatrikB den 05 apr 2001]
:e Hehe... alla ni som trodde att ni skulle slippa frågor om paging.
Till er har jag bara en fråga:
Vad är paging?
liksom bläddring i ett recordset.
först kommer man till sida 1, med posterna 1-10. där finns en knapp, 'nästa', som vid klick för dig till sida 2, posterna 11-20.
precis så som sökresultat delas upp i de flesta sökmotorer, x antal på x sidor.
liksom. :)
------------------
<A HREF="http://cartman.nu" TARGET=_blank>
all your base are belong to us!</A>
Aha... nu förstår jag.
Jag skulle gjort ett försök till ett annat exempel om jag orkat men det är snart dags att gå hem och jag är trött men den skulle typ vara så här :) :
Hämta querystringsiffra om det finns någon annars tilldelas 0
Hämta formulärdata.
Loopa igenom alla poster, räkna dem och skriv ut länk till var 10:e genom loop och räknare.
recordset.movefirst
spola fram genom ny loop tills EOF eller tills räknare = querystringsiffra
skriv ut innehåll tills räknare = querystringsiffra + 10
gör länk till next page genom att ge querystringsiffra + 10 i länken.
Då har man en väldigt basic räknare som funkar överallt. Observera dock att jag är extremt trött när jag skriver detta så jag har ingen aning om jag bara snackar goja. Ska ta mig en titt på detta imorgon och se vad tusan jag skrivit egentligen. :e
God natt!
//JANspeed
[Redigerat av Janspeed den 05 apr 2001]
Ok. Nu är jag tillbaka. Jag tänkte att jag kanske skulle visa i kodform vad jag menar.
Den här koden har aldrig testats så jag vet inte om den faktiskt fungerar. Det kan tänkas att den behöver justeras lite och eftersom jag skrivit den rakt av från huvudet så kan det tänkas att jag saknar lite kod.
Men jag antar att det inte är något problem att fixa för er som är duktiga på att koda.
<%
'Created by JANspeed Sweden 2001
'Denna funktion söker i tabellen tblOrt efter ett matchande resultat i kolumnen Ort
Dim page, Ort
If Request.Querystring("page") <> "" Then
page = 0
Ort = Request.Querystring("Ort")
Else
page = Request.Querystring("page")
Ort = Request("Ort")
End If
Dim SQL
SQL = "SELECT Ort FROM tblOrt WHERE Ort LIKE '%" & Ort & "%' "
Dim dbConnect
Set dbConnect = Server.CreateObject("ADODB.Connection")
dbConnect.ConnectionString = "driver={SQL Server};server=localhost;uid=webusr;pwd=webusr;database=Orter"
dbConnect.Open
Dim dbRS
Set dbRS = Server.CreateObject("ADODB.Recordset")
dbRS.Open SQL, dbConnect, 3, 1
Dim count, counter
count = 0
counter = 0
Do Until dbRS.EOF
If counter = 10 Then
Response.Write "<a href=list.asp?page=" & count & "&ort=" & Ort & ">" & count & "-" & count + 10 & "</a>"
counter = 0
End If
count = count + 1
counter = counter + 1
dbRS.movenext
Loop
Response.Write "Sökningen hittade: " & count & " resultat."
dbRS.movefirst
count = 0
Do Until dbRS.EOF OR count = page
count = count + 1
dbRS.movenext
Loop
Do Until dbRS.EOF OR count = page + 10
Response.Write "Resultat " & count & " " & dbRS("Ort")
count = count + 1
dbRS.movenext
Loop
If NOT dbRS.EOF
Response.Write "<a href=list.asp?page=" & count & "&ort=" & Ort & ">For more results, Click me</a>"
End If
Det borde väl funka? Bortsett från ett eller annat fel? Vad tycker ni?
//JANspeed
Om någon har lust så kan ni väl testa den också så att jag vet om den funkar? :)
Skulle vilja passa på att tipsa er om paging scriptet som finns på ASP101... det är mycket enkelt att få att fungera... http://www.asp101.com
------------------
http://www.hutters.net
tyvärr så får jag samma fel igen trott att jag bytte ut satsen som du skrev
...inga länkar funkar på hutters punkt net föresten
------------------
Mvh Martin Persson
Costodia.com
[Redigerat av costodia den 06 apr 2001]
Var det ingen som vågade prova mitt fina script? ...får väl prova det själv då.
kan man kombinera det översta scriptet med detta script?
<table>
<tr>
<%X = 1%>
<%Do until RS.EOF%>
<td>
<%=rs("fornamn") %> <%=rs("efternamn") %><br><%=rs("adress") %><br><%=rs("postnr") %> <%=rs("postadress") %><br><%=rs("land") %>
</td>
<%if X = 3 then%>
</tr>
<tr>
<%X = 0%>
<%end if%>
<%X = X -- 1%>
<%RS.MoveNext%>
<%loop%>
</tr>
</table>
Hej Patrik!
Jag titta lite på ditt nya script och det verkar som du har databasen öppen hela tiden just eftersom du ska kunna utnyttja de funktioner som finns i ett recordset, men är inte din gamla variant av paging bättre prestandamässigt. Har man många besökare så blir det ju inte så bra det här eller?
------------------
Alltid lär man sig något nytt varje dag...
... he, he ... om du kikar när detta inlägg är skrivet och så jämför du med det andra scriptet som jag skrivit så kanske du förstår ...
Det andra scriptets uppkomst kom till bara för att få till en paging på chilliASP! .... utan att använda ADODB.Recordset vilket har varit/är väldigt "buggigt"/ej fullt implementerat där ännu
cya,
PatrikB
------------------
-=* IF there is a wrong way to do something, then someone will do it *=-
kan man kombinera det översta scriptet med detta script?
Kort och gott: Ja!
Paging kan göras på alla recordset.
Allt handlar om hur många poster som finns, hur många poster jag vill visa de i sin tur ger hur många sidor det blir.
cya,
PatrikB
------------------
-=* IF there is a wrong way to do something, then someone will do it *=-
:) trodde det var något du skrivit nyligen...men nu förstår jag att det är en sån där "old-darling"-inlägg... :)
[Redigerat av Lukaspojken den 25 jan 2002]