最近做個項目有用到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 |
物料描述 |
計算完輸出 |