3ed932b20f326f9b74cc4e8072cc702f359e24e2.svn-base
10.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
<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列的关系
<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></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;"> </td></tr>
<tr><td align=right>含义:</td><td>取修改前的原始值</td></tr>
<tr><td align=right>示例:</td><td>
<pre class='xml'>
//计算列表达式:
<express>total2=round(price * num@origin, 4)</express>
//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;"> </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'>
//某列的小计表达式:
<col name="price" subtotalExpress="='均价: '+@ave" />
//复杂一点的:
<col name="price" subtotalExpress="='方差: '+js('delta', @max, @min)" /></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'>
//某列的小计表达式:
<col name="price" subtotalExpress="=if(@TreeLevel==1, '总计: '+@sum, '小计: '+@sum)" /></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;"> </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;"> </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;"> </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'>
<?xml version="1.0" encoding="UTF-8" ?>
<fault>
<faultcode>错误代码</faultcode> //或<code>
<faultstring>错误</faultstring>
<detail>详细描述</detail>
<reason>错误原因</reason>
<faultactor>错误角色</faultactor>
</fault></pre>
在<fault>下,至少要有上述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>