NCV5-公式技術(shù)紅皮書_第1頁(yè)
NCV5-公式技術(shù)紅皮書_第2頁(yè)
NCV5-公式技術(shù)紅皮書_第3頁(yè)
NCV5-公式技術(shù)紅皮書_第4頁(yè)
NCV5-公式技術(shù)紅皮書_第5頁(yè)
已閱讀5頁(yè),還剩29頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、公式技術(shù)紅皮書NC-UAP 5.0用友NC-UAP2022-01-071第 頁(yè)目 錄第一章新版公式使用手冊(cè)11.公式主要功能12.公式的基本使用方法22.1創(chuàng)建公式執(zhí)行器22.2設(shè)置公式執(zhí)行器環(huán)境32.3設(shè)置公式的值32.4對(duì)公式進(jìn)行語(yǔ)法檢查32.5提取公式變量42.6給公式變量賦值42.7取得公式的值53.數(shù)值型計(jì)算結(jié)果小數(shù)位的控制54.自定義變量的使用65.如何從公式中提取變量86.空值”,NULL值及Zero值的處理97.如何進(jìn)行列操作118.利用自定義函數(shù)擴(kuò)展公式功能119.外接函數(shù)的使用1210.運(yùn)算符重載1311.公式簡(jiǎn)單調(diào)試14附錄1公式解析器內(nèi)置變量列表15附錄2公式解析器內(nèi)置

2、公式列表151.數(shù)學(xué)運(yùn)算函數(shù)152.條件判斷函數(shù)183.數(shù)據(jù)庫(kù)查詢函數(shù)204.字符串相關(guān)函數(shù)215.日期函數(shù)236.類型轉(zhuǎn)換函數(shù)237.貨幣金額函數(shù)248.多語(yǔ)言翻譯函數(shù)259.其他函數(shù)26第 32 頁(yè)第一章 新版公式使用手冊(cè)1. 公式主要功能1. 支持一般的算術(shù)運(yùn)算+,-,*,/,%例如: sin(1.35)*a/b + cos(3.4)/c其中a,b,c均為變量2. 支持對(duì)數(shù)值型計(jì)算結(jié)果小數(shù)位的控制3. 支持邏輯運(yùn)算符&&(兼容老版&),|(兼容老版|),!例如: iif(a&b)|(c&&d),"right","

3、;wrong")其中a,b,c,d均為變量4. 支持比較運(yùn)算符>,>=,<,<=,=,!=等,支持null值的處理。例如: iif(a>b && a != null)|(c<=d),"right","wrong")其中a,b,c,d均為變量5. 支持自定義變量,變量可按Object和String兩種方式傳入例如: col1->var1+var2其中var1,var2均為自定義變量,可以為String型,也可以為任意類型6. 公式除了支持String,Number型數(shù)據(jù)運(yùn)算,還支持自定義類

4、型例如: combine(vo1,vo2)其中vo1,vo2可為自定義的數(shù)據(jù)類型,具體用法參考后面的說(shuō)明7. 支持操作符(+,-,*,/,>,>=,<,<=,=)重載(通過(guò)實(shí)現(xiàn)相應(yīng)的接口)例如: iif(car1>car2)|(factory1<=factory2),"right","wrong")其中car1,car2,factory1,factory2的運(yùn)算符通過(guò)實(shí)現(xiàn)相應(yīng)的接口進(jìn)行重載。8. 可以在數(shù)值型一維數(shù)組之間進(jìn)行加減乘除運(yùn)算(數(shù)組長(zhǎng)度必須相等),即支持列操作.例如var1 = 1,2,3,4; var2 =

5、 2,3,4,5; 可對(duì)var1,var2進(jìn)行各種運(yùn)算。9. 系統(tǒng)函數(shù)支持,NC常用函數(shù)支持例如:sin,cos,ceil,floor,toChinese,getChineseCurrency(),iif()等等,詳細(xì)支持的函數(shù)請(qǐng)參見(jiàn)附錄。10. 支持外接用戶函數(shù).(可以是一個(gè)java的方法)例如:公式combine("nihao","hao")中,combine是一個(gè)自定義函數(shù),可以指定綁定到一個(gè)JAVA類的具體方法,可參考后面的例子。11. 支持自定義函數(shù).具體應(yīng)用可參考后面的詳細(xì)說(shuō)明(第1.8節(jié))有時(shí)候公式解析器內(nèi)部的函數(shù)并不能完全滿足用戶的要求,

6、此時(shí)用戶可添加自定義函數(shù)。例如:hello("say something",person),hello為一個(gè)自定義函數(shù),動(dòng)態(tài)注冊(cè)到公式解析器中。12. 支持客戶端公式和服務(wù)端公式.以滿足前臺(tái)及后臺(tái)調(diào)用,主要體現(xiàn)在數(shù)據(jù)庫(kù)查詢的方式上有一定的差別。13. 支持多行公式批量運(yùn)算,且保持變量的傳遞性.例如:a->col1+col2;b->a+col1*col3;c->a+b;14. 支持一個(gè)線程內(nèi)多個(gè)公式執(zhí)行器實(shí)例交替運(yùn)行的情況,但不支持多個(gè)線程內(nèi)同一公式執(zhí)行器實(shí)例交替運(yùn)行。所以如果程序中起多線程的話,建議每個(gè)線程單獨(dú)創(chuàng)建自己的公式解析器示例。例如下面的代碼是可行

7、的:FormulaParseFather f= new FormulaParse();f.setExpress(formula);f.setNullAsZero(true);FormulaParseFather f1=new FormulaParse(); f1.setNullAsZero(false);f.setDataSArray(map);String res = f.getValueS();2. 公式的基本使用方法使用公式解析器的基本步驟如下:2.1 創(chuàng)建公式執(zhí)行器如果在客戶端使用公式解析:FormulaParseFather f = new nc.ui.pub.formulapars

8、e.FormulaParse();如果在服務(wù)端使用公式解析:FormulaParseFather f = new nc.bs.pub.formulaparse.FormulaParse();如果不知道當(dāng)前的代碼會(huì)在哪一端運(yùn)行,可以用下面的方法進(jìn)行判斷:if (RuntimeEnv.getInstance().isRunningInServer() parse = new nc.bs.pub.formulaparse.FormulaParse(); else parse = new nc.ui.pub.formulaparse.FormulaParse();2.2 設(shè)置公式執(zhí)行器環(huán)境(自定義變量

9、及自定義函數(shù)可參考后續(xù)章節(jié)描述)這里可以給公式執(zhí)行器添加自定義變量,例如:UFDouble var1 = new UFDouble(5.368);f.addVariable(var1);或者添加自定義函數(shù),例如:類YourFunction是一個(gè)定義的函數(shù)類(關(guān)于如何自定義函數(shù),請(qǐng)參考自定義函數(shù)一節(jié)),在公式中函數(shù)取名為"yourfun",則可以這樣添加你的自定義函數(shù):f.addFunction("yourfun",new YourFunction);2.3 設(shè)置公式的值設(shè)置公式執(zhí)行器環(huán)境非必須步驟。對(duì)于單行公式:String fomula = "

10、;sin(30)*2-56/78"f.setExpress(fomula);對(duì)于多行公式:String formulas = new String"viewmny1->viewnum*viewprice-rate*0.23 ","viewmny2-> viewnum*viewprice-rate*0.24"f.setExpressArray(formulas);2.4 對(duì)公式進(jìn)行語(yǔ)法檢查在設(shè)置完公式之后,直接調(diào)用執(zhí)行器的check()方法便可以進(jìn)行公式檢查:bool isok = f.check();如果返回結(jié)果為false,那么說(shuō)

11、明公式存在語(yǔ)法錯(cuò)誤,調(diào)用getError()可以獲得具體的錯(cuò)誤信息:String errmsg = f.getErrorMsg();下面是一段具體應(yīng)用的代碼:FormulaParseFather f= new nc.ui.pub.formulaparse.FormulaParse();String formula = "a->getChineseCurrency(cchmny,34)"boolean isok= f.check(); if(!isok)System.out.println(f.getError();return;另外,如果還沒(méi)有設(shè)置公式,僅僅是想校驗(yàn)公

12、式的正確性,則可以直接通過(guò)checkExpress(String formula)或者:checkExpressArray(formulas)來(lái)檢查公式,例如:bool isok = f. checkExpress (formulas); /單行公式bool isok = f. checkExpressArray(formulas); /多行公式注意:如果是多行公式,那么只要有一個(gè)公式寫法是錯(cuò)誤的,那么檢查結(jié)果就會(huì)是false。2.5 提取公式變量在單據(jù)模板和打印模板的應(yīng)用中,公式中的變量并不是已知的,需要從公式中分析得到,取得公式中的變量之后,再把相應(yīng)的值賦給變量。新版公式解析器中提取公式中

13、變量的接口和老版是一致的:VarryVO varrys = f.getVarryArray();下面是單據(jù)模板里取公式變量的典型代碼:/設(shè)置表達(dá)式formulas = filterUsedFormulas(bfc, formulas);if (formulas = null)return null;f.setExpressArray(formulas);/獲得變量名final VarryVO varrys = f.getVarryArray();2.6 給公式變量賦值下面是一段給公式變量賦值的代碼:/下列代碼假設(shè)varrys不會(huì)為nullVarryVO varrys = f.getVarryA

14、rray();for (int i = 0; i < varrys.length; i+)String varries = varrysi.getVarry();/提取公式變量非必須步驟if(varries != null)for (int j = 0; j < varries.length; j+)/從外部環(huán)境取得變量的值Object varryValue = getVarryValue(varriesj);/傳遞給公式f.addVariable(varriesi,varryValue);2.7 取得公式的值根據(jù)公式具體的應(yīng)用場(chǎng)景,取值有多種形式,如下所示:?jiǎn)涡泄椒祷貑蝹€(gè)值:O

15、bject res = f.getValueAsObject();單行公式返回一列值:Object res =f.getValueO();多行公式返回多列值:Object res = f.getValueOArray();單行公式返回單個(gè)字符串String res = f.getValue();單行公式返回一列字符串:String res =f.getValueS();多行公式返回多列字符串Stringres = f.getValueOArray();3. 數(shù)值型計(jì)算結(jié)果小數(shù)位的控制當(dāng)利用公式解析器進(jìn)行數(shù)值型的運(yùn)算時(shí),可以對(duì)輸出結(jié)果的小數(shù)位進(jìn)行控制。公式解析器中提供了以下幾個(gè)接口:public

16、 void setScale(int scale);設(shè)置返回精度,截位默認(rèn)為四舍五入。對(duì)Double,UFDouble型返回結(jié)果有效。 public void setScale(int scale, int roundingup);設(shè)置返回精度及截位規(guī)則,對(duì)Double,UFDouble型返回結(jié)果有效。public void setScale(String varname, int scale);針對(duì)具體的變量設(shè)置返回精度,截位默認(rèn)為四舍五入。public void setScale(String varname, int scale, int roundingup);針對(duì)具體的變量設(shè)置返回精

17、度及截位規(guī)則,對(duì)所有數(shù)值型返回結(jié)果有效。如果不做任何設(shè)置,那么輸出結(jié)果與UFDouble的默認(rèn)精度一致,為8位小數(shù)。下面是一個(gè)具體的示例:FormulaParseFather f = new nc.ui.pub.formulaparse.FormulaParse();String formulas = new String"a->cchmny*cchmny*cchmny","b->a*cchmny","c->a*b*cchmny"f.setExpressArray(formulas);Map map = new Ha

18、shMap();List v2 = new ArrayList();v2.add(new UFDouble(1.99999); /row valuev2.add(new UFDouble(2.9999); /row valuev2.add(new UFDouble(3.99999);v2.add(new UFDouble(1.999994); /row valuemap.put("cchmny",v2);f.setDataSArray(map);f.setScale("a",5);f.setScale("b",6);Object re

19、s = f.getValueOArray();assertEquals("應(yīng)該相等!", "7.99988", res00.toString();10assertEquals("應(yīng)該相等!", "15.999680", res10.toString();/默認(rèn)精度為8assertEquals("應(yīng)該相等!", "255.98976018", res20.toString();4. 自定義變量的使用公式支持自定義變量,只要相關(guān)的操作允許的話,自定義變量可以是任何類型的,下面的代

20、碼說(shuō)明了如何加入一個(gè)名為var1,UFDouble型的變量:FormulaParseFather f= new nc.ui.pub.formulaparse.FormulaParse();String formula = "a->round(var1,3)"f.addVariable("var1",new UFDouble(3.56893);除了可以加入簡(jiǎn)單類型的變量,還可以加入ArrayList3, 用戶自定義對(duì)象4等等,下面的代碼演示了如何加入一個(gè)ArrayList型的變量:FormulaParseFather f= new nc.ui.pub

21、.formulaparse.FormulaParse();String formula = "a->round(var1,3)"List list1 = new ArrayList();list1.add(new UFDouble(56.2354);list1.add(new UFDouble(23.2343);f.addVariable("var1",list1);另外還可以批量的加入多個(gè)變量,公式解析器提供兩個(gè)接口如下:setDataSArray(Hashtable); /老版接口要求,不推薦使用setDataSArray(Map);需要注意的

22、是,由于老版接口setDataSArray(Hashtable)所有的參數(shù)均通過(guò)字符串傳入,所以在以此方式傳入?yún)?shù)時(shí),存在真假字符串之分,真字符串形如:v10 = ""SHVO0000000000000005""v11 = ""SHVO0000000000000005""v12 = ""SHVO0000000000000005""即在字符串的兩端加上雙引號(hào)”,表示傳入的參數(shù)為String類型,如果兩端不加這個(gè)符號(hào),則表示傳入的為數(shù)值型, 公式解析器會(huì)將其轉(zhuǎn)換為數(shù)值型處理,例如

23、:v10 = "623.23"v11 = "5263.12"v12 = "5242.01"而如果通過(guò)addVariable(name,Value)或者以setDataSArray(Map)方式傳入?yún)?shù)時(shí),參數(shù)的類型取決于實(shí)際傳入的類型,公式解析器不會(huì)做任何轉(zhuǎn)換:-),請(qǐng)注意下面兩段代碼的差別。老版公式接口,判斷真假字符串:FormulaParseFather f = new nc.ui.pub.formulaparse.FormulaParse();f.setExpress("a->var1+var2");L

24、ist v2 = new ArrayList();v2.add("100"); /row valuev2.add("200"); /row valueHashtable map = new Hashtable();map.put("var1",v2);map.put("var2",v2);Hashtable maps = new Hashtable1;maps0 = map;f.setDataSArray(maps); /將會(huì)轉(zhuǎn)為數(shù)值f.setScale(2);String res = f.getValueS();

25、assertEquals("Should equal:","200.00",res0.toString();新版增加的接口,傳什么就是什么,完全按Object方式傳遞參數(shù):FormulaParseFather f = new nc.ui.pub.formulaparse.FormulaParse();f.setExpress("a->var1+var2");List v2 = new ArrayList();v2.add("100"); /row valuev2.add("200"); /

26、row valueMap map = new HashMap();map.put("var1",v2);map.put("var2",v2);f.setDataSArray(map); /當(dāng)作字符串f.setScale(2);String res = f.getValueS();assertEquals("Should equal:","100100",res0.toString();注意:公式中的變量取名不可與內(nèi)置自定義變量名(可參考附錄內(nèi)置變量列表)相同,也不得與內(nèi)置的函數(shù)名(可參考附錄內(nèi)置公式列表)相同。如果

27、和內(nèi)置變量相同,公式解析可能會(huì)得到不正確的結(jié)果;如果變量和內(nèi)置函數(shù)名相同,則會(huì)報(bào)公式解析錯(cuò)誤。5. 如何從公式中提取變量單據(jù)模板和打印模板的公式解析要求可以解析識(shí)別公式中的列變量,以便從模板中取得相應(yīng)的值賦給這些列變量。比如對(duì)下面的公式:String formulas = new String"viewcode->getColValue(hyca_viewobj,viewcode,pk_viewobj, pk_viewobj) ","viewchinaname->getColValue(hyca_viewobj,viewchinaname,pk_vie

28、wobj1,pk_viewobj1)","summny->cchmny*25/5+cchmny"FormulaParseFather f = new nc.ui.pub.formulaparse.FormulaParse();f.setExpressArray(formulas);得到的varrys的信息如下:varrys0: formulaName:viewcode;varry1:pk_viewobjvarrys1: formulaName:viewchinaname; varry1: pk_viewobj1varrys2: formulaName:sum

29、mny; varry1:cchmny其中VarryVO的定義如下:public class VarryVOString formulaName=null;/公式名:等號(hào)左邊String varry=null;/變量,等號(hào)右邊的變量利用varrys的信息就可以從模板中取得相應(yīng)列變量的值,并將公式返回的值賦給每行公式左邊列名所對(duì)應(yīng)的列。下面是提取變量的另一個(gè)例子,演示了從復(fù)雜的函數(shù)中提取列變量:String formulas = new String"viewcode->hyca_viewobj*cvn(hyca_viewobj,viewcode,pk_viewobj,pk_vie

30、wobj)+ viewcode*cvs(hyca_viewobj,viewcode,pk_viewobj,pk_viewobj1)","viewchinaname->getColNmV(hyca_viewobj,viewchinaname,pk_viewobj,pk_viewobj2)"FormulaParseFather f = new nc.ui.pub.formulaparse.FormulaParse();f.setExpressArray(formulas);VarryVO varrys = f.getVarryArray();assertEqua

31、ls("應(yīng)該相等!",2, varrys.length);assertEquals("應(yīng)該相等!",4, (varrys0.getVarry().length);6. 空值”,NULL值及Zero值的處理在公式解析中,請(qǐng)注意區(qū)分以下三個(gè)概念:空值:指長(zhǎng)度為0的字符串,""NULL值:指沒(méi)有分配任何空間的Object,類似JAVA語(yǔ)言里的NULLZero值:指Double(0)公式執(zhí)行器有一個(gè)共有函數(shù)setNullAsZero(boolean value),用于設(shè)置在運(yùn)算過(guò)程中是否需要將NULL值作為Zero值來(lái)進(jìn)行運(yùn)算。默認(rèn)狀態(tài)下,公

32、式執(zhí)行器設(shè)置setNullAsZero(false)。請(qǐng)看下面的例子:String formula = new String"a->val1/val2","b->val1*val2"FormulaParseFather f= new FormulaParse();f.addVariable("val1",null);f.addVariable("val2",new Double(56);f.setExpressArray(formula);f.setNullAsZero(true); /設(shè)置為trueS

33、tring res = f.getValueSArray();/val1當(dāng)做Double(0)計(jì)算,得出a=0assertEquals("應(yīng)該相等!", "0.00000000", res00);/val1當(dāng)做Double(0)計(jì)算,得出b=0assertEquals("應(yīng)該相等!", "0.00000000", res10);如果上例中setNullAsZero(false),因?yàn)閚ull值無(wú)法參與運(yùn)算,那么得到的結(jié)果為空。對(duì)于setNullAsZero函數(shù),需要注意的是,NULL值當(dāng)作Zero值來(lái)處理僅僅是指在

34、運(yùn)算過(guò)程中,不適用于返回值為NULL時(shí)的處理,例如:String formula = "a->val1"FormulaParseFather f= new FormulaParse();f.addVariable("val1",null);f.setExpress(formula);f.setNullAsZero(true);String res = f.getValue();/val1當(dāng)做Double(0)計(jì)算,但結(jié)果res為空值.如果上例中,想要返回0,則可以這么改寫公式:String formula = "a->toNumbe

35、r(val1)"FormulaParseFather f= new FormulaParse();f.addVariable("val1",null);f.setExpress(formula);f.setNullAsZero(true);String res = f.getValue();/結(jié)果res為0.00000000.當(dāng)NULL值參與字符串連接時(shí),NULL值自動(dòng)被當(dāng)作空值處理,setNullAsZero此時(shí)對(duì)運(yùn)算結(jié)果無(wú)任何影響,例如:null+"dddd"+null;null+null+"dddd"上述兩個(gè)公式均應(yīng)該

36、返回"dddd"!關(guān)于NULL值,空值之間區(qū)別另一個(gè)需要注意的地方是在寫IIF函數(shù)時(shí),比較條件到底是NULL還是空值,需要根據(jù)實(shí)際場(chǎng)景決定,一般getColValue()等數(shù)據(jù)庫(kù)查詢函數(shù)如果無(wú)法查到值返回的是null值。例如:fkdw->iif(val2=null,"val2 is zero",val2)"fkdw->iif(val2="","val2 is zero",val2)"iif(getColValue(hyca_viewobj, viewchinaname,pk_view

37、obj,pk_viewobj)=null,pk_viewobj,getColValue(hyca_viewobj, viewchinaname,pk_viewobj,pk_viewobj);7. 如何進(jìn)行列操作公式支持列操作,即列之間的+,-,*,/,%,>,<,>=,<=,=等,需要注意的是這里的公式中的列均由ArrayList表示,如果加入自定義變量時(shí),如果需要加入一列數(shù)據(jù),需以ArrayList的形式加入!列操作的兩個(gè)對(duì)象要求長(zhǎng)度必須相等,實(shí)際上是對(duì)兩個(gè)列的對(duì)應(yīng)元素進(jìn)行操作.例如:1,2,3,4,5 + 3,3,4,5,6 = 4,5,7,9,114,6,8,9,

38、45 /2,3,4,3,9 = 2,2,2,3,5列操作的目的主要是對(duì)模板上各列進(jìn)行操作,以便可以在各列之間進(jìn)行靈活的運(yùn)算。比如有三個(gè)列分別為currentMny(本期發(fā)生金額),initMny(期初金額),endMny(期末金額) 那么就可以直接用公式來(lái)計(jì)算期末金額:endMny-> currentMny + initMny下面是完整的代碼示例:FormulaParseFather f = new nc.ui.pub.formulaparse.FormulaParse();f.setExpress("a->sum(cchmny,cchmny,2*cchmny)"

39、;);String v2 = new String3;v20 = "1" /row valuev21 = "2" /row valuev22 = "3"Map map = new HashMap();map.put("cchmny",v2);f.setDataSArray(map);String res = f.getValueS();assertEquals("應(yīng)該相等!", "4.0", res0);assertEquals("應(yīng)該相等!", &quo

40、t;8.0", res1);assertEquals("應(yīng)該相等!", "12.0", res2);8. 利用自定義函數(shù)擴(kuò)展公式功能你可以在公式中加入自定義函數(shù),為了這個(gè)目的,需要做兩件事情:1) 從nc.vo.pub.expression.function.NcInnerFunction繼承自己的函數(shù)處理類。下面的例子說(shuō)明了如何編寫自己的函數(shù)處理類:public class MyFunction extends NcInnerFunctionpublic MyFunction()numberOfParameters = 0; /函數(shù)參數(shù)的個(gè)數(shù)

41、/函數(shù)具體的運(yùn)算,param中是具體的參數(shù)public Object function(List param) throws ParseExceptionif (param = null | param.size() != 0)throw new ParseException("錯(cuò)誤:參數(shù)個(gè)數(shù)不對(duì),mon()不需要參數(shù)!");UFDate date = new UFDate();return String.valueOf(date.getMonth();可以看出,主要在于編寫function()函數(shù),這個(gè)函數(shù)實(shí)現(xiàn)了具體的功能,即如何對(duì)傳入的參數(shù)進(jìn)行處理。2) 在公式執(zhí)行器中

42、加入自定義函數(shù)直接調(diào)用addFunction()函數(shù)加入你的函數(shù)類即可,funname即為你定義函數(shù)在公式中的名稱。f.addFunction("funname", new yourFunctionClass();完成了上述兩步工作,你就可以直接在你的公式中使用自定義的函數(shù)了!9. 外接函數(shù)的使用本公式解析器支持外接函數(shù),即可以調(diào)用任何一個(gè)類中的函數(shù),只要給出公式中函數(shù)名,類名,類中函數(shù)名,返回參數(shù)類型,函數(shù)參數(shù)類型等,就可以實(shí)現(xiàn)在公式中調(diào)用外接函數(shù),比如下面的公式就調(diào)用了nc.vo.pub.expression.test.Customfunction1類的combineS

43、tring函數(shù)。FormulaParseFather f = new nc.ui.pub.formulaparse.FormulaParse();f.setSelfMethod( "combine", /公式中函數(shù)名"nc.vo.pub.expression.test.Customfunction1", /類名"combineString", /類中函數(shù)名ArrayList.class, /返回參數(shù)類型new ClassString.class,String.class); /函數(shù)參數(shù)類型f.setExpress("a-&g

44、t;combine(cchmny," down")");List v2 = new ArrayList();v2.add("cut"); /row valuev2.add("go"); /row valuev2.add("step");Map map = new HashMap();map.put("cchmny",v2);f.setDataSArray(map);String res = f.getValueS();assertEquals("Should equal:&q

45、uot;,"cut down",res0);10. 運(yùn)算符重載目前公式解析器支持下列運(yùn)算符重載:運(yùn)算符符號(hào)相應(yīng)接口加+ IAddOperator: public Object add(Object obj)減- ISubOperator: Object sub(Object obj)乘* IMulOperator: Object multiply(Object obj)除/ IDivOperator: Object div(Object obj)另外如果用戶對(duì)象要在公式中進(jìn)行比較運(yùn)算,請(qǐng)直接實(shí)現(xiàn)java.lang.Comparable接口,下面是一個(gè)操作符重載的示例:pub

46、lic class TestVO implements IAddOperator public String name;public int age;public TestVO(String name, int age) = name;this.age = age;/運(yùn)算符重載public Object add(Object obj) throws ExceptionTestVO param2 = (TestVO)obj;String sname = name+;int sage = age+param2.age;TestVO res = new Tes

47、tVO(sname,sage);return res;這樣便可以在公式里對(duì)TestVO進(jìn)行加法的運(yùn)算:FormulaParseFather f =new nc.ui.pub.formulaparse.FormulaParse(); f.addVariable("v3", new UFDouble(3.0); f.setExpress("a->vo1+vo2"); Map map =initVarMap(); f.setDataSArray(map); Object res = f.getValueO();assertEquals("Sho

48、uld equal:", "cch1cch2", (TestVO) res0).name);assertEquals("Should equal:", 48, (TestVO) res0).age);其中nitVarMap()函數(shù)對(duì)vo1和vo2做了初始化:private Map initVarMap()List v1 = new ArrayList();v1.add(new TestVO("cch1", 24); /row valuev1.add(new TestVO("hey1", 25); /row

49、 valuev1.add(new TestVO("xuc1", 25);List v2 = new ArrayList();v2.add(new TestVO("cch2", 24); /row valuev2.add(new TestVO("hey2", 25); /row valuev2.add(new TestVO("xuc2", 23);Map map = new HashMap();map.put("vo1", v1);map.put("vo2", v2);retu

50、rn map;11. 公式簡(jiǎn)單調(diào)試公式解析器通過(guò)debug函數(shù),可以實(shí)現(xiàn)簡(jiǎn)單的調(diào)試功能,主要為了幫助分析公式每一步運(yùn)行的情況,確定錯(cuò)誤位置。請(qǐng)看下面debug函數(shù)用法示例。比如需要調(diào)試的公式如下:A->cvn(table,selectfield,wherefield,pkvalue);B->ZeroIfNull(A)*C/10;現(xiàn)在發(fā)現(xiàn)B字段就是沒(méi)有得到值,那么首先就要確認(rèn)A是否正確的從數(shù)據(jù)庫(kù)查詢到了值。添加調(diào)試語(yǔ)句如下:A->cvn(table,selectfield,wherefield,pkvalue);tempvar->debug("Variable

51、A="+ A);B->ZeroIfNull(A)*C/10;也可以順便輸出B的值:A->cvn(table,selectfield,wherefield,pkvalue);tempvar->debug("Variable A="+ A);B->ZeroIfNull(A)*C/10;tempvar->debug("Variable B="+ B);注意上面的tempvar是一個(gè)臨時(shí)變量,請(qǐng)務(wù)必加上且不要和公式變量及模板KEY重復(fù),多個(gè)調(diào)試語(yǔ)句可以使用同一個(gè)臨時(shí)變量,主要為了防止模板混淆。運(yùn)行程序執(zhí)行公式,便會(huì)輸出調(diào)試

52、記錄形如:公式調(diào)試Variable A=45.23公式調(diào)試Variable B=這樣就知道錯(cuò)誤大概在什么地方了。附錄1 公式解析器內(nèi)置變量列表null,NullEACH,WHOLEUPPER,LOWERDEPT,CTC,SUBF以上為公式內(nèi)置變量,注意自定義變量不可與內(nèi)置變量重名。附錄2 公式解析器內(nèi)置公式列表1. 數(shù)學(xué)運(yùn)算函數(shù)sin(num)功能:正弦函數(shù)參數(shù):num-數(shù)值,或一列數(shù)返回值:Double(或內(nèi)含Double型ArrayList,下同)示例:sin(23);List list1 = new ArrayList();list1.add(new UFDouble(2.3);list

53、1.add(new UFDouble(2.3);sin(list1);cos(num)功能:余弦函數(shù)參數(shù):num-數(shù)值,或一列數(shù)返回值:Double 示例:cos(23);List list1 = new ArrayList();list1.add(new UFDouble(2.3);list1.add(new UFDouble(2.3);cos(list1);exp(num)功能:冪數(shù)函數(shù)參數(shù):num-數(shù)值,或一列數(shù)返回值:Double 示例:exp(23);List list1 = new ArrayList();list1.add(new UFDouble(2.3);list1.add(

54、new UFDouble(2.3);exp(list1);sqrt(num)功能:平方根函數(shù)參數(shù):num-數(shù)值,或一列數(shù)返回值:Double示例:sqrt(23);List list1 = new ArrayList();list1.add(new UFDouble(2.3);list1.add(new UFDouble(2.3);sqrt(list1);log(num)功能:對(duì)數(shù)函數(shù)參數(shù):num-數(shù)值,或一列數(shù)返回值:Double 示例:log(23);List list1 = new ArrayList();list1.add(new UFDouble(2.3);list1.add(new

55、 UFDouble(2.3);log(list1);tg(num)功能:正切函數(shù)參數(shù):num-數(shù)值,或一列數(shù)返回值:Double示例:tg(23);List list1 = new ArrayList();list1.add(new UFDouble(2.3);list1.add(new UFDouble(2.3);tg(list1);ctg(num)功能:余切函數(shù)參數(shù):num-數(shù)值,或一列數(shù)返回值:Double示例:ctg(23);List list1 = new ArrayList();list1.add(new UFDouble(2.3);list1.add(new UFDouble(2

56、.3);ctg(list1);asin(num)功能:反正弦函數(shù)參數(shù):num-數(shù)值,或一列數(shù)返回值:Double示例:asin(23);List list1 = new ArrayList();list1.add(new UFDouble(2.3);list1.add(new UFDouble(2.3);asin(list1);acos(num)功能:反余弦函數(shù)參數(shù):num-數(shù)值,或一列數(shù)返回值:Double示例:acos(23);List list1 = new ArrayList();list1.add(new UFDouble(2.3);list1.add(new UFDouble(2.

57、3);acos(list1);atan(num)功能:反正切函數(shù)參數(shù):num-數(shù)值,或一列數(shù)返回值:Double示例:atan(23);List list1 = new ArrayList();list1.add(new UFDouble(2.3);list1.add(new UFDouble(2.3);atan(list1);max(Object,Object)功能:比較兩個(gè)對(duì)象的大小,返回最大值。如果傳入的是兩個(gè)ArrayList,那么一一對(duì)應(yīng)比較,返回結(jié)果也為ArrayList。參數(shù):對(duì)象1,對(duì)象2; 要求兩個(gè)對(duì)象為可比較或已實(shí)現(xiàn)比較操作符重載返回值:Object 示例:max(23.2

58、3,34.56); /返回34.56List list1 = new ArrayList();list1.add(new UFDouble(66);list1.add(new UFDouble(88);List list2 = new ArrayList();list1.add(new UFDouble(45);list1.add(new UFDouble(100);max(list1,list2);/返回ArrayList66,100min(Object,Object)功能:比較兩個(gè)對(duì)象的大小,返回最小值。如果傳入的是兩個(gè)ArrayList,那么一一對(duì)應(yīng)比較,返回結(jié)果也為ArrayList。

59、參數(shù):對(duì)象1,對(duì)象2; 要求兩個(gè)對(duì)象為可比較或已實(shí)現(xiàn)比較操作符重載返回值:Object 示例:min(23.23,34.56); /返回23.23List list1 = new ArrayList();list1.add(new UFDouble(66);list1.add(new UFDouble(88);List list2 = new ArrayList();list1.add(new UFDouble(45);list1.add(new UFDouble(100);min(list1,list2);/返回ArrayList45,88abs(num)功能:絕對(duì)值函數(shù)參數(shù):num-數(shù)值,或一列數(shù)返回值:Double示例:abs(2

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論