【ABAP】创建BAPI

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

abap中关于bapi的介绍:
1.BAPI – business application programming interface
2.它实际上是一种特殊的Remote Function Modules (RFC)是为了提供使用外部程序来进行交易活动
3.它提供的基于企业目标(Business Object) 技术的接口应用界面
4.SAP采用了Object-oriented技术,逻辑定义了SAP R/3系统的所有功能目标,并且将所有的目标(Objects) 和BAPIs存储于企业目标库BOR(Business Objects Repository).
5.SAP R/3 企业目标的目标类型(Object Type) 相当于目标设计语言中类(Class) 的概念,其定义结构由以下几部分组成:基本数据,接口界面,键(Key Fields),方法(Methods),特征(Attributes),事件(Events)

如何创建BAPI程序
1.定义BAPI Structure (Structure不能在BAPI中重复使用,因为一旦BAPI被释放,其Structure被冻结)
2.创建FUNCTION MODULE
每个BAPI必须有自己的Function Group,Function Group属性必须为RFC
3.创建Business Object
4.使用BAPI WIZARD创建API Method
这样BAPI可以被外部程序调用
5.Function Module符合BOR Method
4.释放BAPI Function Module,
释放Business Object Type,
释放BAPI作为BOR的一种Method

BAPI的简单实现步骤
一,创建Function Module
1,在SE11,创建需要的structure
2,在SE80,建Function group
3,在SE37,创建Function Module
Note:一个Function Group只能包含一个BAPI;参数传值;必须有有一个BAPIRETURN类型的EXPORT参数
二,封装
1,在SWO1,建Object Type
2,把Function Module作为一个Method加入,utilities->API Methods->Add Method
3,release Object和Module。使在BAPI Browser 中可以看到。也就是外部能够调用。
三,调用
1,如在另一系统中用ABAP调用,先在SM59中建RFC联到有BAPI的R/3,(ZGOGO)
在SE38的程序中调用,Call Function "ZBAPIXXXXX" DESTINATION ZGOGO EXPORTING ...
2,如用JAVA调用
引入包;(不一定要用IBM的)
import com.sap.rfc.*;
import com.sap.rfc.exception.*;
import com.ibm.sap.bapi.*;
import com.ibm.sap.bapi.generated.*;
建立连接;调用。。。(See CALL_BAPI.java)

1.给bapi创建结构1

事务代码:SE11- 输入结构的名称:ZBAPI_ORDER_STATUS_IMPORT

输入如下的3个字段。激活

2.给BAPI创建数据结构(2)

事务代码:SE11- 输入结构的名称:ZBAPISTAT

输入如下结构,激活

3.创建函数

事务代码:SE37

创建函数组:转到—〉函数组—〉创建组

输入函数组和短文本,保存

输入Function module:Z_BAPI_GET_ORDER_STATUSWW 点 创建

输入函数组和短文本,保存

属性界面更改类型,选择为远程启用的模块

Import输入如下的参数

Export输入如下参数

Tables输入如下参数

选择goto –〉Global data 定义全局变量

添加如下代码,激活

TYPESBEGIN OF type_tj02t,
         istat LIKE tj02t-istat,
         txt04 LIKE tj02t-txt04,
         txt30 LIKE tj02t-txt30,
       END OF type_tj02t.
*          Declarations for TABLE PARAMETER
DATAt_bapistat LIKE zbapistat OCCURS 0,
      g_bapistat LIKE zbapistat,
* Table for object texts
      t_tj02t    TYPE type_tj02t OCCURS 0,
      g_tj02t    TYPE type_tj02t.
* Structure for return messages
DATABEGIN OF message,
        msgty LIKE sy-msgty,
        msgid LIKE sy-msgid,
        msgno LIKE sy-msgno,
        msgv1 LIKE sy-msgv1,
        msgv2 LIKE sy-msgv2,
        msgv3 LIKE sy-msgv3,
        msgv4 LIKE sy-msgv4,
      END OF message.

 

然后返回函数模块添加代码

FUNCTION z_bapi_get_order_statusww.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(BAPI_ORDER_STATUS_IMPORT) TYPE  ZBAPI_ORDER_STATUS_IMPORT
*"  EXPORTING
*"     VALUE(RETURN) TYPE  BAPIRETURN
*"  TABLES
*"      T_BAPISTAT STRUCTURE  ZBAPISTAT
*"----------------------------------------------------------------------

  DATA:
    l_aufnr LIKE afko-aufnr,
    l_objnr LIKE jest-objnr.

********************************************
* Check if order exists
********************************************
  SELECT SINGLE aufnr
    FROM afko
    INTO  l_aufnr
  WHERE aufnr bapi_order_status_import-orderid.
  IF sy-subrc NE 0.
    CLEAR message.
    message-msgty 'E'.
    message-msgid 'Z3'.
    message-msgno '000'.
    message-msgv1 bapi_order_status_import-orderid.
    PERFORM set_return_message USING    message
                                             CHANGING return.
    IF 2.
*     The only reason to include this statement, that will obviously
*     never execute, is that it will create a referecence so that you
*     can find out where a particular message is being used. This
*     functionality is used by the BAPIs programmed by sap
      MESSAGE e000(z3).
    ENDIF.
  ENDIF.
  CHECK return IS INITIAL.

********************************************
* Read order status
********************************************
  CONCATENATE 'OR' bapi_order_status_import-orderid INTO l_objnr.
  IF bapi_order_status_import-i_excludeinactive 'X'.
    SELECT objnr stat inact
      FROM  jest
        INTO  TABLE t_bapistat
        WHERE objnr l_objnr AND
                    inact <> 'X'.
  ELSE.
    SELECT objnr stat inact
      FROM  jest
      INTO  TABLE t_bapistat
      WHERE objnr l_objnr.
  ENDIF.
  IF sy-subrc <> 0.
*   No object status found
    CLEAR message.
    message-msgty 'E'.
    message-msgid 'Z3'.
    message-msgno '001'.
    message-msgv1 bapi_order_status_import-orderid.
    PERFORM set_return_message USING    message
                                             CHANGING return.
    IF 2.
      MESSAGE e001(z3).
    ENDIF.
  ENDIF.
  CHECK return IS INITIAL.

********************************************
* Read order status texts
********************************************
  SELECT istat txt04 txt30
    FROM tj02t
  INTO TABLE t_tj02t
  FOR ALL ENTRIES IN t_bapistat
    WHERE istat t_bapistat-stat AND
        spras bapi_order_status_import-i_spras.
  SORT t_tj02t BY istat.
  LOOP AT t_bapistat INTO g_bapistat.
    READ TABLE t_tj02t WITH KEY istat g_bapistat-stat BINARY SEARCH INTO g_tj02t.
    IF sy-subrc 0.
      MOVE:
  g_tj02t-txt04 TO g_bapistat-txt04,
  g_tj02t-txt30 TO g_bapistat-txt30.
      MODIFY t_bapistat FROM g_bapistat TRANSPORTING txt04 txt30.
    ENDIF.
  ENDLOOP.
ENDFUNCTION.

检查会提示set_return_message这个form不存在,双击创建包含文件

*----------------------------------------------------------------------*
***INCLUDE LZBAPISTATUSWWF01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  SET_RETURN_MESSAGE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_MESSAGE  text
*      <--P_RETURN  text
*----------------------------------------------------------------------*
FORM set_return_message USING    VALUE(p_message)   LIKE message
      CHANGING p_return  LIKE bapireturn.
  CHECK NOT message IS INITIAL.
  CALL FUNCTION 'BALW_BAPIRETURN_GET'
    EXPORTING
      type       p_message-msgty
      cl         p_message-msgid
      number     p_message-msgno
      par1       p_message-msgv1
      par2       p_message-msgv2
      par3       p_message-msgv3
      par4       p_message-msgv4
*     LOG_NO     = ' '
*     LOG_MSG_NO = ' '
    IMPORTING
      bapireturn p_return
    EXCEPTIONS
      OTHERS     1.
ENDFORM.                    " SET_RETURN_MESSAG

4.创建API Method

事务代码:SWO1

输入对象/接口类型:ZORDERSTAW 点 创建

输入如下的参数,保存

选择实用程序—>API方法-添加方法

输入Function module:Z_BAPI_GET_ORDER_STATUSWW,确定

下一步

下一步

选择是

选择 编辑—>更改版本状态—>对象类型—>需要实施

选择 转到—>程序

保存,返回

5.最后一步释放

事务代码:SE37

释放模组(显示的翻译不一样)

事务代码:SWO1

释放业务对象类型 选择 对象类型—>修改版本状态到—>已实现

释放对象类型(把光标放在 对象类型 上)

选择 编辑—更改版本状态—对象类型—已释放

把光标放在zproder…ZgetOrderSt…

选择 编辑—更改版本状态—对象类型组件—已释放

后退到smo1界面

选择对象类型—生成

成功的信息

6.查看BAPI

事务代码:BAPI

给TA打赏
共{{data.count}}人
人已打赏
ABAPSAP

【ABAP】OAOR上传Excel模板

2021-4-17 18:33:41

ABAPSAP

【SAP】SAP轻松访问界面(登录后默认的界面)添加自定义菜单

2021-5-26 10:11:50

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索