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數(shù)據(jù)Example
'先聲明全局變量
Dim sapCon As Object
Dim func As Object
Dim retSapData As Object? '返回的數(shù)據(jù)
-----------------------------
' 通過RFC接口遠(yuǎn)程運行SAP內(nèi)部函數(shù)
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接口遠(yuǎn)程運行SAP內(nèi)部函數(shù)
??? Set func = ofun.Add(RFCName)?????????? ' 賦要調(diào)用的SAP內(nèi)建函數(shù)名
?
a.傳入RFC的參數(shù)為 值
??? '設(shè)置參數(shù)
??? Dim params(5, 1) As String
??? '參數(shù)名
??? 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"
??? '參數(shù)值
??? 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?? '執(zhí)行RFC函數(shù)
??????? Set retSapData = func.tables.Item(RetTblName)???? '輸出參數(shù) 為表
??????? MsgBox retSapData.rowcount????????? '返回的表記錄數(shù)
?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的參數(shù)為 結(jié)構(gòu) (結(jié)構(gòu)名 IS_DOC)
???? func.Exports("IS_DOC").Value("ORDER") = "5000002"?? '?結(jié)構(gòu)中的元素ORDER
???? func.Exports("IS_DOC").Value("MATNR") = "51000001"?? '結(jié)構(gòu)中的元素MATNR
???? If func.Call Then
??????? Set retSapData = func.tables.Item(RetTblName)???? '輸出參數(shù) 為表
??????? sMatnr2 = CStr(retSapData(1, "MATNR_REAL"))?????? '從輸出表中取得需要值
???? End If
c.傳入RFC的參數(shù)為 表 (表名:T_MAT)
? '--------------------------------------
?1. 可以只傳入一條表數(shù)據(jù)
? 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)???? '輸出參數(shù) 為表
???? 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)???? '輸出參數(shù) 為表
???? sMatnr2 = CStr(retSapData(1, "MATNR_REAL"))?????? '從輸出表中取得需要值
? End If?
?
'?? RFC的方法:
'?? func.Exports("參數(shù)名")? 輸入?yún)?shù)
'?? func.Imports("參數(shù)名")? SAP返回值
?
?
?
SAP提供的接口函數(shù)說明??
?
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.輸入?yún)?shù)
?
?
2.返回參數(shù)
l???????? E_SUBRC 狀態(tài) 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 | 生產(chǎn)訂單號 | 必輸 |
| 2 | MATNR_IDEAL | CHAR | 18 | 0 | 計劃物料號 | 必輸 |
| 3 | SWB002 | DEC | 13 | 3 | 組件功率 | 必輸 |
| 4 | MATNR_REAL | CHAR | 18 | 0 | 產(chǎn)出物料號 | 計算完輸出 |
| 5 | MAKTX | CHAR | 40 | 0 | 物料描述 | 計算完輸出 |
總結(jié)
- 上一篇: 用VB开发SAP接口程序
- 下一篇: ABAP Text edit使用