公共内容


  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包也不宜过大,否则影响首次下载的性能.