webForumDet fria alternativet

Paging, en gång för alla ...... OBS!! Långt inlägg

19 svar · 737 visningar · startad av PatrikB

PatrikBMedlem sedan mars 20002 836 inlägg
#1

[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]

nakozMedlem sedan dec. 1999653 inlägg
#2

bra initiativ PatrikB, nu kanske vi slipper alla dessa frågor om paging!

MVH

------------------
nakoz :)

Ghost of NorthMedlem sedan sep. 200057 inlägg
#3

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

VideMedlem sedan dec. 19998 577 inlägg
#4

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

PatrikBMedlem sedan mars 20002 836 inlägg
#5

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

costodiaMedlem sedan aug. 2000864 inlägg
#6

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("&nbsp;&nbsp;&#0124;&nbsp;&nbsp;")
	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

PatrikBMedlem sedan mars 20002 836 inlägg
#7

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]

JanspeedMedlem sedan jan. 2001510 inlägg
#8

: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?

@ndersMedlem sedan juni 200032 969 inlägg
#9

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>

JanspeedMedlem sedan jan. 2001510 inlägg
#10

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]

JanspeedMedlem sedan jan. 2001510 inlägg
#11

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 & "&nbsp;&nbsp;&nbsp;" & 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

JanspeedMedlem sedan jan. 2001510 inlägg
#12

Om någon har lust så kan ni väl testa den också så att jag vet om den funkar? :)

iceM2Medlem sedan mars 2001243 inlägg
#13

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

costodiaMedlem sedan aug. 2000864 inlägg
#14

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]

JanspeedMedlem sedan jan. 2001510 inlägg
#15

Var det ingen som vågade prova mitt fina script? ...får väl prova det själv då.

benkebusMedlem sedan jan. 20024 inlägg
#16

kan man kombinera det översta scriptet med detta script?

<table>
<tr>

<%X = 1%>
<%Do until RS.EOF%>
<td>
<%=rs("fornamn") %>&nbsp;<%=rs("efternamn") %><br><%=rs("adress") %><br><%=rs("postnr") %>&nbsp;<%=rs("postadress") %><br><%=rs("land") %>
</td>

<%if X = 3 then%>
</tr>
<tr>
<%X = 0%>
<%end if%>

<%X = X -- 1%>
<%RS.MoveNext%>
<%loop%>
</tr>
</table>
LukaspojkenMedlem sedan maj 20011 312 inlägg
#17

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

PatrikBMedlem sedan mars 20002 836 inlägg
#18

... 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 *=-

PatrikBMedlem sedan mars 20002 836 inlägg
#19

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 *=-

LukaspojkenMedlem sedan maj 20011 312 inlägg
#20

:) 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]

150 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
145 ms — hämta tråd, inlägg och bilagor (db)