公共內容


  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包也不宜過大,否則影響首次下載的性能.