报表工具怎样使用 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,不仅具备完整的调试功能,还能以表格的形式观察每一步的计算结果,适合开发逻辑较复杂的计算。

IDEpng

除了 WebService/Restful 之外,SPL 还支持 CSV、XLS、Json、XML 等多种文件,以及 MongoDB、Hadoop、redis、ElasticSearch、SalesForce、Cassandra 等多种 NoSQL,以及不同数据源 / 数据库之间的混合计算。