SAP接口编程之 RFC系列(03) : 调用SAP函数

RFC调用SAP函数的过程

RFC是Remote function call,远程调用函数的意思。调用SAP函数代码基本上是模式的代码,区别在于每个函数的参数不一样。总体过程如下:

RFC-3-1.jpg
  • 创建SAPLogonControl对象
  • 通过SAPLogonControl.NewConnection()方法创建Connection对象
  • 登陆到SAP,改变Connection对象的状态
  • 通过SAPFunctions.Add()方法创建Function对象
  • 填充import参数
  • 函数调用
  • 获取返回值
  • 显示返回的结果
  • 注销

在SAP系统中查看函数的参数

我们以BAPI_COMPANYCODE_GETDETAIL函数为例,演示RFC方式调用过程和方法。用事务码SE37查看函数的参数。import参数只有一个:CompanyCodeId

RFC-3-2.jpg

输出参数有三个,类型都是structure型

  • COMPANYCODE_DETAIL: company code detail
  • COMPANYCODE_ADDRESS: company code address
  • RETURN: SAP BAPI标准的返回值(结构型)
RFC-3-3.jpg

SAP系统测试函数

输入公司代码0001

RFC-3-4.jpg

运行,获得返回值的界面如下:

RFC-3-5.jpg

VBA代码编写

VBE添加对SAPFunctions控件的引用

方法不再赘述,参考上一篇。SAPFucntions控件的文件名为wdtfuncs.ocx,Windows 7 64位的默认路径:C:\Program Files (x86)\SAP\FrontEnd\SAPgui

代码

代码分为两个module, module1为SAP Connection

Option Explicit

Public sapLogon As SAPLogonCtrl.SAPLogonControl
Public sapConnection As SAPLogonCtrl.Connection

Public Sub Logon()
    Set sapLogon = New SAPLogonCtrl.SAPLogonControl
    Set sapConnection = sapLogon.NewConnection()

    Call sapConnection.Logon(0, False)
End Sub

Public Sub Logoff()
    If sapConnection.IsConnected = tloRfcConnected Then
        sapConnection.Logoff
    End If
End Sub

Module2为RFC调用:

Option Explicit

Public Sub GetCompanyCodeData()
    Dim functions As SAPFunctionsOCX.SAPFunctions
    Dim fm As SAPFunctionsOCX.Function

    ' BAPI_COMPANYCODE_GETDETAIL的三个输出参数,都是structure,'
    ' 对VB来说这些是输入参数,获得SAP返回的信息'
    Dim ret As SAPFunctionsOCX.Structure        '返回值'
    Dim coCdDetail As SAPFunctionsOCX.Structure '公司代码信息'
    Dim addrData As SAPFunctionsOCX.Structure   '地址信息'

    ' Step 1: 登陆SAP'
    Call Logon

    ' 如果连接成功,调用BAPI'
    If sapConnection.IsConnected <> tloRfcConnected Then
       MsgBox "连接失败!."
       Exit Sub
    End If

    ' Step 2: 创建functions(集合)'
    Set functions = New SAPFunctionsOCX.SAPFunctions
    Set functions.Connection = sapConnection

    ' Step 3 : 将BAPI加到SAPFunctions'
    Set fm = functions.Add("BAPI_COMPANYCODE_GETDETAIL")

    ' Step 4: 填充参数, importing parameter对VB来说是输出参数'
    fm.Exports("COMPANYCODEID").Value = "0001"

    ' Step 5: 调用FM'
    fm.Call

    ' 确定没有Exceptions'
    If fm.Exception <> "" Then
        Exit Sub
    End If

    ' Step 6: 获取函数返回的信息'
    Set ret = fm.Imports("RETURN") 'return参数是一个结构'
    Set coCdDetail = fm.Imports("COMPANYCODE_DETAIL")

    ' Step 7: 展示return Values'
    ' 因为RETURN是一个structure(结构),用遍历的方法得到structure各column的值'
    Dim i As Integer
    For i = 1 To ret.ColumnCount  '从1开始'
        Debug.Print ret.ColumnName(i) & ":" & ret.Value(i)
    Next
    Debug.Print "===================================" ' 分割'

    ' 展示SAP返回的公司代码明细(company code detail)'
    For i = 1 To coCdDetail.ColumnCount
        Debug.Print coCdDetail.ColumnName(i) & ":" & coCdDetail.Value(i)
    Next

    ' Step 8: Logoff'
    Call Logoff
End Sub

要点说明

  • SAPFunctions集合:SAPFunctions集合也可以使用晚绑定,代码如下:
Dim functions As Object
Set functions = CreateObject(“SAP.Functions”)
  • Function对象的初始化
    Function对象是通过SAPFunctions.Add()方法来创建和初始化的:
Dim fm As SAPFunctionsOCX.Function
Set fm = functions.Add("BAPI_COMPANYCODE_GETDETAIL")
  • SAP函数的参数
    SAP函数参数分为单值型、结构型和表类型,对于VBA来说,SAP定义的输入函数是VB的输出参数,本例演示了单值参数的赋值方法:fm.Exports(“COMPANYCODEID”).Value = “0001” 其他类型的填充方法后面再做介绍。
    SAP的输出参数,对于VBA来说是输入参数,大多情况下,输出参数是结构和表类型。如果是结构类型,通过循环的方式获取列名和每列的值。
    列名someStructure.ColumnName(index)
    列值someStructure.Value(i)(使用field索引值,注意column从1开始,而不是0)
    列值someStructure.Value(“FieldName”) (使用列名)
Dim coCdDetail As SAPFunctionsOCX.Structure
Dim i As Integer

Set coCdDetail = fm.Imports("COMPANYCODE_DETAIL")

For i = 1 To coCdDetail.ColumnCount
    Debug.Print coCdDetail.ColumnName(i) & ":" & coCdDetail.Value(i)
Next
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容