8.自定义函数
<?xml version="1.0" encoding="UTF-8"?"> <Category name="函数分类1"> <function name="函数名" > <usage>用途说明</usage> <detail>更详细的说明,可选</detail> <para>参数1,可选</para> <para>参数2,以此类推,可选</para> <returnDatatype>返回值的数据类型,如int、double等,可选</returnDatatype> <example>示例说明,可选</example> </function> <function name="函数名" > ... </function> ... <!-- 嵌套分类 --> <Category name="函数分类11"> <function name="函数名" > ... </function> </Category> </Category> <Category name="函数分类2"> ... </Category>通过分析上述XML,可见XML文档中允许多个函数分类(即Category),每个类别中允许有多个函数,并支持子类别的层层嵌套。
8.1 简单应用
自定义函数最终怎么完成计算? 控件反向调用js!<function name="balance" > <para>编码,可选</para> <para>月份,可选</para> <returnDatatype>double</returnDatatype> </function>那么在页面中必须要有同名、大小写一致的js函数:
function balance(code, mon) { var d; ..(略) return d; }如果函数在处理过程中需要调用后端数据库信息,那么可以通过 Ajax 调用(必须是"同步")后端服务方式实现.
8.2 高级应用
8.2.1 SetBatchFunctionURL( )
有一种极端的应用场景是:用户设计的报表很大,引用自定义函数会达数百处甚至上千处,如果按照上面“7.1.简单应用”的实现方式,并且假设自定义函数都是需要通过 Ajax 来完成计算,那么,最终会导致什么后果?想必您应该知道了!AF.func("SetBatchFunctionURL", "../../myfuncproc.aspx");这个 URL 就是批计算的响应地址.
<Root> <Functions addition="附加串" > <!-- 第一个 --> <Function name="函数名"> </Function> <!-- 第二个 --> <Function name="函数名"> <Para>参数</Para> <Para dataType="double">参数</Para> //备注: "dataType"自动采用原先所定义的(可选) </Function> <!-- 第三个 --> <Function name="函数名"> <Para>参数</Para> </Function> <!-- 第 n 个等等 --> ... </Functions> </Root>其中的“函数名”、“参数”表示真实的函数名、参数。“附加串”是SetBatchFunctionURL()函数中的附加参数(相当于附言,任意串,请参考SetBatchFunctionURL()函数帮助)。
<Root> <Functions> <Function>返回值</Function> <Function>返回值</Function> <Function>返回值</Function> ... </Functions> </Root>备注1: <Function>的顺序必须和前面请求中的XML保持一致;
<Root> <Functions> <Function>返回值</Function> <Function>返回值</Function> <Function> <fault> <faultcode>错误代码</faultcode> <faultstring>错误</faultstring> <detail>详细描述</detail> <reason>错误原因</reason> <faultactor>错误角色</faultactor> </fault> </Function> ... </Functions> </Root>备注: 其中<fault> ... </fault>是 SoapLike 异常包, 表示某个函数在服务器端捕获的错误(如异常),需要在报表的计算信息窗中加以显示;
8.2.2 前后端混合计算
有时候并不是所有自定义函数都必须推送到后端计算,可能有部分函数需要在本地页面中计算,那么只要修改XML的定义,增加<RunAt>内容:<?xml version="1.0" encoding="UTF-8"?"> <Category name="函数分类"> <function name="函数名" > <usage>用途说明</usage> <detail>更详细的说明,可选</detail> <runAt>Local</runAt> ...凡是runAt被定义为 "Local"(或Client)的函数,都不会被发送到后端,而是通过 "8.1 简单应用" 的方式简单地在客户端计算. runAt的默认值是"Server",即后端计算.
8.3 参数输入向导
硕正报表从1.0.64.0开始,增加了函数的向导式输入功能(输入框左侧的f(x)小按钮):