pub.htm 10.6 KB
<HTML>
<head>
<meta http-equiv="content-type" content="text/html; charset=gb2312">
<link rel="stylesheet" href="../temp1.css" type="text/css">
<script type="text/javascript" src="functable.js"></script>
<script>
 function gentable()
 {
  var xmlDoc = getXMLDoc("func_pub.xml");
  genfunctable('TagFuncTable', 'TagFunc', xmlDoc);
  var url = window.location.href;
  var off = url.indexOf("#");
  if(off != -1) {
   var tag = url.substring(off+1);
   var tag3 = tag.substring(0, 3);
   if(tag3 != "Tag") window.setTimeout("gofunc('" +tag+ "')", 500, "javascript");
  }
 }
 function gofunc(tag)
 {
  var od = document.getElementById(tag);
  window.scrollTo(0, od.offsetTop);
 }
</script>
</head>
<body onLoad="gentable()" bgcolor=#ffffff vlink=#0000ff>


<div id="Tag60"/>
<Table cols=2 border=0 width=100%>
<col width=60%>
<col width=40%>
<tr height=91><td/><td><img src='devsh.jpg'></td></tr>
</table>
<h3> <font color=#3366ff>公共内容</font></h3><hr color=#2266ee size=1>
  Supcan TreeList和Supcan Report有一些公共的内容,例如表达式,Report中的单元格与单元格之间的逻辑关系、TreeList的列与列之间的逻辑关系都可以用表达式来描述。<br>
  Supcan具有完备的表达式高速解析功能、并内置了六十多个常用的计算函数。<br>


<div id="Tag601"/><br><br><br>
  <font style='font-size:15pt'>1.表达式</font><hr color=#2266ee size=1>
  Supcan的表达式分二种:关系表达式和格式掩码.<br>
  所谓“关系表达式”就是如前所述的单元格与单元格之间的计算关系、列与列之间的计算关系、小计/合计运算逻辑;而“格式掩码”则是单元格用于描述自身显示的特殊的表达式.<br>
<br>
  Supcan Report的表达式在单元格内直接输入,举例如下:<br>
<pre class='cpp'>
 //支持函数的多层嵌套
 =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)</pre>
<br>
  Supcan Treelist的表达式可以在其XML描述文件中直接定义,举例如下:<br>
<pre class='xml'>
  //表示p2列与price列的关系
 &lt;express&gt;p2=if(price!=100, price-100, price)&lt;/express&gt;
 
 //total、price、num列的关系
 &lt;express&gt;total=round(price * num, 4)&lt;/express&gt;
 
 //num@origin表示num列的原始数据(和修改后内容无关)
 &lt;express&gt;total2=round(price * num@origin, 4)&lt;/express&gt;</pre>
<br>
  格式掩码和关系表达式相比,没有什么大的差别,它还可以包含"textColor="的文字颜色分句,如果是Treelist,还可以有左侧图片、右侧图片分句,举例如下:<br>
<pre class='cpp'>
 //数字以人民币显示
 =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'))</pre>
<br>

  表达式书写规则如下:<br>
<table width=98% class='ruleTable' border=1 align=center callspacing=8 cellpadding=10><tr><td>
1.加、减、乘、除分别以+、-、*、/表示;<br>
2.支持“>”、“<”、“=”(或“==”)、“>=”、“<=”、“!=”(或“<>”)比较逻辑运算;<br>
3.支持“and”(或“&&”)、“or”(或“||”)、“not”(或“!”)与或非逻辑运算;<br>
4.运算优先级:括号 > 乘除 > 加减 > 比较逻辑运算 > 与或非逻辑运算;<br>
5.与或非运算优先级:非 > 与 > 或;<br>
6.允许数字和串混合计算;<br>
7.支持串的大小比较运算;<br>
8.不支持位运算;<br>
9.纯数字不支持嵌入千位符(,逗号);<br>
</td></tr></table>

<div id="Tag602"/><br><br><br>
  <font style='font-size:15pt'>2.计算函数</font><hr color=#2266ee size=1>
  计算函数主要用于硕正组件自身的表达式中,但也可以以"<a href='globalfunction.htm#g6' target=_blank>全局函数</a>"方式被js直接调用,函数如下:<br>
<div id="TagFuncTable"/></div><br>
<div id="TagFunc"></div>

<div id="Tag603"/><br><br><br>
  <font style='font-size:15pt'>3.宏</font><hr color=#2266ee size=1>
<br><b>1.TreeList中的宏</b><br>
<br>
<table width=98% cols=2 cellpadding=4 cellspacing=0 border=1 borderColorLight=#999999 borderColorDark=#999999 align="center">
<col width=90><col>
<tr bgcolor=#c8e0ef><td style="border-right:0px;" align=left><b><font color=#660000>@origin宏</font></b></td><td align=right style="border-left:0px;">&nbsp;</td></tr>
<tr><td align=right>含义:</td><td>取修改前的原始值</td></tr>
<tr><td align=right>示例:</td><td>
<pre class='xml'>
 //计算列表达式:
 &lt;express&gt;total2=round(price * num@origin, 4)&lt;/express&gt;
 //num@origin表示num列的原始数据</pre>
</td></tr></table><br>


<br>
<table width=98% cols=2 cellpadding=4 cellspacing=0 border=1 borderColorLight=#999999 borderColorDark=#999999 align="center">
<col width=90><col>
<tr bgcolor=#c8e0ef><td style="border-right:0px;" align=left><b><font color=#660000>@parent宏</font></b></td><td align=right style="border-left:0px;">&nbsp;</td></tr>
<tr><td align=right>含义:</td><td>用于下拉Treelist的过滤表达式中,取父Treelist的当前行、指定列的内容</td></tr>
<tr><td align=right>示例:</td><td>

<pre class='cpp'>
 //对city列的下拉执行过滤:
 AF.func("Filter", "province=prov@parent\r\ncity");
 //prov@parent表示取父Treelist的当前行、prov列的内容
 //“父”是相对于下拉Treelist而言</pre>
</td></tr></table><br>



<br>
<table width=98% cols=2 cellpadding=4 cellspacing=0 border=1 borderColorLight=#999999 borderColorDark=#999999 align="center">
<col width=90><col>
<tr bgcolor=#c8e0ef><td style="border-right:0px;" align=left><b><font color=#660000>合计宏</font></b></td><td style="border-left:0px;">@sum @sumdim @average(或@ave) @max @min @first @last @rows</td></tr>
<tr><td align=right>含义:</td><td>用于Treelist的小计、合计表达式中,分别表示求和、数组(以某个字符作为分隔)求和、求平均值、最大、最小、首行、末行值、行数.</td></tr>
<tr><td align=right>示例:</td><td>

<pre class='xml'>
 //某列的小计表达式:
 &lt;col name="price" subtotalExpress="='均价: '+@ave" /&gt;
 
 //复杂一点的:
 &lt;col name="price" subtotalExpress="='方差: '+js('delta', @max, @min)" /&gt;</pre>
</td></tr></table><br>


<br>
<table width=98% cols=2 cellpadding=4 cellspacing=0 border=1 borderColorLight=#999999 borderColorDark=#999999 align="center">
<col width=90><col>
<tr bgcolor=#c8e0ef><td style="border-right:0px;" align=left><b><font color=#660000>树级次/小计宏</font></b></td><td style="border-left:0px;">@TreeLevel</td></tr>
<tr><td align=right>含义:</td><td>1.表示树的级次;<br>2.如果用于Treelist的小计表达式,则表示小计的分类级次(返回0表示非小计行,1表示最外层).</td></tr>
<tr><td align=right>示例:</td><td>

<pre class='xml'>
//某列的小计表达式:
&lt;col name="price" subtotalExpress="=if(@TreeLevel==1, '总计: '+@sum, '小计: '+@sum)" /&gt;</pre>
</td></tr></table><br>



<br>
<b>2.Report中的宏</b><br>
<br>
<table width=98% cols=2 cellpadding=4 cellspacing=0 border=1 borderColorLight=#999999 borderColorDark=#999999 align="center">
<col width=90><col>
<tr bgcolor=#c8e0ef><td style="border-right:0px;" align=left><b><font color=#660000>@单元名 宏</font></b></td><td align=right style="border-left:0px;">&nbsp;</td></tr>
<tr><td align=right>含义:</td><td>数据源填充区内、行不定时的动态单元名</td></tr>
<tr><td align=right>示例:</td><td>
<pre class='cpp'>
 //B列求和:
 =sum(B4:@B4)
 //@B4是取第四行、第二列单元格的内容,由于行是动态填充,所以
 //取数后公式中的该单元格名将被自动改为B5, B6, B7...</pre>
</td></tr></table><br>

<table width=98% cols=2 cellpadding=4 cellspacing=0 border=1 borderColorLight=#999999 borderColorDark=#999999 align="center">
<col width=90><col>
<tr bgcolor=#c8e0ef><td style="border-right:0px;" align=left><b><font color=#660000>@sheet工作表 宏</font></b></td><td align=right style="border-left:0px;">&nbsp;</td></tr>
<tr><td align=right>含义:</td><td>取其它工作表数据,一般写在单元名后面</td></tr>
<tr><td align=right>示例:</td><td>
<pre class='cpp'>
 //取第一个工作表的B4单元格内容
 =B4@sheet1
 
 //取第一个工作表的B4单元格内容和第三个工作表的K8单元格内容之和
 =B4@sheet1 + K8@sheet3
 
 //取第三个工作表的B3:D8矩形区域内的所有单元格内容之和
 =sum(B4:D8@sheet3)</pre>
</td></tr></table><br>


<table width=98% cols=2 cellpadding=4 cellspacing=0 border=1 borderColorLight=#999999 borderColorDark=#999999 align="center">
<col width=90><col>
<tr bgcolor=#c8e0ef><td style="border-right:0px;" align=left><b><font color=#660000>@Alias别名 宏</font></b></td><td align=right style="border-left:0px;">&nbsp;</td></tr>
<tr><td align=right>含义:</td><td>取某个别名的单元</td></tr>
<tr><td align=right>示例:</td><td>
<pre class='cpp'>
 //取别名为“Price”的单元格内容
 =@AliasPrice
 
 //取第二个工作表、别名为“Sales”的单元格内容
 =@sheet2@AliasSales</pre>
</td></tr></table><br>


<div id="Tag604"/><br><br><br>
  <font style='font-size:15pt'>4.XML/JSON异常包</font><hr color=#2266ee size=1>
  Treelist、Report组件通过Http Request向服务器索取数据,如果服务器遇到异常,通常返回的Http状态码为非200,组件将直接抛出该异常页面。在Web Service规范中,如果服务器能捕捉到异常(try / catch),通常会采用SOAP协议中的fault包返回,使得客户端能比较友好地显示异常信息。<br>
  Supcan组件对非Web Service的普通XML/JSON格式的数据响应包也提供了类似的扩展支持,只要XML/JSON包符合如下格式(我们称之为SoapLike异常包,即类似SOAP),客户端就能弹出用户能接受的错误信息:<br>
<pre class='xml'>
 &lt;?xml version="1.0" encoding="UTF-8" ?&gt;
 &lt;fault&gt;
    &lt;faultcode&gt;错误代码&lt;/faultcode&gt;  //或&lt;code&gt;
    &lt;faultstring&gt;错误&lt;/faultstring&gt;
    &lt;detail&gt;详细描述&lt;/detail&gt;
    &lt;reason&gt;错误原因&lt;/reason&gt;
    &lt;faultactor&gt;错误角色&lt;/faultactor&gt;
 &lt;/fault&gt;</pre>
  在&lt;fault&gt;下,至少要有上述5种元素中的一种,Supcan组件就把这个包当作异常包看待,并以友好的提示弹出该信息。<br>
  注:JSON格式例如 {"Fault": {"faultCode":"3001", "detail": "服务繁忙"}}<br>
<br>
  在Treelist的"16.分页方案(一)"演示页中,后端源码中有一段模拟拒绝服务的SoapLike XML串,可参考这段C#源码(在技术分析区中).<br>

<div id="Tag605"/><br><br><br>
  <font style='font-size:15pt'>5.图片扩展URL</font>  <img src='document.bmp' title='Treelist演示页: 4.图文并茂(1)、5.图文并茂(2);Freeform演示页: 11.多记录Freeform(1)、12.多记录Freeform(2);Report演示页:9.自定义工具条、自定义右键菜单'><hr color=#2266ee size=1>
  Treelist、Freeform、Tree等组件经常会用到图片,例如背景图片、下拉图片、按钮图片等,如果一个页面中的小图片过多,那么向服务器发起的请求也多,势必影响性能,为此,Supcan对图片的URL作了一个扩展,允许将图片部署在服务器端的一个zip包中,客户端的图片URL如果是采用如下写法:<br>
    url="../res/boudle.zip#car33.bmp"<br>
  那么boudle.zip会被浏览器下载到本地缓存,组件会自动抽取、显示其中的car33.bmp。如果要引用该包中别的图片文件,只要URL采用上述写法即可,浏览器不会再向服务器发送多余请求.<br>
  当然zip包也不宜过大,否则影响首次下载的性能.<br>

<br><br><br><br><br>
<script type='text/javascript' src='nstd.js'></script>
</body></html>