zoukankan      html  css  js  c++  java
  • 报表性能优化方案之单数据集分页SQL实现层式报表


    1、概述

    我们知道,行式引擎按页取数只适用于Oracle,mysql,hsql和sqlserver2008及以上数据库,其他数据库,如access,sqlserver2005,sqlite等必须编写分页SQL。

    下面以Access数据库为例介绍需要写分页SQL的数据库怎样利用行式的引擎实现层式报表。

    解决方案提供工具:报表开发工具FineReport

    2、解决思路

    对于mysql这类可以直接使用行式的引擎实现层式报表的数据库来说,如果勾选了行式引擎,程序会自动生成分页sql,如,我新建了一个数据集ds1,来源于mysql数据库,基本sql语句为:

    SELECT * FROM 订单明细

    如果不定义分页sql,勾选行式引擎选项,预览报表时,程序会将上面的sql语句转化为下面的语句来取一页的数据:

    SELECT COUNT(*)AS totalRowCount FROM (SELECT * FROM 订单明细) t

    如果数据库是上面所说的access一类的无法直接生成分页sql的数据库,那么就需要编写分页SQL。

    3、操作步骤

    以FRDemo内置的sqlite为例,说明sqlite如何写分页查询。

    注:sqlserver2005和sqlite操作步骤一样。

    3.1新建数据集

    新建数据集ds1SELECT * FROM 订单明细

    3.2添加分页查询SQL语句

    在数据查询面板中点击分页查询按钮,编辑分页SQL语句,如下图:


    完整的sql语句如下:

     

       SELECT *     
         FROM (    
                 SELECT  *        
                  FROM(    
                       SELECT *     
                           FROM 订单明细 ORDER BY 订单ID ASC limit ${fr_pagesize*fr_pagenumber}     
                        ) AS e1 ORDER BY 订单ID DESC limit ${    
                             if(fr_pagenumber == int((((fr_rowcount-1)/fr_pagesize)+1)),fr_rowcount - (fr_pagesize*(fr_pagenumber-1)),fr_pagesize)    
                             }  
             ) AS e2 ORDER BY 订单ID ASC    

    注:上述代码放置在分页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 DESClimit30 ) 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 DESClimit30) 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 90)AS e1 ORDER BY 订单ID DESClimit10 ) AS e2 ORDER BY 订单ID ASC

    3.3报表主体设计

    将数据集中的数据列拖曳至单元格中。

    3.4行式引擎设置

    上一节的设置方法,这里不再赘述。

    3.5效果查看

    点击分页预览,效果图如下:

    已完成模板请参照:%FR_HOME%WebReportWEB-INF eportletsdocAdvancedPagingSql.cpt

    3.6数据库的分页SQL语句

       SELECT *     
               FROM (    
                  SELECT TOP ${    
                                 if(fr_pagenumber == int((((fr_rowcount-1)/fr_pagesize)+1)),fr_rowcount - (fr_pagesize*(fr_pagenumber-1)),fr_pagesize)    
                                } *        
                   FROM(    
                            SELECT TOP ${fr_pagesize*fr_pagenumber} *     
                           FROM 订单明细 ORDER BY 订单ID ASC      
                          ) AS e1 ORDER BY 订单ID DESC   
                 ) AS e2 ORDER BY 订单ID ASC  



     

  • 相关阅读:
    Vue 中样式穿透 /deep/
    Vue 数据冻结 Object.freeze
    Vue 启动项目内存溢出
    Typora[ markdown ] 使用3之----- 语法高亮显示
    Typora[ markdown ] 使用2之-----空格显示
    手动创建mysql数据库的语句记录
    api不能自动注入条件的解决方法
    【WTM框架】查询列表显示正常,但是导出的时候查询条件不起作用的问题记录及解决方法
    WTM问题之“数据列表”控件出现横向的滚动条的解决方法
    树莓派docker无法限制内存Your kernel does not support memory limit capabilities or the cgroup is not mounted
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13326119.html
Copyright © 2011-2022 走看看