調(diào)用pos機動態(tài)碼,報表工具的動態(tài)數(shù)據(jù)源實現(xiàn)

 新聞資訊2  |   2023-05-24 09:32  |  投稿人:pos機之家

網(wǎng)上有很多關(guān)于調(diào)用pos機動態(tài)碼,報表工具的動態(tài)數(shù)據(jù)源實現(xiàn)的知識,也有很多人為大家解答關(guān)于調(diào)用pos機動態(tài)碼的問題,今天pos機之家(www.shineka.com)為大家整理了關(guān)于這方面的知識,讓我們一起來看下吧!

本文目錄一覽:

1、調(diào)用pos機動態(tài)碼

調(diào)用pos機動態(tài)碼

有時候我們需要用參數(shù)動態(tài)指定數(shù)據(jù)源,或?qū)⒍鄶?shù)據(jù)源連接為單數(shù)據(jù)源,或向子報表、table控件動態(tài)傳入數(shù)據(jù)源名。對于此類需求,報表工具經(jīng)常要借助高級語言實現(xiàn)或犧牲安全性以降低復(fù)雜度,尤其是BIRT、Jasper等單源報表。

使 用免費的集算器可以彌補這一不足。集算器封裝了豐富的結(jié)構(gòu)化計算函數(shù),支持動態(tài)解析表達式,支持多數(shù)據(jù)源混合計算,書寫簡單腳本就能實現(xiàn)動態(tài)數(shù)據(jù)源。集算 器還提供了簡單易用的JDBC接口,報表工具可將集算器腳本文件當(dāng)做數(shù)據(jù)庫存儲過程執(zhí)行,傳入?yún)?shù)并用JDBC獲得返回結(jié)果。

集算器與報表工具的集成結(jié)構(gòu)如下:

下面舉例說明集算器根據(jù)參數(shù)動態(tài)切換數(shù)據(jù)源的基本過程:

數(shù)據(jù)源myDB1和oraDB分別指向不同的數(shù)據(jù)庫,兩庫中有相同結(jié)構(gòu)的表sOrder,報表需要根據(jù)參數(shù)動態(tài)連接數(shù)據(jù)源,查詢并展現(xiàn)sOrder中金額大于1000的訂單。

myDB1中sOrder部分?jǐn)?shù)據(jù)如下:

oraDB中sOrder部分?jǐn)?shù)據(jù)如下:

集算器代碼:

=${pSource}.query("select * from sOrderwhere Amount>?",pAmount)

pSource、pAmount都是報表參數(shù),其中pSource代表數(shù)據(jù)源名,${…}表示將字符串或字符串變量解析為表達式,pAmount代表訂單金額。

當(dāng)pSource=”myDB1”時,A1的計算結(jié)果如下:

當(dāng)pSource=”oraDB”時,A1的計算結(jié)果如下:

報表工具可用JDBC的方式調(diào)用集算器腳本,就像調(diào)用普通數(shù)據(jù)庫中的存儲過程,形如:call 腳本文件名(參數(shù)1…參數(shù)N)。集算器的返回結(jié)果會以普通數(shù)據(jù)集的形式參與報表計算。具體用法可參考下列文檔:集算器集成與應(yīng)用之JasperReport集成 和集算器集成與應(yīng)用之BIRT集成 。

作為專業(yè)的報表數(shù)據(jù)源工具,集算器還可以實現(xiàn)更多的計算,下面分別舉例。

多源數(shù)據(jù)join后計算

Sales是mysql數(shù)據(jù)庫中的表,存儲著多名銷售員每天的多個訂單,其中字段SellerId是銷售員編號。emp是mssql數(shù)據(jù)庫中的表,存儲著 銷售員信息,其中字段EId是銷售員編號?,F(xiàn)在需要在報表中展現(xiàn):訂單編號、日期、金額、銷售員名字、部門名稱,條件是:訂單日期在最近N天(比如30 天)或者訂單屬于某幾個受關(guān)注的部門(比如Markeding和Finance)。部分源數(shù)據(jù)如下:

庫表sales

庫表emp

集算器代碼:

A1,A2:查詢數(shù)據(jù)庫,myDB1和myDB2分別直向mysql和mssql。

A3:將A1中的SellerId字段替換成A2中對應(yīng)的記錄,關(guān)聯(lián)字段為EId。A3的計算結(jié)果如下(藍色字體表示該數(shù)據(jù)項包含下級成員):

當(dāng)A2中找不到對應(yīng)的記錄時,函數(shù)switch默認(rèn)保留A1中記錄,對應(yīng)的SellerId顯示為空,效果類似于左連接。如果想進行內(nèi)連接,應(yīng)當(dāng)使用選項@i,形如:A1.switch@i(SellerId,A2:EId)

A4:對關(guān)聯(lián)結(jié)果進行過濾,第1個條件是:訂單日期在最近N天(對應(yīng)參數(shù)days),表達式為OrderDate>=after(date(now),days*-1)。第2個條件是:訂單屬于某幾個受關(guān)注的部門(對應(yīng)參數(shù)depts),表達式是depts.array.pos(SellerId.Dept)。運算符||表示邏輯關(guān)系“或”。

函數(shù)after可以算出相對時間,函數(shù)array可以按分隔符將字符串拆分為集合。函數(shù)pos可以找出成員在集合中的位置。SellerId.Dept表示SellerId字段對應(yīng)的記錄的Dept字段。

Days和depts都是來自于報表的參數(shù),如果分別輸入30、"Marketing,Finance",則A4的結(jié)果如下:

A5:從A4中取得報表需要的字段,最終計算結(jié)果如下:

結(jié)果集union

結(jié)果集ds1和ds2結(jié)構(gòu)相同,分別來自mySQL和文本文件,需要將ds1和ds2縱向拼接起來再呈現(xiàn)為交叉表。源數(shù)據(jù)如下:

集算器代碼:

A3:縱向拼接兩個數(shù)據(jù)集。報表工具只需呈現(xiàn)基于單數(shù)據(jù)集的簡單交叉表。

主子報表多數(shù)據(jù)源

對于單數(shù)據(jù)源報表,如果同一張報表中的主表和子表使用不同的數(shù)據(jù)源,就需要顯式傳遞數(shù)據(jù)庫URL,或用JAVA類合并不同的數(shù)據(jù)源,前者安全性較低,后者代碼復(fù)雜。使用集算器可以方便地解決此類問題,下面用例子來說明。

設(shè)計一張主子報表,按薪酬范圍顯示每位員工的訂單信息,主報表數(shù)據(jù)來自表emp(MySQL數(shù)據(jù)庫),子報表數(shù)據(jù)來自表sales(MSSQL數(shù)據(jù)庫)。部分源數(shù)據(jù)如下:

集算器代碼:

empEsProc.dfx(該腳本文件用于主報表)

A1:按薪酬范圍查詢MYSQL數(shù)據(jù)庫的表emp。

salesEsProc.dfx(該腳本文件用于子報表)

A1:按員工ID從MSSQL的sales表查找相應(yīng)的訂單。如果eid=1,則A1的計算結(jié)果如下:

可以看到,不同的數(shù)據(jù)源可被集算器合并為單一數(shù)據(jù)源,主子報表只需調(diào)用不同的集算器文件即可實現(xiàn)本需求。

有些報表系統(tǒng)會存在多種數(shù)據(jù)源,各報表使用的數(shù)據(jù)源不同且經(jīng)常發(fā)生變更,管理起來難度較大,使用集算器單一數(shù)據(jù)源可以降低管理難度。

類似地,單一數(shù)據(jù)源還可以解決子報表多數(shù)據(jù)源的問題,即:報表中存在多個子報表(或table控件),每個子報表使用不同的數(shù)據(jù)源。

主子表動態(tài)關(guān)聯(lián)

主表相關(guān)的子表分布在多個數(shù)據(jù)庫中,要求報表呈現(xiàn)這些數(shù)據(jù)源動態(tài)關(guān)聯(lián)的結(jié)果。此類需求可以用集算器簡單實現(xiàn),例如:

主 表org在數(shù)據(jù)源Master中,org里每條記錄對應(yīng)的子表在不同的數(shù)據(jù)源中,比如org.org_id=”O(jiān)RG_S”時,這條記錄對應(yīng)的子表是數(shù)據(jù) 源S_odaURL的User表,org.org_id=”O(jiān)RG_T”時,這條記錄對應(yīng)的子表是數(shù)據(jù)源T_odaURL中的User表。子表不止兩個, 名字都是User,需要和主表動態(tài)關(guān)聯(lián)再呈現(xiàn)在報表中。邏輯上的關(guān)系如下:

集算器代碼如下:

A1:執(zhí)行SQL,從數(shù)據(jù)源Master的org表取數(shù)據(jù)。arg1是來自報表的參數(shù),arg1=”O(jiān)RG”時A1的計算結(jié)果如下:

A2:依次循環(huán)A1中的記錄,每次動態(tài)關(guān)聯(lián)一個子表,并將關(guān)聯(lián)結(jié)果合并在B2中。集算器用自然縮進來表示循環(huán)語句的作用范圍,即B2-B7,循環(huán)體中可用A2來引用循環(huán)變量,可用#A2來引用循環(huán)計數(shù)。

B2:根據(jù)當(dāng)前記錄的org_id字段計算出對應(yīng)子表的數(shù)據(jù)源名。第一次循環(huán)時,B2的計算結(jié)果為” S_odaURL”。

B3:根據(jù)名字顯式連接到數(shù)據(jù)源。

B4:按條件查詢user表中的數(shù)據(jù)。

B5:在子表B4中新增三列,數(shù)據(jù)來自主表。比如第一次循環(huán)時,B5計算結(jié)果如下:

B6:將B5的計算結(jié)果合并到B1,運算符”|”等價于函數(shù)union。循環(huán)結(jié)束后B1會存儲報表需要的完整數(shù)據(jù),如下:

B7:顯式關(guān)閉數(shù)據(jù)源連接。

A8:將B1顯式返回給報表工具(默認(rèn)會返回最后一個單元格)

根據(jù)參數(shù)顯示時間精度不同的數(shù)據(jù)

報 表需要用折線圖展現(xiàn)近期的銷售額變化。unitType是報表參數(shù),代表時間精度,當(dāng)unitType等于"hour"時,需要展現(xiàn)近1小時內(nèi)每五分鐘的 銷售額,當(dāng)unitType="day"時,需要展現(xiàn)近1天內(nèi)每小時的銷售額,當(dāng)unitType="week"時,需要展現(xiàn)近1周內(nèi)每天的銷售額。數(shù)據(jù) 來源于orders表,字段Amount是訂單金額,t是訂單發(fā)生時間。

集算器代碼:

A1:空結(jié)果集,用來存儲B2-B4產(chǎn)生的時間序列。

A2-B2:根據(jù)報表參數(shù)unitType生成不同的時間序列,B2可生成近1小時內(nèi)的12個時間點,每個時間點間隔5分鐘,B3生成近1天內(nèi)的時間點,B4生成近1周的時間點。

A5:循環(huán)A1,每次統(tǒng)計一個時間段內(nèi)的銷售額,"~"表示A1的當(dāng)前成員,"~[-1] "表示上一個成員。當(dāng)unitType="day",會生成12條記錄的單字段結(jié)果集。

A6:將A5通過JDBC傳給報表。之后就可以按普通統(tǒng)計圖的方法去呈現(xiàn)。

以上就是關(guān)于調(diào)用pos機動態(tài)碼,報表工具的動態(tài)數(shù)據(jù)源實現(xiàn)的知識,后面我們會繼續(xù)為大家整理關(guān)于調(diào)用pos機動態(tài)碼的知識,希望能夠幫助到大家!

轉(zhuǎn)發(fā)請帶上網(wǎng)址:http://www.shineka.com/newsone/52356.html

你可能會喜歡:

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 babsan@163.com 舉報,一經(jīng)查實,本站將立刻刪除。