UReport2教學(xué)視頻http://pan.baidu.com/s/1boWTxF5,密碼:98hj
在報(bào)表使用過(guò)程當(dāng)中,不可避免的要使用函數(shù)及表達(dá)式實(shí)現(xiàn)一些數(shù)據(jù)的計(jì)算,在 UReport2 當(dāng)中,很多地方都支持編寫表達(dá)式,比如最典型的我們可以將單元格類型改為“表達(dá)式”,這樣就可以在下面的表達(dá)式編輯器里輸入相應(yīng)的表達(dá)式與函數(shù),除此之外,UReport2 還允許我們?cè)跅l件、圖片來(lái)源、二維碼數(shù)據(jù)來(lái)源等地方使用表達(dá)式,所以學(xué)習(xí)并掌握 UReport2 中提供的表達(dá)式,是制作復(fù)雜報(bào)表的前提。
與一般的編程語(yǔ)言類似,UReport2 中的表達(dá)式也有一些基本的數(shù)據(jù)類型,比如數(shù)字、字符串等,如下表所示:
表達(dá)式類型
|
描述
|
示例
|
---|---|---|
數(shù)字 | 可以是一個(gè)整數(shù),也可以是一個(gè)小數(shù) | 1、123、0.121331,這些都是合法的數(shù)字 |
字符串 | 字符串需要用單引號(hào)或雙引號(hào)包裹 | 'ureport2'、"UReport2"、‘UReport2教程’,這些都是合法的字符串 |
布爾值 | 布爾值表示是或否 | 布爾就兩個(gè):true 和 false |
上述的有三種基本的數(shù)據(jù)類型,可以單獨(dú)使用,也可以用“+”、"-"、"*"、"/"、"%"連接,進(jìn)行組合運(yùn)算,如下表所示:
操作符
|
描述
|
示例
|
---|---|---|
+ | 求兩個(gè)數(shù)的和,或者是連接兩個(gè)值 | 21+31,這就表示求這兩個(gè)數(shù)的和,結(jié)果就是 52,“值:”+331則表示連接兩個(gè)值,其結(jié)果就是“值:331” |
- | 求兩個(gè)數(shù)差 | 21 - 31,這就表示求這兩個(gè)數(shù)的差,結(jié)果就是-10 |
* | 求兩個(gè)數(shù)的乘積 | 3*6,結(jié)果就是18 |
/ | 求兩個(gè)數(shù)除的結(jié)果 | 6/3,結(jié)果就是2,如果除不盡,則會(huì)保留8位小數(shù) |
% | 求兩個(gè)數(shù)除的余值 | 5%3,結(jié)果是2;6%2結(jié)果是0 |
UReport2 中還提供了幾種類型的條件判斷運(yùn)算符,我們首先來(lái)看一下三元表達(dá)式。
基本所有的語(yǔ)言都支持三元表達(dá)式判斷,它的特點(diǎn)是簡(jiǎn)潔明晰,可以用最少的代碼進(jìn)行條件判斷,UReport2 中的三元表達(dá)式語(yǔ)法結(jié)構(gòu)如下圖所示:
可以看到,和普通的三元表達(dá)式一樣,它的第一部分是條件部分,條件部分可以有多個(gè)條件(用and或or連接),“?”后面是條件滿足后執(zhí)行并返回的表達(dá)式部分,“:”后面則是條件不滿足時(shí)執(zhí)行返回的表達(dá)式部分。
三元表達(dá)式示例
|
說(shuō)明
|
---|---|
A1>1000 ? "正常值" : "低值" | 表達(dá)式計(jì)算時(shí),先取到A1單元格的值,判斷值是否大于1000,如果是返回“正常值”字符串,否則返回“低值”字符串 |
A1>1000 and A1<20000 ? "正常值" : "修正值:"+(A1+100) | 條件部分,判斷A1值是否大于1000 且小于20000,如果是返回"正常值",否則返回字符串”修正值“與A1值加100后結(jié)果連接的值,如果A1是2000,那么就返回”修正值:2100“ |
UReport2 中 if 判斷表達(dá)式語(yǔ)法結(jié)構(gòu)如下圖所示:
從圖中可以看到,if 判斷表達(dá)式則一個(gè)if條件判斷部分加若干個(gè)可選的 elseif 條件判斷部分,最后再加一個(gè)可選的 else 部分構(gòu)成,語(yǔ)法結(jié)構(gòu)類似 java 或 javascript。
if判斷表達(dá)式示例
|
說(shuō)明
|
---|---|
if(A1>1000){ return "正常值" } |
判斷A1單元格的值是不是大于1000,如果是返回”正常值“字符串,否則什么都不做 |
if(A1>1000){ return "正常值" }else{ "低值"; } |
判斷 A1 單元格的值是不是大于1000,如果是返回”正常值“字符串,否則返回”低值“字符串。 這里需要注意的是,在if表達(dá)式中,return 關(guān)鍵字是可選的,同是行尾添加';'也是可選的,這主要是為了照顧一些 java 及 javascript 程序的習(xí)慣 |
if(A1>1000 and A1<20000){ return "正常值:"+A1 }else if(A>20000 and A1<40000){ return "超高值" }else{ "低值" } |
在這個(gè)例子當(dāng)中,條件部分添加了多個(gè)組合條件,同時(shí) else if 多重判斷 |
case 判斷是 UReport2 中提供的另一種條件判斷形式,與if判斷有些類似,但 case 判斷看起來(lái)更為簡(jiǎn)潔,其語(yǔ)法結(jié)構(gòu)圖如下所示:
可以看到,case 判斷要由 case{...}包裹,然后是若干條件加返回值。
case表達(dá)式示例
|
說(shuō)明
|
---|---|
case{
|
有兩個(gè)條件,分別返回不同的值 |
case{
A1==100 return "正常值", A1>100 and A1<1000 '偏高' } |
在 case 表達(dá)式中,return 關(guān)鍵字同樣是可選的 |
在報(bào)表當(dāng)中,大多數(shù)的計(jì)算都是針對(duì)單元格或與單元格有關(guān),因?yàn)閳?bào)表中單元格多數(shù)都與數(shù)據(jù)綁定,而數(shù)據(jù)往往又是多條,所以計(jì)算后的報(bào)表一個(gè)單元格會(huì)產(chǎn)生多個(gè),這樣對(duì)于單元格的引用就變的比較復(fù)雜。在 UReport2 中,引用的目標(biāo)單元格是相對(duì)當(dāng)前單元格來(lái)進(jìn)行計(jì)算的,引用方法就是直接在表達(dá)式里書寫單元格名稱,比如引用 A1 單元格,就直接寫 A1 即可,如下面的例子:
在上圖當(dāng)中,我們?cè)?D1 單元格中輸入表達(dá)式 A1,這就表示,在 D1 單元格里填入相對(duì)當(dāng)前 D1 單元格的 A1 單元格的值,運(yùn)行后的效果如下:
可以看到,因?yàn)?D1 是 A1 的子格,A1 單元格綁定的數(shù)據(jù)就是分組結(jié)構(gòu),根據(jù)當(dāng)前 D1 單元格的位置,就產(chǎn)生的上圖所示的結(jié)果。如果在 D1 單元格中輸入 B1,那么運(yùn)行后的效果又是下圖的樣子:
同樣,如果在 D1 中輸入表達(dá)式 C1,那么運(yùn)行后將會(huì)在每個(gè) D1 單元格中填入與 D1 單元格位于同一行的 C1 單元格的值,運(yùn)行結(jié)果這里就不再貼出來(lái)了。
通過(guò)上面的例子我們可以看到,UReport2 中某個(gè)單元格的表達(dá)式引用目標(biāo)單元格,首先判斷的是目標(biāo)單元格與其所在單元格是否位于同一行或列,如果是則直接取對(duì)應(yīng)行或列上目標(biāo)單元格的值。如果當(dāng)前單元格與目標(biāo)單元格不在同一行或列,那情況又不一樣了,我們來(lái)看下一個(gè)例子。
在上面的例子中,我們?cè)?C2 單元格的表達(dá)式中輸入 B1,表示取 B1 單元格的值,但 B1 單元格又和 C2 不在同一行或列上,同時(shí) B1 單元格展開(kāi)后會(huì)有多個(gè)值,但 B1 單元格和 C2 單元格都擁有一個(gè)共同的父格或間接父格 A1(C2 單元格的左父格是 B2,而 B2 單元格的左父格又是 A1,所以 A1 是 C2 單元格的間接左父格),所以它會(huì)取他們共同父格 A1 下所有 B1 的值,運(yùn)行結(jié)果如下圖所示:
多個(gè)值的輸出在 UReport2 中,如果取到值超過(guò)一個(gè),輸出時(shí)多個(gè)值間以“,”分隔,如上圖所示
目標(biāo)格獲取原則由上面的例子可以看出,UReport2 中單元格表達(dá)式在取目標(biāo)格值時(shí),優(yōu)先考慮的是目標(biāo)格是否與其位于同一行或列,如果是則取與其位于同一行或列的目標(biāo)單元格,如果不是,則取與當(dāng)前單元格有共同父格的所有目標(biāo)單元格,如果他們有共同的上父格或共同的左父格,那么就取共同上父格與共同左格交集部分的目標(biāo)單元格;如果他們沒(méi)有共同的父格,那么就取迭代后所有的目標(biāo)單元格。
針對(duì)上面的例子,如果我們?cè)谏厦娴膯卧裰休斎?C1,那結(jié)果又不一樣;因?yàn)?C1 是 C2 的上父格,所以將直接取與其位于同一列的上父格單元格的值,運(yùn)行效果如下圖所示:
再看下面的報(bào)表示例:
在上面的例子中,B2 單元格表達(dá)里輸入 C1,因?yàn)?B2 和 C2 既不在同一行或列,也沒(méi)有共同的父格,所以 B2 中將取到所有的 C1 單元格的值,如下圖所示:
更改父格實(shí)現(xiàn)單元格取值在之前的視頻教程中,在介紹報(bào)表計(jì)算模型時(shí),我們多次利用更改當(dāng)前單元格的上父格或左父格使得當(dāng)前單元格與目標(biāo)格處于某個(gè)特定的父格下,其原理就來(lái)自于此。
為了實(shí)現(xiàn)更為復(fù)雜的單元格引用,UReport2 引用了單元格坐標(biāo)的概念。單元格坐標(biāo),也是相對(duì)于當(dāng)前單元格來(lái)進(jìn)行計(jì)算的,同樣遵循上面的介紹的優(yōu)先取同行、同列或共同父格的原則,一個(gè)標(biāo)準(zhǔn)的單元格坐標(biāo)格式如下:
單元格坐標(biāo)格式單元格名稱[Li:li,Li-1:li-1,…;Ti:ti,Ti-1:ti-1…]{條件...}
L 表示左父格,l 表示左父格展示后的序號(hào),序號(hào)為負(fù)值,表示向上位移;T 表示上父格,t 表示上父格展開(kāi)后的序號(hào),序號(hào)為負(fù)值,表示相對(duì)于當(dāng)前單元格向上位移,正值則表示向下位移,如果只有左父格,那么直接寫 L 部分即可;如果只是上父格,那么前面需要加上“;”號(hào),然后寫 T 部分,后面的大括號(hào)中是條件部分,多個(gè)條件之間用 and/or 連接,表示對(duì)通過(guò)坐標(biāo)取到的單元格進(jìn)行條件過(guò)濾(如果取到多個(gè)單元格的話),條件部分是可選的,相關(guān)示例如下:
單元格坐標(biāo)示例
|
說(shuō)明
|
---|---|
C1[A1:2,B1:1] |
在找 C1 時(shí)先找單元格 A1 展開(kāi)后的第2格;再找第二個(gè) A1 下的 B1 單元格展開(kāi)后的第一個(gè)單元格,然后再找這個(gè) B1 單元格對(duì)應(yīng)的 C1 單元格 |
C2[A1:2,B1:2;C1:3] | 在找 C2 時(shí),先找 A1 單元格展開(kāi)后的第二格,再找第二個(gè) A1 單元格下 B2 單元格展開(kāi)后的第二格,再根據(jù)第二個(gè)展開(kāi)的 B2 單元格找其下名為 C2 單元格的左子格;然后再找到 C1 單元格展開(kāi)后的第三格,再看其下的 C2 單元格,取 C2 單元格的交集 |
C2[A1:2,B2:2]{C2>1000} | 表示取 A2 單元格展開(kāi)后的第二格,再取其下 B2 單元格展開(kāi)后第二格,再取 B2 下所有的 C2 單元格,最后再對(duì)取到的 C2 單元格進(jìn)行條件過(guò)濾,只取出 C2 單元格值大于1000的所有 C2 單元格。 |
C2[A1:2,B2:2]{C2>1000 and C2<10000} | 表示取 A2 單元格展開(kāi)后的第二格,再取其下 B2 單元格展開(kāi)后第二格,再取 B2 下所有的 C2 單元格,最后再對(duì)取到的 C2 單元格進(jìn)行條件過(guò)濾,只取出 C2 單元格值大于1000且小于10000的所有 C2 單元格的值。 |
我們來(lái)看一個(gè)具體的示例,報(bào)表模版如下:
在上面的報(bào)表模版中,在 B2 單元格表達(dá)式里,我們輸入了 C1[A1:2,B1:1],這就表示取 A1 單元格展開(kāi)后第二格下 B1 單元格展開(kāi)后第一格下對(duì)應(yīng)的 C1 單元格的值,所以運(yùn)行后我們可以看到如下圖所示效果:
當(dāng)然,我們可以做一個(gè)交叉表,然后通過(guò)添加左父格和上父格約束坐標(biāo)來(lái)定位某個(gè)特定單元格,這里就不再演示了。在實(shí)際應(yīng)用當(dāng)中,單元格坐標(biāo)可以用在諸如同比,環(huán)比之類的統(tǒng)計(jì)報(bào)表當(dāng)中,這時(shí)單元格坐標(biāo)序號(hào)會(huì)用一些負(fù)值相對(duì)當(dāng)前單元格進(jìn)行位移,從而實(shí)現(xiàn)各種比值的計(jì)算。
引用所有單元格如果我們需要引用所有單元格時(shí),那么只需要在單元格名稱后跟”[]“即可,如 A1[],表達(dá)引用所有 A1 單元格,而不管當(dāng)前引用格所在位置,同時(shí)在引用所有單元格時(shí),還可以后跟條件,以對(duì)引用格做進(jìn)一步條件限制,如 A1[]{@>1000 and @<10000},表示要引用所有的 A1 單元格,但要求引用的 A1 單元格值要大于1000同時(shí)小于10000,這里的@符號(hào)是2.2.3及以后版本新增加的一個(gè)表達(dá)式符號(hào),專門用于取條件循環(huán)中當(dāng)前循環(huán)對(duì)象。
我們首先來(lái)看一個(gè)環(huán)比的例子。
報(bào)表模版如下圖所示:
在上面的報(bào)表模版中,D2 單元格中的表達(dá)式為 C2 - C2[A2:-1] ,這就表示在D2單元格中首先取到 C2 單元格的值, 因?yàn)?C2 單元格與 D2 位于同一行,所以可以直接取到,且只有一個(gè);下一個(gè)C2采用了坐標(biāo)A2:-1,那就表示取相對(duì)于當(dāng)前單元格的 A2 單元格上一格(負(fù)值表示向上位移)的A2單元格所對(duì)應(yīng)的 C2 單元格,運(yùn)行后的效果如下圖所示:
從運(yùn)行結(jié)果中可以看到,第一行環(huán)比的值為0,這是因?yàn)閷?duì)于第一行的 D2 單元格來(lái)說(shuō),其上一行其實(shí)是不存在的,所以 UReport2 默認(rèn)就取了第一個(gè) C2 單元格的值,所以兩個(gè)值減下來(lái)就是0。
下一個(gè)例子我們來(lái)看看同比。
報(bào)表模版如下圖所示:
在上面的模版當(dāng)中,D2 單元格中首先取到與其同行的 C2 單元格的值,然后利用單元格坐格,先取到當(dāng)前 D2 單元格所在行的 A2 單元格的上一條 A2 單元格記錄(-1表示坐標(biāo)上移),然后再取這個(gè) A2 下對(duì)應(yīng)的 C2 單元格,但由于其下 C2 單元格還是有多個(gè),所以這里加了個(gè)條件B2==$B2,這里的第一個(gè) B2 表示當(dāng)前單元格所在行對(duì)應(yīng)的 B2 的值,$B2 表示坐標(biāo)定位后 C2 單元格對(duì)應(yīng)的 B2 單元格的值,條件就是他們倆要相等,實(shí)際上就是月份相等,這樣就達(dá)到了我們要實(shí)現(xiàn)的同比的目的,運(yùn)行后的效果如下:
關(guān)于$B2在UReport2當(dāng)中,在單元格名稱前加$符號(hào),表示取相對(duì)于目標(biāo)單元格的單元格的值,多用在條件比較當(dāng)中,比如上面的C2[A2:-1]{B2==$B2},這里的$B2就是指取到的C2單元格對(duì)應(yīng)的B2單元格的值。
在上面的例子中,第一個(gè)分組2000下,所有的同比值都為0,這是因?yàn)檫@個(gè)分組下不存在 A2:-1 這個(gè)坐標(biāo),沒(méi)法上移,所以系統(tǒng)默認(rèn)取了當(dāng)前記錄自身,所以計(jì)算后的值都是0。如果我們不希望顯示0,那么可以加個(gè) if 條件判斷表達(dá)式,如果當(dāng)前位于第一個(gè)分組,就輸出空字符串,否則輸出實(shí)際計(jì)算后的值,修改后的報(bào)表模版如下圖所示:
D2 單元格對(duì)應(yīng)的表達(dá)內(nèi)容如下圖所示:
運(yùn)行后的效果如下圖所示:
在上面的例子中,我們使用了 if 判斷表達(dá)式,當(dāng)然你也可以換成三元表達(dá)式判斷或 case 判斷,在這個(gè) if 判斷中,首先我們判斷的是 &A2==1 是否成立,這里的 &A2 指的是相對(duì)于當(dāng)前單元格 A2 單元格展開(kāi)后的序號(hào),在 UReport2 中,可以采用“&單元格名稱”的方式標(biāo)記某個(gè)單元格展開(kāi)后的序號(hào),需要注意的是,使用“&單元格名稱”來(lái)標(biāo)記目標(biāo)單元格展開(kāi)后的序號(hào)時(shí),當(dāng)前單元格必須是目標(biāo)單元格的子格或間接子格;比如,在上面的例子中,使用 &A2 的單元格是 D2,D2 是 A2 單元格的間接子格,這樣就可以正確取到 A2 展開(kāi)后的序號(hào)值。
關(guān)于&標(biāo)記的使用
在使用“&單元格名稱”來(lái)標(biāo)記目標(biāo)單元格展開(kāi)后的序號(hào)時(shí),除上需要注意上面描述的內(nèi)容外,還需要注意,取序號(hào)將以他們共同的父格為基準(zhǔn),如果他們有共同的父格,那么將以這個(gè)父格里目標(biāo)單元格的數(shù)量來(lái)進(jìn)行序號(hào)編排,這在之前視頻教程介紹報(bào)表計(jì)算模型中,實(shí)現(xiàn)明細(xì)型主從報(bào)表,對(duì)從表數(shù)據(jù)進(jìn)行編號(hào)時(shí)就有體現(xiàn)。
報(bào)表模版如下圖所示:
D2 單元格對(duì)應(yīng)的表達(dá)式如下:
在上面的表達(dá)式中,我們采用了 if 判斷(同樣你可以換成三元判斷或 case 判斷),當(dāng)相對(duì)當(dāng)前單元格A2展開(kāi)后的序號(hào)為1時(shí),那么直接取當(dāng)前行的 C2 單元格值,否則就拿當(dāng)前行的 C2 單元格值加上,上一行D2 單元格值,這樣就實(shí)現(xiàn)了逐層累加的需求,運(yùn)行后的效果如下:
數(shù)據(jù)集是報(bào)表展示數(shù)據(jù)的來(lái)源,一般情況,定義好數(shù)據(jù)集后,在數(shù)據(jù)集對(duì)應(yīng)的字段上雙擊即可在目標(biāo)單元格上添加對(duì)應(yīng)的數(shù)據(jù)綁定信息,然后在其屬性面板設(shè)置聚合方式、迭代方向等。實(shí)際上,在 UReport2中,還允許我們?cè)趩卧癖磉_(dá)式里通過(guò)書寫表達(dá)式來(lái)實(shí)現(xiàn)單元格與數(shù)據(jù)集字段的綁定,其語(yǔ)法結(jié)構(gòu)如下:
數(shù)據(jù)集名稱.聚合方式(字段名[,條件,排序方式])
聚合方式與我們雙擊添加字段綁定后在屬性面板上看到的聚合方式基本一致,具體有以下幾種類型。
語(yǔ)法格式如下:
datasetName.select(propertyName[,filter,order])
filter 為條件部分,條件可以有多個(gè),多個(gè)條件之間用 and 或 or 連接,order 為是否對(duì)當(dāng)前的 propertyName 進(jìn)行排序,可選值有兩個(gè) desc 和 asc,既正序和倒序。
示例
|
說(shuō)明
|
---|---|
ds1.select(username) | 取數(shù)據(jù)集 ds1 中所有的 username 字段信息 |
ds1.select(username,age>18) | 取數(shù)據(jù)集 ds1 中所有的 age 屬性大于18的 username 字段信息 |
ds1.select(username,age>18, desc) |
取數(shù)據(jù)集 ds1中所有的 age 屬性大于18的 username 字段信息,同時(shí)對(duì) username 字段做倒排序 |
ds1.select(username,age>18 and age<60, asc) |
取數(shù)據(jù)集 ds1中所有的 age 屬性大于18且小于60的 username 字段信息,同時(shí)對(duì) username 字段做正排序 |
語(yǔ)法格式如下:
datasetName.group(propertyName[,filter,order])
filter 為條件部分,條件可以有多個(gè),多個(gè)條件之間用 and 或 or 連接,order 為是否對(duì)當(dāng)前的 propertyName 進(jìn)行排序,可選值有兩個(gè) desc 和 asc,既正序和倒序。
示例
|
說(shuō)明
|
---|---|
ds1.group(degree) | 對(duì)數(shù)據(jù)集 ds1 中 degree 字段進(jìn)行分組 |
ds1.group(degree,age>18) | 對(duì)數(shù)據(jù)集 ds1 中 age 屬性大于18的所有的 degree 字段進(jìn)行分組 |
ds1.group(degree,age>18, asc) |
對(duì)數(shù)據(jù)集 ds1 中 age 屬性大于18的所有的 degree 字段進(jìn)行分組,同時(shí)對(duì)分組后的 degree 字段進(jìn)行正排序 |
sum 是對(duì)數(shù)據(jù)集目標(biāo)字段進(jìn)行累加,所以目標(biāo)字段一定要是一個(gè)數(shù)字類型,否則就會(huì)產(chǎn)生錯(cuò)誤,其語(yǔ)法格式如下:
datasetName.sum(propertyName,filter)
與之前函數(shù)不同之處在于,sum 函數(shù)沒(méi)有 order,也就是說(shuō)不需要排序,原因很簡(jiǎn)單,因?yàn)槔奂雍蟮闹抵挥幸粋€(gè),所以無(wú)需排序。
示例
|
說(shuō)明
|
---|---|
ds1.sum(salary) | 對(duì)于數(shù)據(jù)集 ds1 中的 salary 字段進(jìn)行累加 |
ds1.sum(salary, age>30) | 對(duì)數(shù)據(jù)集 ds1 中 age 屬性大于30的所有對(duì)象的 salary 字段進(jìn)行累加 |
count 是對(duì)數(shù)據(jù)集對(duì)象數(shù)量進(jìn)行統(tǒng)計(jì),其語(yǔ)法格式如下:
datasetName.count(filter)
統(tǒng)計(jì)數(shù)量不需要指定 propertyName 及 order。
示例
|
說(shuō)明
|
---|---|
ds1.count() | 對(duì) ds1 數(shù)據(jù)集中對(duì)象數(shù)量進(jìn)行統(tǒng)計(jì) |
ds1.count(age>30) |
統(tǒng)計(jì)數(shù)據(jù)集 ds1 中對(duì)象屬性 age 值大 30 的所有對(duì)象的數(shù)量 |
max 語(yǔ)法格式如下:
datasetName.max(propertyName,filter)
取最大值沒(méi)有 order。
示例
|
說(shuō)明
|
---|---|
ds1.max(salary) | 對(duì)于數(shù)據(jù)集 ds1 中的 salary 字段進(jìn)行比較,取最大值 |
ds1.max(salary, age>30) | 對(duì)數(shù)據(jù)集 ds1中 age 屬性大于30的所有對(duì)象的 salary 字段進(jìn)行比較,取最大值 |
min 的語(yǔ)法格式如下:
datasetName.min(propertyName,filter)
取最小值沒(méi)有 order。
示例
|
說(shuō)明
|
---|---|
ds1.min(salary) | 對(duì)于數(shù)據(jù)集 ds1 中的 salary 字段進(jìn)行比較,取最小值 |
ds1.min(salary, age>30) | 對(duì)數(shù)據(jù)集 ds1 中 age 屬性大于30的所有對(duì)象的 salary 字段進(jìn)行比較,取最小值 |
avg在取平均值時(shí),如除不盡,則保留8位小數(shù),avg的語(yǔ)法格式如下:
datasetName.avg(propertyName,filter)
取平均值沒(méi)有order。
示例
|
說(shuō)明
|
---|---|
ds1.avg(salary) | 對(duì)于數(shù)據(jù)集 ds1中的 salary 字段取平均值時(shí),如除不盡,則保留8位小數(shù) |
ds1.avg(salary, age>30) | 對(duì)數(shù)據(jù)集 ds1中 age 屬性大于30的所有對(duì)象的 salary 字段取平均值時(shí),如除不盡,則保留8位小數(shù) |
在 UReport2 中提供了一種特殊的表達(dá)式,用來(lái)取當(dāng)前單元格值,它就是“#”,比如在給某個(gè)單元格配置鏈接時(shí),我們可能需要將當(dāng)前單元格值作為參數(shù)傳遞給這個(gè)鏈接,那么就可以在鏈接表達(dá)式里輸入#,這就將會(huì)將當(dāng)前單元格值取出來(lái),傳遞過(guò)去,如下圖所示:
除此之外,如果在#后面加上.后接具體的屬性名,那么還可以取到與當(dāng)前單元格綁定的數(shù)據(jù)對(duì)象的具體屬性值,如:#.id,表示取與當(dāng)前單元格綁定的對(duì)象的id屬性值,當(dāng)然如果當(dāng)前單元格內(nèi)容不是一個(gè)數(shù)據(jù)集類型的,那么就會(huì)返回 null,同樣如果當(dāng)前單元格綁定的數(shù)據(jù)集屬性運(yùn)行時(shí)值有多個(gè),那么它只會(huì)取第一個(gè)對(duì)象的對(duì)應(yīng)的屬性值。
更多建議: