声明:本文仅代表原作者观点,仅用于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
se11建结构1
se11建结构2,对应后台表JEST和TJ30T
查看表
在这里插入代码片
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.
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.
*----------------------------------------------------------------------*
***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
点击输入参数
结果如下:
跟生产订单对比下,感觉好像对不上啊。以后再研究
如果输入一个不存在的订单呢?
下一步,定义table仅为输出参数
可以看到方法了,将方法发布实施
执行,结果和单独执行函数是一样的
首先选择过滤,查看全部的BAPI,找到ZORDERSTAT,发现状态是未释放
再点对象类型组件释放,提示
需要SE37先把函数释放
再点对象类型组件释放,提示OK
4.生成函数对象
再看BAPI状态