SAP R/3系統是業界最先進、最穩定的ERP系統,國際和國內大型企業採用該系統的比例遙遙領先於其它ERP系統的總和。SAP R/3內建了二次開發平台,使用的開發語言叫做ABAP,是一種類似於COBOL的程式設計語言。ABAP在報表輸出方面功能相對較弱(只能按行列印在螢幕上或者匯出到Excel中處理),所以日常工作中經常需要在外部開發程式。通過程式介面自動讀取SAP R/3的資料表(視圖),在外部進行處理和利用水晶報表等工具產生符合中國人習慣的報表樣式。
SAP R/3的介面方式主要有RFC、IDOC、BAPI三種,本文要介紹的是相對比較簡單的RFC(Romote Function Call,遠程函數調用)。SAP系統RFC調用的原理其實很簡單,有一些類似於三層構架的C/S系統,第三方的客戶程式通過介面調用SAP內部的標準或自訂函數,獲得函數返回的資料進行處理後顯示或列印。下面是RFC調用的模型:
本文主要不是討論SAP R/3函數的開發,因為使用SAP的公司一般都有專門的ABAP開發人員。大家如果有機會接觸ABAP平台,可以通過事務代碼SE37進入ABAP開發平台的"函數編製器"進行函數開發測試。
下面主要以VB為例介紹一下SAP介面RFC的開發思路。在SAP用戶端SAP Gui Client安裝的時候,注意選擇安裝附帶的SDK包(最保險是選擇完整安裝)。RFC介面程式開發,主要用的是"SAP.Functions"這個控制項,通過控制項在外部程式類比SAP Gui Client的使用者登入和函數調用,然後返回函數的值。請看下面的程式片段和重點註解(尤其是test_Click()):
Private Sub Command1_Click() ' 定義R/3使用者名稱和密碼變數(使用者名稱應由SAP管理員開運行函數的許可權) Dim logname As String * 22, password As String * 22 Call logonr3(logname, password) ' 調用SAP登入介面程式 If logflag Then ' 調用生產、開發系統開關 StatusBar1.Visible = True StatusBar1.SimpleText = "正在登入SAP R/3系統..." Dim R3AppServer As String, R3Client As String, R3SystemNo As String If Form2.opPRD.Value Then ' 以下伺服器參數請根據客戶配置情況更改 R3AppServer = "10.3.1.4" ' 生產系統伺服器IP R3Client = "800" '生產系統集團代碼 R3SystemNo = "00" '生產系統號 Else R3AppServer = "10.3.3.1" ' 開發系統伺服器IP R3Client = "101" R3SystemNo = "00" End If Unload Form2 ' 釋放 Form2 , 所有控制項及值不可用 Set Functions = CreateObject("Sap.Functions") ' 建立RFC的本機物件 Set Connect = Functions.Connection ' 設定串連 Connect.ApplicationServer = R3AppServer ' 賦值伺服器IP Connect.Client = R3Client ' 賦值SAP集團代碼 Connect.Language = "ZH" ' 置SAP系統介面中文 Connect.User = Trim(logname) ' 賦值SAP登入使用者名稱 Connect.password = Trim(password) ' 賦值SAP登入使用者密碼 Connect.SystemNumber = R3SystemNo ' 賦值SAP系統號 If Not Connect.Logon(0, True) Then ' 軟體登入SAP並判斷 MsgBox "登入SAP R/3失敗,請重新登入!", vbOKOnly + vbExclamation, "系統提示" Command1.SetFocus Else ' 登入SAP成功 Command1.Enabled = False Command2.Enabled = True test.Enabled = True End If StatusBar1.SimpleText = "" StatusBar1.Visible = False End If End Sub Private Sub Command2_Click() ' 登出SAP登入 Connect.LogOff Command2.Enabled = False Command1.Enabled = True test.Enabled = False End Sub Private Sub Command3_Click() ' 退出SAP介面示範程式 If Form1.Command2.Enabled Then MsgBox "退出前請斷開SAP R/3系統!", vbOKOnly + vbInformation, "系統提示" Else End End If End Sub Private Sub Form_Load() Command2.Enabled = False test.Enabled = False logoflag = False End Sub Private Sub test_Click() ' SAP RFC遠程調用處理主示範 Dim GetCustomers As Object Dim Customers As Object Dim i As Integer ' 通過RFC介面遠程運行SAP內建函式RFC_CUSTOMER_GET ' 賦要調用的SAP內建函數名 Set GetCustomers = Functions.Add("RFC_CUSTOMER_GET") GetCustomers.Exports("KUNNR") = "0000000103" ' 向函數入口賦值(客戶代碼) ' 向函數入口賦查詢表名稱 Set Customers = GetCustomers.Tables("CUSTOMER_T") If GetCustomers.Call Then ' 調用成功遍曆顯示客戶所有資訊條目 For i = 1 To Customers.rowcount MsgBox Customers(i, "KUNNR") Next i Else MsgBox " 搜尋出錯! 出錯資訊: " + GetCustomers.Exception End If End Sub |
SAP的RFC調用是其介面技術中最簡單和易用的一種方式,該方式開發比較簡便,特別適合於外部報表開發,但對於大資料量的查詢效率相對較低。大家在熟練掌握後,可以進一步學習進階的IDOC和BAPI介面開發技術。