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

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

          1. 問(wèn)題描述
          若報(bào)表使用的數(shù)據(jù)量是上百萬(wàn)條的話,覺(jué)得報(bào)表展現(xiàn)的速度慢,可以使用層式報(bào)表來(lái)提高報(bào)表展現(xiàn)速度。但由層式報(bào)表章節(jié)可以得知,層式報(bào)表必須是單數(shù)據(jù)集,若是多數(shù)據(jù)集的模板且數(shù)據(jù)量又很大,想要提高報(bào)表的查詢(xún)速度要如何實(shí)現(xiàn)呢?

          2. 實(shí)現(xiàn)思路
          在定義數(shù)據(jù)集時(shí)通過(guò)使用數(shù)據(jù)庫(kù)本身的行序號(hào)或者使用數(shù)據(jù)庫(kù)函數(shù)生成行序號(hào)(即行號(hào))并且在where條件中通過(guò)頁(yè)碼參數(shù)使得行號(hào)在一定范圍內(nèi)顯示,點(diǎn)擊自定義的上一頁(yè)下一頁(yè)按鈕時(shí)重新傳入頁(yè)碼參數(shù)取出相應(yīng)的數(shù)據(jù)。

          注:SQL Server2000無(wú)法生成行號(hào),因此需要定義存儲(chǔ)過(guò)程實(shí)現(xiàn)分頁(yè)查詢(xún),以下具體介紹Access實(shí)現(xiàn)分頁(yè)的步驟,SQL Server2005以及Oracle數(shù)據(jù)庫(kù)實(shí)現(xiàn)分頁(yè)的步驟有一點(diǎn)區(qū)別,以下會(huì)詳細(xì)介紹。

          3. Access分頁(yè)示例
          3.1 新建模板
          新建模板mutipage.cpt,為了加快展示速度,我們可以使用分頁(yè)查詢(xún),獲取每個(gè)產(chǎn)品的詳細(xì)信息并計(jì)算產(chǎn)品對(duì)應(yīng)的訂單中的應(yīng)付金額,因此添加數(shù)據(jù)集時(shí)查詢(xún)SQL語(yǔ)句為select 產(chǎn)品.產(chǎn)品ID,產(chǎn)品名稱(chēng), 供應(yīng)商ID , 類(lèi)別ID, 單位數(shù)量, 產(chǎn)品.單價(jià), 產(chǎn)品.庫(kù)存量, 產(chǎn)品.訂購(gòu)量,sum(應(yīng)付金額) as 應(yīng)付款項(xiàng) from 產(chǎn)品,訂單,訂單明細(xì) where 產(chǎn)品.產(chǎn)品ID=訂單明細(xì).產(chǎn)品ID and 訂單明細(xì).訂單ID=訂單.訂單ID and 產(chǎn)品.產(chǎn)品ID between 10*(${page}-1)+1 and 10*${page} group by 產(chǎn)品.產(chǎn)品ID,產(chǎn)品名稱(chēng), 供應(yīng)商ID , 類(lèi)別ID, 單位數(shù)量, 產(chǎn)品.單價(jià), 產(chǎn)品.庫(kù)存量, 產(chǎn)品.訂購(gòu)量 order by 產(chǎn)品.產(chǎn)品ID,設(shè)置參數(shù)page的默認(rèn)值為1,首次看到的是第一頁(yè),只查詢(xún)出第1~20條記錄;若page參數(shù)為2時(shí),查詢(xún)出第21~40條記錄,即第二頁(yè)內(nèi)容。

          注:這邊定義報(bào)表每頁(yè)顯示10條數(shù)據(jù),即ds1的查詢(xún)SQL一次只取10條數(shù)據(jù),從而加快報(bào)表展示速度。

          3.2 自定義上一頁(yè)、下一頁(yè)按鈕
          使用分頁(yè)查詢(xún)后,報(bào)表需要根據(jù)page參數(shù)查詢(xún)出行號(hào)在一定范圍內(nèi)的數(shù)據(jù),當(dāng)點(diǎn)擊下一頁(yè)時(shí),page需要加1并傳入報(bào)表查詢(xún)出后10條記錄;點(diǎn)擊上一頁(yè)時(shí),page需要減1并傳入報(bào)表查詢(xún)出前10條記錄。而報(bào)表內(nèi)置的上一頁(yè)下一頁(yè)按鈕無(wú)法做這些操作,因此需要自定義上一頁(yè)下一頁(yè)按鈕。

          • 在單元格中求出上一頁(yè)、下一頁(yè)頁(yè)碼的值

          在工具欄中無(wú)法直接獲取page參數(shù)的值,因此先在單元格中求出上一頁(yè)下一頁(yè)的頁(yè)碼值,然后再在工具欄按鈕中獲取單元格的值。

          • 自定義上一頁(yè)下一頁(yè)按鈕

          點(diǎn)擊模板>模板web屬性>分頁(yè)預(yù)覽設(shè)置分,選擇為該模板單獨(dú)設(shè)置,在工具欄中增加兩個(gè)自定義按鈕分別命名為上一頁(yè),下一頁(yè),是工具欄上只剩下如下圖所示幾個(gè)按鈕。

          3.3 第一頁(yè)與最后一頁(yè)的處理
          首次訪問(wèn)報(bào)表時(shí),默認(rèn)顯示第一頁(yè)page=1,此時(shí)上一頁(yè)按鈕應(yīng)該是無(wú)效的,否則點(diǎn)擊上一頁(yè)按鈕時(shí)(頁(yè)碼為0),此時(shí)查詢(xún)行號(hào)在-9到0之間的記錄將會(huì)出錯(cuò);同樣,顯示到最后一頁(yè)時(shí)需下一頁(yè)按鈕無(wú)效。即當(dāng)上一頁(yè)頁(yè)碼page-1=0時(shí),上一頁(yè)無(wú)效;當(dāng)下一頁(yè)頁(yè)碼page>總頁(yè)數(shù)時(shí),下一頁(yè)無(wú)效。

          • 求出總頁(yè)數(shù)

          根據(jù)總記錄數(shù)及每頁(yè)顯示條數(shù),求出總頁(yè)數(shù)。新增數(shù)據(jù)集ds2,SQL語(yǔ)句為:SELECT count(*) as 總數(shù) FROM 產(chǎn)品,查詢(xún)出產(chǎn)品表總條數(shù),拖入單元格,如下

          雙擊總數(shù)所在單元格彈出數(shù)據(jù)列設(shè)置對(duì)話框,選擇高級(jí)>自定義顯示,在自定義中填入公式:roundup($$$/10,0)求出總頁(yè)數(shù)。

          將第一行的行高設(shè)置為0,或者是隱藏:

          上一頁(yè)按鈕設(shè)置:選中上一頁(yè)自定義按鈕,點(diǎn)擊自定義JavaScript,在js中填入:

          1. var page= $("tr[tridx=0]","div.content-container").children().eq(0).html();    
          2. if(page==0)//如果報(bào)表顯示第一頁(yè),則上一頁(yè)不可用  
          3. this.setEnable(false);  
          4. else  
          5. window.location.href="${servletURL}?reportlet=doc/Advanced/multipage.cpt&page="+page;   

          注:第一句是獲取上一頁(yè)頁(yè)碼(A1單元格)的值,其中最后的html()可以用Text()代替;第二句是重新加載報(bào)表并給page參數(shù)賦值。

          上一頁(yè)按鈕設(shè)置:下一頁(yè)按鈕設(shè)置與上一頁(yè)的js差不多,只需要獲取B1的值就可以了,所以在js中填入:

          1. var page= $("tr[tridx=0]","div.content-container").children().eq(1).html();    
          2. var total=$("tr[tridx=0]","div.content-container").children().eq(2).html();    
          3. if(parseInt(page) > parseInt(total))//如果報(bào)表顯示最后一頁(yè),則下一頁(yè)不可用  
          4. {  
          5. this.setEnable(false);  
          6. }  
          7. else  
          8. window.location.href="${servletURL}?reportlet=doc/Advanced/multipage.cpt&page="+page;   

          注:首次打開(kāi)報(bào)表的時(shí)候,由于page參數(shù)是在數(shù)據(jù)集中定義的,數(shù)據(jù)集參數(shù)的默認(rèn)值在第一個(gè)次打開(kāi)報(bào)表時(shí)沒(méi)辦法傳到單元格中,所以需要定義一個(gè)完全一樣的模板參數(shù)page,默認(rèn)值設(shè)為1。這樣,首次打開(kāi)模板時(shí),上一頁(yè)按鈕同樣不可用。

          分頁(yè)預(yù)覽,即可查看效果。mutipage.cpt

          具體模板可參考:%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Advanced\mutipage.cpt。

          4. SQL Server2005示例
          SQL Server2005使用ROW_NUMBER() OVER (ORDER BY 主鍵字段) AS rowno生成行號(hào)。

          因此只需要修改數(shù)據(jù)集ds1查詢(xún)SQL語(yǔ)句為select * from (SELECT *,ROW_NUMBER() OVER (ORDER BY year_school_id) AS rowno FROM year_school) as b where b.rowno between 20*(${page}-1)+1 and 20*${page}即可。

          5. Oracle示例
          Oracle數(shù)據(jù)庫(kù)中本身有行序號(hào)ROWNUM,因此只需要將上例ds1數(shù)據(jù)集修改成如下:SELECT * FROM (select A.*,ROWNUM rn from (select * from year_school) A where ROWNUM <=${start}+20) where RN >=${start}即可。

          注:ROWNUM只支持小于,大于是不支持的,因此要做如上定義。




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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 安乡县| 合川市| 安多县| 齐齐哈尔市| 大埔县| 定襄县| 夏津县| 陇西县| 龙江县| 集安市| 无为县| 淮南市| 陆河县| 上高县| 云和县| 福鼎市| 和林格尔县| 建昌县| 广西| 和政县| 宁南县| 宁津县| 铁岭县| 双城市| 台北市| 虞城县| 论坛| 昌吉市| 错那县| 淮安市| 牟定县| 浦江县| 阆中市| 新疆| 社旗县| 金阳县| 太保市| 阳高县| 万年县| 长岛县| 浏阳市|