首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
清单首页SAP文章详情

ABAP初体验六:BAPI介绍

声明:本文仅代表原作者观点,仅用于SAP软件的应用与学习,不代表SAP公司。注:文中所示截图来源SAP软件,相应著作权归SAP所有。

01

目录

6 BAPI

6.1 基础篇

6.1.1 bapi

6.1.2 给用户上锁bapi

6.2 直接上实例

6.2.1 建输入参数结构

6.2.2 建函数组和函数

6.2.2.1 远程调用

6.2.2.2 远程调用 输入参数,参考结构ZBAPI_ORDER_STATUS_IMPORTA,值传递

6.2.2.3 输出是BAPI类型的输出,系统定义的,也是值传递

6.2.2.4 表是ZBAPISTAT的结构

6.2.3 函数代码

6.2.3.1 函数组全局信息

6.2.3.2 函数模块

6.2.3.3 模块调用的子程序,建在函数组外面

6.2.3.4 运行

6.3 生成bapi

6.3.1 SWO1创建,SAP自己封装的一层

6.3.2 添加API

6.4 再看BAPI

6.4.1 释放对象类型

6.4.2 当函数名和参数不含BAPI时,会报错

02

正文

6 BAPI

6.1 基础篇

6.1.1 bapi

6.1.2 给用户上锁bapi

6.2 直接上实例

6.2.1 建输入参数结构

se11建结构1

se11建结构2,对应后台表JEST和TJ30T

查看表

6.2.2 建函数组和函数

6.2.2.1 远程调用

6.2.2.2 远程调用 输入参数,参考结构ZBAPI_ORDER_STATUS_IMPORTA,值传递

6.2.2.3 输出是BAPI类型的输出,系统定义的,也是值传递

6.2.2.4 表是ZBAPISTAT的结构

6.2.3 函数代码

6.2.3.1 函数组全局信息

代码语言:javascript
复制
在这里插入代码片
FUNCTION-POOL ZBAPI_GROUP.                  "MESSAGE-ID ..

* INCLUDE LZBAPI_GROUPD...                   " Local class definition
DATA: l_char1 type char2,

      l_char2 type char2.

* 把表TJ30T里面的状态ID istat  短描述 txt04和中长描述txt30给拉出来形成结构
TYPES :
  BEGIN OF Type_tj02t,
    istat like tj02t-istat,
    txt04 like tj02t-txt04,
    txt30 like tj02t-txt30,
  END OF type_tj02t.

* 根据结构来定义内表和结构变量
DATA:

  T_BAPISTAT like ZBAPISTAT OCCURS 0,
  G_BAPISTAT like ZBAPISTAT,

  t_tj02t TYPE type_tj02t OCCURS 0,
  g_tj02t type type_tj02t .

* 返回参数
DATA:
      BEGIN 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.


6.2.3.2 函数模块

代码语言:javascript
复制
FUNCTION Z_BAPI_GET_ORDER_STATUS.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(BAPI_ORDER_STATUS_IMPORT) TYPE  ZBAPI_ORDER_STATUS_IMPORTA
*"  EXPORTING
*"     VALUE(RETURN) TYPE  BAPIRETURN
*"  TABLES
*"      T_BAPISTAT STRUCTURE  ZBAPISTAT
*"----------------------------------------------------------------------

*定义两个变量,其中l_aufnr是用来定义生产订单编号的临时变量,而 l_objnr是存储jest表中订单的临时变量,后面主要是拼接OR开头的字符串

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

* 第一步,将输入bapi_order_status_import的ID与afko中的aufnr对比,看看是否在生产订单表中存在该订单,不存在则报返回信息
  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 1 = 2.
      MESSAGE e000(z3).
    ENDIF.

  ENDIF.

* 第二步,检查返回信息是否初始化,拼接bapi_order_status_import的ID的前缀’or‘
  CHECK return is INITIAL.

  CONCATENATE 'OR' bapi_order_status_import-orderid INTO l_objnr.

*  第三步 ,检查选项i_excludeinactive是否输入是X,如果是那么从jest状态表中把三个字段取出来,同时过滤状态是X的。啥都没查到继续抛信息
  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.
     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 1 = 2.
      MESSAGE e000(z3).
    ENDIF.

  ENDIF.

*  第四步 ,从tj02t文本描述表查询状态名istat、文本信息,同时条件中过滤了i_spras(语言),当然检索了内表t_bapistat,将信息放到内表t_tj02t(这个内表在全局变量定义了)
  CHECK return is INITIAL.

  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.



*  第五步 ,通过结构g_bapistat循环内表t_bapistat,读内表信息t_tj02t(用关键字istat状态名来判断,读到g_tj02t结构中,读到了就将信息写入到g_bapistat结构中,然后修改内表t_bapistat中的相关信息
    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.


6.2.3.3 模块调用的子程序,建在函数组外面

代码语言:javascript
复制
*----------------------------------------------------------------------*
***INCLUDE LZBAPI_GROUPF01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      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
     ONLY_2_CHAR_FOR_MESSAGE_ID       = 1
     OTHERS                           = 2
            .
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.


ENDFORM.                    " SET_RETURN_MESSAGE


6.2.3.4 运行

点击输入参数

结果如下:

跟生产订单对比下,感觉好像对不上啊。以后再研究

如果输入一个不存在的订单呢?

6.3 生成bapi

6.3.1 SWO1创建,SAP自己封装的一层

6.3.2 添加API

下一步,定义table仅为输出参数

可以看到方法了,将方法发布实施

执行,结果和单独执行函数是一样的

6.4 再看BAPI

首先选择过滤,查看全部的BAPI,找到ZORDERSTAT,发现状态是未释放

6.4.1 释放对象类型

再点对象类型组件释放,提示

需要SE37先把函数释放

再点对象类型组件释放,提示OK

4.生成函数对象

再看BAPI状态

6.4.2 当函数名和参数不含BAPI时,会报错

下一篇
举报
领券