亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 3374 | 回復: 0
打印 上一主題 下一主題

[JavaScript] 報表性能優(yōu)化方案之單數(shù)據(jù)集分頁SQL實現(xiàn)層式報表 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2015-09-08 16:48 |只看該作者 |倒序瀏覽
1、概述

我們知道,行式引擎按頁取數(shù)只適用于Oracle,mysql,hsql和sqlserver2008及以上數(shù)據(jù)庫,其他數(shù)據(jù)庫,如access,sqlserver2005,sqlite等必須編寫分頁SQL。

下面以Access數(shù)據(jù)庫為例介紹需要寫分頁SQL的數(shù)據(jù)庫怎樣利用行式的引擎實現(xiàn)層式報表。

解決方案提供工具:報表開發(fā)工具FineReport

2、解決思路

對于mysql這類可以直接使用行式的引擎實現(xiàn)層式報表的數(shù)據(jù)庫來說,如果勾選了行式引擎,程序會自動生成分頁sql,如,我新建了一個數(shù)據(jù)集ds1,來源于mysql數(shù)據(jù)庫,基本sql語句為:

SELECT * FROM 訂單明細

如果不定義分頁sql,勾選行式引擎選項,預覽報表時,程序會將上面的sql語句轉化為下面的語句來取一頁的數(shù)據(jù):
  1. SELECT COUNT(*)AS totalRowCount FROM (SELECT * FROM 訂單明細) t
復制代碼
如果數(shù)據(jù)庫是上面所說的access一類的無法直接生成分頁sql的數(shù)據(jù)庫,那么就需要編寫分頁SQL。

3、操作步驟

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

注:sqlserver2005和sqlite操作步驟一樣。

3.1新建數(shù)據(jù)集

新建數(shù)據(jù)集ds1:SELECT * FROM 訂單明細。

3.2添加分頁查詢SQL語句

在數(shù)據(jù)查詢面板中點擊分頁查詢按鈕,編輯分頁SQL語句,如下圖:



完整的sql語句如下:
  1. [javascript] view plaincopy
  2. SELECT *      
  3.   FROM (      
  4.           SELECT  *         
  5.            FROM(      
  6.                 SELECT *      
  7.                     FROM 訂單明細 ORDER BY 訂單ID ASC limit ${fr_pagesize*fr_pagenumber}      
  8.                  ) AS e1 ORDER BY 訂單ID DESC limit ${      
  9.                       if(fr_pagenumber == int((((fr_rowcount-1)/fr_pagesize)+1)),fr_rowcount - (fr_pagesize*(fr_pagenumber-1)),fr_pagesize)      
  10.                       }   
  11.       ) 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)}意思是:

假如是最后一頁的話,就取最后一頁剩余的行數(shù),假如不是最后一頁就取每頁需要顯示的行數(shù),示例中每頁需要顯示的行數(shù)為30行。

fr_pagenumber:當前瀏覽的頁數(shù),如果預覽第2頁,則fr_pagenumber=2;

fr_rowcount:當前數(shù)據(jù)集的總數(shù)據(jù)條數(shù);

fr_pagesize:表示設置行式引擎時,每頁需顯示的行數(shù),該示例中fr_pagesize=30.

在預覽時,設定的分頁查詢根據(jù)3個變量的值,會生成數(shù)據(jù)庫查詢,如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

預覽至最后一頁時,所剩下的數(shù)據(jù)可能不足30行,那么sql語句又會轉化成什么樣呢?

如果fr_rowcount=100,fr_pagesize=30,即數(shù)據(jù)總行數(shù)為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報表主體設計

將數(shù)據(jù)集中的數(shù)據(jù)列拖曳至單元格中。

3.4行式引擎設置

同上一節(jié)的設置方法,這里不再贅述。

3.5效果查看

點擊分頁預覽,效果圖如下:

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

3.6數(shù)據(jù)庫的分頁SQL語句
  1. [javascript] view plaincopy
  2. SELECT *      
  3.         FROM (      
  4.            SELECT TOP ${      
  5.                           if(fr_pagenumber == int((((fr_rowcount-1)/fr_pagesize)+1)),fr_rowcount - (fr_pagesize*(fr_pagenumber-1)),fr_pagesize)      
  6.                          } *         
  7.             FROM(      
  8.                      SELECT TOP ${fr_pagesize*fr_pagenumber} *      
  9.                     FROM 訂單明細 ORDER BY 訂單ID ASC        
  10.                    ) AS e1 ORDER BY 訂單ID DESC     
  11.           ) AS e2 ORDER BY 訂單ID ASC   
復制代碼
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP