中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

解決 Birt 等報表工具制作報表的幾個難題

發布時間:2020-07-19 10:17:53 來源:網絡 閱讀:251 作者:raqsoft 欄目:大數據

解決Birt等報表工具制作報表的幾個難題

在上一篇《Birt 如何實現不規則月份統計》中,我們講解了如何幫助 Birt 制作這種報表的詳細過程,在本文中我們再繼續討論幾個類似的制作難題,并把說明集中在如何編寫集算器 SPL 腳本上,不再贅述如何在 Birt 中引入 SPL 的步驟了。

1.??????? 組內跨行計算

組內跨行計算是指在計算一行中某個計算列的值時,需要引用到組內其它行的數據來進行計算。比如下面這個例子:

庫表 sample 有三個字段,其中 id 是分組字段。需要設計一張分組表,使用 id 分組,明細字段是 v1,v2 以及計算列 crossline, 其中 crossline 的算法是本條記錄 v1、v2 之和加上本組上一條記錄的 v1、v2 之和。示例源數據如下:

idv1v2
112
123
211
222
333

最后要展現的報表結果如下圖所示:

解決 Birt 等報表工具制作報表的幾個難題

編寫集算器 SPL 代碼如下:


A
1=connect("demo")
2=A1.query("select ? *, 0 as crossline from sample")
3>A2.group(id).run(~.run(v1+v2+v1[-1]+v2[-1]:crossline))
4>A1.close()
5return ? A2

?

A1?? 連接數據庫

A2?? 查詢數據庫,同時多產生一列常數備用。

A3?? 按 id 分組,并在每組數據中修改計算列 crossline,最后合并,其中 v1[-1]、v2[-1] 是集算器特有的定位上一行記錄中字段的寫法。

A4?? 關閉數據庫

A5?? 將 A2 中的計算結果數據集返回給報表工具

?

2.??????? 跨庫數據源

制作報表的數據往往來自于多種數據源,比如不同的物理數據庫、文本文件、Excel 文件等,這些數據在報表中往往還需要相互關聯進行運算。

報表工具本身能實現從多數據源取數,但進行關聯運算會有一定的困難,或者運算性能非常差。而由開發者自己編程去做關聯運算,工作量一般又會非常大。而集算器 SPL 恰恰能在這一點幫上大忙。

下面這個例子中,訂單表 orders 和訂單明細表 orderDetail 數據分別來自兩個不同的數據庫,二者之間要做 join 運算。兩表數據如下:

解決 Birt 等報表工具制作報表的幾個難題? 解決 Birt 等報表工具制作報表的幾個難題

最后想要展現的報表結果如下:

解決 Birt 等報表工具制作報表的幾個難題

?

編寫集算器 SPL 代碼如下:


A
1=connect("db1")
2=connect("db2")
3=A1.query("select orderID,customer,orderDate ? from orders")
4=A2.query("select orderID,productID,price,mount ? from orderDetail order by orderID")
5>A1.close()
6>A2.close()
7=join@1(A3:orderID,A4:orderID)
8=A7.new(#1.orderID,#1.customer,#1.orderDate,#2.productID,#2.price,#2.mount)
9return A8

?

A1?? 連接數據庫 1

A2?? 連接數據庫 2

A3?? 查詢訂單表數據

A4?? 查詢訂單明細表數據

A5A6?? 關閉數據庫連接

A7?? 以 A3 的 orderID 和 A4 的 orderID 為主鍵進行 left join,連接后的結果集有兩個字段,第一個字段是 A3 的記錄,第二個字段是 A4 的記錄。

A8?? 以 A7 中兩個字段的字段形成新的數據集,也就是需要的結果

A9?? 將 A8 的數據集返回給報表工具

本例只是演示了兩個數據源的 left join,其實 SPL 能做關系數據庫能完成的任何數據運算,比如各種 join、union、過濾、分組、排序等。

3.??????? 字段拆分成記錄

在本例中,數據庫表 data 有兩個字段,其中 ANOMOALIES 字段是用空格分隔的多個字符串,我們需要把 ANOMOALIES 按空格拆分為多個字符串,并用每個字符串和原 ID 字段形成新的記錄。源數據如下:

IDANOMALIES
3903B1 D1 CAT1
3904D7 D2 B1 CAD4

最后想要展現的報表結果如下:

解決 Birt 等報表工具制作報表的幾個難題

編寫集算器 SPL 代碼如下:


A
1=connect("db")
2=A1.query("select ID,ANOMALIES from ? data")
3=A2.conj(ANOMALIES.array("?").new(A2.ID:ID,~:ANOMALIES))
4>A1.close()
5return A3

?

A1?? 連接數據庫 1

A2?? 查詢 data 表數據

A3?? 將ANOMALIES字段值按空格拆分,并與原ID形成新的記錄

A4?? 關閉數據庫連接

A5?? 將 A3 形成的數據集返回給報表工具

?

4.??????? 主表中動態插入子表字段

在本例中,數據庫表 dColThread 是主表,主鍵是 tID。dColQuestion 是子表,外鍵是 tID,如下:

dColThread

tIDApplicationNameUserPhoneDecline
A01mfcBill+700000001
A02mfcJohn+187612212
A03javaJack+80140012316
A04mfcTim+0086131331234
A05dbJohn+187612218

dColQuestion

qIDtIDstatus
1A01yes
2A01no
3A01yes
4A02yes
5A03no
6A04no
7A04no
8A05yes

報表需要根據 ApplicationName 查詢主表并以列表的形式展現數據。可以看到,在子表中,主表每條記錄對應的 status 字段值有多個,但不超過 5 個。我們需要把子表中的這些記錄橫向排列后插入主表的 Phone、Decline 字段之間,依次命名為 QuestionNo1、QuestionNo2…QuestionNo5。同時,如果某列數據都為空,則這一列不顯示。最后的表樣形如下圖:

解決 Birt 等報表工具制作報表的幾個難題

用集算器準備數據,SPL 代碼如下:


AB
1=connect("db")
2=A1. ? query("select * from dColThread t,dColQuestion q where t.tID=q.tID and ? t.ApplicationName=?",arg1)
3>A1.close()
4=A2.group(tID)
5=create(ApplicationName,User,Phone,QuestionNo1,QuestionNo2,QuestionNo3,QuestionNo4,QuestionNo5,Decline)
6for A4=A6.(status)|["","","","",""]
7
= A5.record(A6.ApplicationName|A6.User|A6.Phone|B6.to(5)|A6.Decline)
8return A5

?

A1?? 連接數據庫

A2?? 執行 SQL,取出主子表關聯數據。arg1 是來自報表參數。假如 arg1= "mfc ",則 A1 的計算結果如下:

解決 Birt 等報表工具制作報表的幾個難題

A4?? 按照 tID 分組,每組是一條主表記錄及其對應的子表記錄,如下圖:

解決 Birt 等報表工具制作報表的幾個難題

A5?? 按照報表中列表的結構新建空二維表。

A6?? 循環 A4 中的組,每次向 A5 插入一條記錄。循環體中可用 A6 引用循環變量,用 #A6 來引用循環計數。

B6?? 取當前組中 status 的字段值,并補足至少 5 條記錄。

B7?? 向 A5 追加新記錄。循環結束后 A5 如下:

解決 Birt 等報表工具制作報表的幾個難題

A8:返回結果給報表。

?

隱藏空列的工作交給 BIRT,設計 list 表,模板如下:

解決 Birt 等報表工具制作報表的幾個難題

如果 QuestionNo 列為空則應當隱藏。動態隱藏的方法有很多,這里介紹其中一種。對于 QuestionNo5(其他列類似),可以先在 dataSet 的 onFetch 方法中使用如下腳本:

if(reportContext.getGlobalVariable("t5")==null){

??? reportContext.setGlobalVariable("t5",row.QuestionNo5)

}else{

reportContext.setGlobalVariable("t5",reportContext.getGlobalVariable("t5")+row.QuestionNo5)

}

再在 QustionNo5 列的 Visibility 屬性中使用如下表達式:BirtStr.trim(reportContext.getGlobalVariable("t5"))==""

預覽后可以看到報表結果:

解決 Birt 等報表工具制作報表的幾個難題

?

5.??????? 小結

通過以上例子可以看出,報表制作時經常遇到不好處理的數據準備工作,而在集算器的幫助下都可以得到完美的解決。這是因為集算器提供了完備的數據源連接功能,能連接市面上常見的各種數據源并從中取數。同時,SPL 還提供了豐富的函數庫,能在庫外輕松進行數據的各種關聯運算。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泸水县| 基隆市| 马公市| 江达县| 东丰县| 阳城县| 勐海县| 犍为县| 宝应县| 吐鲁番市| 揭阳市| 宜兰县| 宜春市| 河东区| 三门峡市| 南城县| 花莲市| 高邑县| 庐江县| 上饶市| 株洲县| 靖边县| 天气| 台东市| 大埔区| 西贡区| 西安市| 巩留县| 太原市| 丁青县| 荆州市| 融水| 蓝田县| 郎溪县| 肃南| 萨嘎县| 泌阳县| 环江| 蕲春县| 巴马| 呼玛县|