怎样使用 SAP BW 的数据做复杂逻辑的查询统计
把SAP BW里的数据取出来,就可以利用计算语言实现逻辑复杂的统计查询。SQL的计算能力足够强,可以先用informatica、Talend等ETL工具取数,再写入数据库,最后执行SQL。但这个方法入库过程繁琐、实时性差、架构复杂、集成困难。Python的计算能力也没问题,但取数接口的问题很多,其中,PySapRfc类库可以通过专用接口取数,但已经很久不活跃了,而且存在各种bug;RestClient/Requests等类库可以通过公共的Restful/Web Service接口取数,但性能很差且代码繁琐。
更好的方法是用集算器SPL,不仅架构简单实时性强,而且计算能力非常强大,取数接口简单易用。
SPL将SAP jco接口封装成简单易用的函数。比如,根据连接信息访问SAP服务器,执行函数Z_TEST1,再取得IT_ROOM表中的返回结果,只需下面的SPL脚本:
A | |
1 | =sap_open("userName","passWord","192.168.0.188","00","000",”E") |
2 | =sap_cursor(A1, "Z_TEST1","IT_ROOM").fetch() |
3 | =sap_close(A1) |
如果不方便部署jco,或对传输性能要求不高,也可以使用SPL的Restful/Web Service函数取数,同样简单易用且支持权限控制,这里不展开说了。
SPL内置丰富的计算函数,提供了不亚于SQL的计算能力。比如,对A2单元格已取出的数据进行计算:
A | B | |
3 | … | /省略取数过程 |
4 | =A2.select(salary>8000 && salary<10000) | /过滤 |
5 | =A2.sort(salary) | /排序 |
6 | =A2.groups(deptid;sum(salary),avg(salary)) | /分组汇总 |
7 | =join(B2,cat;A2,cat).groups(_1.title, _2.path; sum(_1.amount)) | /关联计算 |
SPL提供了JDBC/ODBC集成接口,容易被高级语言和报表工具调用。比如在JAVA中以存储过程的形式调用SPL脚本文件,只需如下代码:
… Class.forName("com.esproc.jdbc.InternalDriver"); Connection conn =DriverManager.getConnection("jdbc:esproc:local://"); CallableStatement statement = conn.prepareCall("{call run(?,?)"); …
…
Class.forName("com.esproc.jdbc.InternalDriver");
Connection conn =DriverManager.getConnection("jdbc:esproc:local://");
CallableStatement statement = conn.prepareCall("{call run(?,?)");
…
SPL具有灵活的计算语法,很多逻辑复杂的计算对SQL和存储过程来说难以实现,对SPL则轻而易举。比如,找出某种物料最长的消耗量连续上涨天数,SPL只需一行计算代码:
A | B | |
3 | … | /省略取数过程 |
4 | =a=0,A2.max(a=if(consum> consum[-1],a+1,0)) | /连续上涨 |
再比如:找出销售额累计占到一半的前n个大客户,并按销售额从大到小排序:
A | B | |
3 | … | /取数 |
4 | =A2.sort(amount:-1) | /销售额逆序排序 |
5 | =A4.cumulate(amount) | /计算累计序列 |
6 | =A5.m(-1)/2 | /最后的累计即总额 |
7 | =A5.pselect(~>=A6) | /超过一半的位置 |
8 | =A4(to(A7)) | /按位置取值 |
SPL提供了专业的IDE,不仅具备完整的调试功能,还能随时观察每一步的计算结果,适合设计逻辑复杂的计算:
总之,SPL计算能力强、接口易用、架构轻便,更适合用SAP BW的数据做逻辑复杂的查询统计。