报表工具怎样使用 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,以及不同数据源 / 数据库之间的混合计算。
英文版