本文主要是介绍SAP接口编程-RFC系列09 : 使用BAPI,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
使用BAPI
SAP 的 BAPI 和 Function Module 经常让大家迷惑和混淆。究竟 BAPI 和 Functional Module 有什么区别呢?我的理解,BAPI 是基于 Function Module 的,但提供面向对象的接口调用方式。比如说,我们想获得总账科目的期间余额,我们可以通过 RFC 远程调用BAPI_GL_GETGLACCPERIODBALANCES
函数来实现,也可以使用类似GeneralLedger.GetGLAccountPeriodBalances
这种面向对象的方式来实现。后者就是 BAPI 调用,底层上 BAPI 也是调用的BAPI_GL_GETGLACCPERIODBALANCES
函数。
在 SAP 系统中查看 BAPI
在 SAP 中,我们可以使用事务码:SWO2查看 BAPI,并且进行测试。比如我们想获得会计科目的期间余额,我们先找到相关对象:
双击 General Ledger 前面的小圆圈:
在这个界面中,我们可以查看方法的参数,并进行测试。我们先点击 Parameters 按钮查查参数:
BAPI 方法的参数,和 FM 的参数名并不一定相同。比如 AccountBalances 参数,在 FM 中对应的参数名称是 ACCOUNT_BALA NCES
,以 BAPI 方式调用,需要用 BAPI 的参数名称,切记。
BAPI 测试,点击工具栏上的 Test/Execute 按钮:
填充 input parameters
运行,得到如下结果:
通过 BAPI 控件调用 SAP BAPI
OK,下面编写接口实现的代码。在外部使用 BAPI,关键是 BAPI ActiveX 控件的使用,对应的文件是 wdobapi.ocx,Win7 默认路径:C:\Program Files (x86)\SAP\FrontEnd\SAPgui\wdobapi.ocx。添加对 ocx 控件的引用。
Option ExplicitPublic Sub TestGetACBalacne()Call LogonCall DoGetAccBalance("Z900", "0010010100", "2015")Call logoff
End SubPrivate Sub DoGetAccBalance(cocd As String, glAccount As String, year As String)' Function: Get account period balances, just like FAGLB03Dim bapiControl As New SAPBAPIControlLib.SAPBAPIControlDim glObj As Object 'general ledger objectDim ret As SAPFunctionsOCX.StructureDim acBalance As SAPTableFactoryCtrl.TableSet bapiControl.Connection = sapConnection ' global variable' creating business object' return value of GetSAPObject() is of type Object' first parameter indicates ObjectType, other ten parameters is objectKeySet glObj = bapiControl.GetSAPObject("GeneralLedger")' Invoke methodglObj.GetGLAccountPeriodBalances _CompanyCode:=cocd, _Glacct:=glAccount, _fiscalYear:=year, _CurrencyType:="10", _AccountBalances:=acBalance, _Return:=ret' Error occuredIf ret("TYPE") = "E" ThenCall DebugWriteBapiError(ret)Exit SubEnd IfIf acBalance.rowcount > 0 Then' Write acBalance internal table in worksheetDim sht As WorksheetSet sht = ThisWorkbook.Worksheets.Addsht.Name = sht.Name + "_GLBalances"Call WriteTable(acBalance, sht)End IfSet acBalance = NothingSet glObj = NothingSet bapiControl = Nothing
End SubPrivate Sub DebugWriteBapiError(error As SAPFunctionsOCX.Structure)Debug.Print "Type:", error.Value("TYPE")Debug.Print "Code:", error.Value("CODE")Debug.Print "Message:", error.Value("MESSAGE")
End Sub
程序结果:
这篇关于SAP接口编程-RFC系列09 : 使用BAPI的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!