報(bào)表沒(méi)完沒(méi)了怎么辦?
應(yīng)用系統(tǒng)軟件項(xiàng)目中有一個(gè)普遍現(xiàn)象,就是報(bào)表總也做不完。不管是領(lǐng)導(dǎo)需要的宏觀數(shù)據(jù)統(tǒng)計(jì)重點(diǎn)的變化,還是業(yè)務(wù)部門(mén)的計(jì)算口徑的變化,都會(huì)造成報(bào)表需求的頻繁變更。報(bào)表項(xiàng)目組就要不斷修改現(xiàn)有報(bào)表,還會(huì)新增很多報(bào)表。潤(rùn)乾的很多用戶(hù)提出,能不能發(fā)明一種軟件工具,來(lái)解決報(bào)表永遠(yuǎn)做不完的問(wèn)題?
從本質(zhì)上說(shuō),報(bào)表本身就存在業(yè)務(wù)穩(wěn)定性差的特點(diǎn),這是造成報(bào)表開(kāi)發(fā)沒(méi)完沒(méi)了的本質(zhì)原因。也就是說(shuō),這個(gè)問(wèn)題是需求頻繁變化造成的,是一種常態(tài)。因此,要試圖適應(yīng)而不是解決這個(gè)問(wèn)題,具體的辦法就是建立長(zhǎng)期應(yīng)對(duì)機(jī)制。也就是說(shuō),在應(yīng)用系統(tǒng)開(kāi)發(fā)完成之后,保持***成本的報(bào)表維護(hù)人員來(lái)解決報(bào)表需求的變更和新增。
如果能夠不依賴(lài)于開(kāi)發(fā)商的專(zhuān)業(yè)程序員來(lái)解決沒(méi)完沒(méi)了的報(bào)表需求,對(duì)于甲方和開(kāi)發(fā)商而言,都是***方案。非專(zhuān)業(yè)的程序員,或者是甲方自己的技術(shù)人員兼職來(lái)做這件事,成本很低,可持續(xù)性卻很高。
但是,要實(shí)現(xiàn)這樣的長(zhǎng)期機(jī)制,還有幾個(gè)難題需要解決:
1、 由于有報(bào)表工具的支持,報(bào)表的呈現(xiàn)環(huán)節(jié)開(kāi)發(fā)已經(jīng)很容易了。但是,報(bào)表數(shù)據(jù)計(jì)算環(huán)節(jié)還需要編程序(Java、C#、復(fù)雜SQL、存儲(chǔ)過(guò)程等),是低成本維護(hù)人員很難完成的任務(wù)。
2、 開(kāi)發(fā)商為報(bào)表的數(shù)據(jù)計(jì)算部分編寫(xiě)的代碼,和應(yīng)用系統(tǒng)的其他部分是耦合在一起的。一旦調(diào)整,還需要開(kāi)發(fā)商的專(zhuān)業(yè)程序員才能解決。
3、 Java等編程工具的環(huán)境配置復(fù)雜,低成本維護(hù)人員沒(méi)辦法自主完成。
4、 SQL對(duì)于復(fù)雜計(jì)算實(shí)現(xiàn)起來(lái)是比較困難的,存儲(chǔ)過(guò)程本身也比較難寫(xiě),還需要較高的數(shù)據(jù)庫(kù)權(quán)限,存在安全風(fēng)險(xiǎn)。遇到庫(kù)外文件的情況,比如Excel等,SQL和存儲(chǔ)過(guò)程也沒(méi)辦法直接計(jì)算。
所以,建立長(zhǎng)期機(jī)制必須要做到:
1、 報(bào)表開(kāi)發(fā)要徹底工具化。不僅是呈現(xiàn)層的工具化,報(bào)表數(shù)據(jù)計(jì)算層也要工具化,降低對(duì)開(kāi)發(fā)人員的要求。不必做復(fù)雜的環(huán)境配置(數(shù)據(jù)源等),也可以編寫(xiě)簡(jiǎn)單的代碼來(lái)實(shí)現(xiàn)復(fù)雜計(jì)算。對(duì)于多樣性數(shù)據(jù)源,比如Excel、文本文件等,也必須支持簡(jiǎn)單腳本計(jì)算。
2、 報(bào)表模塊要徹底獨(dú)立化。數(shù)據(jù)計(jì)算層也要和呈現(xiàn)層一樣,完全和應(yīng)用系統(tǒng)解耦合,實(shí)現(xiàn)獨(dú)立維護(hù)。報(bào)表需求變更和新增的時(shí)候,僅僅修改報(bào)表模塊就可以了,不會(huì)影響應(yīng)用系統(tǒng)其他部分。
有了報(bào)表工具,報(bào)表的呈現(xiàn)層已經(jīng)可以做到工具化和獨(dú)立化了。結(jié)合潤(rùn)乾的專(zhuān)業(yè)計(jì)算產(chǎn)品集算器,可以實(shí)現(xiàn)報(bào)表開(kāi)發(fā)過(guò)程的徹底工具化和報(bào)表模塊的徹底獨(dú)立化,建立長(zhǎng)期應(yīng)對(duì)機(jī)制,***解決報(bào)表沒(méi)完沒(méi)了的難題。
報(bào)表工具集合集算器的方案結(jié)構(gòu)圖如下:
集算器可以降低報(bào)表后端計(jì)算的開(kāi)發(fā)難度,徹底實(shí)現(xiàn)報(bào)表開(kāi)發(fā)過(guò)程工具化。
集算器是一種高級(jí)語(yǔ)言,潤(rùn)乾公司提供了集算器的集成開(kāi)發(fā)環(huán)境IDE。類(lèi)似于Java的集成開(kāi)發(fā)環(huán)境Eclipse,集算器的IDE也提供了調(diào)試執(zhí)行、單步執(zhí)行、設(shè)置斷點(diǎn)等代碼調(diào)試方式:
圖中的腳本,是從oracle數(shù)據(jù)庫(kù)取部分的訂單數(shù)據(jù),和Excel中的部分?jǐn)?shù)據(jù)合并分組匯總后過(guò)濾出訂單金額小于10000的數(shù)據(jù),返回給報(bào)表。從圖中可以看到,集算器采用了過(guò)程計(jì)算編程方式,相比SQL無(wú)法嚴(yán)格分步驟寫(xiě)腳本的方式要更容易編寫(xiě)。有經(jīng)驗(yàn)的程序員都知道,SQL用來(lái)實(shí)現(xiàn)很零碎的多步運(yùn)算很不方便,特別是與次序相關(guān)的運(yùn)算,程序員常常要把數(shù)據(jù)從數(shù)據(jù)庫(kù)中取出來(lái)用Java等完成。而集算器則正好在這方面做了強(qiáng)化,在分步計(jì)算、集合化、有序計(jì)算和對(duì)象引用等幾方面做了完善,對(duì)于常用的日期和字串等運(yùn)算,也比大部分SQL提供了更豐富的方法。B1單元格只需要一個(gè)函數(shù)就可以讀取Excel文件中的數(shù)據(jù),這是SQL無(wú)法直接實(shí)現(xiàn)的。
Java等高級(jí)語(yǔ)言沒(méi)有提供批量數(shù)據(jù)計(jì)算的類(lèi)庫(kù),寫(xiě)個(gè)簡(jiǎn)單的SUM也要好幾行,更何況分組、連接等運(yùn)算,而對(duì)于過(guò)濾、匯總用到的通用表達(dá)式計(jì)算,基本上是大多數(shù)應(yīng)用程序員無(wú)法完成的任務(wù)了。而且Java其實(shí)也沒(méi)有通行的結(jié)構(gòu)化數(shù)據(jù)對(duì)象,只JDBC有個(gè)幾乎沒(méi)有計(jì)算能力的ResultSet。直接用Java實(shí)現(xiàn)報(bào)表數(shù)據(jù)準(zhǔn)備非常繁瑣。集算器則提供了大量與結(jié)構(gòu)化計(jì)算相關(guān)的基礎(chǔ)對(duì)象和方法,分組匯總這些只要一句,而且是解析執(zhí)行的動(dòng)態(tài)語(yǔ)言,可以進(jìn)行隨意的表達(dá)式計(jì)算。使用集算器完成報(bào)表數(shù)據(jù)準(zhǔn)備工作要比Java容易得多,代碼也要短小很多,實(shí)現(xiàn)了復(fù)雜計(jì)算的簡(jiǎn)單開(kāi)發(fā)。報(bào)表開(kāi)發(fā)者只需要寫(xiě)腳本,不用管理數(shù)據(jù)連接等環(huán)境等等問(wèn)題,可以實(shí)現(xiàn)非專(zhuān)業(yè)程序員、甚至用戶(hù)自己的運(yùn)維人員獨(dú)立完成報(bào)表開(kāi)發(fā)過(guò)程的目標(biāo)。
集算器集成開(kāi)發(fā)環(huán)境還提供了方便調(diào)試的功能。圖中單擊A4單元格,在IDE右邊就可以所見(jiàn)即所得的看到A4的計(jì)算結(jié)果,非常有利于發(fā)現(xiàn)每個(gè)步驟的問(wèn)題。IDE下方可以直觀的看到系統(tǒng)信息輸出,隨時(shí)查看腳本的異常。
集算器可以?xún)?yōu)化報(bào)表應(yīng)用結(jié)構(gòu),使得報(bào)表模塊可以獨(dú)立維護(hù),徹底實(shí)現(xiàn)獨(dú)立化。
集算器可以降低與業(yè)務(wù)系統(tǒng)其他模塊的耦合度。集算器編寫(xiě)的腳本是獨(dú)立的dfx文件,不會(huì)和應(yīng)用系統(tǒng)其他部分的Java程序形成耦合關(guān)系。這樣就可以把報(bào)表模塊單列出來(lái),而不必和應(yīng)用程序綁死在一起。獨(dú)立的報(bào)表模塊可以單獨(dú)去維護(hù),雖然業(yè)務(wù)穩(wěn)定性差,但是頻繁的修改不影響主應(yīng)用程序。
計(jì)算方法的調(diào)整和報(bào)表模板的修改一樣無(wú)需重啟服務(wù)器,真正實(shí)現(xiàn)整個(gè)報(bào)表系統(tǒng)的熱切換。因?yàn)閳?bào)表系統(tǒng)業(yè)務(wù)不穩(wěn)定造成的系統(tǒng)重啟減少到零。
這樣,從報(bào)表計(jì)算層到呈現(xiàn)層完全獨(dú)立出來(lái)了。用報(bào)表工具修改報(bào)表模板,上傳覆蓋之前的模板即可;用集算器修改報(bào)表計(jì)算腳本文件,上傳服務(wù)器,覆蓋舊的腳本文件即可。因?yàn)楹蛻?yīng)用系統(tǒng)其他模塊沒(méi)有任何關(guān)系,所以無(wú)需開(kāi)發(fā)商的專(zhuān)業(yè)程序員到現(xiàn)場(chǎng)修改。非專(zhuān)業(yè)程序員或者用戶(hù)自己的維護(hù)人員就可以解決沒(méi)完沒(méi)了的報(bào)表難題。































