VB連接SAP實例


最近做個項目有用到vb連接SAP,現在項目完成,做個技術總結。順便整理了下VB連接SAP取回/傳送數據

的方法。

1.連接SAP.

Public Function GetSAPConnection() As Object
    Dim strStatus As String
    Dim oFunction As Object
    Dim oConnection As Object
    Dim result As Boolean
    Set oFunction = CreateObject("SAP.LogonControl.1")
    Set oConnection = oFunction.NewConnection
   
    oConnection.client = "700"
    oConnection.language = "zh"
   
    oConnection.ApplicationServer = "172.16.0.23"  
    oConnection.user = "WMS001"                   
    oConnection.Password = "WMS001"               
    oConnection.SystemNumber = "03"              
    oConnection.codepage = "8400"
   
    result = oConnection.Logon(0, True)
    If result <> True Then
        Set oFunction = Nothing
        Set oConnection = Nothing
        Set GetSAPConnection = Nothing
        MsgBox "連接失敗!"
    Else
'        MsgBox "連接成功!"
        Set GetSAPConnection = oConnection
    End If
End Function


2.取得SAP數據Example

'先聲明全局變量
Dim sapCon As Object
Dim func As Object
Dim retSapData As Object  '返回的數據

-----------------------------
' 通過RFC接口遠程運行SAP內部函數
Public Function GetSAPData() As Boolean

    'On Error GoTo LblErr

    Dim RFCName As String
    Dim RetTblName As String
    Dim RetTblName2 As String
    Dim ofun As Object
    Dim i As Integer

    Set sapCon = GetSAPConnection()
    Set ofun = CreateObject("SAP.FUNCTIONS")
    Set ofun.Connection = sapCon

 

    RFCName = "ZWMS_POST_DATA"

    ' 通過RFC接口遠程運行SAP內部函數
    Set func = ofun.Add(RFCName)           ' 賦要調用的SAP內建函數名

 

a.傳入RFC的參數爲 值

    '設置參數
    Dim params(5, 1) As String
    '參數名
    params(0, 0) = "I_TCODE"
    params(1, 0) = "I_WERKS"
    params(2, 0) = "I_ORDNO"
    params(3, 0) = "I_CHECK_NOPOST"
    params(4, 0) = "I_CHECK_CANCEL"
    '參數值
    params(0, 1) = "ZMMJ06"
    params(1, 1) = "WX01"
    params(2, 1) = "K000025013"
    params(3, 1) = "X"
    params(4, 1) = "X"


      If Not IsEmpty(params) Then
        For i = 0 To 5
            func.Exports(CStr(params(i, 0))) = CStr(params(i, 1))
        Next
     End If

    RetTblName = "ET_MSEG"
    RetTblName2 = "ET_BATCH"

    If func.Call Then   '執行RFC函數
        Set retSapData = func.tables.Item(RetTblName)     '輸出參數 爲表
        MsgBox retSapData.rowcount          '返回的表記錄數
 MsgBox retSapData(1, "MATNR_REAL")  '返回的表的第一條記錄"MATNR_REAL"字段的值

        GetSAPData = True
    Else
        MsgBox func.Exception
        GetSAPData = False
    End If
    Exit Function
LblErr:
    MsgBox Err.Description, vbCritical
End Function

 

b.傳入RFC的參數爲 結構 (結構名 IS_DOC)

     func.Exports("IS_DOC").Value("ORDER") = "5000002"   ' 結構中的元素ORDER
     func.Exports("IS_DOC").Value("MATNR") = "51000001"   '結構中的元素MATNR
     If func.Call Then
        Set retSapData = func.tables.Item(RetTblName)     '輸出參數 爲表
        sMatnr2 = CStr(retSapData(1, "MATNR_REAL"))       '從輸出表中取得需要值

     End If

c.傳入RFC的參數爲 表 (表名:T_MAT)

  '--------------------------------------
 1. 可以只傳入一條表數據
  func.tables("T_MAT").Rows.Add
  func.tables("T_MAT").Value(1, "PROD_ORDER") = "5000002"
  func.tables("T_MAT").Value(1, "MATNR_IDEAL") = "51000000"
  func.tables("T_MAT").Value(1, "SWB002") = "82"
  func.tables("T_MAT").Value(1, "MATNR_REAL") = ""
  func.tables("T_MAT").Value(1, "MAKTX") = ""

  If func.Call Then
     Set retSapData = func.tables.Item(RetTblName)     '輸出參數 爲表
     sMatnr2 = CStr(retSapData(1, "MATNR_REAL"))       '從輸出表中取得需要值
  End If
  '------------------------------------------------

  2. 整張表傳入
    Do While Not objRs.EOF
        iRow = iRow + 1
        func.tables("T_MAT").Rows.Add
        func.tables("T_MAT").Value(iRow, "PROD_ORDER") = objRs.Fields(0).Value
        func.tables("T_MAT").Value(iRow, "MATNR_IDEAL") = objRs.Fields(1).Value
        func.tables("T_MAT").Value(iRow, "SWB002") = objRs.Fields(2).Value
        func.tables("T_MAT").Value(iRow, "MATNR_REAL") = ""
        func.tables("T_MAT").Value(iRow, "MAKTX") = ""
        objRs.MoveNext
    Loop

  If func.Call Then
     Set retSapData = func.tables.Item(RetTblName)     '輸出參數 爲表
     sMatnr2 = CStr(retSapData(1, "MATNR_REAL"))       '從輸出表中取得需要值
  End If 

 

'   RFC的方法:
'   func.Exports("參數名")  輸入參數
'   func.Imports("參數名")  SAP返回值

 

 

 

SAP提供的接口函數說明  

 

function name:ZMESSH_REAL_MATERIAL

 

FUNCTION ZMESSH_REAL_MATERIAL .

*"---------------------------------------------------------

*"*" 本地接口 :

*"  EXPORTING

*"     VALUE(E_SUBRC) TYPE  SY-SUBRC

*"     VALUE(E_MSG) TYPE  BAPI_MSG

*"  TABLES

*"      T_MAT STRUCTURE  ZMES_MAT

*"      ET_RETURN STRUCTURE  BAPIRET2 OPTIONAL

*"----------------------------------------------------------

 

1.輸入參數

 

 

2. 返回參數

l          E_SUBRC 狀態 0: 成功 其它失敗

l          E_MSG   錯誤信息

3. 輸入表

l          T_MAT  物料特性表 ( 有一部份欄位也輸出)

1

ZMES_MAT

 

 

 

Mes 物料

 

NO

Field name

Data type

Length

Decimal

Memo

Memo

1

PROD_ORDER

CHAR

12

0

生產訂單號

必輸

2

MATNR_IDEAL

CHAR

18

0

計劃物料號

必輸

3

SWB002

DEC

13

3

組件功率

必輸

4

MATNR_REAL

CHAR

18

0

產出物料號

計算完輸出

5

MAKTX

CHAR

40

0

物料描述

計算完輸出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章