Java軟件報(bào)表軟件技術(shù)博客

          java報(bào)表軟件技術(shù)匯總 java報(bào)表軟件制作 報(bào)表軟件新聞
          posts - 355, comments - 100, trackbacks - 0, articles - 3
             :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理

          1、概述

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

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

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

          2、解決思路

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

          SELECT * FROM 訂單明細(xì)

          如果不定義分頁sql,勾選行式引擎選項(xiàng),預(yù)覽報(bào)表時(shí),程序會(huì)將上面的sql語句轉(zhuǎn)化為下面的語句來取一頁的數(shù)據(jù):

          SELECT COUNT(*)AS totalRowCount FROM (SELECT * FROM 訂單明細(xì)) t

          如果數(shù)據(jù)庫是上面所說的access一類的無法直接生成分頁sql的數(shù)據(jù)庫,那么就需要編寫分頁SQL。

          3、操作步驟

          以FRDemo內(nèi)置的sqlite為例,說明sqlite如何寫分頁查詢。

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

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

          新建數(shù)據(jù)集ds1SELECT * FROM 訂單明細(xì)

          3.2添加分頁查詢SQL語句

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


          完整的sql語句如下:

           SELECT *     
               FROM (    
                       SELECT  *        
                        FROM(    
                             SELECT *     
                                 FROM 訂單明細(xì) 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面板中時(shí),要?jiǎng)h除后面的注釋語句,并且語句中的三次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:當(dāng)前瀏覽的頁數(shù),如果預(yù)覽第2頁,則fr_pagenumber=2;

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

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

          在預(yù)覽時(shí),設(shè)定的分頁查詢根據(jù)3個(gè)變量的值,會(huì)生成數(shù)據(jù)庫查詢,如fr_pagenumber=2,fr_pagesize=30時(shí),即在web端預(yù)覽報(bào)表,預(yù)覽至第2頁時(shí),上面的sql語句會(huì)轉(zhuǎn)化為:

          SELECT * FROM (SELECT * FROM ( SELECT * FROM 訂單明細(xì) ORDER BY 訂單ID ASC limit 60 )AS e1 ORDER BY 訂單ID DESClimit30 ) AS e2 ORDER BY 訂單ID ASC

          預(yù)覽至第3頁時(shí),fr_pagenumber=3,sql語句就轉(zhuǎn)化為:

          SELECT * FROM (SELECT * FROM ( SELECT * FROM 訂單明細(xì) ORDER BY 訂單ID ASC limit 90 )AS e1 ORDER BY 訂單ID DESClimit30) AS e2 ORDER BY 訂單ID ASC

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

          如果fr_rowcount=100,fr_pagesize=30,即數(shù)據(jù)總行數(shù)為100行,每頁顯示30行,預(yù)覽至最后一頁,也就是第4頁時(shí),fr_pagenumber=4,sql語句將轉(zhuǎn)換為:

          SELECT * FROM (SELECT * FROM ( SELECT * FROM 訂單明細(xì) ORDER BY 訂單ID ASC limit 90)AS e1 ORDER BY 訂單ID DESClimit10 ) AS e2 ORDER BY 訂單ID ASC

          3.3報(bào)表主體設(shè)計(jì)

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

          3.4行式引擎設(shè)置

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

          3.5效果查看

          點(diǎn)擊分頁預(yù)覽,效果圖如下:

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

          3.6數(shù)據(jù)庫的分頁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 訂單明細(xì) ORDER BY 訂單ID ASC      
                                ) AS e1 ORDER BY 訂單ID DESC   
                       ) AS e2 ORDER BY 訂單ID ASC  

           

           




          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 衡阳县| 滕州市| 平阴县| 谷城县| 清河县| 溆浦县| 当雄县| 曲麻莱县| 富阳市| 汝阳县| 娱乐| 六枝特区| 焉耆| 穆棱市| 通州市| 仙游县| 抚松县| 灵丘县| 城口县| 崇阳县| 广宗县| 柳州市| 铁岭市| 越西县| 稷山县| 衡阳市| 碌曲县| 嘉善县| 札达县| 平遥县| 河南省| 勐海县| 双江| 瓦房店市| 铜川市| 富源县| 贵定县| 惠东县| 永顺县| 枝江市| 渑池县|