报表工具怎样使用 Salesforce 的数据
很多数报表工具没有现成的接口访问Salesforce,只能在自定义数据集里硬写代码,难度非常大。有些报表工具封装了相应的接口,可以通过SOQL\SOSL访问Salesforce。这种办法虽然可以降低取数难度,但不能解决后续的计算,除非继续硬写代码。
更好的办法是用JAVA开源计算类库SPL,既有方便的取数函数,又有强大的计算能力,还有易于被报表集成的JDBC接口。
SPL内置方便易用的取数函数,可以通过SOQL\SOSL访问Salesforce。比如从Lead表取数,只需用json文件保存Salesforce账号信息,再执行下面的SPL脚本。
A |
|
1 |
=sf_open("D:\\conf\\user.json") |
2 |
=sf_query(A1,"/services/data/v51.0/query","Select Id,CaseNumber,Subject From Case where Status='New'") |
3 |
=sf_close(A1) |
4 |
return A2 |
SPL内置丰富的计算函数,可以用简单直观的语法计算多层数据,从而避免繁琐的硬编码。比如取得订单数据后进行区间查询,其中p_start、p_end是参数:
A |
|
3 |
…//取得订单,关闭连接 |
4 |
=A2.select(Amount>p_start && Amount<=p_end) |
SPL提供了JDBC驱动,可以像普通RDB一样被报表工具集成。对于上面的SPL代码,先存为脚本文件,再在报表工具里以调用存储过程的形式调用脚本文件名。以Birt报表为例,可写作:
{call intervalQuery(? , ?)}
再举几例:
A |
B |
|
3 |
… |
|
4 |
=A2.select(Amount>1000 && like(Client,\"*S*\")) |
//模糊查询 |
5 |
=A2.sort(Client,-Amount)" |
//排序 |
6 |
=A2 .id(Client) |
//去重 |
7 |
=A2.groups(year(OrderDate);sum(Amount)) |
//分组汇总 |
8 |
=orcl.query@x("select * from employees") |
//取Oracle数据 |
9 |
=join(A2:O,SellerId;A8:E,EId) |
//关联Oracle |
SPL提供了标准SQL语法,除了where、group、order,也包括from子查询、with子查询、join等Salesforce不支持的功能。比如区间查询可以改写为下面的SQL语句:
A |
|
1 |
=sf_open("D:\\conf\\user.json") |
2 |
=sf_query(A1,"/services/data/v51.0/query","Select OrderID,Client,Amount,OrderDate from Orders") |
3 |
=sf_close(A1) |
4 |
$select * from {A2} where Amount>? && Amount<=?; p_start, p_end |
更多例子参考《在文件上使用 SQL 查询的示例》
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,具备完整的调试功能,允许以表格的形式观察每一步的计算结果,适合开发逻辑较复杂的计算。
除了Salesforce之外,SPL还支持CSV/XLS/WebService XML/Restful Json、MongoDB、Hadoop、redis、ElasticSearch、Cassandra等多种NoSQL,以及不同数据源/数据库之间的混合计算。
英文版