很早就写的,现在总结出来权当抛砖引玉啦:) 请大家说说算法上如何优化
<% ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '' '' PageDiv.asp '' '' Version: 1.0 Last-Modified: 2004-10-28 10:16 '' Copyright: Xinsoft@newX.org ( CTO of UnionIT.org ) '' '' 分页类(通用) '' '' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' %> <% Class ListDiv
Public Flag ' as Integer
Private RecordSet ' as ADODB.RecordSet Private Connection ' as ADODB.Connection
Public DivNum ' as Integer Public PageN ' as Integer Public CurN ' as Integer Public CurPage ' as Integer Public IdxColType ' as String ' -- char ' -- int Public IndexSQL ' as String Public ListSQLB ' as String Public ListSQLE ' as String Public IdxStr ' as String Public RecN ' as Integer
Public RowA,RowN ' A pair of Array
Public LinkStrB ' as String Public LinkStrE ' as String Public LinkStyle ' as String
Property Let Conn(objConn) Connection.ConnectionString=objConn.ConnectionString End Property Property Get Conn() Conn=Connection.ConnectionString End Property
Private Sub Class_Initialize Flag=1 DivNum=10 PageN=0 CurN=0 CurPage=1 IdxColType="char" LinkStyle="default" Set RecordSet=Server.CreateObject("ADODB.RecordSet") Set Connection=Server.CreateObject("ADODB.Connection") End Sub Private Sub Class_Terminate Set RecordSet=Nothing Set Connection=Nothing End Sub
Public Sub Exec()
If Not IsNumeric(CurPage) Then CurPage=1 If CurPage<1 Then CurPage=1 '' 获取索引字段值列表 Dim RecA,i,N Connection.Open RecordSet.Open IndexSQL,Connection,1,1 RecN=RecordSet.RecordCount If RecN>0 Then RecA=RecordSet.GetRows Else Flag=0 Exit sub End if RecordSet.Close '' 计算页数 PageN=Int(RecN / DivNum)+1 If DivNum*(PageN-1)=RecN Then PageN=PageN-1 End if If CurPage>PageN Then CurPage=PageN If PageN>1 Then If CurPage=PageN Then CurN=RecN-(CurPage-1)*DivNum Else CurN=DivNum End if Else CurN=RecN End If '' 索引数组 Dim IdxA ReDim IdxA(CurN) For i=0 To CurN-1 IdxA(i)=RecA(0,(CurPage-1)*DivNum+i) Next Dim DotChar Select Case LCase(IdxColType) Case "int" : DotChar="" Case "char" : DotChar="'" Case Else : DotChar="'" End select IdxStr="" If CurN>0 Then IdxStr=DotChar& IdxA(0) &DotChar If CurN>1 Then For i=1 To CurN-1 IdxStr=IdxStr&","&DotChar&IdxA(i)&DotChar Next End if End If '' 获取实际列表 RecordSet.Open ListSQLB &IdxStr& ListSQLE,Connection,1,1 RowN=RecordSet.RecordCount If RowN>0 Then RowA=RecordSet.GetRows Else Flag=0 Exit sub End if RecordSet.Close Connection.Close End Sub
Public Function GetPageDivBar() Dim Str Dim i Str="" If CurPage>1 Then Str=Str&"<a href="""& LinkStrB & CStr(CurPage-1) & LinkStrE &""">上一页</a>" Else Str=Str&"上一页" End If Str=Str&" 第"&CurPage&"页/共"&PageN&"页,每页"&DivNum&"条记录,共"&RecN&"条记录 " If CurPage<PageN Then Str=Str & "<a href="""&LinkStrB&CStr(CurPage+1)&LinkStrE&""">下一页</a>" Else Str=Str & "下一页" End if GetPageDivBar=Str End Function
End Class %> |
这是调用的例子:
<% Dim objListDiv Set objListDiv=New ListDiv With objListDiv .Conn=Conn .IdxColType="int" .IndexSQL="Select PeriodID From Xiworld Where Flag=1 Order by PeriodID Desc" .ListSQLB="Select PeriodID,YearVal,YearPid,DocURL From Xiworld Where PeriodID in (" .ListSQLE=") Order by PeriodID Desc" .DivNum=15 .CurPage=CurPage .LinkStrB="list.asp?page=" .LinkStrE="" End With objListDiv.Exec %> |
|