报表工具怎样使用 Webservice/Restful 的数据
很多报表工具都没有提供 Webservice/Restful 接口,只能通过自定义数据集硬写代码去访问。个别报表工具虽然提供了取数接口,但因为报表工具普遍只擅长展示,所以很多时候还是要另想办法去计算,比如再掏出老伙计自定义数据集,或借助 SQLite 等 RDB 中转再算。硬编码繁琐冗长,SQLite 时效性差架构复杂,两种办法都不是上选,更大的问题是,WebService/Restful 是多层数据而不是简单的结构化数据,而这些办法都不擅长多层数据的计算。
更好的办法是用 JAVA 开源计算类库 SPL,既有方便的 WebService/Restful 取数函数,又有强大的多层数据计算能力,还有易于被报表集成的 JDBC 接口。
SPL 内置WebService/Restful 接口,可以方便地获取数据。比如某 URL 返回 Restful json,结构为多条员工记录及员工的多个订单,用 SPL 取所有的员工记录:
A |
|
1 |
=httpfile("http://....../api/getData").read() |
2 |
=json(A1) |
或取所有的订单记录:
A |
|
1 |
…//同上 |
2 |
=json(A1).conj() |
类似地,从 WebSerivce XML 取数:
A |
|
1 |
=ws_call(ws_client("http://....../entityWS.asmx?wsdl"),"entityWS ":"entityWSSoap":"getData") |
2 |
=A1.conj(Orders) |
SPL 也能访问有权限控制的服务器,这里不展开了。
SPL 内置丰富的计算函数,可以用简单直观的语法计算多层数据,从而避免繁琐的硬编码。比如对订单进行区间查询,其中 p_start、p_end 是参数:
A |
|
2 |
…//取得订单记录 |
3 |
=A2.select(Amount>p_start && Amount<=p_end) |
SPL 提供了通用的数据对象,WebService 和 Restful 只是取数过程不同,计算代码没区别,这里不再分开说明。
SPL 提供了JDBC 驱动,可以像 RDB 一样被报表工具集成。对于上面的 SPL 代码,先存为脚本文件 intervalQuery.splx,再在报表工具里调用脚本文件,类似调用存储过程。以 JasperReport 为例,应写作:
call intervalQuery($P{paramStart}, $P{paramEnd})
再举几例:
A |
B |
|
2 |
…//取得员工记录 |
|
3 |
=A2.conj(Orders).groups(Client;sum(Amount)) |
/多层数据汇总 |
4 |
=A2.groups(State,Gender;avg(Salary),count(1)) |
/单层数据汇总 |
5 |
=A2.sort(Salary) |
/排序 |
6 |
=A2.id(State) |
/去重 |
7 |
=A2.new(Name,Gender,Dept,Orders.OrderID,Orders.Client,Orders.Client,Orders.SellerId,Orders.Amount,Orders.OrderDate) |
/关联 |
SPL 还提供了标准 SQL 语法,可有效降低学习门槛,适合代码短难度低的计算。比如区间查询,可以在报表工具中建立 SQL 数据集,并编写如下 SQL 语句:
$select * from {json(httpfile("http://....../api/getData").read()).conj()}
where Amount>$P{paramStart} and Amount<=$P{paramEnd}
SPL 具有灵活的计算语法,可简化分步计算、有序计算、分组后计算等逻辑较复杂的计算,很多 SQL 或存储过程都很难实现的计算,用 SPL 解决起来就很轻松。比如,找出销售额累计占到一半的前 n 个大客户,并按销售额从大到小排序:
A |
B |
|
1 |
… |
/取数据 |
2 |
=A1.sort(amount:-1) |
/销售额逆序排序 |
3 |
=A2.cumulate(amount) |
/计算累计序列 |
4 |
=A3.m(-1)/2 |
/最后的累计即总额 |
5 |
=A3.pselect(~>=A4) |
/超过一半的位置 |
6 |
=A2(to(A5)) |
/ 按位置取值 |
SPL提供了专业的 IDE,不仅具备完整的调试功能,还能以表格的形式观察每一步的计算结果,适合开发逻辑较复杂的计算。
除了 WebService/Restful 之外,SPL 还支持 CSV、XLS、Json、XML 等多种文件,以及 MongoDB、Hadoop、redis、ElasticSearch、SalesForce、Cassandra 等多种 NoSQL,以及不同数据源 / 数据库之间的混合计算。
英文版