数据库分页算法类 仿LeadBBS

原创 2005年04月24日 18:46:00

Class Pg_Jet_Ex

      Private sCodeVer, sCodeName, sCoder, sDis
      Private Toward, Backward, TowardOrder, BackwardOrder
      Private IdxSql, QuerySql
      Public Conn
      Public PageCount, ItemCount, PageItemCount
      Public PageLast, PageStart
      Public ViewPage, ToPage, Division, StepPage, StartID
      Public OrderKey, OrderMode
      Public IdxTable, IdxKey, IdxWhere
      Public QueryTable, QueryKeys, QueryWhere

      Private Sub Class_Initialize()
            sCodeVer = "1.1.050115"
            sCodeName = "JetPage Leader!"
            sCoder = "ashi"
            sDis = "数据分页类。"
            ViewPage = 1            '浏览页面
            ToPage = 1                  '去往页面
            Division = 20            '每页显示数目
            StepPage = 5            '允许最大跳转页数
            StartID = 0                  '索引查询开始记录号,优化查询
            PageCount = 0            '页面总数
            ItemCount = 0            '记录总数
            OrderKey = "id"            '排序字段,使用数据库中的索引字段,存在于索引表和数据表中的共有数据,在表中具有唯一值
            OrderMode = "asc"      '排序方式
            IdxKey = "id"            '索引字段名称,存在于索引表和数据表中的共有字段
            IdxTable = ""            '索引表
            IdxWhere = ""            '索引表Where
            QueryKeys = ""            '查询字段名称
            QueryTable = ""            '查询表
            QueryWhere = ""            '查询表Where
      End Sub
     
      Private Sub OrderChoose()
            Select Case LCase(OrderMode)
                  Case "desc"
                        OrderMode = "desc"
                        Toward = "<"
                        TowardOrder = "desc"
                        Backward = ">"
                        BackwardOrder = "asc"
                  Case Else
                        OrderMode = "asc"
                        Toward = ">"
                        TowardOrder = "asc"
                        Backward = "<"
                        BackwardOrder = "desc"
            End Select
      End Sub
     
      Private Sub CountPage()
            Dim Rs, Sql, sT
            If IdxWhere <> "" Then sT = " Where " & IdxWhere
            Sql = "Select Count(*) From " & IdxTable & sT
            'Debug.addsql(Sql)
            'Sys.Dbplus()
            Set Rs = Conn.ExeCute(Sql)
            If Not Rs.Eof Then
                  ItemCount = cCur(Rs(0))
            End If
            Rs.Close()
            Set Rs = Nothing
      End Sub
     
      Private Sub ListPage()
            Dim iMovePg, iaMovePg
            Dim iTop, iDis, i, itc
            Dim iMode
            Dim Rs, at, aw, sw
            Dim st
           
            PageCount = ItemCount / Division
            If ItemCount Mod Division > 0 Then PageCount = PageCount + 1

            If ToPage =< 1 Then
                  iMode = 1
            ElseIf ToPage >= PageCount Then
                  if StartId <= 0 Then
                        iMode = -1
                  Else
                        iMode = 0
                        iMovePg = ToPage - ViewPage
                        iaMovePg = Abs(iMovePg)
                        iTop = iaMovePg * Division
                        iDis = iTop - Division
                        If iaMovePg > StepPage Or iaMovePg = 0 Then iMode = -1
                        If StartID =< 0 Then iMode = -1
                  End If
            Else
                  iMode = 0
                  iMovePg = ToPage - ViewPage
                  iaMovePg = Abs(iMovePg)
                  iTop = iaMovePg * Division
                  iDis = iTop - Division
                  If iaMovePg > StepPage Or iaMovePg = 0 Then iMode = 1
                  If StartID =< 0 Then iMode = 1
            End If
                       
            If IdxWhere <> "" Then st = " Where " & IdxWhere
           
            Select Case iMode
                  Case 1
                        ToPage = 1
                        iTop = Division
                        iDis = 0
                        iMovePg = 1
                        If PageCount = 1 Then iTop = ItemCount
                        IdxSql = "Select Top " & iTop & " " & IdxKey & " From " & IdxTable & st & " Order By " & OrderKey & " " & TowardOrder
                  Case -1
                        ToPage = PageCount
                        iTop = ItemCount - (PageCount - 1) * Division
                        iDis = 0
                        iMovePg = -1
                        IdxSql = "Select Top " & iTop & " " & IdxKey & " From " & IdxTable & st & " Order By " & OrderKey & " " & BackwardOrder
                  Case 0
                        If IdxWhere <> "" Then st = IdxWhere & " And "
                        If iMovePg < 0 Then
                              IdxSql = "Select Top " & iTop & " " & IdxKey & " From " & IdxTable & " Where " & st & OrderKey & Backward & StartID & " Order By " & OrderKey & " " & BackwardOrder
                        Else
                              IdxSql = "Select Top " & iTop & " " & IdxKey & " From " & IdxTable & " Where " & st & OrderKey & Toward & StartID & " Order By " & OrderKey & " " & TowardOrder
                        End If
            End Select

            Set Rs = Conn.Execute(IdxSql)
            'Debug.AddSql IdxSql
            'Sys.Dbplus
           
            If Rs.Eof Then
                  Rs.Close()
                  Set Rs = Nothing
                  Set Conn = Noting
                  Sys.ShowErr sCodeName, sCodeVer, "未找到请求的索引(" & IdxSql & ")。"
            Else
                  If iDis > 0 Then Rs.Move(iDis)
                  If Rs.Eof Then
                        Rs.Close()
                        Set Rs = Nothing
                        ToPage = 1
                        ListPage()
                        Exit Sub
                  End If
                  aw = Rs.GetRows(-1)
                  Rs.Close()
                  Set Rs = Nothing
                  itc = Ubound(aw,2)
                  ReDim At(itc)
                  For i = 0 To itc
                        at(i) = aw(0, i)
                  Next
                  aw = Empty
                  If iMovePg < 0 Then
                        PageStart = at(itc)
                        PageLast = at(0)
                  Else
                        PageStart = at(0)
                        PageLast = at(itc)
                  End If
                  If isNumeric(at(0)) Then
                        sw = Join(at, ",")
                  Else
                        sw = "'" & join(at, "','") & "'"
                  End If
                  If QueryWhere <> "" Then
                        QueryWhere = QueryWhere & " And "
                  End If                       
                  QuerySql = "Select " & QueryKeys & " From " & QueryTable & " Where " & QueryWhere & IdxKey & " In(" & sw & ") Order By " & OrderKey & " " & OrderMode
                  'Debug.addsql(QuerySql)
                  'Sys.Dbplus()
            End If
           
            PageItemCount = iTc + 1
            ViewPage = ToPage
      End Sub
     
      Public Property Get Rec()
            If ItemCount = 0 Then
                  CountPage()
            End If
            OrderChoose()
            ListPage()
            Rec = Conn.Execute(QuerySql).Getrows(-1)
      End Property

End Class

调用实例:

Dim obj
Set obj = New Pg_Jet_Ex

With obj
     .Division = 20
     .IdxKey = "ID"
     .IdxTable = "markList"
     .QueryKeys = "考号,姓名,语文总分"
     .QueryTable = "markList"
     .StepPage = 5
     .ViewPage = sys.Requestnum("p")
     .ToPage = sys.Requestnum("t")
     .StartId = sys.Requestnum("s")
     .OrderKey = "Id"
     .OrderMode = "asc"
     .ItemCount = 375
     Set .Conn = mCon
     Rs = .Rec
     Set .Conn = Nothing
     Set mcon = Nothing
End With
With xs
.load "plug_mark2"
.OpenTag "marks"
     .Tag "item"
           For i = 0 To obj.pageitemcount - 1
                 .pVar(Array("序号","考号","姓名","语文总分")) = Array(i+1,rs(0,i),rs(1,i),rs(2,i))
           Next
     .EndTag
     .pVar("startid") = obj.PageStart
     .pVar("endid") = obj.PageLast
     .pVar("viewpage") = obj.viewpage
     .pVar("pagecount") = obj.pagecount
     .pVar("itemcount") = obj.itemcount
     .pVar("division") = obj.division
     If b Then .pVar("ableorder") = ""
.EndTag
.res
End With

 

生成链接条的客户端脚本

           <script language="javascript">
           vpg=<xsl:value-of select="marks/viewpage" />;
           sid=<xsl:value-of select="marks/startid" />;
           eid=<xsl:value-of select="marks/endid" />;
           pagecount=<xsl:value-of select="marks/pagecount" />;
           itemcount=<xsl:value-of select="marks/itemcount" />;
           <xsl:text disable-output-escaping="yes">

           if(vpg>1){
                 document.write("<a href=netx.asp?t=1>首页</a> <a href=netx.asp?p="+vpg+"&t="+(vpg-1)+"&s="+sid+">上一页</a>")
           }
           else{
           document.write("<span disabled>首页 上一页</span>")
           }
           document.write(" 页面: "+vpg+" / "+pagecount+" 统计: "+itemcount+" 条记录 ");
           if(vpg<pagecount){
                 document.write("<a href=netx.asp?p="+vpg+"&t="+(vpg+1)+"&s="+eid+">下一页</a> <a href=netx.asp?t="+pagecount+">尾页</a>")
           }
           else{
                 document.write("<span disabled>下一页 尾页</span>")
           }

           </script>

因为我的模板用的是xslt所以,大家凑合看

数据库分页方法总结

在做Java Web项目的时候,项目经常要求能够兼容各种主流数据库,
  • zht666
  • zht666
  • 2014年06月08日 15:59
  • 2309

数据库 分页优化的四种方式

很久以前读了一篇关于分页的文章,后来越想越有道理,最近又重新找出来,并做了翻译,原文参考:Four ways to optimize paginated displays.翻译背景:在大数据量的情况下...
  • qilixiang012
  • qilixiang012
  • 2015年06月04日 20:51
  • 1634

常用3种数据库的Sql分页

在程序的开发过程中,处理分页是大家接触比较频繁的事件,因为现在软件基本上都是与数据库进行挂钓的。但效率又是我们所追求的,如果是像原来那样把所有满足条件的记录全部都选择出来,再去进行分页处理,那么就会多...
  • diligentcat
  • diligentcat
  • 2013年11月04日 10:54
  • 1862

不同数据库分页总结

总结下主流的MYSQL,sqlSever 和oracle的数据库的分页代码,如下: MySQL:select * from TableName where …… limit start_th , c...
  • polarbear_gh
  • polarbear_gh
  • 2014年12月22日 16:49
  • 1373

再一个CrackMe的算法分析

算法比较简单,算法也比较经典。原作者的注册算法好像有点问题,因为0-9数字间的任意两个数相加不会等于6D。还是帖出来。00450062    55                    push eb...
  • qingye2008
  • qingye2008
  • 2007年11月05日 14:57
  • 623

热点新闻算法

1、爬取各大网站的热点数据,统计点击量和评论数等。 2、
  • xiaming564
  • xiaming564
  • 2014年07月09日 21:09
  • 478

几个面试经典算法题Java解答

几个面试经典算法题Java解答 题目一: public class testClockwiseOutput { //顺时针打印一个矩阵 @Test public void test()...
  • huangshulang1234
  • huangshulang1234
  • 2017年11月26日 08:43
  • 120

快速排序实现以及优化

SortTestHelper为辅助类,在我插入排序那篇文章有 SOrtTestHelPer快速排序原理:假设我们现在对“6 1 2 7 9 3 4 5 10 8”这 10 个数进行排序。首先在这个序...
  • qq_30034925
  • qq_30034925
  • 2017年10月11日 14:08
  • 214

算法解题步骤

初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(...
  • sysstc
  • sysstc
  • 2012年09月28日 21:52
  • 1686

数据库分页

用来返回某一页上显示的部分帖子: /**    *  Get the top-level threads under the given category from start index    * ...
  • lwqadmin
  • lwqadmin
  • 2004年09月20日 15:07
  • 571
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库分页算法类 仿LeadBBS
举报原因:
原因补充:

(最多只允许输入30个字)