報表性能優化方案之單數據集分頁SQL實現層式報表

一、概述mysql

咱們知道,行式引擎按頁取數只適用於Oracle,mysql,hsql和sqlserver2008及以上數據庫,其餘數據庫,如access,sqlserver2005,sqlite等必須編寫分頁SQL。web

下面以Access數據庫爲例介紹須要寫分頁SQL的數據庫怎樣利用行式的引擎實現層式報表。sql

解決方案提供工具:報表開發工具FineReport數據庫

二、解決思路工具

對於mysql這類能夠直接使用行式的引擎實現層式報表的數據庫來講,若是勾選了行式引擎,程序會自動生成分頁sql,如,我新建了一個數據集ds1,來源於mysql數據庫,基本sql語句爲:sqlserver

SELECT * FROM 訂單明細開發工具

若是不定義分頁sql,勾選行式引擎選項,預覽報表時,程序會將上面的sql語句轉化爲下面的語句來取一頁的數據:spa

SELECT COUNT(*)AS totalRowCount FROM (SELECT * FROM 訂單明細) t設計

若是數據庫是上面所說的access一類的沒法直接生成分頁sql的數據庫,那麼就須要編寫分頁SQL。code

三、操做步驟

以FRDemo內置的sqlite爲例,說明sqlite如何寫分頁查詢。

注:sqlserver2005和sqlite操做步驟同樣。

3.1新建數據集

新建數據集ds1:SELECT * 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%\WebReport\WEB-INF\reportlets\doc\Advanced\PagingSql.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
相關文章
相關標籤/搜索