VBA 操作SAP
一、吐槽
之前曾用autoit操作SAP,但那样的话,用户的界面被autoit控制,就不能随便乱动。因此想做一个静态连接SAP,然后读取,操作SAP的程序。为后期自动化做准备,找了很多资料,尝试了不少语言,最后选择了VBA。
在我看来SAP 是一个数据库管理系统,记得20年前刚解除计算机,曾学了一点foxbase,做过一个图书馆管理系统。当然SAP很复杂,因为SAP本身有自己的ABAP语言(之前觉得做个语言很牛逼,因为文法是开发一个语言的前提,后来看了autoit才知道,语言也可以封装。因此ABAP,autoit等语言其实都是从C,C++封装过来的)。
很多人一听到我说SAP是一个数据库就立马喷我无知。怎么说呢,现在很多软件都要用到数据库,但不能说一切软件都是数据库系统。SAP早期是没有自己底层的数据库,因此客户买了SAP还要买数据库比如Oracle(当然有很多时候是SAP打包一起做生意了)Oracle本身也有ERP解决方案。你想你为竞争对手打工,是什么感觉,因此SAP后来收购了一家数据库公司SYBASE,并且趁机把很多年前的内存数据库概念拿出来热炒一番,趁势推出hana数据库。
总之,狭义的SAP就是一般end user看到的,是一个ERP软件。对于那些搞SAP开发的就包括了 底层数据库,这个数据库SAP已经把几乎所有的标准表都建好了。大家需要学习怎么用表,各个表之间的关系,怎么增删改查,当然遇到复杂的可能还要增强。底层往上,就是不同的SAP 客户端了。有云,有B/S 有C/S,有用ABAP写的,有调用BAPI,有之间操作数据库的服务端接口。再往上,就是一些比较熟悉SAP 配置的顾问,他们了解企业流程,管理,财务知识怎么用SAP来体现出来。顾问和上面写代码的,结合客户的KEY UERR一起实施项目。说实话,SAP忽悠的成分比较多。多配置一个字段可能就说是一个更高级的版本。因为ERP都是要结合企业自身情况量身定制。但SAP里已经为你写好了很多标准的表,标准的操作数据库的方法。而顾问这时候不给力,就照搬标准实现,最后就达不到客户需求,这时候,就需要做SAP二次开发了。
很多语言都可以做SAP二次开发,但一般来说,需要下载SAP的sdk,这个SDK下载难度相当的高,因为SAP太他娘的封闭了。无奈,只好用VBA引用 SAP控件的方式来做。
二、上菜
用过VBA的都知道,要想使用哪个对象,就先要引用哪个对象。
说明一下,上面SAP 开头的不是都需要引用,VBA操作SAP有2种方式,或者说通过2种类型的对象都可以。但我这个人很糊涂的,一般都把SAP 相关的都勾选上,还有一个 蓝色背景的CCO ,那个是别人写的dll用不同的语言操作SAP,很强大,我下载的。你的电脑上可能没有。总之,操作SAP 方法方式很多。直接操作hana数据库最好,可任何一个数据库系统不可能让你直接用SQL语句操作,除非DBA,只能封装了一层,BAPI, RFC等。
扯远了。继续VBA。
引用是前期准备,下面先上个小凉菜,连接SAP,想象成web 程序的后端 连接数据库。
Public Sub Logon()
Set sapLogon = New SAPLogonControl
Set sapConn = sapLogon.NewConnectionWith sapConn
.System = 'PRP' '系统标识'
.ApplicationServer = '172.16.80.66' '应用服务器,一般为IP地址'
'.SAPRouter = '/H/XXX.XX.XXX.XX/H/' '外网连接的SAP路由'
.SystemNumber = '00' '实例编号'
.Client = '100'
.User = 'username' '你用SAPlogon gui 登录用户名
.Password = 'password' '你用SAPlogon gui 登录密码
.Language = 'EN'
End WithCall sapConn.Logon(0, True) ' 第二个参数如果是True 表示静默登录,false,就会给你一个登录控件,选择已经安装的SAP 系统,输入用户名密码,等等吧,也就是上面的配置信息。'
If sapConn.IsConnected <> tloRfcConnected Then
MsgBox '连接失败!.' & sapConn.IsConnected
Exit SubEnd If
End Sub
上面很多我都注释了。但还有一点对于新手可能有点困难。ApplicationServer这个属性如果获得,其实很简单,很多公司SAP logon会让你选择登陆哪一个,如果是大一些的,子公司比较多的。都会配置logon 。你能看到这些属性。Message Server就是它了。如果和我一样是个纠结的人,非要知道Message Server对于的IP地址。那就用cmd ping 一下它。就看到IP啦。
其实,说白了。就是我们客户端和服务器要相通的。就好比你上百度,如果你网线也没有,wifi也么有,就无法连接百度服务器。
上面的代码只有连接失败的提示,你也可以添加上连接成功的提示。这个我就不多啰嗦了。
可能有朋友问,这些引用从哪里找,为什么我的电脑中没有呢。
对于这个问题,首先要确保你的电脑安装了SAP 客户端。就是你平时能登录上公司的SAP系统。
然后在引用里找一下有没有SAP 开头的控件,如果没有点击右边的 “浏览“ 按钮,
然后去类似于这样的目录中寻找:C:\Program Files (x86)\SAP\FrontEnd\SAPgui
注意: 每个人的电脑可能不一样,但懂电脑的人应该都明白大概会在哪里找到。最后的OCX文件名不要选择错了。
上面是BAPI 控件。下面是RFC (remote function call)控件。
二,连接上后通过RFC操作消费SAP 数据库中的数据(想了想还是用消费这个词比较好,否则很多人以为是在点啊点的操作SAP)
插播一点,我们公司有4套不同的SAP系列。其实在我看来就2大类,一类是基于非hana数据库的,一类是基于hana数据库的。还没有云端版的。大集团很少把自己的服务器放在云端吧。
这4套SAP,对应集团10多个公司不同的业务模型。
我所属的这个BU,使用的是hana数据库的SAP,从上次文章写出来后,不知道为什么老外把服务器配置改成不能RFC连接了。
也就是说上面的连接代码失效。后面进行数据的增删改查都无法完成。所以一直没继续写。
这也看出来,SAP很扯淡的。有时候,你的工作是烧开水,但他只让你打水,不让你生火。很多公司高管一般就是计算机文盲。下面做事的很难受。SAP公司就可以乱忽悠了。当然一般都是SAP实施方,也就是所谓的甲方(SAP公司自己不会给你实施上项目的,授权给甲方了,作为客户的我们是乙方。)
回头我想想办法,找出之前能用的代码贴出来,继续写。就是无法验证,以及贴图了。请谅解。