### 公共內容

Supcan TreeList和Supcan Report有一些公共的內容，例如表達式，Supcan Report的單元格與單元格之間的邏輯關係、Supcan TreeList列與列之間的邏輯關係都可以用表達式來描述。
Supcan底層類庫提供了高速的表達式解析功能、並內置了六十多個常用的計算函數。
1.表達式

Supcan的表達式分二種：關係表達式和格式掩碼.
所謂「關係表達式」就是如前所述的單元格與單元格之間的計算關係、列與列之間的計算關係、小計/合計運算邏輯；而「格式掩碼」則是Report的單元格或Treelist的列用於描述自身顯示的特殊的表達式.
Supcan Report的表達式在單元格內直接輸入，舉例如下:

     //支持函數的多層嵌套
     =sum(203.12, 200.1, min(20, 20) * 20)

     //A3、B4、 B5表示單元格
     =average(A3, B4, if(B5>2, 3, 4))

     //A3至C4的矩形區域內所有單元格
     =sum(A3:C4)

Supcan Treelist的表達式可以在其XML描述文件中直接定義，舉例如下:

      //表示p2列與price列的關係
     <express>p2=if(price!=100, price-100, price)</express>

     //total、price、num列的關係
     <express>total=round(price * num, 4)</express>

     //num@origin表示num列的原始數據(和修改後內容無關)
     <express>total2=round(price * num@origin, 4)</express>

格式掩碼和關係表達式相比，沒有什麼大的差別，它還可以包含"textColor="的文字顏色分句，如果是Treelist，還可以有左側圖片、右側圖片分句，舉例如下:

     //數字以人民幣顯示
     =RMB(data)

     //日期型數據以中國銀行格式顯示
     =ChineseBankDate(data)

     //日期型數據以指定格式顯示
     =FormatDate(data, 'DD/MM/YYYY')

     //布爾型數據以「是」/「否」顯示
     =if(data, '是', '否')

     //數據乘以1000，然後在後面跟隨「噸」(數據本身未變)
     =data *1000 + '噸'

     //textColor=...是文字顏色
     ='$'+data; textColor=if(data>100,'#0000ff', red)

     //Treelist的右側圖片: rightImage，圖片URL根據當前行的productID列內容算出：
     ='產品:'+data+ '，圖樣：'; rightImage=if(productID=1, 'fruit.jpg', if(product=2, '../meta/office.ico', 'ele.png'))

表達式書寫規則如下：

1.加、減、乘、除分別以+、-、*、/表示; 2.支持「>」、「<」、「=」、「>=」、「<=」、「!=」(或「<>」)比較邏輯運算; 3.支持「and」(或「&&」)、「or」(或「||」)、「not」(或「!」)與或非邏輯運算; 4.運算優先級：括號 > 乘除 > 加減 > 比較邏輯運算 > 與或非邏輯運算; 5.與或非運算優先級：非 > 與 > 或; 6.允許數字和串混合計算; 7.支持串的大小比較運算; 8.不支持位運算; 9.純數字不支持嵌入千位符(,逗號);

2.計算函數

3.宏

1.TreeList中的宏

@origin宏 |
含義: | 取修改前的原始值

示例:

     //計算列表達式:
     <express>total2=round(price * num@origin, 4)</express>
     //num@origin表示num列的原始數據

@parent宏 |
含義: | 用於下拉Treelist的過濾表達式中，取父Treelist的當前行、指定列的內容

示例:

     //對city列的下拉執行過濾:
     AF.func("Filter", "province=prov@parent\r\ncity");
     //prov@parent表示取父Treelist的當前行、prov列的內容
     //「父」是相對於下拉Treelist而言

合計宏 | @sum　@average(或@ave)　@max　@min　@first　@last　@rows
含義: | 用於Treelist的小計、合計表達式中，分別表示求和、求平均值、最大、最小、首行、末行值、行數.

示例:

     //某列的小計表達式:
     <col name="price" subtotalExpress="='均價: '+@ave" />

     //複雜一點的:
     <col name="price" subtotalExpress="='方差: '+js('delta', @max, @min)" />

2.Report中的宏

@單元名 宏 |
含義: | 數據源填充區內、行不定時的動態單元名

示例:

     //B列求和:
     =sum(B4:@B4)
     //@B4是取第四行、第二列單元格的內容，由於行是動態填充，所以
     //取數後公式中的該單元格名將被自動改為B5, B6, B7...

4.XML/JSON異常包

Treelist、Report組件通過Http Request向服務器索取填充數據，如果服務器遇到異常，通常返回的Http狀態碼為非200，組件將直接拋出該異常頁面。在Web Service規範中，如果服務器能捕捉到異常(try / catch)，通常會採用SOAP協議中的fault包返回，使得客戶端能比較友好地顯示異常信息。
Supcan組件對非Web Service的普通XML/JSON格式的數據響應包也提供了類似的擴展支持，只要XML/JSON包符合如下格式(我們稱之為SoapLike異常包，即類似SOAP)，客戶端就能彈出用戶能接受的錯誤信息:

     <?xml version="1.0" encoding="UTF-8" ?>
     <fault>
     　　　<faultcode>錯誤代碼</faultcode>　　//或<code>
     　　　<faultstring>錯誤</faultstring>
     　　　<detail>詳細描述</detail>
     　　　<reason>錯誤原因</reason>
     　　　<faultactor>錯誤角色</faultactor>
     </fault>

在<fault>下，至少要有上述5種元素中的一種，Supcan組件就把這個包當作異常包看待。
5.圖片擴展URL

Treelist、Freeform、Tree等組件經常會用到圖片，例如背景圖片、下拉圖片、按鈕圖片等，如果一個頁面中的小圖片過多，那麼向服務器發起的請求也多，勢必影響性能，為此，Supcan對圖片的URL作了一個擴展，允許將圖片部署在服務器端的一個zip包中，客戶端的圖片URL如果是採用如下寫法：
url="../res/boudle.zip#car33.bmp"
那麼boudle.zip會被下載到本地緩存，並自動抽取、顯示其中的car33.bmp。只要是引用該包中的圖片文件，不會再向服務器發多餘請求.
當然zip包也不宜過大，否則影響首次下載的性能.