VB连接SAP实例

2023-10-12 17:26:09 浏览数 (1)

最近做个项目有用到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

物料描述

计算完输出

0 人点赞