怎样使用 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,不仅具备完整的调试功能,还能随时观察每一步的计算结果,适合设计逻辑复杂的计算:

IDEpng

总之,SPL计算能力强、接口易用、架构轻便,更适合用SAP BW的数据做逻辑复杂的查询统计。