集算器實(shí)現(xiàn) Birt 等報(bào)表工具中不規(guī)則月份統(tǒng)計(jì)
專注于為中小企業(yè)提供成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、成都外貿(mào)網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)招遠(yuǎn)免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
????業(yè)務(wù)報(bào)表中,常常需要基于時(shí)間段進(jìn)行分組統(tǒng)計(jì),特別是按月份分組統(tǒng)計(jì)。一般情況如果按自然月就簡(jiǎn)單了,但有時(shí)候也會(huì)需要按不規(guī)則月份來(lái)分組。例如,某企業(yè)從 1 月 16 日開(kāi)始實(shí)行某種特殊的價(jià)格策略或營(yíng)銷(xiāo)活動(dòng),因此以后都想以每月 16 號(hào)為界來(lái)統(tǒng)計(jì)產(chǎn)品銷(xiāo)售情況。這里所謂不規(guī)則月份就是指: 如果起始時(shí)間是 2013-01-16,則將 2013-01-16 到 2013-02-15 作為一組,將 2013-02-16 到 2013-03-15 作為一組。更特別的,如果起始時(shí)間是 2013-01-31,則可能要求將 2013-01-31 到 2013-02-27 作為一組,而將 2013-02-28 到 2013-03-30 作為一組,也就是“從每月最后一天”開(kāi)始分組。
????怎么樣?小伙伴們是不是有點(diǎn)傻眼了?對(duì)于 Birt 等報(bào)表工具,一般都會(huì)提供按自然月分組的表達(dá)式,但也卻都難以應(yīng)對(duì)這種不規(guī)則月份分組的表達(dá)式。如果要解決這個(gè)問(wèn)題,往往需要編寫(xiě)程序?qū)崿F(xiàn)自定義報(bào)表數(shù)據(jù)集,而在程序中按這種規(guī)則進(jìn)行分組,不但編程工作量不小,更重要的是基本無(wú)法通用。
????現(xiàn)在好了,如果在報(bào)表工具中引入集算器,解決這個(gè)問(wèn)題就易如反掌了。下面我們就以 Birt 報(bào)表工具為例,講解一下實(shí)現(xiàn)的過(guò)程。對(duì)其它報(bào)表工具來(lái)說(shuō),也基本大同小異。
????在本例中,要統(tǒng)計(jì)企業(yè)從 2013-01-16 日開(kāi)始到 2013-08-15 結(jié)束,每個(gè)月的銷(xiāo)售總額。數(shù)據(jù)表 salesall 中原始數(shù)據(jù)如下:
最后需要得到如下圖所示的目標(biāo)表樣:
?
我們直接來(lái)看集算器解決這個(gè)問(wèn)題的 SPL 代碼:
A | B | |
1 | =connect("demo") | |
2 | =A1.query("select ? OrderID,Amount,OrderDate from salesall where OrderDate>=?? and OrderDate<? order by ? OrderDate",startDate,endDate) | |
3 | =interval@m(startDate,endDate) | =startDate|A3.(elapse@m(startDate,~)) |
4 | =A2.group(B3.pseg(OrderDate);round(~.sum(Amount),2),B3(#)) | |
5 | =A4.new(#:Number,#2:TotalAmount,#3:StartDate) | |
6 | >A1.close() | |
7 | return A5 |
A1?? 連接數(shù)據(jù)庫(kù)
A2?? 從數(shù)據(jù)庫(kù)訂單表中查出統(tǒng)計(jì)開(kāi)始日期到結(jié)束日期之間的訂單數(shù)據(jù),startDate 和 endDate 是日期參數(shù)。
A3?? 根據(jù)起止時(shí)間算出月份間隔,比如 2013-01-16 和 2013-08-15 間隔 7 個(gè)月。
B3?? 根據(jù)起始時(shí)間和日期間隔算出不規(guī)則月份的開(kāi)始日期,并將起始時(shí)間插入第 1 位。“|”表示合并,“~”表示集合中的當(dāng)前成員,即數(shù)字 1 到 7,結(jié)合不同的選項(xiàng),elapse 函數(shù)可以正確計(jì)算各種不規(guī)則月份的情況。
A4?? 按 B3 區(qū)間對(duì) A2 分組,統(tǒng)計(jì)出不規(guī)則月份的銷(xiāo)售額,保留兩位小數(shù),并將 B3 作為最后一列。函數(shù) pseg 可返回參數(shù),也就是訂購(gòu)日期所在的區(qū)間號(hào)。~.sum(Amount)中的~表示分組后的當(dāng)前組。# 表示 A2 當(dāng)前組號(hào)。
A5?? 取出 A4 的組號(hào)作為 Number,第 2 列為 TotalAmount,第 3 列為分組的 StartDate,生成新的結(jié)果序表。
A6?? 關(guān)閉數(shù)據(jù)庫(kù)
A7?? 將 A5 作為數(shù)據(jù)集返回給報(bào)表工具。
?
將集算器 SPL 代碼存為 orders.dfx 文件,然后引入到 Birt 報(bào)表中。如何引入請(qǐng)參看乾學(xué)院文章《BIRT 調(diào)用 SPL 腳本》。
在 BIRT 中設(shè)計(jì)簡(jiǎn)單的 list 表如下:
?
報(bào)表調(diào)用集算器的方法和調(diào)用存儲(chǔ)過(guò)程完全一樣,比如在 BIRT 的存儲(chǔ)過(guò)程數(shù)據(jù)集中可以用 call orders(?,?) 來(lái)調(diào)用。輸入開(kāi)始日期參數(shù) 2013-01-16、結(jié)束日期參數(shù) 2013-08-15 后,預(yù)覽報(bào)表就可以看到要求的目標(biāo)表樣了。
文章題目:Birt如何實(shí)現(xiàn)不規(guī)則月份統(tǒng)計(jì)
文章位置:http://jinyejixie.com/article26/iieocg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、外貿(mào)建站、軟件開(kāi)發(fā)、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)