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

 

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是一个简单的VB连接SQL数据库的示例: 首先,您需要在VB项目中添加ADO.NET引用。在解决方案资源管理器中右键单击项目,选择“添加引用”,然后选中“System.Data”和“System.Data.SqlClient”。 接下来,您需要创建一个SqlConnection对象,并提供连接字符串来连接到SQL数据库。连接字符串中包含了数据库的名称、服务器名称、验证方式等信息。 ```vb Dim connectionString As String = "Data Source=服务器名称;Initial Catalog=数据库名称;Integrated Security=True" Dim connection As New SqlConnection(connectionString) ``` 然后,您可以打开数据库连接,并执行任何需要的操作,例如执行SQL查询、插入、更新或删除数据。 ```vb Try ' 打开数据库连接 connection.Open() ' 执行SQL查询 Dim query As String = "SELECT * FROM 表名" Dim command As New SqlCommand(query, connection) Dim reader As SqlDataReader = command.ExecuteReader() ' 遍历查询结果 While reader.Read() Dim column1 As String = reader("列名1").ToString() Dim column2 As String = reader("列名2").ToString() ' 处理查询结果 End While ' 关闭数据阅读器 reader.Close() ' 插入数据 Dim insertQuery As String = "INSERT INTO 表名 (列名1, 列名2) VALUES ('值1', '值2')" Dim insertCommand As New SqlCommand(insertQuery, connection) insertCommand.ExecuteNonQuery() ' 更新数据 Dim updateQuery As String = "UPDATE 表名 SET 列名1 = '新值' WHERE 列名2 = '某条件'" Dim updateCommand As New SqlCommand(updateQuery, connection) updateCommand.ExecuteNonQuery() ' 删除数据 Dim deleteQuery As String = "DELETE FROM 表名 WHERE 列名 = '某条件'" Dim deleteCommand As New SqlCommand(deleteQuery, connection) deleteCommand.ExecuteNonQuery() ' 关闭数据库连接 connection.Close() Catch ex As Exception ' 处理异常 Finally ' 确保关闭数据库连接 If connection.State = ConnectionState.Open Then connection.Close() End If End Try ``` 最后,不要忘记在处理完数据库操作后关闭数据库连接,以释放资源。 这是一个简单的VB连接SQL数据库的实例,您可以根据具体需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值