最近做个项目有用到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 | 物料描述 | 计算完输出 |