怎样使用 SAP BW 的数据做复杂逻辑的查询统计

 

SAP BW里的数据取出来,就可以利用计算语言实现逻辑复杂的统计查询SQL的计算能力足够强,可以先用informaticaTalendETL工具取数,再写入数据库,最后执行SQL。但这个方法入库过程繁琐、实时性差、架构复杂、集成困难。Python的计算能力也没问题,但取数接口的问题很多,其中,PySapRfc类库可以通过专用接口取数,但已经很久不活跃了,而且存在各种bugRestClient/Requests等类库可以通过公共的Restful/Web Service接口取数,但性能很差且代码繁琐。

更好的方法是用集算器SPL,不仅架构简单实时性强,而且计算能力非常强大,取数接口简单易用。

SPLSAP 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,或对传输性能要求不高,也可以使用SPLRestful/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(?,?)");  
…

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的数据做逻辑复杂的查询统计。