以FRDemo内置的sqlite为例,说明sqlite如何写分页查询。
新建数据集ds1:SELECT * FROM 订单明细。
在数据查询面板中点击分页查询按钮,编辑分页SQL语句,如下图:

完整的sql语句如下:
注:上述代码放置在分页sql面板中时,要删除后面的注释语句,并且语句中的三次ORDER BY 一定不能丢。
分页sql语句注释
${if(fr_pagenumber ==int( (((fr_rowcount-1)/fr_pagesize)+1)),fr_rowcount - (fr_pagesize*(fr_pagenumber-1)),fr_pagesize)}
意思是:
假如是最后一页的话,就取最后一页剩余的行数,假如不是最后一页就取每页需要显示的行数,示例中每页需要显示的行数为30行。
fr_pagenumber:当前浏览的页数,如果预览第2页,则fr_pagenumber=2;
fr_rowcount:当前数据集的总数据条数;
fr_pagesize:表示设置行式引擎时,每页需显示的行数,该示例中fr_pagesize=30.
在预览时,设定的分页查询根据3个变量的值,会生成数据库查询,如fr_pagenumber=2,fr_pagesize=30时,即在web端预览报表,预览至第2页时,上面的sql语句会转化为:
SELECT * FROM ( SELECT * FROM ( SELECT * FROM 订单明细 ORDER BY 订单ID ASC limit 60 )AS e1 ORDER BY 订单ID DESC limit30 ) AS e2 ORDER BY 订单ID ASC
预览至第3页时,fr_pagenumber=3,sql语句就转化为:
SELECT * FROM ( SELECT * FROM ( SELECT * FROM 订单明细 ORDER BY 订单ID ASC limit 90 )AS e1 ORDER BY 订单ID DESC limit30) AS e2 ORDER BY 订单ID ASC
预览至最后一页时,所剩下的数据可能不足30行,那么sql语句又会转化成什么样呢?
如果fr_rowcount=100,fr_pagesize=30,即数据总行数为100行,每页显示30行,预览至最后一页,也就是第4页时,fr_pagenumber=4,sql语句将转换为:
SELECT * FROM ( SELECT * FROM ( SELECT * FROM 订单明细 ORDER BY 订单ID ASC limit 120)AS e1 ORDER BY 订单ID DESC limit10 ) AS e2 ORDER BY 订单ID ASC
将数据集中的数据列拖曳至单元格中,如下图:

3.4 行式引擎设置
点击分页预览,效果图如下:

已完成模板请参照:
%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Advanced\PagingSql.cpt