大家来说说用karrigell开发WEB程序的分页思路.

大家来说说用karrigell开发WEB程序的分页思路.

不可能在一个页面中显示太多数据,不合理,也难看,所以采用分页方式.
我正在做这个东东,请大家提供一点好的思路.


QUOTE:
原帖由 sunny3super 于 2006-5-26 22:34 发表
不可能在一个页面中显示太多数据,不合理,也难看,所以采用分页方式.
我正在做这个东东,请大家提供一点好的思路.

客户端页面显示两类数据,页数、当前页包含的记录。这两个数据结构设计好了,这个功能处理就比较清楚。
一般而言,服务器端根据条件搜索出所有记录,根据分页参数(多少条记录/页)计算出页数,客户端发送请求调阅对应记录。具体实现方式参照具体应用来设计。
楼上说的没有错,不过我的思路还不成熟, 举例代码如下:我用MSSQLSERVER2000的.
...
...
<%
Man_Cur=conn.cursor()
Man_sql='select * from Fabric where Add_person='+ "'"+so.login+"'" +'order by CreationDate desc'
Man_Cur.execute(Man_sql)
%>
到这里为止,已经取出了记录.
maxnum=Man_Cur.rowcount  得到总记录数
pagenum=20 设置每一页显示20条记录

由上面两个东东可以得到总页数,比如为 maxpage
当前页用 curpage 表示

浏览商品的页面为 search.pih 或者为 search.hip
如何用 如下方式分页显示 search.pih?page=2

关于分页函数的思路怎么继续下去呢.

如果在ASP里面ADO会提供一个记录数,所以翻到上一页,下一页
好像能记录绝对地址一样.

郁闷中????
继续想办法解决问题.
一般的数据库的select语句都应该支持limit和offset吧?
楼上的怎么又来asp了?真是搞不明白


QUOTE:
原帖由 sunny3super 于 2006-5-27 12:03 发表
楼上说的没有错,不过我的思路还不成熟, 举例代码如下:我用MSSQLSERVER2000的.
...
...
<%
Man_Cur=conn.cursor()
Man_sql='select * from Fabric where Add_person='+ "'"+so.login+"'&qu ...

如你所述:
客户端request-》search.pih?page=2
服务器端reponse-》对应页面数据记录集,这个数据集是写页面返回还是用ajax方式只返回一个数据包(JSON或XML)看你的设计。
推荐你用ajax方式实现,客户端可采用mochikit库,服务器端使用karrigell的ks脚本实现,ks脚本的作用就是一个任务分发引擎,可以再写一个专门数据读取并做分页处理的类,ks脚本调用这个类返回数据记录集和分页索引。
归纳起来就是:
客户端ajax组件-》搜索请求-》服务器端ks脚本-》响应请求,调相关类-》返回数据集(页面总数,当前页,当前页面包含的记录集)-》客户端接收数据集,展现数据。
调试时,建议分层次实现,例如:先做一个包括多行数据记录的文件,接着做一个对这个数据文件进行处理的类(先写接口,数据写入、数据读出、数据更改等等),再用ks脚本调用这个类并返回给客户端页面文件,最后完成客户端页面组件(ajax)和数据库对接。
总的指导原则是先构建数据对象,接着实现对数据对象处理的组件,最后将这个组件与应用处理流程联调。

有点高深,还不是很了解.我继续想办法.
谢谢大家.
其实分页正如前面所述,就是通过offset来设定起始的位置,limit用来设置取多少条记录。这样就起到了分页的效果。通过设置上一下,下一页来设定上页和下面的起始位置即可。

有直接通过页号,有通过起始记录数,意思是一样的。

如果你使用django的话,它自带一个分页处理的类,会更方便。
多谢limodou  兄弟,我采用你说的后一种方法,我在表上建立了一个自增量字段,如果每一页显示20条的话,
就select top 20 * from table1 where id条件 order by id desc,上一页,下一页就在于ID条件的设定,

不过我第一次打开的时候我没有ID限制的,直接TOP 20 * 的.

谢谢大家.
另外可以用offset,不过我觉得很慢,效率不高,
比我 我打开了一个表 select * from table1 where id>1
total=cur.rowcount
if total % 20>1:
   totalpage=total/20 + 1 #每一页显示20条记录.
else:
   totalpage=total/20  #totalpage是总页数.
如果用offset 的方式 每翻一页就要打开一次这个表,(我感觉很浪费,很多数据是多余的,效率不高),然后用offset定位,然后 fetchmany(20)得到该页的数据,如果在数据量大的情况下,效率不高呀.
比如:我要显示第8页的记录.
cur.offset(20*7)
cur.fetchmany(20) #得到第八页的数据.然后显示出来,
数据量大就浪费了,效率低,好象游标一样.

不知道我分析是否有道理,或者有更好的办法,请大家指点.

所以我采用了用ID来定位的方法,每次取20条很快的.
我理解有错误。
offset limit用于select 语句中,cur.offset(20)是错误的,纠正。
select * from table1 limit 140,20