網(wǎng)上有很多關(guān)于調(diào)用pos機(jī)動(dòng)態(tài)碼,報(bào)表工具的動(dòng)態(tài)數(shù)據(jù)源實(shí)現(xiàn)的知識(shí),也有很多人為大家解答關(guān)于調(diào)用pos機(jī)動(dòng)態(tài)碼的問(wèn)題,今天pos機(jī)之家(m.afbey.com)為大家整理了關(guān)于這方面的知識(shí),讓我們一起來(lái)看下吧!
本文目錄一覽:
1、調(diào)用pos機(jī)動(dòng)態(tài)碼
調(diào)用pos機(jī)動(dòng)態(tài)碼
有時(shí)候我們需要用參數(shù)動(dòng)態(tài)指定數(shù)據(jù)源,或?qū)⒍鄶?shù)據(jù)源連接為單數(shù)據(jù)源,或向子報(bào)表、table控件動(dòng)態(tài)傳入數(shù)據(jù)源名。對(duì)于此類需求,報(bào)表工具經(jīng)常要借助高級(jí)語(yǔ)言實(shí)現(xiàn)或犧牲安全性以降低復(fù)雜度,尤其是BIRT、Jasper等單源報(bào)表。
使 用免費(fèi)的集算器可以彌補(bǔ)這一不足。集算器封裝了豐富的結(jié)構(gòu)化計(jì)算函數(shù),支持動(dòng)態(tài)解析表達(dá)式,支持多數(shù)據(jù)源混合計(jì)算,書寫簡(jiǎn)單腳本就能實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源。集算 器還提供了簡(jiǎn)單易用的JDBC接口,報(bào)表工具可將集算器腳本文件當(dāng)做數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程執(zhí)行,傳入?yún)?shù)并用JDBC獲得返回結(jié)果。
集算器與報(bào)表工具的集成結(jié)構(gòu)如下:
下面舉例說(shuō)明集算器根據(jù)參數(shù)動(dòng)態(tài)切換數(shù)據(jù)源的基本過(guò)程:
數(shù)據(jù)源myDB1和oraDB分別指向不同的數(shù)據(jù)庫(kù),兩庫(kù)中有相同結(jié)構(gòu)的表sOrder,報(bào)表需要根據(jù)參數(shù)動(dòng)態(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都是報(bào)表參數(shù),其中pSource代表數(shù)據(jù)源名,${…}表示將字符串或字符串變量解析為表達(dá)式,pAmount代表訂單金額。
當(dāng)pSource=”myDB1”時(shí),A1的計(jì)算結(jié)果如下:
當(dāng)pSource=”oraDB”時(shí),A1的計(jì)算結(jié)果如下:
報(bào)表工具可用JDBC的方式調(diào)用集算器腳本,就像調(diào)用普通數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程,形如:call 腳本文件名(參數(shù)1…參數(shù)N)。集算器的返回結(jié)果會(huì)以普通數(shù)據(jù)集的形式參與報(bào)表計(jì)算。具體用法可參考下列文檔:集算器集成與應(yīng)用之JasperReport集成 和集算器集成與應(yīng)用之BIRT集成 。
作為專業(yè)的報(bào)表數(shù)據(jù)源工具,集算器還可以實(shí)現(xiàn)更多的計(jì)算,下面分別舉例。
多源數(shù)據(jù)join后計(jì)算
Sales是mysql數(shù)據(jù)庫(kù)中的表,存儲(chǔ)著多名銷售員每天的多個(gè)訂單,其中字段SellerId是銷售員編號(hào)。emp是mssql數(shù)據(jù)庫(kù)中的表,存儲(chǔ)著 銷售員信息,其中字段EId是銷售員編號(hào)。現(xiàn)在需要在報(bào)表中展現(xiàn):訂單編號(hào)、日期、金額、銷售員名字、部門名稱,條件是:訂單日期在最近N天(比如30 天)或者訂單屬于某幾個(gè)受關(guān)注的部門(比如Markeding和Finance)。部分源數(shù)據(jù)如下:
庫(kù)表sales
庫(kù)表emp
集算器代碼:
A1,A2:查詢數(shù)據(jù)庫(kù),myDB1和myDB2分別直向mysql和mssql。
A3:將A1中的SellerId字段替換成A2中對(duì)應(yīng)的記錄,關(guān)聯(lián)字段為EId。A3的計(jì)算結(jié)果如下(藍(lán)色字體表示該數(shù)據(jù)項(xiàng)包含下級(jí)成員):
當(dāng)A2中找不到對(duì)應(yīng)的記錄時(shí),函數(shù)switch默認(rèn)保留A1中記錄,對(duì)應(yīng)的SellerId顯示為空,效果類似于左連接。如果想進(jìn)行內(nèi)連接,應(yīng)當(dāng)使用選項(xiàng)@i,形如:A1.switch@i(SellerId,A2:EId)
A4:對(duì)關(guān)聯(lián)結(jié)果進(jìn)行過(guò)濾,第1個(gè)條件是:訂單日期在最近N天(對(duì)應(yīng)參數(shù)days),表達(dá)式為OrderDate>=after(date(now),days*-1)。第2個(gè)條件是:訂單屬于某幾個(gè)受關(guān)注的部門(對(duì)應(yīng)參數(shù)depts),表達(dá)式是depts.array.pos(SellerId.Dept)。運(yùn)算符||表示邏輯關(guān)系“或”。
函數(shù)after可以算出相對(duì)時(shí)間,函數(shù)array可以按分隔符將字符串拆分為集合。函數(shù)pos可以找出成員在集合中的位置。SellerId.Dept表示SellerId字段對(duì)應(yīng)的記錄的Dept字段。
Days和depts都是來(lái)自于報(bào)表的參數(shù),如果分別輸入30、"Marketing,Finance",則A4的結(jié)果如下:
A5:從A4中取得報(bào)表需要的字段,最終計(jì)算結(jié)果如下:
結(jié)果集union
結(jié)果集ds1和ds2結(jié)構(gòu)相同,分別來(lái)自mySQL和文本文件,需要將ds1和ds2縱向拼接起來(lái)再呈現(xiàn)為交叉表。源數(shù)據(jù)如下:
集算器代碼:
A3:縱向拼接兩個(gè)數(shù)據(jù)集。報(bào)表工具只需呈現(xiàn)基于單數(shù)據(jù)集的簡(jiǎn)單交叉表。
主子報(bào)表多數(shù)據(jù)源
對(duì)于單數(shù)據(jù)源報(bào)表,如果同一張報(bào)表中的主表和子表使用不同的數(shù)據(jù)源,就需要顯式傳遞數(shù)據(jù)庫(kù)URL,或用JAVA類合并不同的數(shù)據(jù)源,前者安全性較低,后者代碼復(fù)雜。使用集算器可以方便地解決此類問(wèn)題,下面用例子來(lái)說(shuō)明。
設(shè)計(jì)一張主子報(bào)表,按薪酬范圍顯示每位員工的訂單信息,主報(bào)表數(shù)據(jù)來(lái)自表emp(MySQL數(shù)據(jù)庫(kù)),子報(bào)表數(shù)據(jù)來(lái)自表sales(MSSQL數(shù)據(jù)庫(kù))。部分源數(shù)據(jù)如下:
集算器代碼:
empEsProc.dfx(該腳本文件用于主報(bào)表)
A1:按薪酬范圍查詢MYSQL數(shù)據(jù)庫(kù)的表emp。
salesEsProc.dfx(該腳本文件用于子報(bào)表)
A1:按員工ID從MSSQL的sales表查找相應(yīng)的訂單。如果eid=1,則A1的計(jì)算結(jié)果如下:
可以看到,不同的數(shù)據(jù)源可被集算器合并為單一數(shù)據(jù)源,主子報(bào)表只需調(diào)用不同的集算器文件即可實(shí)現(xiàn)本需求。
有些報(bào)表系統(tǒng)會(huì)存在多種數(shù)據(jù)源,各報(bào)表使用的數(shù)據(jù)源不同且經(jīng)常發(fā)生變更,管理起來(lái)難度較大,使用集算器單一數(shù)據(jù)源可以降低管理難度。
類似地,單一數(shù)據(jù)源還可以解決子報(bào)表多數(shù)據(jù)源的問(wèn)題,即:報(bào)表中存在多個(gè)子報(bào)表(或table控件),每個(gè)子報(bào)表使用不同的數(shù)據(jù)源。
主子表動(dòng)態(tài)關(guān)聯(lián)
主表相關(guān)的子表分布在多個(gè)數(shù)據(jù)庫(kù)中,要求報(bào)表呈現(xiàn)這些數(shù)據(jù)源動(dòng)態(tài)關(guān)聯(lián)的結(jié)果。此類需求可以用集算器簡(jiǎn)單實(shí)現(xiàn),例如:
主 表org在數(shù)據(jù)源Master中,org里每條記錄對(duì)應(yīng)的子表在不同的數(shù)據(jù)源中,比如org.org_id=”O(jiān)RG_S”時(shí),這條記錄對(duì)應(yīng)的子表是數(shù)據(jù) 源S_odaURL的User表,org.org_id=”O(jiān)RG_T”時(shí),這條記錄對(duì)應(yīng)的子表是數(shù)據(jù)源T_odaURL中的User表。子表不止兩個(gè), 名字都是User,需要和主表動(dòng)態(tài)關(guān)聯(lián)再呈現(xiàn)在報(bào)表中。邏輯上的關(guān)系如下:
集算器代碼如下:
A1:執(zhí)行SQL,從數(shù)據(jù)源Master的org表取數(shù)據(jù)。arg1是來(lái)自報(bào)表的參數(shù),arg1=”O(jiān)RG”時(shí)A1的計(jì)算結(jié)果如下:
A2:依次循環(huán)A1中的記錄,每次動(dòng)態(tài)關(guān)聯(lián)一個(gè)子表,并將關(guān)聯(lián)結(jié)果合并在B2中。集算器用自然縮進(jìn)來(lái)表示循環(huán)語(yǔ)句的作用范圍,即B2-B7,循環(huán)體中可用A2來(lái)引用循環(huán)變量,可用#A2來(lái)引用循環(huán)計(jì)數(shù)。
B2:根據(jù)當(dāng)前記錄的org_id字段計(jì)算出對(duì)應(yīng)子表的數(shù)據(jù)源名。第一次循環(huán)時(shí),B2的計(jì)算結(jié)果為” S_odaURL”。
B3:根據(jù)名字顯式連接到數(shù)據(jù)源。
B4:按條件查詢user表中的數(shù)據(jù)。
B5:在子表B4中新增三列,數(shù)據(jù)來(lái)自主表。比如第一次循環(huán)時(shí),B5計(jì)算結(jié)果如下:
B6:將B5的計(jì)算結(jié)果合并到B1,運(yùn)算符”|”等價(jià)于函數(shù)union。循環(huán)結(jié)束后B1會(huì)存儲(chǔ)報(bào)表需要的完整數(shù)據(jù),如下:
B7:顯式關(guān)閉數(shù)據(jù)源連接。
A8:將B1顯式返回給報(bào)表工具(默認(rèn)會(huì)返回最后一個(gè)單元格)
根據(jù)參數(shù)顯示時(shí)間精度不同的數(shù)據(jù)
報(bào) 表需要用折線圖展現(xiàn)近期的銷售額變化。unitType是報(bào)表參數(shù),代表時(shí)間精度,當(dāng)unitType等于"hour"時(shí),需要展現(xiàn)近1小時(shí)內(nèi)每五分鐘的 銷售額,當(dāng)unitType="day"時(shí),需要展現(xiàn)近1天內(nèi)每小時(shí)的銷售額,當(dāng)unitType="week"時(shí),需要展現(xiàn)近1周內(nèi)每天的銷售額。數(shù)據(jù) 來(lái)源于orders表,字段Amount是訂單金額,t是訂單發(fā)生時(shí)間。
集算器代碼:
A1:空結(jié)果集,用來(lái)存儲(chǔ)B2-B4產(chǎn)生的時(shí)間序列。
A2-B2:根據(jù)報(bào)表參數(shù)unitType生成不同的時(shí)間序列,B2可生成近1小時(shí)內(nèi)的12個(gè)時(shí)間點(diǎn),每個(gè)時(shí)間點(diǎn)間隔5分鐘,B3生成近1天內(nèi)的時(shí)間點(diǎn),B4生成近1周的時(shí)間點(diǎn)。
A5:循環(huán)A1,每次統(tǒng)計(jì)一個(gè)時(shí)間段內(nèi)的銷售額,"~"表示A1的當(dāng)前成員,"~[-1] "表示上一個(gè)成員。當(dāng)unitType="day",會(huì)生成12條記錄的單字段結(jié)果集。
A6:將A5通過(guò)JDBC傳給報(bào)表。之后就可以按普通統(tǒng)計(jì)圖的方法去呈現(xiàn)。
以上就是關(guān)于調(diào)用pos機(jī)動(dòng)態(tài)碼,報(bào)表工具的動(dòng)態(tài)數(shù)據(jù)源實(shí)現(xiàn)的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于調(diào)用pos機(jī)動(dòng)態(tài)碼的知識(shí),希望能夠幫助到大家!
