利用VisualBasic开发SAP接口程序初探

利用VisualBasic开发SAP接口程序初探,第1张

SAP R/3系统是业界最先进、最稳定的ERP系统,国际和国内大型企业采用该系统的比例遥遥于其它ERP系统的总和。SAP R/3内建了二次开发平台,使用的开发语言叫做ABAP,是一种类似于COBOL的编程语言。ABAP在报表输出方面功能相对较弱(只能按行打印在屏幕上或者导出到Excel中处理),所以日常工作中经常需要在外部开发程序。通过程序接橡凳举口自动读取SAP R/3的数据表(视图),在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。

SAP R/3的接口方式主要粗高有RFC、IDOC、BAPI三种,本文要介绍的是相对比较简单的RFC(Romote Function Call,远程函数调用)。SAP系统RFC调用的原理其实很简单,有一些类似于三层构架的C/S系统,第三方的客户程序通过接口调用SAP内部的标准或自定义函数,获得函数返回的数据进行处理后显示或打印。下面是RFC调用的模型:

本文主要不是讨论SAP R/3函数的开发,因为使用SAP的公司一般都有专门的ABAP开发人员。大家如果有机会接触ABAP平台,可以通过事务代码SE37进入ABAP开发平台梁碧的"函数编制器"进行函数开发测试。如图:

下面主要以VB为例介绍一下SAP接口RFC的开发思路。在SAP客户端SAP Gui Client安装的时候,注意选择安装附带的SDK包(最保险是选择完全安装)。RFC接口程序开发,主要用的是"SAP.Functions"这个控件,通过控件在外部程序模拟SAP Gui Client的用户登录和函数调用,然后返回函数的值。请看下面的程序片段和重点注解(尤其是test_Click()):

Private Sub Command1_Click()

 ' 定义R/3用户名和密码变量(用户名应由SAP管理员开运行函数的权限)

 Dim logname As String * 22, password As String * 22

 Call logonr3(logname, password) ' 调用SAP登录界面程序

 If logflag Then ' 调用生产、开发系统开关

StatusBar1.Visible = True

StatusBar1.SimpleText = "正在登录SAP R/3系统..."

Dim R3AppServer As String, R3Client As String, R3SystemNo As String

If Form2.opPRD.Value Then

 ' 以下服务器参数请根据客户配置情况更改

 R3AppServer = "10.3.1.4" ' 生产系统服务器IP

 R3Client = "800" '生产系统集团代码

 R3SystemNo = "00" '生产系统号

Else

 R3AppServer = "10.3.3.1" ' 开发系统服务器IP

 R3Client = "101"

 R3SystemNo = "00"

End If

Unload Form2 ' 释放 Form2 , 所有控件及值不可用

Set Functions = CreateObject("Sap.Functions") ' 创建RFC的本地对象

Set Connect = Functions.Connection ' 设置连接

Connect.ApplicationServer = R3AppServer ' 赋值服务器IP

Connect.Client = R3Client ' 赋值SAP集团代码

Connect.Language = "ZH" ' 置SAP系统界面中文

Connect.User = Trim(logname) ' 赋值SAP登录用户名

Connect.password = Trim(password) ' 赋值SAP登录用户密码

Connect.SystemNumber = R3SystemNo ' 赋值SAP系统号

If Not Connect.Logon(0, True) Then ' 软件登录SAP并判断

 MsgBox "登录SAP R/3失败,请重新登录!", vbOKOnly + vbExclamation, "系统提示"

 Command1.SetFocus

Else ' 登录SAP成功

 Command1.Enabled = False

 Command2.Enabled = True

 test.Enabled = True

End If

StatusBar1.SimpleText = ""

StatusBar1.Visible = False

 End If

End Sub

Private Sub Command2_Click() ' 注销SAP登录

 Connect.LogOff

 Command2.Enabled = False

 Command1.Enabled = True

 test.Enabled = False

End Sub

Private Sub Command3_Click() ' 退出SAP接口演示程序

 If Form1.Command2.Enabled Then

MsgBox "退出前请断开SAP R/3系统!", vbOKOnly + vbInformation, "系统提示"

 Else

End

 End If

End Sub

Private Sub Form_Load()

 Command2.Enabled = False

 test.Enabled = False

 logoflag = False

End Sub

Private Sub test_Click() ' SAP RFC远程调用处理主演示

 Dim GetCustomers As Object

 Dim Customers As Object

 Dim i As Integer

  ' 通过RFC接口远程运行SAP内部函数RFC_CUSTOMER_GET

 ' 赋要调用的SAP内建函数名

 Set GetCustomers = Functions.Add("RFC_CUSTOMER_GET")

 GetCustomers.Exports("KUNNR") = "0000000103" ' 向函数入口赋值(客户代码)

 ' 向函数入口赋查询表名称

 Set Customers = GetCustomers.Tables("CUSTOMER_T")

 If GetCustomers.Call Then ' 调用成功遍历显示客户所有信息条目

For i = 1 To Customers.rowcount

 MsgBox Customers(i, "KUNNR")

Next i

 Else

MsgBox " 搜索出错! 出错信息: " + GetCustomers.Exception

 End If

End Sub

SAP的RFC调用是其接口技术中最简单和易用的一种方式,该方式开发比较简便,特别适合于外部报表开发,但对于大数据量的查询效率相对较低。大家在熟练掌握后,可以进一步学习高级的IDOC和BAPI接口开发技术。

可执行程序 (程序类型为 1,在 SAP 标准教程里面经常会提到 type 1 program,就是指这个意思,以后都是这样,不重复说明了。)

可执行程序的特点是可以直接执行,而无需事务码,这个也是一般报表开发最常用的程序类型。我们可以在 SE38 中直接点击执行按钮或按 F8 键来运行一个可执行程序。

可执行程序包含一些预定义的过程块,比如 INITIALIZATION、AT SELECTION-SCREEN、START-OF-SELECTION、END-OF-SELECTION 等等,有一个后台系统程序会控制可执行程序,按照规定的顺序依次调用这些过程块。首先显示一个选择屏幕,最后输出一个列表。可执行程序还能指定一个逻辑数据库,逻辑数据库也是一种程序,悔尘毕它按照预定义好的数据库表结构,依次根据主键读取相关的业务数据,可以用 SE36 查看逻辑数据库。

为屏幕绘制器画出的屏幕所用的模块池 (程序类型为 M)

模块池包含了来自业务的屏幕模块的处理步骤,它只能通过事务码或者菜单功能调用。

包含程序 (程序类型为 I)

包含了不能独立运行的程序代码,也就是说,无论你是在 SE38 里用执行功兄团能还是通过事碧芹务码或菜单调用,都无法打开一个包含程序。它们的作用主要是让程序变得清晰和可以被重用,在其他程序里,用 INCLUDE 语句可以把一个包含程序加到程序里。最终的效果相当于用被包含的程序里的全部内容替换调 INCLUDE 语句。

子程序 (程序类型为 S)

这种类型的程序里只包含被外部 PERFORM 语句调用的程序块。也就是说,只包含形如 FORM ... ENDFORM 块的程序代码,从外部程序里,用 PERFORM IN PROGRAM [IF FOUND]. 来调用。

函数组 (程序类型为 F)

这类程序包含了函数模块。函数组和函数模块用函数制作器进行管理,事务码 SE37。在创建函数组和函数模块时,函数制作器把程序类型设置为 F。

接口池 (程序类型为 J)

包含了接口。类和接口都在类制作器中管理,事务码 SE24。

类池 (程序类型为 K)

包含了类。类和接口都在类制作器中管理,事务码 SE24。

BAPI和RFC不是同一个层次上概念,不能说从字面上看到BAPI函数和RFC函数就认为他们之间有必然的联系和区别。打个比衫余如,问一个问题:人可以分为哪几类,答曰:男人和老人,呵~~,大家都知道,男人是基于性别来说的,老人是基于年龄的。BAPI是SAP提供的基于业务对象的函数,关键是它们处理的对象是R/3的业务相关business object),比如判消单据类销售订单,组织:公司等,它们是一系列实体。RFC则是一种系统间通讯的方式(Remote Funciton Call),一个男人可能同时也是一个老人,一个BAPI函数往往能是一个RFC函数(我不知道是不是所有BAPI都可以有基于RFC技术来调用,但是至少也可以说大部分吧,VB里面用BAPI,就是因为这个BAPI函数具有RFC的特性)

BAPI是个SAP里一个很好的思想,把业务对象都对象化了。刚学ABAP/4时,并不能理解SAP所说”ABAP/ 4”中的‘4’,而觉得它更像是一种脚本语言,顶多也就是和C一样,但是自从我接触了BAPI之后,我才体会到SAP说ABAP是种4G语言的确不虚。 当在外部调用BAPI的时候,比如VB,就可以把SAP里的诸如订单,物料,员工,工厂等作为一个对象来处理,而且这种处理又是那么的简单,可能只要几句代码就可以了,最关键就是:1.收集BAPI函数所要的数据,也就是BAPI输入参数,VB也好,SAP本身的 Screen也好,甚至Web页面也好,只不过是一个数据收集器!(要作一些必要的数据检查保证它们是正确的,不过即使不正确也没有关系,BAPI会返回错误信息) 收集完成了,就送给BAPI作为参数,剩下的事都是BAPI给做了,你就不用管了! 2.接收BAPI返回的信息,也就是BAPI输出参数,并把它们“掘塌知翻译”成恰当的形式给表达给用户


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12375559.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存