BAPI作为SAP中的重要概念,在SAP系统的开发中几乎是必须的。
本章来学习一下BAPI 的直观印象,以及在ABAP代码中的调用。
目录
1, BAPI概述
1,从画面角度来直观体验一下BAPI
1-1,MM:購買依頼変更BAPI - BAPI_PR_CHANGE
1-2,SE37 - 查看BAPI的代码和构造
1-3,SE37 - 界面上执行BAPI
1-4,Test顺序(测试序列)
1-5,总结
2,从ABAP角度来执行BAPI
2-1,SE38
2-2,执行确认
下面是详细内容。
1, BAPI概述
SAP里面有个BAPI 的概念,那么BAPI究竟是什么呢?
其实BAPI 就是SAP系统级函数。
大家玩过Windows开发的都知道Windows有内核函数,可以直接在自己写的代码中调用,传入参数,从而使用很少的代码就能实现一些特殊的/复杂的功能。
这个BAPI就跟那个有点儿像,外界(ABAP代码或其他代码)可以通过调用BAPI,传入参数,就可以直接执行SAP系统里面的一些功能,从而用很少的代码就能实现很复杂的功能。
BAPI 的诞生背景是为了完成一些特殊的商业任务,如上传交易数据等,R/3系统中内置了BAPI。
1,BAPI – Business Application Programming Interface
2,它是一种特殊的Remote Function Modules (RFC),提供给外部程序调用来进行交易活动。
BAPI是SAP以外程序访问SAP内部数据和程序的标准方式。
3,它基于企业目标(BO - Business Object) 技术的接口应用界面
4,SAP采用了Object-Oriented技术,逻辑定义了SAP R/3系统的所有功能目标,并且将所有的目标(Objects) 和BAPIs存储于企业对象库(Business Objects Repository).
5,SAP R/3 企业目标(BO)的目标类型(Object Type) 相当于目标设计语言中类(Class) 的概念。其定义结构由以下几部分组成:基本数据,接口界面,键(Key Fields),方法(Methods),特征(Attributes),事件(Events)
6,BAPI在SAP系统内部以Function Module的方式实现.所有的BAPI Function都
- 支持Remote Function Call (RFC)
- 处理过程中不激活对话窗口
7,BAPI是被定义为Business Object Repository(BOR)中的SAP Business Object类型或SAP Interface类型的方法,并且以Function Module方式实现的. 这种定义和实现分离的方式是我们可以通过2中方式访问BAPI:
- 通过面向对象的方法调用BOR中的BAPI
- 通过RFC直接调用Function Module
8,需要注意的事项:
在T-CODE:SE11中创建的结构必须保存在开发类中,不可保存为本地对象。
BAPI_百度百科
上面那一大段是百度百科中的内容,看完也没啥感觉,以后慢慢来理解吧。
下面通过一个例子来看一下BAPI 的样子以及怎么调用。
1,从画面角度来直观体验一下BAPI
ME51N
购买依赖号:10014101
有了这个购买依赖(采购申请)之后,想要做些修改,当然可以在上面的界面上修改,比如更改Block ID为 【1- 被请求者Block济】,这个当然一点儿问题都没有,大家平时也是这么用的。
除此之外,还可以用 BAPI 来进行修改。
咱们下面来看看用BAPI 来修改 Block ID。
那么到底用哪个BAPI呢?
1-1,MM:購買依頼変更BAPI - BAPI_PR_CHANGE
SAP里面提供了很多BAPI,比如如下这些常用的Logistics系的BAPI:
- SD:受注伝票登録BAPI (BAPI_SALESORDER_CREATEFROMDAT2)
- SD:受注伝票変更BAPI(BAPI_SALESORDER_CHANGE)
- MM:出荷伝票登録BAPI (BAPI_OUTB_DELIVERY_CREATE_SLS)
- MM:発注伝票登録BAPI(BAPI_PO_CREATE1)
- MM:発注伝票変更BAPI(BAPI_PO_CHANGE)
- MM:在庫移動登録BAPI(BAPI_GOODSMVT_CREATE)
- MM:在庫移動取消BAPI(BAPI_GOODSMVT_CANCEL)
- MM:購買依頼登録BAPI(BAPI_PR_CREATE)
- MM:購買依頼変更BAPI(BAPI_PR_CHANGE)
- MM:品目Master登録/変更BAPI(BAPI_MATERIAL_SAVEDATA)
这里面我们本次要用的就是这个 BAPI_PR_CHANGE。
详细的内容也可以参照下面这个链接:
在庫移動登録BAPI | SAP知恵の輪
要在那里查看和执行BAPI 呢?
1-2,SE37 - 查看BAPI的代码和构造
输入 BAPI_PR_CHANGE,点 照会
这就是该BAPI 的代码
看着也没多少行,其实里面调用了很多其他的代码
FUNCTION bapi_pr_change. "#EC ENHOK
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" VALUE(NUMBER) LIKE BAPIMEREQHEADER-PREQ_NO
*" VALUE(PRHEADER) LIKE BAPIMEREQHEADER STRUCTURE BAPIMEREQHEADER
*" OPTIONAL
*" VALUE(PRHEADERX) LIKE BAPIMEREQHEADERX STRUCTURE
*" BAPIMEREQHEADERX OPTIONAL
*" VALUE(TESTRUN) LIKE BAPIFLAG-BAPIFLAG OPTIONAL
*" EXPORTING
*" VALUE(PRHEADEREXP) TYPE BAPIMEREQHEADER
*" TABLES
*" RETURN STRUCTURE BAPIRET2 OPTIONAL
*" PRITEM STRUCTURE BAPIMEREQITEMIMP OPTIONAL
*" PRITEMX STRUCTURE BAPIMEREQITEMX OPTIONAL
*" PRITEMEXP STRUCTURE BAPIMEREQITEM OPTIONAL
*" PRITEMSOURCE STRUCTURE BAPIMEREQSOURCE OPTIONAL
*" PRACCOUNT STRUCTURE BAPIMEREQACCOUNT OPTIONAL
*" PRACCOUNTPROITSEGMENT STRUCTURE BAPIMEREQACCOUNTPROFITSEG
*" OPTIONAL
*" PRACCOUNTX STRUCTURE BAPIMEREQACCOUNTX OPTIONAL
*" PRADDRDELIVERY STRUCTURE BAPIMERQADDRDELIVERY OPTIONAL
*" PRITEMTEXT STRUCTURE BAPIMEREQITEMTEXT OPTIONAL
*" PRHEADERTEXT STRUCTURE BAPIMEREQHEADTEXT OPTIONAL
*" EXTENSIONIN STRUCTURE BAPIPAREX OPTIONAL
*" EXTENSIONOUT STRUCTURE BAPIPAREX OPTIONAL
*" PRVERSION STRUCTURE BAPIMEREQDCM OPTIONAL
*" PRVERSIONX STRUCTURE BAPIMEREQDCMX OPTIONAL
*" ALLVERSIONS STRUCTURE BAPIMEDCM_ALLVERSIONS OPTIONAL
*" PRCOMPONENTS STRUCTURE BAPIMEREQCOMPONENT OPTIONAL
*" PRCOMPONENTSX STRUCTURE BAPIMEREQCOMPONENTX OPTIONAL
*" SERVICEOUTLINE STRUCTURE BAPI_SRV_OUTLINE OPTIONAL
*" SERVICEOUTLINEX STRUCTURE BAPI_SRV_OUTLINEX OPTIONAL
*" SERVICELINES STRUCTURE BAPI_SRV_SERVICE_LINE OPTIONAL
*" SERVICELINESX STRUCTURE BAPI_SRV_SERVICE_LINEX OPTIONAL
*" SERVICELIMIT STRUCTURE BAPI_SRV_LIMIT_DATA OPTIONAL
*" SERVICELIMITX STRUCTURE BAPI_SRV_LIMIT_DATAX OPTIONAL
*" SERVICECONTRACTLIMITS STRUCTURE BAPI_SRV_CONTRACT_LIMITS
*" OPTIONAL
*" SERVICECONTRACTLIMITSX STRUCTURE BAPI_SRV_CONTRACT_LIMITSX
*" OPTIONAL
*" SERVICEACCOUNT STRUCTURE BAPI_SRV_ACC_DATA OPTIONAL
*" SERVICEACCOUNTX STRUCTURE BAPI_SRV_ACC_DATAX OPTIONAL
*" SERVICELONGTEXTS STRUCTURE BAPI_SRV_LONGTEXTS OPTIONAL
*" SERIALNUMBER STRUCTURE BAPIMEREQSERIALNO OPTIONAL
*" SERIALNUMBERX STRUCTURE BAPIMEREQSERIALNOX OPTIONAL
*"----------------------------------------------------------------------
ENHANCEMENT-POINT bapi_pr_change_g8 SPOTS es_sapl2105 STATIC.
*$*$-Start: BAPI_PR_CHANGE_G8-------------------------------------------------------------------$*$*
ENHANCEMENT 3 MGV_GENERATED_BAPI_PR_CHANGE. "active version
DATA: T_MGV_FNAMES1 LIKE MGVBAPIFNAMES OCCURS 0 WITH HEADER LINE.
DATA: T_MGV_FNAMES2 LIKE MGVBAPIFNAMES OCCURS 0 WITH HEADER LINE.
FIELD-SYMBOLS: <MGV_PRITEMX> TYPE BAPIMEREQITEMX.
ENDENHANCEMENT.
*$*$-End: BAPI_PR_CHANGE_G8-------------------------------------------------------------------$*$*
ENHANCEMENT-POINT bapi_pr_change_g6 SPOTS es_sapl2105.
*$*$-Start: BAPI_PR_CHANGE_G6-------------------------------------------------------------------$*$*
ENHANCEMENT 1 MGV_GENERATED_BAPI_PR_CHANGE. "active version
*{BAPI Begin} generation http://intranet.sap.com/materialversion
*Do not change coding between begin and end comments. ANI 20050217
T_MGV_FNAMES1-INT = 'PUR_MAT'.
T_MGV_FNAMES1-EXT = 'PUR_MAT_EXTERNAL'.
T_MGV_FNAMES1-VERS = 'PUR_MAT_VERSION'.
T_MGV_FNAMES1-GUID = 'PUR_MAT_GUID'.
APPEND T_MGV_FNAMES1.
T_MGV_FNAMES1-INT = 'MATERIAL'.
T_MGV_FNAMES1-EXT = 'MATERIAL_EXTERNAL'.
T_MGV_FNAMES1-VERS = 'MATERIAL_VERSION'.
T_MGV_FNAMES1-GUID = 'MATERIAL_GUID'.
APPEND T_MGV_FNAMES1.
T_MGV_FNAMES1-INT = 'CONF_MATL'.
T_MGV_FNAMES1-EXT = 'CONF_MATL_EXTERNAL'.
T_MGV_FNAMES1-VERS = 'CONF_MATL_VERSION'.
T_MGV_FNAMES1-GUID = 'CONF_MATL_GUID'.
APPEND T_MGV_FNAMES1.
CALL FUNCTION 'MATNR_BAPI_TABLES_CONVERSION'
EXPORTING
INT_TO_EXTERNAL = ' '
TABLES
T_FNAMES = T_MGV_FNAMES1
T_MATNR = PRITEMEXP
.
T_MGV_FNAMES2-INT = 'PUR_MAT'.
T_MGV_FNAMES2-EXT = 'PUR_MAT_EXTERNAL'.
T_MGV_FNAMES2-VERS = 'PUR_MAT_VERSION'.
T_MGV_FNAMES2-GUID = 'PUR_MAT_GUID'.
APPEND T_MGV_FNAMES2.
T_MGV_FNAMES2-INT = 'MATERIAL'.
T_MGV_FNAMES2-EXT = 'MATERIAL_EXTERNAL'.
T_MGV_FNAMES2-VERS = 'MATERIAL_VERSION'.
T_MGV_FNAMES2-GUID = 'MATERIAL_GUID'.
APPEND T_MGV_FNAMES2.
CALL FUNCTION 'MATNR_BAPI_TABLES_CONVERSION'
EXPORTING
INT_TO_EXTERNAL = ' '
TABLES
T_FNAMES = T_MGV_FNAMES2
T_MATNR = PRITEM
.
LOOP AT PRITEMX ASSIGNING <MGV_PRITEMX>
WHERE NOT ( PUR_MAT_EXTERNAL IS INITIAL AND
PUR_MAT_VERSION IS INITIAL AND
PUR_MAT_GUID IS INITIAL ).
<MGV_PRITEMX>-PUR_MAT = 'X'.
ENDLOOP.
LOOP AT PRITEMX ASSIGNING <MGV_PRITEMX>
WHERE NOT ( MATERIAL_EXTERNAL IS INITIAL AND
MATERIAL_VERSION IS INITIAL AND
MATERIAL_GUID IS INITIAL ).
<MGV_PRITEMX>-MATERIAL = 'X'.
ENDLOOP.
*{BAPI End} generation
ENDENHANCEMENT.
*$*$-End: BAPI_PR_CHANGE_G6-------------------------------------------------------------------$*$*
* generate data record
SET EXTENDED CHECK OFF.
fbgenmac 'BAPI_PR_CHANGE'. "#EC *
SET EXTENDED CHECK ON.
* define local data
DATA: lr_bapi TYPE REF TO lcl_bapi_requisition,
lf_cr TYPE mmpur_bool VALUE cl_mmpur_constants=>no.
* dynamic break point (Transaction SAAB -> MMPUR_2105)
BREAK-POINT ID mmpur_2105.
CREATE OBJECT lr_bapi
EXPORTING
im_preq_no = number
im_actyp = if_bapi_mereq=>ver
im_testrun = testrun.
* set header data
lr_bapi->set_header( im_header = prheader im_headerx = prheaderx ).
* set item data
lr_bapi->set_items( im_items = pritem[] im_itemsx = pritemx[] ).
* set accouting data
lr_bapi->set_account( im_account = praccount[] im_accountx = praccountx[] ).
* set profit segment data for accouting data
lr_bapi->set_profitsegment( praccountproitsegment[] ).
* set subcontracting components
lr_bapi->set_components( im_component = prcomponents[]
im_componentx = prcomponentsx[] ).
* set serial numbers
lr_bapi->set_serialno( im_serno = serialnumber[] im_sernox = serialnumberx[] ).
* set delivery address
lr_bapi->set_delivery_address( praddrdelivery[] ).
* set header texts
lr_bapi->set_header_text( prheadertext[] ).
* set header texts
lr_bapi->set_item_text( pritemtext[] ).
* set version data
lr_bapi->set_version( im_version = prversion[] im_versionx = prversionx[] ).
* set extensionin
lr_bapi->set_extensionin( extensionin[] ).
* set srv outline
lr_bapi->set_srv_outline( imt_outline = serviceoutline[] imt_outlinex = serviceoutlinex[] ).
* set service lines
lr_bapi->set_srv_service_lines( imt_service_lines = servicelines[]
imt_service_linesx = servicelinesx[] ).
* set limit data
lr_bapi->set_srv_limit_data( imt_limit_data = servicelimit[]
imt_limit_datax = servicelimitx[] ).
* set contract limits
lr_bapi->set_srv_contract_limits( imt_contract_limits = servicecontractlimits[]
imt_contract_limitsx = servicecontractlimitsx[] ).
* set srv accounting lines
lr_bapi->set_srv_acc_lines( imt_srv_acc_data = serviceaccount[]
imt_srv_acc_datax = serviceaccountx[] ).
* set srv longtexts
lr_bapi->set_srv_longtexts( imt_srv_texts = servicelongtexts[] ).
* start processing
CALL METHOD lr_bapi->process( ).
*- Outbound mapping to returning structures/tables
* get header data
prheaderexp = lr_bapi->get_header( ).
* get requisition number
number = lr_bapi->my_document.
* get header text
prheadertext[] = lr_bapi->get_header_text( ).
* get item data
pritemexp[] = lr_bapi->get_items_exp( ).
* get accouting data
praccount[] = lr_bapi->get_account( ).
* get subcontracting components
prcomponents[] = lr_bapi->get_components( ).
* get serial numbers
serialnumber[] = lr_bapi->get_serialno( ).
* get delivery address
praddrdelivery[] = lr_bapi->get_delivery_address( ).
* get item text
pritemtext[] = lr_bapi->get_item_text( ).
* get source of supply
pritemsource[] = lr_bapi->get_source( ).
* version data
allversions[] = lr_bapi->get_version( ).
* get extensionout
extensionout[] = lr_bapi->get_extensionout( ).
* return messages
return[] = lr_bapi->get_return( ).
* get srv outline
serviceoutline[] = lr_bapi->get_srv_outline( ).
* get service lines
servicelines[] = lr_bapi->get_srv_service_lines( ).
* get limit data
servicelimit[] = lr_bapi->get_srv_limit_data( ).
* get contract limits
servicecontractlimits[] = lr_bapi->get_srv_contract_limits( ).
* get srv accounting lines
serviceaccount[] = lr_bapi->get_srv_acc_lines( ).
* get srv longtexts
servicelongtexts[] = lr_bapi->get_srv_longtexts( ).
* only for testing purpose.
IF lf_cr EQ cl_mmpur_constants=>yes. COMMIT WORK. ENDIF.
ENHANCEMENT-POINT bapi_pr_change_g7 SPOTS es_sapl2105.
*$*$-Start: BAPI_PR_CHANGE_G7-------------------------------------------------------------------$*$*
ENHANCEMENT 2 MGV_GENERATED_BAPI_PR_CHANGE. "active version
*{BAPI Begin} generation http://intranet.sap.com/materialversion
CALL FUNCTION 'MATNR_BAPI_TABLES_CONVERSION'
EXPORTING
INT_TO_EXTERNAL = 'X'
TABLES
T_FNAMES = T_MGV_FNAMES1
T_MATNR = PRITEMEXP
.
CALL FUNCTION 'MATNR_BAPI_TABLES_CONVERSION'
EXPORTING
INT_TO_EXTERNAL = 'X'
TABLES
T_FNAMES = T_MGV_FNAMES2
T_MATNR = PRITEM
.
*{BAPI End} generation
ENDENHANCEMENT.
*$*$-End: BAPI_PR_CHANGE_G7-------------------------------------------------------------------$*$*
ENDFUNCTION.
点一下 Import Tab(输入),这里面有好多参数
- NUMBER - 购买依赖番号
对照上面做的购买依赖票,就是 购买依赖番号:10014101
点一下 Table Tab
双击 PRITEM - BAPIMEREQITEMIMP - 转送构造:EnjoySAP 购买依赖-明细Data
这个其实就是购买依赖明细 的构造
按一下Ctrl+F,然后查找 Block,找到下面两个明细行的字段
- REQ_BLOCKED - 购买依赖Block标记
- REASON_BLOCKING - 明细Block的理由
1-3,SE37 - 界面上执行BAPI
回到上一页,然后点 执行
这就是BAPI的执行界面
输入
- NUMBE - 10014101
点一下 PRITEM
输入
- PREQ - 0010
这个就是明细行的行番号,指明想要改哪行
然后点 列 图标
按下 Ctrl+F,输入 Block,这样就可以查到列,然后双击对象列
- REQ_BLOCKED - 购买依赖Block标记
- REASON_BLOCKING - 明细Block的理由
定位到后对象列后,继续双击该对象列
这样就显示了变更页面
在这里输入想更新的字段数据,然后点执行就可以了
那么该输入什么值呢?
具体输入什么值这个基本干过一段时间都能知道,这里也简单说一下其中一种方法
比如点一下画面的字段,然后按F1,再点技术情报
然后继续双击 项目名 BLCKD
然后继续 Component列的 BLCKD 字段
双击Domain BLCKD
点 值范围 tab,就能看到值范围
- 1 - 被请求者Block济
- 空白 - 未Block
另外其实还可以简单通过 SE16N,SE11 之类的直接看表里面既存数据
就像下面这样
回到值输入界面
输入之后点返回图标,这里还有一个 PRITEMX 构造
这个一般来说和 PRITEM 成对出现
它的涵义就像一个指示器,指示哪些字段要更改
这里双击它
和 PRITEM 一样,输入行番号
点 列 图标,找到 BLCKD,然后找到对象列之后,输入 X 到两个列里面,表示这些字段要更改
回到输入界面,可以看到 PRITEM,PRITEMX 各有1条数据
点执行
这样就执行完了
可以看到 PRITEM/ PRITEMX 各执行一条数据
点 RETURN,可以看到已经更新成功
回到 ME53N
哎,好像更新失败了啊
那么到底为什么没有成功呢?明明都已经出成功的Log了呀
其实是因为咱们没Commit。
熟悉DB知识的朋友都知道,SQL执行之后要Commit 或 Rollback,不然是不会反映到DB的。
那么SAP BAPI 要怎么Commit呢?这就要用到Test序列 功能,把Commit/Rollback给加进去执行
1-4,Test顺序(测试序列)
Menu > 汎用Module(功能模块) > Test
Test顺序(测试序列)
啥叫Test顺序呢?其实就是顾名思义,按顺序执行多个BAPI
咱们这里就是要在 SAP Test顺序里面加入 Commit BAPI。
输入如下汎用Module序列:
- BAPI_PR_CHANGE
- BAPI_TRANSACTION_COMMIT
这个就是SAP Commit BAPI
上图点 执行,这样第1个汎用Module就开始执行了
和 上面的【1-3】一样,在界面上输入要修改的数据
点执行,这样第1个汎用Module就执行完了
点一下返回,这样就开始执行第2个BAPI
直接点执行图标
这样就执行完了
再回到 ME53N,这回确实是更改成功了。
1-5,总结
- BAPI就是SAP的系统级函数
- 可以通过SE37界面执行BAPI,和通过T-code执行的效果是一样的
- 单单执行BAPI 是更改不了数据的,要通过Test顺序 把 Commit BAPI也带上,这样才能提交更新
上面是通过界面来体验了一下BAPI长什么样儿,怎么执行,让大家有个具体的印象。
下面通过ABAP代码来执行一下BAPI,从而贴近现实应用。
因为大家用BAPI不是为了傻兮兮的到SE37 去执行BAPI的,更常见的是在ABAP代码中通过传参来批量执行某种动作。比如更新1000条数据中某个字段,像这种通过ABAP调BAPI那太有利了。
2,从ABAP角度来执行BAPI
2-1,SE38
先用SE38 来创建1个调用程序。
- Program - ZTEST_BAPI01
输入
- 标题:任意
- Type:1 - 可实行Program
点保存
点 Local Object
这样咱们的可执行程序就做好了。
下面就要通过它来调用购买依赖变更BAPI - BAPI_PR_CHANGE
Menu > 编集 > Pattern(模式)
输入
- CALL_FUNCTION:BAPI_PR_CHANGE
然后点执行
可以看到其实就是简单的把BAPI 给插进来了。
默认把所有参数都屏了。
就是说刚加进来的BAPI 函数是一个毛坯状态,想用什么参数你就打开它。
然后咱们代码写写,具体的含义以后有机会再说。
这里把写完的代码贴一下。
其实就是通过代码方式,实现的是和上面SE37调用BAPI一样的功能。
*&---------------------------------------------------------------------*
*& Report ZTEST_BAPI01
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_BAPI01.
DATA: LV_NUM LIKE BAPIMEREQHEADER-PREQ_NO .
DATA: LT_PRITEM LIKE TABLE OF BAPIMEREQITEMIMP .
DATA: LS_PRITEM LIKE BAPIMEREQITEMIMP .
DATA: LT_PRITEMX LIKE TABLE OF BAPIMEREQITEMX .
DATA: LS_PRITEMX LIKE BAPIMEREQITEMX .
DATA: LT_RETURN LIKE TABLE OF BAPIRET2 .
LV_NUM = '0010014101' .
LS_PRITEM-PREQ_ITEM = '0010' .
LS_PRITEM-REQ_BLOCKED = '1' .
LS_PRITEM-REASON_BLOCKING = '10014101-Blocked ABAP' .
APPEND LS_PRITEM TO LT_PRITEM .
LS_PRITEMX-PREQ_ITEM = '0010' .
LS_PRITEMX-REQ_BLOCKED = 'X' .
LS_PRITEMX-REASON_BLOCKING = 'X' .
APPEND LS_PRITEMX TO LT_PRITEMX .
CALL FUNCTION 'BAPI_PR_CHANGE'
EXPORTING
NUMBER = LV_NUM
* PRHEADER =
* PRHEADERX =
* TESTRUN =
* IMPORTING
* PRHEADEREXP =
TABLES
RETURN = LT_RETURN
PRITEM = LT_PRITEM
PRITEMX = LT_PRITEMX
* PRITEMEXP =
* PRITEMSOURCE =
* PRACCOUNT =
* PRACCOUNTPROITSEGMENT =
* PRACCOUNTX =
* PRADDRDELIVERY =
* PRITEMTEXT =
* PRHEADERTEXT =
* EXTENSIONIN =
* EXTENSIONOUT =
* PRVERSION =
* PRVERSIONX =
* ALLVERSIONS =
* PRCOMPONENTS =
* PRCOMPONENTSX =
* SERVICEOUTLINE =
* SERVICEOUTLINEX =
* SERVICELINES =
* SERVICELINESX =
* SERVICELIMIT =
* SERVICELIMITX =
* SERVICECONTRACTLIMITS =
* SERVICECONTRACTLIMITSX =
* SERVICEACCOUNT =
* SERVICEACCOUNTX =
* SERVICELONGTEXTS =
* SERIALNUMBER =
* SERIALNUMBERX =
.
DATA: X .
X = 'X' .
点一下激活 图标,然后在最后一行那里打个断点,执行一下看看结果。
激活
双击某一行打断点
然后点 执行 图标
双击 LT_RETURN
再双击 LT_RETURN,这样就能看到结果了,
跟上面 1-3 里面的执行结果是一样的。
仔细看一下的话,如果 TYPE = 'S' AND ID = '06',那么就表示执行成功了。
咱们在代码里面也加上这个判断,就是说成功之后咱们再Commit。
修改之后,代码就变成像下面这样的了:
*&---------------------------------------------------------------------*
*& Report ZTEST_BAPI01
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_BAPI01.
DATA: LV_NUM LIKE BAPIMEREQHEADER-PREQ_NO .
DATA: LT_PRITEM LIKE TABLE OF BAPIMEREQITEMIMP .
DATA: LS_PRITEM LIKE BAPIMEREQITEMIMP .
DATA: LT_PRITEMX LIKE TABLE OF BAPIMEREQITEMX .
DATA: LS_PRITEMX LIKE BAPIMEREQITEMX .
DATA: LT_RETURN LIKE TABLE OF BAPIRET2 .
DATA: LS_RETURN LIKE BAPIRET2 .
LV_NUM = '0010014101' .
LS_PRITEM-PREQ_ITEM = '0010' .
LS_PRITEM-REQ_BLOCKED = '1' .
LS_PRITEM-REASON_BLOCKING = '10014101-Blocked ABAP' .
APPEND LS_PRITEM TO LT_PRITEM .
LS_PRITEMX-PREQ_ITEM = '0010' .
LS_PRITEMX-REQ_BLOCKED = 'X' .
LS_PRITEMX-REASON_BLOCKING = 'X' .
APPEND LS_PRITEMX TO LT_PRITEMX .
CALL FUNCTION 'BAPI_PR_CHANGE'
EXPORTING
NUMBER = LV_NUM
* PRHEADER =
* PRHEADERX =
* TESTRUN =
* IMPORTING
* PRHEADEREXP =
TABLES
RETURN = LT_RETURN
PRITEM = LT_PRITEM
PRITEMX = LT_PRITEMX
* PRITEMEXP =
* PRITEMSOURCE =
* PRACCOUNT =
* PRACCOUNTPROITSEGMENT =
* PRACCOUNTX =
* PRADDRDELIVERY =
* PRITEMTEXT =
* PRHEADERTEXT =
* EXTENSIONIN =
* EXTENSIONOUT =
* PRVERSION =
* PRVERSIONX =
* ALLVERSIONS =
* PRCOMPONENTS =
* PRCOMPONENTSX =
* SERVICEOUTLINE =
* SERVICEOUTLINEX =
* SERVICELINES =
* SERVICELINESX =
* SERVICELIMIT =
* SERVICELIMITX =
* SERVICECONTRACTLIMITS =
* SERVICECONTRACTLIMITSX =
* SERVICEACCOUNT =
* SERVICEACCOUNTX =
* SERVICELONGTEXTS =
* SERIALNUMBER =
* SERIALNUMBERX =
.
LOOP AT LT_RETURN INTO LS_RETURN WHERE TYPE = 'S' AND ID = '06' .
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' .
ENDLOOP .
2-2,执行确认
执行前:
代码执行
好像没啥 执行完了 之类的提示哈
执行后确认:执行完了之后,再次打开ME53N,可以看到数据已经更改了
这样就通过在ABAP代码中执行了 BAPI 从而实现修改 购买依赖数据的功能。
可以将 BAPI 理解为SAP系统级函数,通过调用它可以用很少的代码实现特殊/复杂的功能。
可以在SE37 界面上执行BAPI,当然更为常用的是在 自己写的ABAP 或其他代码中调用BAPI,从而实现一些批量修改之类的功能。
以上就是本章的内容。
更多SAP顾问业务知识请点击下面目录链接
https://blog.csdn.net/shi_ly/category_12216766.html