SAP接口编程-RFC系列09 : 使用BAPI

本文详细介绍了SAP系统中BAPI(Business Application Programming Interface)的概念及其与Function Module的区别,展示了如何通过BAPI获取总账科目的期间余额,并提供了具体的编程实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用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 Explicit

Public Sub TestGetACBalacne()
    Call Logon
    Call DoGetAccBalance("Z900", "0010010100", "2015")
    Call logoff
End Sub

Private Sub DoGetAccBalance(cocd As String, glAccount As String, year As String)
    ' Function: Get account period balances, just like FAGLB03
    
    Dim bapiControl As New SAPBAPIControlLib.SAPBAPIControl
    Dim glObj As Object 'general ledger object
    Dim ret As SAPFunctionsOCX.Structure
    Dim acBalance As SAPTableFactoryCtrl.Table
    
    Set bapiControl.Connection = sapConnection ' global variable
    
    ' creating business object
    ' return value of GetSAPObject() is of type Object
    ' first parameter indicates ObjectType, other ten parameters is objectKey
    Set glObj = bapiControl.GetSAPObject("GeneralLedger")
    
    ' Invoke method
    glObj.GetGLAccountPeriodBalances _
            CompanyCode:=cocd, _
            Glacct:=glAccount, _
            fiscalYear:=year, _
            CurrencyType:="10", _
            AccountBalances:=acBalance, _
            Return:=ret
    
    ' Error occured
    If ret("TYPE") = "E" Then
        Call DebugWriteBapiError(ret)
        Exit Sub
    End If

    If acBalance.rowcount > 0 Then
        ' Write acBalance internal table in worksheet
        Dim sht As Worksheet
        Set sht = ThisWorkbook.Worksheets.Add
        sht.Name = sht.Name + "_GLBalances"
        Call WriteTable(acBalance, sht)
    End If

    Set acBalance = Nothing
    Set glObj = Nothing
    Set bapiControl = Nothing
End Sub

Private 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

程序结果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值