### 公共内容

Supcan TreeList和Supcan Report有一些公共的内容，例如表达式，Report中的单元格与单元格之间的逻辑关系、TreeList的列与列之间的逻辑关系都可以用表达式来描述。
Supcan具有完备的表达式高速解析功能、并内置了六十多个常用的计算函数。
1.表达式

Supcan的表达式分二种：关系表达式和格式掩码.
所谓“关系表达式”就是如前所述的单元格与单元格之间的计算关系、列与列之间的计算关系、小计/合计运算逻辑；而“格式掩码”则是单元格用于描述自身显示的特殊的表达式.
Supcan Report的表达式在单元格内直接输入，举例如下:

     //支持函数的多层嵌套
     =sum(203.12, 200.1, min(20, 22) * 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.计算函数

计算函数主要用于硕正组件自身的表达式中，但也可以以"全局函数"方式被js直接调用，函数如下:
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　@sumdim　@average(或@ave)　@max　@min　@first　@last　@rows
含义: | 用于Treelist的小计、合计表达式中，分别表示求和、数组(以某个字符作为分隔)求和、求平均值、最大、最小、首行、末行值、行数.

示例:

     //某列的小计表达式:
     <col name="price" subtotalExpress="='均价: '+@ave" />

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

树级次/小计宏 | @TreeLevel
含义: | 1.表示树的级次; 2.如果用于Treelist的小计表达式，则表示小计的分类级次(返回0表示非小计行，1表示最外层).

示例:

    //某列的小计表达式:
    <col name="price" subtotalExpress="=if(@TreeLevel==1, '总计: '+@sum, '小计: '+@sum)" />

2.Report中的宏

@单元名 宏 |
含义: | 数据源填充区内、行不定时的动态单元名

示例:

     //B列求和:
     =sum(B4:@B4)
     //@B4是取第四行、第二列单元格的内容，由于行是动态填充，所以
     //取数后公式中的该单元格名将被自动改为B5, B6, B7...

@sheet工作表 宏 |
含义: | 取其它工作表数据，一般写在单元名后面

示例:

     //取第一个工作表的B4单元格内容
     =B4@sheet1

     //取第一个工作表的B4单元格内容和第三个工作表的K8单元格内容之和
     =B4@sheet1 + K8@sheet3

     //取第三个工作表的B3:D8矩形区域内的所有单元格内容之和
     =sum(B4:D8@sheet3)

@Alias别名 宏 |
含义: | 取某个别名的单元

示例:

     //取别名为“Price”的单元格内容
     =@AliasPrice

     //取第二个工作表、别名为“Sales”的单元格内容
     =@sheet2@AliasSales

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组件就把这个包当作异常包看待，并以友好的提示弹出该信息。
注：JSON格式例如 {"Fault": {"faultCode":"3001", "detail": "服务繁忙"}}
在Treelist的"16.分页方案(一)"演示页中，后端源码中有一段模拟拒绝服务的SoapLike XML串，可参考这段C#源码(在技术分析区中).
5.图片扩展URL

Treelist、Freeform、Tree等组件经常会用到图片，例如背景图片、下拉图片、按钮图片等，如果一个页面中的小图片过多，那么向服务器发起的请求也多，势必影响性能，为此，Supcan对图片的URL作了一个扩展，允许将图片部署在服务器端的一个zip包中，客户端的图片URL如果是采用如下写法：
url="../res/boudle.zip#car33.bmp"
那么boudle.zip会被浏览器下载到本地缓存，组件会自动抽取、显示其中的car33.bmp。如果要引用该包中别的图片文件，只要URL采用上述写法即可，浏览器不会再向服务器发送多余请求.
当然zip包也不宜过大，否则影响首次下载的性能.