钻取报表学习总结
什么是鉆取報表
鉆取報表是在希望支持指向其他相關報表的鉆取鏈接時創建的一種報表。通常,鉆取報表通過數據與父報表關聯。舉一個常見的鉆
取報表的示例:包含指向當月各個銷售訂單的鏈接的 Monthly Sales 報表。當您單擊鉆取鏈接時,父報表將被含有支持詳細信息
的其他報表替代。
參考資料: http://baike.baidu.com/view/92983.htm
========
報表開發實例——動態多層次KPI鉆取報表
http://blog.csdn.net/u012388497/article/details/45577673?? ? ? ? ?在報表項目中有時會有動態層次報表,而且還需要層次鉆取的場景,開發難度較大。這里記錄了使潤乾集算報表開發《各級
部門KPI報表》的過程。
? ? ? ? ?《各級部門KPI報表》初始狀態如下圖:
? ? ? ? ?當前節點是根節點“河北省”,要求報表顯示當前節點的下一級節點“地市”匯總的KPI數值。Kpi又分為普通指標和VIP指
標兩類,共四項。如果點擊“石家莊”來鉆取的時候,要求能夠將石家莊下一級的KPI匯總指標顯示出來,如下圖:
? ? ? ? ?點擊“中心區”鉆取,要求能夠將下一級的KPI匯總指標顯示出來,以此類推,直到顯示到最后一級。如下圖:
? ? ? ? ?前四級固定是“省、地市、區縣、營業部”,后邊則是動態的“架構4、架構5、架構6. . . 架構13”(根節點“省”對應“
架構0”)。
這個報表對應的Oracle數據庫表有兩個,tree(樹形結構維表)和kpi(指標事實表),如下圖:
?
Tree表
?
Kpi表
? ? ? ? ?Tree表的葉子節點,通過id字段與kpi表關聯。這個報表的難點在于1、動態的多層數據、標題;2、樹形結構數據與事實表
關聯。
? ? ? ? ?采用潤乾集算報表實現的第一步:編寫集算腳本tree.dfx,完成源數據計算。集算腳本如下:
? ? ? ? ?A1:連接預先配置好的oracle數據庫。
? ? ? ? ?A2:新建一個序列,內容是“省、地市、區縣、營業部、架構4、架構5、架構6. . . 架構13”。
? ? ? ? ?A3:使用oracle數據庫提供的connectby語句編寫sql,從數據庫中取出指定id(節點編號)的所有父節點id、name。id是
預先定義的網格參數,如果傳進來的值是104020,那么A3的計算結果是:
?
? ? ? ? ?A4:為A3增加一個字段title,按照順序,對應A2中的層級。結果是:
? ? ? ? ?A5:計算變量level,是A3序表的長度,也就是輸入節點“104020”的層級號“4”(“省”為第一級)。
? ? ? ? ?A6:計算輸入節點“104020”的下一級對應的層級名稱“架構4”,賦值給變量xtitle。
? ? ? ? ?A7:編寫sql,從tree表中取出輸入節點“104020”的所有葉子節點,并拆分sys_connect_by_path字符串,得到這些葉子
節點對應的輸入節點“104020”的下一級節點。形成臨時表leaf與kpi表關聯分組匯總。為了能夠得到輸入節點“104020”的下一
級節點的name,leaf還需要與tree關聯一次。需要注意的是,如果輸入節點號本身就是葉子節點,結果中的name將為空。完整的
sql如下:
with leaf as( SELECT tree.id id,REGEXP_SUBSTR(SYS_CONNECT_BY_PATH(id,';'),'[^;]+',1,2) x FROM tree whereconnect_by_isleaf=1 START WITH ID =? CONNECT BY NOCYCLE PRIOR id = pid ) select nvl(leaf.x,max(leaf.id))id,'"+xtitle+"' title,max(tree.name) name, sum(kpi.kpi1)kpi1,sum(kpi.kpi2) kpi2,sum(kpi.vipkpi1) vipkpi1,sum(kpi.vipkpi2) vipkpi2 from leaf left join kpi on leaf.id = kpi.idleft join tree on leaf.x=tree.id group by leaf.x order by leaf.x
? ? ? ? ?計算的結果是:
?
? ? ? ? ?A8:關閉數據庫連接。
? ? ? ? ?A9:向報表返回A4、A7兩個結果集。
? ? ? ? ?第二步:在報表設計器中定義報表參數和集算數據集,調用tree.dfx。如下圖:
?
定義報表參數“id”
?
定義集算數據集(其中的參數名“id”是集算腳本的輸出參數名,參數值“id”是報表參數。
? ? ? ? ?第三步,設計報表如下圖:
?
? ? ? ? ?A列是報表的左半部分,是輸入節點(例如:“104020”)的所有父節點和它本身,橫向擴展,A1的值是id,顯示的是title
。A3顯示的是name。
? ? ? ? ?B列是報表的中間部分,是輸入節點(例如:“104020”)的下一級子節點,縱向擴展。在B3格中設置隱藏列的條件是
value()==null,如果輸入節點本省就是葉子節點,那么name==null,B列就會隱藏不顯示了。
? ? ? ? ?C列到F列是報表的右半部分,顯示的是ds2.name對應的kpi統計值。
? ? ? ? ?為了實現報表的格式需要,A3單元格需要將左主格設置為B3。
? ? ? ? ?為了實現鉆取功能,需要:
? ? ? ? ?1、 ?將A3單元格的超鏈接屬性定義為表達式:"/reportJsp/showReport.jsp?rpx=r4.rpx&id="+ds1.ID。超鏈接指向本報
表自身,報表參數是當前列對應的ds1.ID。
? ? ? ? ?2、 ?將B3單元格的超鏈接屬性定義為表達式:"/reportJsp/showReport.jsp?rpx=r4.rpx&id="+ds2.ID。超鏈接指向本報
表自身,報表參數是當前行對應的ds2.ID。
? ? ? ? ?第四步:發布報表并運行。實際的超鏈值如下圖:
? ? ? ? ?從上述實現步驟可以看到,難度最大的是tree.dfx中的A7單元格的復雜SQL。應該說,oracle數據庫的樹形遞歸查詢還是比
較豐富的,用其他數據庫(比如MySQL,PostgreSQL及Greenplum等)可能就很難實現A7中的SQL。那么有什么其他方案,可以
讓這些數據庫也能實現上述復雜的樹形結構計算呢?
========
報表中如何進行數據鉆取
http://jingyan.baidu.com/article/2a138328a9d186074a134fcf.html報表系統中數據的鉆取是一個普遍的需求,如下圖點擊訂單ID的時候能夠鉆取到該訂單的明細數據。
報表通過超級連接功能方便的實現了數據鉆取及無限層鉆取。
下面我們就通過FineReport報表軟件進行介紹。
報表中如何進行數據鉆取步驟閱讀
工具/原料
報表軟件FineReport7.1.1
大小:148.2M 適用平臺:windows/linux
方法/步驟
1
我們以內置數據庫FRDemo中的訂單表和訂單明細表為例為大家介紹下數據鉆取的實現。
2
新建一個子表,數據集就是訂單明細表,將表樣設計如下樣式:
子表中定義一個參數,用來接收主表中傳來的訂單ID值,在此我們定義報表參數,參數的名為ID,然后給訂單ID設置過濾條件,
使訂單ID等于參數ID
3
數據鉆取設置
打開主表,右擊訂單ID數據列所在單元格,選擇超級鏈接,彈出超級鏈接對話框,添加網絡報表,然后按照下圖設置超級鏈接:
注:在子表中使用同樣的方法再設置超級鏈接就能實現無限層次的鉆取。
4
預覽
分頁預覽父表,點擊某個訂單ID,就能鉆取到明細表了,如下圖。
========
報表之鉆取報表
http://www.cnblogs.com/ck-winner/archive/2013/02/02/2890546.html? 1.沿用之前報表數據源,新建主報表與子報表(以下分別為主,子報表)?
? 2.在子報表中設置鉆取參數,即上圖中的Department。
? 3.設置主報表鉆取鏈接。
? ? ?在文本框屬性“操作”一欄。啟用為超鏈接中選擇“轉到報表”,選擇子報表。
? ? ?之后添加參數,即選擇子報表的鉆取參數,在值中選擇傳遞的字段。 ??
? 4.修改子報表數據源(若只移植到web項目中,此步驟可省略。SSRS中不可忽略) ?
? 此時,鉆取報表即可預覽。但為了移植到web項目中,繼續...
? 5.在web項目中,鉆取報表必須實現Drillthrough事件。?
View Code
? 注意:若僅適用鉆取參數,可使用OriginalParametersToDrillthrough索引器。msdn推薦GetParameters方法。此方法獲取報
表所有參數集合。
? ? ? ? ? 因為web項目默認獲取的報表對象為rdlc,但該報表實為rdl,所以截取最后一位,才可與實際路徑相符。
? 以下分別為主、子報表效果圖。
========
總結
- 上一篇: C# List 嵌套学习总结
- 下一篇: 解锁bios学习总结