利用VisualBasic開發(fā)SAP接口程序初探

字號(hào):

SAP R/3系統(tǒng)是業(yè)界最先進(jìn)、最穩(wěn)定的ERP系統(tǒng),國(guó)際和國(guó)內(nèi)大型企業(yè)采用該系統(tǒng)的比例遙遙于其它ERP系統(tǒng)的總和。SAP R/3內(nèi)建了二次開發(fā)平臺(tái),使用的開發(fā)語言叫做ABAP,是一種類似于COBOL的編程語言。ABAP在報(bào)表輸出方面功能相對(duì)較弱(只能按行打印在屏幕上或者導(dǎo)出到Excel中處理),所以日常工作中經(jīng)常需要在外部開發(fā)程序。通過程序接口自動(dòng)讀取SAP R/3的數(shù)據(jù)表(視圖),在外部進(jìn)行處理和利用水晶報(bào)表等工具生成符合中國(guó)人習(xí)慣的報(bào)表樣式。
    SAP R/3的接口方式主要有RFC、IDOC、BAPI三種,本文要介紹的是相對(duì)比較簡(jiǎn)單的RFC(Romote Function Call,遠(yuǎn)程函數(shù)調(diào)用)。SAP系統(tǒng)RFC調(diào)用的原理其實(shí)很簡(jiǎn)單,有一些類似于三層構(gòu)架的C/S系統(tǒng),第三方的客戶程序通過接口調(diào)用SAP內(nèi)部的標(biāo)準(zhǔn)或自定義函數(shù),獲得函數(shù)返回的數(shù)據(jù)進(jìn)行處理后顯示或打印。下面是RFC調(diào)用的模型:
    本文主要不是討論SAP R/3函數(shù)的開發(fā),因?yàn)槭褂肧AP的公司一般都有專門的ABAP開發(fā)人員。大家如果有機(jī)會(huì)接觸ABAP平臺(tái),可以通過事務(wù)代碼SE37進(jìn)入ABAP開發(fā)平臺(tái)的"函數(shù)編制器"進(jìn)行函數(shù)開發(fā)測(cè)試。如圖:
    下面主要以VB為例介紹一下SAP接口RFC的開發(fā)思路。在SAP客戶端SAP Gui Client安裝的時(shí)候,注意選擇安裝附帶的SDK包(最保險(xiǎn)是選擇完全安裝)。RFC接口程序開發(fā),主要用的是"SAP.Functions"這個(gè)控件,通過控件在外部程序模擬SAP Gui Client的用戶登錄和函數(shù)調(diào)用,然后返回函數(shù)的值。請(qǐng)看下面的程序片段和重點(diǎn)注解(尤其是test_Click()):
    Private Sub Command1_Click()
    ' 定義R/3用戶名和密碼變量(用戶名應(yīng)由SAP管理員開運(yùn)行函數(shù)的權(quán)限)
    Dim logname As String * 22, password As String * 22
    Call logonr3(logname, password) ' 調(diào)用SAP登錄界面程序
    If logflag Then ' 調(diào)用生產(chǎn)、開發(fā)系統(tǒng)開關(guān)
    StatusBar1.Visible = True
    StatusBar1.SimpleText = "正在登錄SAP R/3系統(tǒng)..."
    Dim R3AppServer As String, R3Client As String, R3SystemNo As String
    If Form2.opPRD.Value Then
    ' 以下服務(wù)器參數(shù)請(qǐng)根據(jù)客戶配置情況更改
    R3AppServer = "10.3.1.4" ' 生產(chǎn)系統(tǒng)服務(wù)器IP
    R3Client = "800"     '生產(chǎn)系統(tǒng)集團(tuán)代碼
    R3SystemNo = "00" '生產(chǎn)系統(tǒng)號(hào)
    Else
    R3AppServer = "10.3.3.1" ' 開發(fā)系統(tǒng)服務(wù)器IP
    R3Client = "101"
    R3SystemNo = "00"
    End If
    Unload Form2 ' 釋放 Form2 , 所有控件及值不可用
    Set Functions = CreateObject("Sap.Functions") ' 創(chuàng)建RFC的本地對(duì)象
    Set Connect = Functions.Connection ' 設(shè)置連接
    Connect.ApplicationServer = R3AppServer ' 賦值服務(wù)器IP
    Connect.Client = R3Client ' 賦值SAP集團(tuán)代碼
    Connect.Language = "ZH" ' 置SAP系統(tǒng)界面中文
    Connect.User = Trim(logname) ' 賦值SAP登錄用戶名
    Connect.password = Trim(password) ' 賦值SAP登錄用戶密碼
    Connect.SystemNumber = R3SystemNo ' 賦值SAP系統(tǒng)號(hào)
    If Not Connect.Logon(0, True) Then ' 軟件登錄SAP并判斷
    MsgBox "登錄SAP R/3失敗,請(qǐng)重新登錄!", vbOKOnly + vbExclamation, "系統(tǒng)提示"
    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 "退出前請(qǐng)斷開SAP R/3系統(tǒng)!", vbOKOnly + vbInformation, "系統(tǒng)提示"
    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遠(yuǎn)程調(diào)用處理主演示
    Dim GetCustomers As Object
    Dim Customers As Object
    Dim i As Integer
     ' 通過RFC接口遠(yuǎn)程運(yùn)行SAP內(nèi)部函數(shù)RFC_CUSTOMER_GET
    ' 賦要調(diào)用的SAP內(nèi)建函數(shù)名
    Set GetCustomers = Functions.Add("RFC_CUSTOMER_GET")
    GetCustomers.Exports("KUNNR") = "0000000103" ' 向函數(shù)入口賦值(客戶代碼)
    ' 向函數(shù)入口賦查詢表名稱
    Set Customers = GetCustomers.Tables("CUSTOMER_T")
    If GetCustomers.Call Then ' 調(diào)用成功遍歷顯示客戶所有信息條目
    For i = 1 To Customers.rowcount
    MsgBox Customers(i, "KUNNR")
    Next i
    Else
    MsgBox " 搜索出錯(cuò)! 出錯(cuò)信息: " + GetCustomers.Exception
    End If
    End Sub
    SAP的RFC調(diào)用是其接口技術(shù)中最簡(jiǎn)單和易用的一種方式,該方式開發(fā)比較簡(jiǎn)便,特別適合于外部報(bào)表開發(fā),但對(duì)于大數(shù)據(jù)量的查詢效率相對(duì)較低。大家在熟練掌握后,可以進(jìn)一步學(xué)習(xí)高級(jí)的IDOC和BAPI接口開發(fā)技術(shù)。