MartyConnelly
martyconnelly at shaw.ca
Wed May 26 12:40:59 CDT 2004
Paging is quite commonly done on ASP websites
You just set or use three properties of the ADO recordset
' Create recordset and set the page size (no of records per page)
Set objPagingRS = New ADODB.Recordset
objPagingRS.PageSize = iPageSize
' Get the count of the pages using the given page size
iPageCount = objPagingRS.PageCount
' Move to the selected page number
objPagingRS.AbsolutePage = iPageCurrent
Here is some quickly cobbled sample code stolen from http://www.asp101.com
Search on "paging" as there several methods available including placing
in an array
There are probably articles floating around as to best method for
performance
Sub AdoPaging()
'stolen from
http://www.asp101.com/samples/viewasp.asp?file=db%5Fpaging%2Easp
' BEGIN USER CONSTANTS
Dim CONN_STRING As String
Dim CONN_USER As String
Dim CONN_PASS As String
CONN_STRING = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Program Files\Microsoft
Office\Office\Samples\Northwind.mdb;" & _
"User Id=admin;" & "Password="
' Our SQL code - overriding values we just set
' Comment out to use Access
'CONN_STRING = "Provider=SQLOLEDB;Data Source=10.2.1.214;" _
' & "Initial Catalog=samples;Connect Timeout=15;" _
' & "Network Library=dbmssocn;"
'CONN_USER = "samples"
'CONN_PASS = "password"
' END USER CONSTANTS
' Declare our vars
Dim iPageSize As Long 'How big our pages are
Dim iPageCount As Long 'The number of pages we get back
Dim iPageCurrent As Long 'The page we want to show
Dim strOrderBy As String 'A fake parameter used to illustrate
passing them
Dim strSQL As String 'SQL command to execute
Dim iRecordsShown As Long 'Loop controller for displaying just
iPageSize records
Dim I As Long 'Standard looping var
Dim objPagingConn As ADODB.Connection
Dim objPagingRS As ADODB.Recordset
' Get parameters
' set number of records per page
iPageSize = 10 ' You could easily allow users to change this
' Set page to show or default to 1
iPageCurrent = 2
' If you're doing this script with a search or something
' you'll need to pass the sql from page to page. I'm just
' paging through the entire table so I just hard coded it.
' What you show is irrelevant to the point of the sample.
'strSQL = "SELECT * FROM sample ORDER BY id;"
strOrderBy = "'Customer ID'"
'strOrderBy = "last_name,first_name,sales"
' Build our SQL String using the parameters we just got.
strSQL = "SELECT * FROM customers ORDER BY " & strOrderBy & ";"
Debug.Print strSQL
' Now we finally get to the DB work...
' Create and open our connection
Set objPagingConn = New ADODB.Connection
'objPagingConn.Open CONN_STRING, CONN_USER, CONN_PASS
objPagingConn.Open CONN_STRING
' Create recordset and set the page size
Set objPagingRS = New ADODB.Recordset
objPagingRS.PageSize = iPageSize
' You can change other settings as with any RS
'objPagingRS.CursorLocation = adUseClient
objPagingRS.CacheSize = iPageSize
' Open RS
objPagingRS.Open strSQL, objPagingConn, adOpenStatic, adLockReadOnly,
adCmdText
' Get the count of the pages using the given page size
iPageCount = objPagingRS.PageCount
' If the request page falls outside the acceptable range,
' give them the closest match (1 or max)
If iPageCurrent > iPageCount Then iPageCurrent = iPageCount
If iPageCurrent < 1 Then iPageCurrent = 1
' Check page count to prevent bombing when zero results are returned!
If iPageCount = 0 Then
Debug.Print "No records found!"
Else
' Move to the selected page
objPagingRS.AbsolutePage = iPageCurrent
' Start output with a page x of n line
' Show field names in the top row
Dim strtitles As String
strtitles = ""
For I = 0 To objPagingRS.Fields.Count - 1
strtitles = strtitles & objPagingRS.Fields(I).Name & " "
Next 'I
Debug.Print strtitles & vbCrLf
' Loop through our records and ouput 1 row per record
iRecordsShown = 0
Dim strFields As String
strFields = ""
Do While iRecordsShown < iPageSize And Not objPagingRS.EOF
For I = 0 To objPagingRS.Fields.Count - 1
strFields = strFields & objPagingRS.Fields(I) & ","
Next 'I
Debug.Print strFields & vbCrLf
'clear strfields shown
strFields = ""
' Increment the number of records we've shown
iRecordsShown = iRecordsShown + 1
' Can't forget to move to the next record!
objPagingRS.MoveNext
Loop
' All done - close table
End If
' Close DB objects and free variables
objPagingRS.Close
Set objPagingRS = Nothing
objPagingConn.Close
Set objPagingConn = Nothing
End Sub
Martin Reid wrote:
>Anyone every done any work on paging large recordsets in Access. I want to
>look at the possibility of breaking up massive recordsets returned from SQL
>Server in page sets of say 100 records. Rather than pull them all at the
>start I want the user to be able to select Page 1, Page etc etc then move
>freely between pages.
>
>Only 100 records (or less) would be taken of the server at one time.
>
>I cannot use filters at the client end. All records MUST be available?
>
>MArtin
>
>
>
--
Marty Connelly
Victoria, B.C.
Canada