Geplaatst door: Ramon Geplaatst op: 23-12-2002 Laatste update: 3-4-2003 11:31:35 Aantal keer bekeken: 49439 Database paging
Stel je hebt een database met 2000 records en wilt deze records op een
website laten zien. Voor de bezoeker van de website is het niet fijn wanneer
er in één keer 2000 records op het scherm verschijnen. Het
is beter om telkens 20 records te laten zien en dat de bezoeker kan navigeren.
Dit principe heet paging. Dit is dus het opdelen van de records in verschillende
pagina's. Het volgende voorbeeld laat zien hoe dit in z'n werk gaat. Dit
artikel is gebaseerd op een artikel van asp101.
Adovbs.inc is een standaard bestand van Microsoft. In dit bestand staan
alle constanten gedefineerd. Termen als adOpenStatic en adLockReadOnly
staan hierin. Het bestand is hier al textbestand
te downloaden.
In dit voorbeeld is er weer gebruik gemaakt van de voorbeeld database.
<%
' Declareren van de variabelen
Dim strCon
Dim objCon
Dim accessDB
Dim aantalRecords
Dim aantalPaginas
Dim huidigePagina
Dim strSQL
Dim objRec
Dim recordsGetoond
Dim I
' Zet de connectiestring in de variabele. Hier is dit dus
een ODBC connectie.
accessDB = server.mappath("/voorbeeld/voorbeeld.mdb")
strCon = "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE="
strCon = strCon & accessDB & ";"
' Hoeveel records worden er per keer getoond.
' Dit zou een gebruiker ook kunnen opgeven en met
request.form("aantalRecords") opgevraagd kunnen worden.
aantalRecords = 2
' De pagina die getoond moet worden.
if Request.QueryString("pagina")
= "" Then
' Maak een serverobject aan voor de connectie (ObjectConnectie
-> objCon)
Set objCon = Server.CreateObject("ADODB.Connection")
' Maak een recordsetobject aan.
Set objRec = Server.CreateObject("ADODB.Recordset")
' Open de verbinding met de database. Voor objCon wordt er
een
' verbinding geopend met opgegeven database.
objCon.Open strCon
' De SQL query om de gegevens uit de database te halen.
SQL = "SELECT * FROM klanten"
' Plaats de gegevens van de SQL Query in de recordset objRec.
' Geef de juiste constante uit adovbs.inc mee.
objRec.Open SQL, strCon, adOpenStatic, adLockReadOnly,
adCmdText
' Zet het aantal records in Pagesize
objRec.PageSize = aantalRecords
' Zet het aantal records in cachesize
objRec.CacheSize = aantalRecords
' Tel het aantal pagina's
aantalPaginas = objRec.PageCount
' zorg ervoor dat de huidige pagina niet buiten het aantal
pagina's valt.
if huidigePagina > aantalPaginas Then
huidigePagina = aantalPaginas
End if
if huidigePagina < 1 Then
huidigePagina = 1
End if
' Wanneer er geen records zijn geef een melding.
if aantalPaginas = 0 Then
Response.Write "Er zijn geen
records gevonden"
Else
' Ga naar de juiste pagina
objRec.AbsolutePage = huidigePagina
%>
<p>
<font size="+1">Pagina<strong> <%=
huidigePagina %></strong>
van de <strong><%= aantalPaginas
%></strong></font>
</p>
<%
' Een spatie
Response.Write vbCrLf
' Maak een tabel
Response.Write "<table border=""1"">"
& vbCrLf
' Toon de namen van de velden
Response.Write "<tr>"
& vbCrLf
For I = 0 To objRec.Fields.Count
- 1
Response.Write "<td>"
Response.Write objRec.Fields(I).Name
Response.Write "</td>"
& vbCrLf
Next
Response.Write "</tr>"
& vbCrLf
' Toon de records.
recordsGetoond = 0
Do While recordsGetoond < aantalRecords And
Not objRec.EOF
Response.Write "<tr>"
& vbCrLf
For I = 0 To objRec.Fields.Count
- 1
Response.Write "<td>"
Response.Write objRec.Fields(I)
Response.Write "</td>"
& vbCrLf
Next
Response.Write "</tr>"
& vbCrLf
' Verhoog het aantal records dat getoond is
recordsGetoond = recordsGetoond + 1
' Volgende record.
objRec.MoveNext
Loop
' Sluit de tabel
Response.Write "</table>"
& vbCrLf
End if
' Alles afsluiten
objRec.Close
Set objRec = Nothing
objCon.Close
Set objCon = Nothing
'Maken van de volgende en vorige knoppen.
' Maak de [< Vorige] knop
if huidigePagina > 1 Then
%>
In dit voorbeeld heet het script paging.asp. Wanneer de pagina een andere
naam krijgt is het noodzakelijk om onderaan bij de volgende en vorige
knoppen de naam van de pagina te wijzigen.
' Maak een serverobject aan voor de connectie (ObjectConnectie -> objCon)
Set objCon = Server.CreateObject("ADODB.Connection")
' Maak een recordsetobject aan.
Set objRec = Server.CreateObject("ADODB.Recordset")
' Open de verbinding met de database. Voor objCon wordt er een
' verbinding geopend met opgegeven database.
objCon.Open strCon
' De SQL query om de gegevens uit de database te halen.
SQL = "SELECT * FROM klanten"
' Plaats de gegevens van de SQL Query in de recordset objRec.
' Geef de juiste constante uit adovbs.inc mee.
objRec.Open SQL, strCon, adOpenStatic, adLockReadOnly, adCmdText
Ligt het aan mij of wordt 'objCon' enkel geset en gesloten en verder niet gebruikt.
Ik gebruik meestal de 'set objRec = objCon.execute(SQL)' om de recordset aan te maken. Maar hier wordt voor de recordset een appart object gemaakt.
Current Recordset does not support bookmarks. This may be a limitation of the provider or of the selected cursortype.
-----------------------------------
Meerdere korte vraagjes over paging. Ten eerste: is het wel nodig om adovbs.inc te gebruiken? Volgens mij komt hij alleen terug bij het uitvoeren van de SQL?
Verder zie ik een aantal variabelen, die ik niet kan plaatsen, zoals CInt en vbCrLf; waar komen die vandaan en wat is hun functie?
Tot slot, waar kan ik de voorbeeld database downloaden. Ik kan hem niet zo snel vinden op deze site.
Nogmaals ik en vergeet de vorige reactie. Het is reeds gelukt om paging aan de praat te krijgen (gecombineerd met een zoekfunctie van een andere pagina), maar nu werkt hij niet helemaal.
Wanneer ik op 'volgende' klik, springt hij direct naar de laatste pagina. Ook wanneer ik één van de tussenliggende pagina's probeer te openen, springt hij naar de laatste pagina. Vervolgens werkt de 'vorige' ook niet. Ik heb de code toegevoegd; kan iemand de fout ontdekken?
<%
Sub Show_student %>
<h1>show students</h1>
<%
Dim strcon, objcon, objrec, accessDB
Dim Keyword
Dim numrec, showrec, numpage, curpage, I
hoe moet ik nu binnen de code van paging omgaan met een image, die als tekstverwijzing wordt aangegeven in het Hyperlinkveld van mijn db.
Zonder dit stukje werkt het goed maar met plaatje zou leuk zijn.
Het gewone pagen werkt. Maar ik wil graag weten hoe ik het voor elkaar kan krijgen dat je niet alle paginanummers te zien krijgt als het er een heleboel zijn. Zodra het meer dan, zeg, 10 worden is het niet mooi meer om alle paginalinken te laten zien.
Ik weet dat het mogelijk is om dan een deel in "vorige" en "volgende" te stoppen, maar hoe wordt dat gedaan?
Zoals bijvoorbeeld bij Google: Vorige, 6,7,8,9,10, Volgende