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.NewConnection
? ? ? ?With 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 With
? ? Call sapConn.Logon(0, True) ' 第二個參數如果是True 表示靜默登錄,false,就會給你一個登錄控件,選擇已經安裝的SAP 系統,輸入用戶名密碼,等等吧,也就是上面的配置信息。'
? ??
? ? ?If sapConn.IsConnected <> tloRfcConnected Then
? ? ? ?MsgBox "連接失敗!." & sapConn.IsConnected
? ? ? ?
? ? ? ?Exit Sub
? ? End 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公司自己不會給你實施上項目的,授權給甲方了,作為客戶的我們是乙方。)
回頭我想想辦法,找出之前能用的代碼貼出來,繼續寫。就是無法驗證,以及貼圖了。請諒解。
?
總結
- 上一篇: 零基础,新手小白看过来!易用可视化工具推
- 下一篇: 腾讯魔镜壁纸所在位置