Forum

July 12th, 2025
A A A
Avatar

Lost password?
Advanced Search

— Forum Scope —




— Match —





— Forum Options —





Minimum search word length is 3 characters - maximum search word length is 84 characters

The forums are currently locked and only available for read only access
sp_Feed Topic RSS sp_TopicIcon
Grid ASP + MSSQL with LIMIT
18/08/2010
18:00
Avatar
Roca-Brazil
Brazil
New Member
Members
Forum Posts: 1
Member Since:
18/08/2010
sp_UserOfflineSmall Offline

I decided to share this code for those using ASP + MSSQL and not found a solution to the limit, made me Mysql

<%
Response.ContentType = "text/xml"
Response.Charset = "UTF-8" 'or ISO-8859-1
'Response.Write "<?xml version=""1.0"" encoding=""ISO-8859-1"" ?>"
Response.Flush()

strIdx  = Request("sidx")
strOrd  = Request("sord")

strSearchOn = Request("_search")
If (strSearchOn = "true") Then
strField = Request("searchField")
 If (strField = "invid" Or strField = "invdate" Or strField = "amount") Then
  strFieldData = Request("searchString")
  strSearchOper = Request("searchOper")
  'construct where'
  strWhere = " Where " & strField

  Select Case strSearchOper
  Case "bw" : 'Begin With
   strFieldData = strFieldData & "%"
   strWhere = strWhere & " LIKE '" & strFieldData & "'"
  Case "eq" : 'Equal
   If(IsNumeric(strFieldData)) Then
     strWhere = strWhere & " = " & strFieldData
   Else
     strWhere = strWhere & " = '" & strFieldData & "'"
   End If
  Case "ne": 'Not Equal
    If(IsNumeric(strFieldData)) Then
     strWhere = strWhere & " <> " & strFieldData
    Else
     strWhere = strWhere & " <> '"& strFieldData &"'"
    End If
  Case "lt": 'Less Than
    If(IsNumeric(strFieldData)) Then
     strWhere = strWhere & " < " & strFieldData
    Else
     strWhere = strWhere & " < '"& strFieldData &"'"
    End If
  Case "le": 'Less Or Equal
    If(IsNumeric(strFieldData)) Then
     strWhere = strWhere & " <= " & strFieldData
    Else
     strWhere = strWhere & " <= '"& strFieldData &"'"
    End If
  Case "gt": 'Greater Than
    If(IsNumeric(strFieldData)) Then
     strWhere = strWhere & " > " & strFieldData
    Else
     strWhere = strWhere & " > '"& strFieldData &"'"
    End If
  Case "ge": 'Greater Or Equal
    If(IsNumeric(strFieldData)) Then
     strWhere = strWhere & " >= " & strFieldData
    Else
     strWhere = strWhere & " >= '"& strFieldData &"'"
    End If
  Case "ew" : 'End With
   strWhere = strWhere & " LIKE '%" & strFieldData & "'"
  Case "cn" : 'Contains
   strWhere = strWhere & " LIKE '%" & strFieldData & "%'"
  End Select
 End if
End If

Dim rs_user
Dim rs_user_numRows

Set rs_user = Server.CreateObject("ADODB.Recordset")
rs_user.ActiveConnection = MM_WEBINTRANET_STRING 'Provider=SQLOLEDB.1;Initial...
rs_user.Source = "SELECT invid, invdate, amount, tax,total, note FROM invheader "&strWhere&" order by "&strIdx&" "&strOrd&""
rs_user.CursorType = 0
rs_user.CursorLocation = 2
rs_user.LockType = 1
rs_user.Open()

rs_user_numRows = 0

%>
<%
Dim Repeat1__numRows
Dim Repeat1__index

Repeat1__numRows = Request.QueryString("rows") 'number line
Repeat1__index = 0
rs_user_numRows = rs_user_numRows + Repeat1__numRows
%>
<%
'  *** Recordset Stats, Move To Record, and Go To Record: declare stats variables

' set the record count
rs_user_total = rs_user.RecordCount

' set the number of rows displayed on this page
If (rs_user_numRows < 0) Then
  rs_user_numRows = rs_user_total
Elseif (rs_user_numRows = 0) Then
  rs_user_numRows = 1
End If

' set the first and last displayed record
rs_user_first = 1
rs_user_last  = rs_user_first + rs_user_numRows - 1

' if we have the correct record count, check the other stats
If (rs_user_total <> -1) Then
  If (rs_user_first > rs_user_total) Then rs_user_first = rs_user_total
  If (rs_user_last > rs_user_total) Then rs_user_last = rs_user_total
  If (rs_user_numRows > rs_user_total) Then rs_user_numRows = rs_user_total
End If
%>
<%
' *** Recordset Stats: if we don't know the record count, manually count them

If (rs_user_total = -1) Then

  ' count the total records by iterating through the recordset
  rs_user_total=0
  While (Not rs_user.EOF)
    rs_user_total = rs_user_total + 1
    rs_user.MoveNext
  Wend

  ' reset the cursor to the beginning
  If (rs_user.CursorType > 0) Then
    rs_user.MoveFirst
  Else
    rs_user.Requery
  End If

  ' set the number of rows displayed on this page
  If (rs_user_numRows < 0 Or rs_user_numRows > rs_user_total) Then
    rs_user_numRows = rs_user_total
  End If

  ' set the first and last displayed record
  rs_user_first = 1
  rs_user_last = rs_user_first + rs_user_numRows - 1
  If (rs_user_first > rs_user_total) Then rs_user_first = rs_user_total
  If (rs_user_last > rs_user_total) Then rs_user_last = rs_user_total

End If
%>
<%
' *** Move To Record and Go To Record: declare variables

Set MM_rs    = rs_user
MM_rsCount   = rs_user_total
MM_size      = rs_user_numRows
MM_uniqueCol = ""
MM_paramName = ""
MM_offset = 0
MM_atTotal = false
MM_paramIsDefined = false
If (MM_paramName <> "") Then
  MM_paramIsDefined = (Request.QueryString(MM_paramName) <> "")
End If
%>
<%
' *** Move To Record: handle 'index' or 'offset' parameter

if (Not MM_paramIsDefined And MM_rsCount <> 0) then

  ' use index parameter if defined, otherwise use offset parameter
  If Request.QueryString("page") = "" or Request.QueryString("page") = 1 Then
  page = 0
  ElseIf Request.QueryString("page") > 1 Then
  page = int(Request.QueryString("page")) * int(Request.QueryString("rows")) - int(Request.QueryString("rows"))
  else  
  page = Request.QueryString("page")
  End If
 
  r = Request.QueryString("index")
  If r = "" Then r = page
  If r <> "" Then MM_offset = Int(r)

  ' if we have a record count, check if we are past the end of the recordset
  If (MM_rsCount <> -1) Then
    If (MM_offset >= MM_rsCount Or MM_offset = -1) Then  ' past end or move last
      If ((MM_rsCount Mod MM_size) > 0) Then         ' last page not a full repeat region
        MM_offset = MM_rsCount - (MM_rsCount Mod MM_size)
      Else
        MM_offset = MM_rsCount - MM_size
      End If
    End If
  End If

  ' move the cursor to the selected record
  i = 0
  While ((Not MM_rs.EOF) And (i < MM_offset Or MM_offset = -1))
    MM_rs.MoveNext
    i = i + 1
  Wend
  If (MM_rs.EOF) Then MM_offset = i  ' set MM_offset to the last possible record

End If
%>
<%
' *** Move To Record: if we dont know the record count, check the display range

If (MM_rsCount = -1) Then

  ' walk to the end of the display range for this page
  i = MM_offset
  While (Not MM_rs.EOF And (MM_size < 0 Or i < MM_offset + MM_size))
    MM_rs.MoveNext
    i = i + 1
  Wend

  ' if we walked off the end of the recordset, set MM_rsCount and MM_size
  If (MM_rs.EOF) Then
    MM_rsCount = i
    If (MM_size < 0 Or MM_size > MM_rsCount) Then MM_size = MM_rsCount
  End If

  ' if we walked off the end, set the offset based on page size
  If (MM_rs.EOF And Not MM_paramIsDefined) Then
    If (MM_offset > MM_rsCount - MM_size Or MM_offset = -1) Then
      If ((MM_rsCount Mod MM_size) > 0) Then
        MM_offset = MM_rsCount - (MM_rsCount Mod MM_size)
      Else
        MM_offset = MM_rsCount - MM_size
      End If
    End If
  End If

  ' reset the cursor to the beginning
  If (MM_rs.CursorType > 0) Then
    MM_rs.MoveFirst
  Else
    MM_rs.Requery
  End If

  ' move the cursor to the selected record
  i = 0
  While (Not MM_rs.EOF And i < MM_offset)
    MM_rs.MoveNext
    i = i + 1
  Wend
End If
%>
<%
' *** Move To Record: update recordset stats

' set the first and last displayed record
rs_user_first = MM_offset + 1
rs_user_last  = MM_offset + MM_size
If (MM_rsCount <> -1) Then
  If (rs_user_first > MM_rsCount) Then rs_user_first = MM_rsCount
  If (rs_user_last > MM_rsCount) Then rs_user_last = MM_rsCount
End If

' set the boolean used by hide region to check if we are on the last record
MM_atTotal = (MM_rsCount <> -1 And MM_offset + MM_size >= MM_rsCount)
%>
<%
' *** Go To Record and Move To Record: create strings for maintaining URL and Form parameters

' create the list of parameters which should not be maintained
MM_removeList = "&index="
If (MM_paramName <> "") Then MM_removeList = MM_removeList & "&" & MM_paramName & "="
MM_keepURL="":MM_keepForm="":MM_keepBoth="":MM_keepNone=""

' add the URL parameters to the MM_keepURL string
For Each Item In Request.QueryString
  NextItem = "&" & Item & "="
  If (InStr(1,MM_removeList,NextItem,1) = 0) Then
    MM_keepURL = MM_keepURL & NextItem & Server.URLencode(Request.QueryString(Item))
  End If
Next

' add the Form variables to the MM_keepForm string
For Each Item In Request.Form
  NextItem = "&" & Item & "="
  If (InStr(1,MM_removeList,NextItem,1) = 0) Then
    MM_keepForm = MM_keepForm & NextItem & Server.URLencode(Request.Form(Item))
  End If
Next

' create the Form + URL string and remove the intial '&' from each of the strings
MM_keepBoth = MM_keepURL & MM_keepForm
if (MM_keepBoth <> "") Then MM_keepBoth = Right(MM_keepBoth, Len(MM_keepBoth) - 1)
if (MM_keepURL <> "")  Then MM_keepURL  = Right(MM_keepURL, Len(MM_keepURL) - 1)
if (MM_keepForm <> "") Then MM_keepForm = Right(MM_keepForm, Len(MM_keepForm) - 1)

' a utility function used for adding additional parameters to these strings
Function MM_joinChar(firstItem)
  If (firstItem <> "") Then
    MM_joinChar = "&"
  Else
    MM_joinChar = ""
  End If
End Function
%>
<%
' *** Move To Record: set the strings for the first, last, next, and previous links

MM_keepMove = MM_keepBoth
MM_moveParam = "index"

' if the page has a repeated region, remove 'offset' from the maintained parameters
If (MM_size > 0) Then
  MM_moveParam = "page"
  If (MM_keepMove <> "") Then
    params = Split(MM_keepMove, "&")
    MM_keepMove = ""
    For i = 0 To UBound(params)
      nextItem = Left(params(i), InStr(params(i),"=") - 1)
      If (StrComp(nextItem,MM_moveParam,1) <> 0) Then
        MM_keepMove = MM_keepMove & "&" & params(i)
      End If
    Next
    If (MM_keepMove <> "") Then
      MM_keepMove = Right(MM_keepMove, Len(MM_keepMove) - 1)
    End If
  End If
End If

' set the strings for the move to links
If (MM_keepMove <> "") Then MM_keepMove = MM_keepMove & "&"
urlStr = Request.ServerVariables("URL") & "?" & MM_keepMove & MM_moveParam & "="
MM_moveFirst = urlStr & "0"
MM_moveLast  = urlStr & "-1"
MM_moveNext  = urlStr & Cstr(MM_offset + MM_size)
prev = MM_offset - MM_size
If (prev < 0) Then prev = 0
MM_movePrev  = urlStr & Cstr(prev)
%>
<%
TM_counter = 0
For i = 1 to rs_user_total Step MM_size
TM_counter = TM_counter + 1
TM_PageEndCount = i + MM_size - 1
next
%>
<%
'Response.Write "<?xml version='1.0' encoding='ISO-8859-1'?>" & vbcrlf !for accents
Response.Write "<?xml version='1.0' encoding='UTF-8'?>" & vbcrlf
Response.Write  "<rows>" & vbcrlf
Response.Write "<page>"&Request("page")&"</page>" & vbcrlf
Response.Write "<total>"&TM_counter&"</total>" & vbcrlf
Response.Write "<records>"&rs_user_total&"</records>" & vbcrlf  
 
While ((Repeat1__numRows <> 0) AND (NOT rs_user.EOF))
%>
<%
total = total + 1

Response.Write "<row id='" & total & "'>" & vbcrlf
Response.Write "<cell><![CDATA[" & Trim(rs_user.Fields.Item("invid").Value) & "]]></cell>" & vbcrlf              
Response.Write "<cell><![CDATA[" & Trim(rs_user.Fields.Item("invidate").Value) & "]]></cell>" & vbcrlf     
Response.Write "<cell><![CDATA[" & Trim(rs_user.Fields.Item("amount").Value) & "]]></cell>" & vbcrlf        
Response.Write "<cell><![CDATA[" & Trim(rs_user.Fields.Item("tax").Value) & "]]></cell>" & vbcrlf     
Response.Write "<cell><![CDATA[" & Trim(rs_user.Fields.Item("total").Value) & "]]></cell>" & vbcrlf
Response.Write "</row>" & vbcrlf    
 
  Repeat1__index=Repeat1__index+1
  Repeat1__numRows=Repeat1__numRows-1
  rs_user.MoveNext()
Wend
Response.Write "</rows>"
%>
<%
rs_user.Close()
Set rs_user = Nothing
%>

bye

Roca

18/08/2010
21:38
Avatar
Groxx
New Member
Members
Forum Posts: 2
Member Since:
17/08/2010
sp_UserOfflineSmall Offline

If you're using T-SQL 2005 or later with MSSQL, there's a much easier way:

select Paged.* from (

[Your select statement goes here, and include this column:]

ROW_NUMBER() over (order by [order you desire in the end]) as RowNum

) as Paged

where Paged.RowNum between @start and @end

order by Paged.RowNum ;

And viola :)  Full pagination, all on the DB, and significantly faster if you'd be returning many rows.  If you want to find the number of rows, just include a column like this in the inner query:

COUNT(*) over () as NumRecords

And each row will now have that column, all of which contain the total count built by the query.  From there, finding your page looks like this in VB:

Dim records As Integer = Integer.parse(<DataTable>.Rows(0)("NumRecords"))

Dim pages As Integer = 0

pages = -Int(-(records* 1.0 / <DataTable>.Rows.Count * 1.0)) ' Ceil w/ decimal division.

Forum Timezone: Europe/Sofia

Most Users Ever Online: 994

Currently Online:
19 Guest(s)

Currently Browsing this Page:
1 Guest(s)

Top Posters:

OlegK: 1255

markw65: 179

kobruleht: 144

phicarre: 132

YamilBracho: 124

Renso: 118

Member Stats:

Guest Posters: 447

Members: 11373

Moderators: 2

Admins: 1

Forum Stats:

Groups: 1

Forums: 8

Topics: 10592

Posts: 31289

Newest Members:

, razia, Prankie, psky, praveen neelam, greg.valainis@pa-tech.com

Moderators: tony: 7721, Rumen[Trirand]: 81

Administrators: admin: 66

Comments are closed.
Privacy Policy   Terms and Conditions   Contact Information