4ec6b8720b3c9ce3157802ef790f282a94341b0f.svn-base
10.8 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
<HTML>
<head>
<meta http-equiv="content-type" content="text/html; charset=gb2312">
<link rel="stylesheet" href="../temp1.css" type="text/css">
</head>
<body bgcolor=#ffffff vlink=#0000ff>
<div id="Tag307"/><br><br><br>
<font style='font-size:15pt'>8.中心数据源</font><hr color=#2266ee size=1>
<b>8.1.关于数据源</b><br>
报表从数据源取数、填充是Supcan Report最重要的功能之一,数据源分二种:中心数据源和临时数据源。<br>
所谓“中心数据源”是指可用的数据源全部都已经预先编排好了,客户编制报表时,只要获得中心数据源目录列表的URL,就能从中挑选本张报表需要的各种数据,例如制作销售统计表时,从数据源中心的数据目录树中挑选和销售有关的数据源即可。
采用中心数据源,报表制作者只要有数据目录的URL,就可以实现不需要程序员帮助的报表制作;对于程序员而言,只要把能提供的数据归并到中心数据目录即可,不必关心具体的报表制作过程,真正实现了数据与格式的分离。<br>
所谓“临时数据源”是指每一个数据源的URL都需要程序员告诉最终的制表者,从哪里去获得数据,没有一个统一的数据发布途经,所以这只是临时的报表制作方案。当然如果对报表的自定义要求不高、报表数量不多的话,临时数据源也能实现和中心数据源同样的功能。此外“临时数据源”支持更多种类的数据格式。<br>
“临时数据源”相对比较简单,您只要按最下面的<a href="reportds.htm" target=_blank>附录.数据源实例</a>做一遍,就应该对其有所了解,在此不再作分析。<br>
<!--硕正报表从1.0.57.0后,增加了一项重要的功能:可变参数查询功能,通过指认URL中的查询参数(例如 http://local/test.aspx?para1=01&para2=ceo&para3=31)实现动态查询的目的,可变参数可以通过API函数SetParas( )从页面js设置,也可以在报表内部通过单元格的关联设置。在演示页中也有详细的分析示例。<br>-->
<div id="Tag30701"/><br>
<b>8.2.基本协议</b><br>
中心数据源协议核心是2个协议:目录协议和描述协议,这2种协议其实就是2种格式的XML。建设中心数据源的基础工作,主要就是维护这2种XML文件(或http响应)。<br>
此外,还有根据需要可选的协议,比如单个数据源的描述协议、懒加载协议、搜索协议等。<br>
<br>
<i>8.2.1.数据源目录协议</i><br>
中心数据源首先必须要有一个总的目录,这个目录好比就是电话号码本,里面记载了每个可用数据源的入口。<br>
数据源目录是XML格式的,必须由程序员预先编排好,XML举例如下:<br>
<pre class='xml'>
<?xml version="1.0" encoding="UTF-8"?">
<Catalog>
<Project <font color=#ff0000>text</font>="业务数据" <font color=red>tip</font>="货运数据">
<ds <font color=#ff0000>id</font>="1001" <font color=#ff0000>descURL</font>="data1.desc.xml" <font color=#ff0000>dataURL</font>="data.xml"><b>货运数据</b></ds>
</Project>
<Project <font color=#ff0000>text</font>="财务数据" >
<ds <font color=#ff0000>id</font>="2001" <font color=#ff0000>descURL</font>="fin.xml" <font color=#ff0000>dataURL</font>="serv1?para=1" <font color=red>tip</font>="资产类科目余额"><b>资产</b></ds>
<ds <font color=#ff0000>id</font>="2002" <font color=#ff0000>descURL</font>="fin.xml" <font color=#ff0000>dataURL</font>="serv1?para=2" <font color=red>tip</font>="负债类科目余额"><b>负债</b></ds>
<ds <font color=#ff0000>id</font>="2003" <font color=#ff0000>descURL</font>="fin.xml" <font color=#ff0000>dataURL</font>="serv1?para=3" <font color=red>tip</font>="权益"><b>权益</b></ds>
</Project>
<Project <font color=#ff0000>text</font>="以往年度数据" <font color=#ff0000>lazyload</font>="old1.aspx?nj=3">
</Project>
</Catalog></pre>
协议说明如下:<br>
1.该XML树、子树的级别无限制,树的元素命名也无限制,Supcan Report都能够正确地解析、显示出来;<br>
2.上例中红色部分元素名必须书写正确,黑色部分为可选;<br>
3.上述XML中,带<b>id</b>的行表示某个具体的数据源,其id必须唯一,id可以为英文字母、数字、下划线组合,但不得包含斜杠。<font color=red>该目录树一旦正式发布、投入使用,id不得轻易修改</font>,因为id会被保存在引用了该数据源的报表的XML文件中;<br>
4.<b>descURL</b>表示描述该数据源的XML的URL,数据源描述协议在下面有介绍。该URL可以是绝对URL,也可以是相对URL(相对于中心数据源目录XML),例子中就是相对URL;<br>
5.<b>dataURL</b>表示该数据源最终数据的URL,对于JavaEE开发者而言,这就象是一个Servlet。该URL可以是绝对URL,也可以是相对URL(相对于中心数据源目录XML),例子中就是相对URL;<br>
6.<b>LazyLoad</b>表示懒加载,鼠标首次点击让它展开时动态从后端加载子孙;<br>
7.<b>tip</b>表示内容帮助,即鼠标滑过该数据源时会出现的略为详细的黄色说明条;<br>
8.黑色加粗部分(即XML的Text)为数据源的含义正文,制表者在挑选数据源时看到的就是这些文字,通常要求简短而含义准确;<br>
<br>
<i>8.2.2.数据源描述协议</i><br>
上述目录中,每条都有一个名为 "descURL" 的属性,这个 descURL 就是指向该数据源的详细描述的XML文本,这就是数据源的描述协议.<br>
该XML描述了各个数据列的属性,描述协议举例如下:<br>
<pre class='xml'>
<?xml version="1.0" encoding="UTF-8"?">
<cols>
<col name="orderID" datatype="int" hyperLink="conID">订单号</col>
<col name="orderDate" datatype="date">订单日期</col>
<col name="conID">合同号</col>
</cols></pre>
协议说明如下:<br>
1.元素名必须书写正确;<br>
2.datatype可以是string、int、double、date、datetime,默认是string(即datatype="string"可以忽略);<br>
3.hyperLink表示该列允许被超链接,指向超链接的列;<br>
<div id="Tag30702"/><br>
<b>8.3.参数协议</b><br>
采用中心数据源后,制表者会倍感轻松,但是也会面临一个问题:参数问题,例如获取销售数据,通常会有时间段的要求,如何获得有指定时间、地点或其它查询条件的数据,通常都采用查询“参数”来解决。<br>
以上述中心数据源目录XML为例,带参数的数据源目录格式举例如下:<br>
<pre class='xml'>
<?xml version="1.0" encoding="UTF-8"?">
<Project name="业务数据" <font color=black>tip</font>="货运数据">
...
<ds id="11" <font color=#ff0000>para1</font>="月份" <font color=#ff0000>para2</font>="组织号" dataURL="<font color=#ff0000>data.serv?month=@para1&org=@para2</font>" descURL="data1.desc.xml">货运数据</ds>
<ds id="12" <font color=#ff0000>para1</font>="搜索串" dataURL="<font color=#ff0000>data.serv?search=@para1</font>" descURL="data1.desc.xml" isPost="EncodeURIComponent">货运数据</ds>
...
</Project></pre>
这样就实现了带参数的查询,该部分协议规定如下:<br>
1.预先定义的参数,元素名为para1、para2、...,序号从1开始,其内容为参数的含义;<br>
2.若预先定义了参数,dataURL中须有@para1、@para2之类的宏,最终Supcan Report会根据真实的参数拼装出真正的URL,并向服务器发送GET请求.<br>
这是数据源目录中的参数预定义规则,在具体的制表过程中,参数可以通过如下途经设置:<br>
1.直接在公式中输入,例如"=datarow('ds1', <font color=#ff0000>1</font>, <font color=#ff0000>'001'</font>)";<br>
2.将参数指向某个单元格,例如:"=datarow('ds1', <font color=#ff0000>C6</font>, <font color=#ff0000>'001'</font>)",其中C6是指C6单元格,只要在C6单元格输入了月份数据,数据会立即刷新;<br>
3.在上例中,C6单元格可以制作成下拉,将月份字典表赋予给此单元,最终用户只要从下拉中选择月份,数据也能刷新;<br>
4.在页面中通过js调用Supcan Report的SetParas()函数,直接设置查询条件;<br>
5.<b>isPost</b> 可以是 false / true / encodeURIComponent,默认是false(即 GET);否则将dataURL中问号(?)后面的内容拆分出来安置在 http Body 中;而"encodeURIComponent"则表示参数内容预先做encodeURIComponent处理,和ajax post处理方式一致;<br>
<br>
<div id="Tag30704"/><br>
<b>8.4.单个数据源描述协议</b><br>
“单个数据源描述协议”是一个可选的协议, 服务端返回的XML结构举例如下:<br>
<pre class='xml'>
<?xml version="1.0" encoding="UTF-8"?">
<cols <font color=#ff0000>dataURL="data.serv?month=@para1&org=@para2" para1="月份" para2="组织号"</font> >
<col name="orderID" datatype="int" hyperLink="conID">订单号</col>
<col name="orderDate" datatype="date">订单日期</col>
<col name="conID">合同号</col>
</cols></pre>
它相当于将dataURL、para参数和列信息统统写在一起了。<br>
<br>
该协议的使用场景如下:<br>
假如某张报表已经使用了中心数据源,假设其数据源 id 为 "1001", 当硕正报表打开这张报表后,它会在中心数据源目录URL的后面增加参数“serviceId=1001”,以这个URL访问服务器。其实它是试图绕过目录服务,单独取得这个数据源的结构信息. <br>
假如中心数据源目录的URL为 "../serv/centercat.aspx", 那么单独获取的URL为 "../serv/centercat.aspx?<font color=red>serviceId=1001</font>";<br>
<br>
您的后端程序遇到这种请求,有如下2种处理方案:<br>
1.按照本“单个数据源描述协议”,返回该数据源的结构;<br>
2.不理会本协议,直接返回整个数据源目录,相当于是无视“serviceId=1001”这个参数;<br>
不管您返回上述哪种XML,硕正报表都能正确辨认,达到取得该数据源的结构的目的。<br>
<br>
在您的中心数据源目录比较庞大、访问获取时比较耗时的情况下,实现“单个数据源描述协议”能明显提升报表的性能。<br>
<br>
<div id="Tag30705"/><br>
<b>8.5.懒加载协议</b><br>
如果中心数据源目录中条目增多,假如达到数千条,这个XML数据的下载会很慢,为此,我们的目录协议还支持另一种XML格式:采用平面的结果集格式,以 "pid" 属性指定树的上层 id,例如:<br>
<pre class='xml'>
<?xml version="1.0" encoding="UTF-8"?">
<Catalog <font color=#ff0000>treeformat="bypid"</font>>
<ds id="1" text="业务数据" tip="货运数据"/>
<ds id="1001" <font color=#ff0000>pid</font>="1" descURL="data1.desc.xml" dataURL="data.xml" text="货运数据"/>
<ds id="2" text="财务数据" />
<ds id</font>="2001" <font color=#ff0000>pid</font>="2" descURL="fin.xml" dataURL="serv1?para=1" text="资产"/>
<ds id"2002" <font color=#ff0000>pid</font>="2" descURL="fin.xml" dataURL="serv1?para=2" text="负债"/>
<ds id="3" <font color=#ff0000>text</font>="以往年度数据" <font color=#ff0000>lazyload</font>="old1.aspx?nj=3"/>
</Catalog></pre>
该协议须注意:<br>
1.顶部的<Catalog <font color=#ff0000>treeformat="bypid"</font>>就表示告诉硕正数据源管理器,目前使用的是byPid格式;<br>
2.第8行的 <font color=#ff0000>LazyLoad</font> 属性表示该行是树杈,鼠标点击展开时,会动态从这个URL加载其子孙的;<br>
3.子孙的XML格式也应该和这个XML相似.<br>
如果您准备启用LazyLoad模式,那么您<font color=red>必须同时也实现前述的“单个数据源描述协议”</font>。
<br>
<div id="Tag30706"/><br>
<b>8.6.搜索协议</b><br>
和上述懒加载的情形相似,如果中心数据源编目繁多,为了快速搜索到所需的数据源,还需要补充一个搜索协议。<br>
当实例创建参数增加:DSCenterDialogHeader="search" 时,中心数据源对话框显示如下:<br>
<center><img src="reportds13.jpg"></center>
这就需要在硕正控件和后端服务之间设定一个协议,协议很简单:在中心数据源URL后增加search参数,假如中心数据源目录的URL是:<br>
http://loaclhost/datacenter.aspx<br>
那么数据源搜索的URL就是(假如搜索内容是 "仓储"):<br>
http://loaclhost/datacenter.aspx?search=%e4%bb%93%e5%82%a8<br>
其中"%e4%bb%93%e5%82%a8"是中文"仓储"的UTF-8编码.<br>
此外,后端服务也同样需要实现数据源描述服务,即懒加载协议中的 serviceId=ID号 的服务。<br>
<div id="Tag30707"/><br>
<b>8.7.其它说明</b><br>
1.一张报表中可以有多个数据源,允许中心数据源、临时数据源混合使用;<br>
2.一张报表只能有一个中心数据源目录URL,但是可以使用多个属于该中心数据源的具体数据源;<br>
3.中心数据源的XML协议中,如果需要用到中英文对照,应该以竖线("|")分隔中英文,例如tip="合同号|Contact ID";<br>
4.中心数据源具体的数据的格式只支持XML、JSON;<br>
5.可以在页面js中调用SetSource(),预先设置中心数据源的URL;<br>
6.上述XML中的元素名对大小写不敏感;<br>
<br><br><br>
<script type='text/javascript' src='nstd.js'></script>
</body></html>