<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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

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

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

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

    3. Access分頁示例
    3.1 新建模板
    新建模板mutipage.cpt,為了加快展示速度,我們可以使用分頁查詢,獲取每個產(chǎn)品的詳細(xì)信息并計算產(chǎn)品對應(yīng)的訂單中的應(yīng)付金額,因此添加數(shù)據(jù)集時查詢SQL語句為select 產(chǎn)品.產(chǎn)品ID,產(chǎn)品名稱, 供應(yīng)商ID , 類別ID, 單位數(shù)量, 產(chǎn)品.單價, 產(chǎn)品.庫存量, 產(chǎn)品.訂購量,sum(應(yīng)付金額) as 應(yī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)品名稱, 供應(yīng)商ID , 類別ID, 單位數(shù)量, 產(chǎn)品.單價, 產(chǎn)品.庫存量, 產(chǎn)品.訂購量 order by 產(chǎn)品.產(chǎn)品ID,設(shè)置參數(shù)page的默認(rèn)值為1,首次看到的是第一頁,只查詢出第1~20條記錄;若page參數(shù)為2時,查詢出第21~40條記錄,即第二頁內(nèi)容。

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

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

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

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

    • 自定義上一頁下一頁按鈕

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

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

    • 求出總頁數(shù)

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

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

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

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

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

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

    上一頁按鈕設(shè)置:下一頁按鈕設(shè)置與上一頁的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))//如果報表顯示最后一頁,則下一頁不可用  
    4. {  
    5. this.setEnable(false);  
    6. }  
    7. else  
    8. window.location.href="${servletURL}?reportlet=doc/Advanced/multipage.cpt&page="+page;   

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

    分頁預(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生成行號。

    因此只需要修改數(shù)據(jù)集ds1查詢SQL語句為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ù)庫中本身有行序號ROWNUM,因此只需要將上例ds1數(shù)據(jù)集修改成如下:SELECT * FROM (select A.*,ROWNUM rn from (select * from year_school) A where ROWNUM <=${start}+20) where RN >=${start}即可。

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




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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产精品亚洲天堂| 99视频有精品视频免费观看| 国内免费高清在线观看| 亚洲欭美日韩颜射在线二| 亚洲成a人无码亚洲成av无码| 香蕉成人免费看片视频app下载| 亚洲黄片毛片在线观看| 亚洲精品天堂在线观看| 无码精品人妻一区二区三区免费看| 日产国产精品亚洲系列| ASS亚洲熟妇毛茸茸PICS| 日韩免费观看一区| 亚洲中文字幕丝袜制服一区| 亚洲精品国产av成拍色拍| 亚洲一级毛片免费在线观看| 亚洲国产三级在线观看| 一级女性全黄久久生活片免费| 午夜小视频免费观看| 亚洲中字慕日产2020| 一级毛片全部免费播放| 亚洲国产精品无码久久久秋霞2 | 国产精品色拉拉免费看| 亚洲VA中文字幕无码一二三区| 免费无码午夜福利片69| 免费看美女被靠到爽| 亚洲国产成人99精品激情在线| 久久精品一本到99热免费| 久久国产精品亚洲一区二区| 中文字幕不卡免费视频| 亚洲精品456播放| 无套内谢孕妇毛片免费看看| 日本免费福利视频| 亚洲国产日韩精品| 丁香花免费高清视频完整版| 亚洲电影在线免费观看| 91精品全国免费观看含羞草| 亚洲日韩图片专区第1页| 亚洲视频免费在线观看| 无码乱人伦一区二区亚洲| 国产成人精品免费久久久久| 亚洲国产精华液网站w|