本文主要是介绍sap abap初体验6之bapi,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
SAP ABAP-6.BAPI
- 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时,会报错
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 函数组全局信息
在这里插入代码片
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 函数模块
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 aufnrfrom afkointo l_aufnrwhere 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 messageCHANGING 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 inactfrom jestinto TABLE t_bapistatwhere objnr = l_objnr and inact <> 'X'.ELSE.SElect objnr stat inactfrom jestinto TABLE t_bapistatwhere 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 messageCHANGING return.IF 1 = 2.MESSAGE e000(z3).ENDIF.ENDIF.* 第四步 ,从tj02t文本描述表查询状态名istat、文本信息,同时条件中过滤了i_spras(语言),当然检索了内表t_bapistat,将信息放到内表t_tj02t(这个内表在全局变量定义了)CHECK return is INITIAL.select istat txt04 txt30from tj02tINTO table t_tj02tFOR ALL ENTRIES IN t_bapistatwhere istat = t_bapistat-stat Andspras = 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 SEARCHinto 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 模块调用的子程序,建在函数组外面
*----------------------------------------------------------------------*
***INCLUDE LZBAPI_GROUPF01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form SET_RETURN_MESSAGE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_MESSAGE text
* <--P_RETURN text
*----------------------------------------------------------------------*
FORM SET_RETURN_MESSAGE USING value(P_MESSAGE) like messageCHANGING P_RETURN like bapireturn.check not message is INITIAL.CALL FUNCTION 'BALW_BAPIRETURN_GET'EXPORTINGTYPE = p_message-msgtyCL = p_message-msgidNUMBER = p_message-msgnoPAR1 = p_message-msgv1PAR2 = p_message-msgv2PAR3 = p_message-msgv3PAR4 = p_message-msgv4
* LOG_NO = ' '
* LOG_MSG_NO = ' 'IMPORTINGBAPIRETURN = p_returnEXCEPTIONSONLY_2_CHAR_FOR_MESSAGE_ID = 1OTHERS = 2.IF SY-SUBRC <> 0.
* Implement suitable error handling hereENDIF.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时,会报错
这篇关于sap abap初体验6之bapi的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!