sap开发者指导之十四

SAP 开发者指导
第十四章 BAPI 的使用
一、BAPI 概述
BAPIs 是“Business Application Programming Interfaces”的简写,中文翻译为“业务应用编 程接口” 。不同的系统或模块进行通讯时,就需要用到编程接口。 BAPI 与我们经常用到的 Windows API 其实是同样的概念。操作系统通常会将一些驱动和内 部处理封装起来,并提供 API 给我们调用。我们利用第三方软件(例如:BC,Delphi)开 发对话程序时,调用 Windows API,具体的处理就交给了操作系统。 BAPI 是外部应用程序访问 SAP 业务对象的方法。 在面向对象编程方面, 业务对象 (business object)和 BAPI 是 SAP 的两个很重要的内容,业务对象就是类,BAPI 就是业务对象的方 法。它们的关系描述如下:
第一层(最里层)为内核,对数据库直接进行操作。 第二层为业务对象,将实际业务定义成一个类。 第三层为业务应用编程接口,通过该接口,对业务对象进行操作。 第四层为访问方式,直接面向对象编程或远程函数调用。 在第三方开发环境中,我们既能够直接访问 BAPI,也能够通过 RFC 访问 BAPI。在面向对 象语言中 (例如: C++, Java, VB) 我们既能够直接访问 BAPI 也能够通过 RFC 访问 BAPI。 , 在非面向对象语言中(例如:C) ,我们只能利用 RFC 访问 BAPI。 每一个 BAPI 都有与之对应的以“BAPI_”开头的函数。例如:业务对象“USER”表示“系 统用户” ,它有 BAPI(方法) “Lock”和“Unlock” ,它们用来锁定系统用户和对系统用户解 锁。这两个方法对应的函数为“BAPI_USER_LOCK”和“BAPI_USER_UNLOCK” 。
104
AnBoShi@https://www.360docs.net/doc/8614769752.html,

SAP 开发者指导
我们为什么要使用 BAPI 呢? 为了说明这个问题,我举个例子:有一个开发需求,要求创建一个外部程序,该程序根据一 些输入信息,在 SAP 系统中生成一张销售订单。 请问你敢直接往数据库表 VBAK、VBAP 写入销售订单信息吗?肯定不敢。SAP 的一项业 务操作,通常涉及多个表,有的表你能够跟踪得到,有的你没有跟踪到。 安全快捷的做法应该是:查看 SAP 提供的 BAPI,调用业务对象“SalesOrder”的方法 “CreateFromDat1” 。
二、查看 BAPI
运行 BAPI,进入如下界面:
这就是 SAP BAPI 浏览器。 在这里, 我们能够通过业务层次迅速找到需要的业务对象和方法。 从上图,我们能够获得如下信息: 业务对象 关键字段 BAPI 与 BAPI 对应的函数 SalesOrder SalesDocument (即:通过销售凭证号来区分销售订单) ChangeFromData BAPI_SALESORDER_CHANGE
105
AnBoShi@https://www.360docs.net/doc/8614769752.html,

SAP 开发者指导
下面是“Alphabetical”视图,在这里能够按字母顺序显示业务对象:
三、BAPI 编程
在第三方开发环境中访问 BAPI 通常需要经历以下步骤(以 VB 为例) : 1、 安装 SAP Development Tools。运行 SAP GUI 的安装程序,选择如下组件:
106
AnBoShi@https://www.360docs.net/doc/8614769752.html,

SAP 开发者指导
安装完成后,系统注册如下组件: 控件名 Logon Control RFC Control BAPI Control Wdtfuncs.ocx Wdobapi.ocx OCX 文件 Wdtlog.ocx wdtlogu.ocx wdtfuncu.ocx wdobapiu.ocx Sap.Functions SAP.BAPI.1 对象 SAP.LogonControl.1
(在发布程序时,用到了什么控件,则需要在客户机上注册对应的 OCX) 2、 创建 BAPI 对象实例。 Dim o_BAPICtrl As Object Set o_BAPICtrl = CreateObject("SAP.BAPI.1") ‘对象类型名不区分大小写 (如果是 VB 编程,也可以先增加 SAPBAPIControl 到工具箱,然后拖动该控件到 Form。 ) 3、 建立与 SAP 系统的连接 方式一:直接指定 SAPBAPIControl 实例的连接属性。 o_BAPICtrl.Connection.ApplicationServer = "" o_BAPICtrl.Connection.SystemNumber="" oBAPICtrl.Connection.Client = "" https://www.360docs.net/doc/8614769752.html,er = "" https://www.360docs.net/doc/8614769752.html,nguage = ""... oBAPICtrl.Connection.Logon (0, FALSE) 最后的 Logon 方法中,如果第二个参数为 True,则不弹出登录窗口。 方式二:先创建一个 SAPLogonControl 实例,然后将该连接指定给 BAPI 实例使用。 Set oLogonCtrl =CreateObject("SAP.LogonControl.1") ‘指定 oLogonCtrl 的各项属性并 Logon
107 AnBoShi@https://www.360docs.net/doc/8614769752.html,

SAP 开发者指导
Set oBAPICtrl.Connection =oLogonControl.Connection 4、 获得 SAP 业务对象实例 语法: oBAPICtrl.GetSAPObject(String ObjectType, Variant ObjectKey1,..., Variant ObjectKey10) 其中, “ObjectType”是业务对象类型,ObjectKeyi 用来指定关键字段。 例如:Set bo_User = o_BAPICtrl.GetSAPObject("USER", “AD000”) 指定业务对象是 USER,USERNAME 是 AD000,根据系统用户名返回业务对象实例。 注意:ObjectType 必须与 BAPI Explore 中看到的业务对象的大小写一致。 5、 对业务对象实例进行操作 在 BAPI 的使用者和服务器之间, 会用一大堆的参数和表格传递信息。 BAPI 对象利用 DimAs 方法来定义参数,DimAs 的语法为: Object.DimAs(Object BusinessObject, String Method, String Parameter) 例如,对于 USER 对象,其 BAPI 如下:
通过查看输入参数属性,AddFax 是表格参数,我们通过如下代码,修改其参数: Set oAddFax = oBAPICtrl.DimAs(boUser, "Create", "AddFax") oAddFax.Rows.Add oAddFax.Value(1, " COUNTRY ") = "CN"
108
AnBoShi@https://www.360docs.net/doc/8614769752.html,

SAP 开发者指导
oAddFax.Value(1, " FAX ") = "020********" Company 是一个参数,利用下面的代码修改它的值: Set oCompany = oBAPICtrl.DimAs(boUser, "Create", "Company") boUser.Value("Company") = "BP01" 下面的代码是访问 Create 方法: boUser.Create AddFax:=oAddFax, … 6、 断开与 SAP 系统的连接 oBAPICtrl.Connection.Logoff Set sapConnection = Nothing 7、 释放业务对象实例 Set oBAPICtrl = Nothing
四、VB 访问 BAPI 举例
本例中,我想完成这样的功能:通过 BAPI 访问,对指定的系统用户锁定和解锁。 首先,向 Form 增加如下控件: 控件名称 Label1 txt_UserName cmd_connect cmd_disconnect cmd_Lock cmd_Unlock 界面如下: Label TextBox CommandButton CommandButton CommandButton CommandButton Connect to SAP Disconnect to SAP Lock User Unlock User 控件类型 UserName 文本
109
AnBoShi@https://www.360docs.net/doc/8614769752.html,

SAP 开发者指导
下面是代码: Dim o_BAPICtrl As Object Private Sub cmd_Connect_Click() Set o_BAPICtrl = CreateObject("SAP.BAPI.1") o_BAPICtrl.Connection.ApplicationServer = "192.168.0.200" o_BAPICtrl.Connection.SystemNumber = "00" o_BAPICtrl.Connection.Client = "700" o_https://www.360docs.net/doc/8614769752.html,er = "AD003" o_BAPICtrl.Connection.Password = "*****" o_https://www.360docs.net/doc/8614769752.html,nguage = "ZH" If Not o_BAPICtrl.Connection.Logon(0, True) Then ' MsgBox "No access to R/3 System!", vbOKOnly + vbExclamation, "Alert" End If End Sub Private Sub cmd_Lock_Click() Dim bo_User As Object Set bo_User = o_BAPICtrl.GetSAPObject("USER", txt_UserName) bo_User.Lock Return:=lo_ret For i_tmp = 1 To lo_ret.rowcount MsgBox lo_ret(i_tmp, "MESSAGE") Next i_tmp End Sub Private Sub cmd_Unlock_Click() Dim bo_User As Object Set bo_User = o_BAPICtrl.GetSAPObject("USER", txt_UserName) bo_User.UnLock Return:=lo_ret For i_tmp = 1 To lo_ret.rowcount MsgBox lo_ret(i_tmp, "MESSAGE") Next i_tmp End Sub Private Sub cmd_disconnect_Click() o_BAPICtrl.Connection.Logoff Set o_BAPICtrl = Nothing End Sub
110
AnBoShi@https://www.360docs.net/doc/8614769752.html,

SAP 开发者指导
五、ABAP 中访问 BAPI
因 ABAP 不是面向对象的语言, 所以, ABAP 程序中使用 BAPI 实际上是调用 BAPI 函数。 在 BAPI 的函数名称,可以在 BAPI Exploer 中的“Function module”见到。 我们进行月末结账时,为了防止用户进行物料移动,在订单结算之前,需要锁定系统用户。 下 面 这 一 段 代 码 就 用 来 完 成 这 个 功 能 。 它 利 用 了 BAPI 函 数 “ BAPI_USER_LOCK ” 和 “BAPI_USER_UNLOCK” 。 ================================================================== REPORT z_fi_20 NO STANDARD PAGE HEADING LINE-SIZE 100. *&---------------------------------------------------------------------* * 声明全局变量 *&---------------------------------------------------------------------* TABLES: usr21. DATA: BEGIN OF itab OCCURS 0, bname LIKE usr21-bname, END OF itab.
DATA: rtn LIKE bapiret2 OCCURS 0 . *&---------------------------------------------------------------------* * 选择屏幕 *&---------------------------------------------------------------------* SELECTION-SCREEN BEGIN OF BLOCK blk0 WITH FRAME TITLE text-010. PARAMETER: p_lock RADIOBUTTON GROUP rad1 DEFAULT 'X', "锁定 "解锁 p_unlock RADIOBUTTON GROUP rad1 . SELECTION-SCREEN END OF BLOCK blk0. SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-020. SELECT-OPTIONS p_bname FOR usr21-bname. SELECTION-SCREEN END OF BLOCK blk1. *&---------------------------------------------------------------------* * 初始化选择屏上的变量 *&---------------------------------------------------------------------* INITIALIZATION. p_bname-sign = 'I'. p_bname-option = 'EQ'. p_bname-low = 'AD003'. APPEND p_bname. p_bname-sign = 'I'. p_bname-option = 'EQ'. p_bname-low = 'TMSADM'. APPEND p_bname. *&---------------------------------------------------------------------* * 主要数据处理逻辑 *&---------------------------------------------------------------------*
111 AnBoShi@https://www.360docs.net/doc/8614769752.html,

SAP 开发者指导
START-OF-SELECTION. SELECT bname INTO CORRESPONDING FIELDS OF TABLE itab FROM usr21 WHERE bname NOT IN p_bname AND persnumber NOT IN ( SELECT persnumber FROM adrp WHERE name_last = '000' ). LOOP AT itab. IF p_lock = 'X'. CALL FUNCTION 'BAPI_USER_LOCK' EXPORTING username = itab-bname TABLES return ENDIF. IF p_unlock = 'X'. CALL FUNCTION 'BAPI_USER_UNLOCK' EXPORTING username = itab-bname TABLES return ENDIF. ENDLOOP. IF p_lock = 'X'. MESSAGE i846(so) WITH '所有用户锁定完成!'. ELSE. MESSAGE i846(so) WITH '所有用户解锁完成!'. ENDIF. = rtn. = rtn.
================================================================== ============本章完成于 20060712============
112
AnBoShi@https://www.360docs.net/doc/8614769752.html,

相关文档
最新文档