SAP学习笔记 – 开发01 – BAPI是什么?通过界面和ABAP代码来调用BAPI

SAP学习笔记 – 开发01 – BAPI是什么?通过界面和ABAP代码来调用BAPI本章主要讲 BAPI 的基本印象 让大家理解 BAPI 能干啥

大家好,欢迎来到IT知识分享网。

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 的样子以及怎么调用。

1,从画面角度来直观体验一下BAPI

ME51N

购买依赖号:

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

有了这个购买依赖(采购申请)之后,想要做些修改,当然可以在上面的界面上修改,比如更改Block ID为 【1- 被请求者Block济】,这个当然一点儿问题都没有,大家平时也是这么用的。

除此之外,还可以用 BAPI 来进行修改。

咱们下面来看看用BAPI 来修改 Block ID。

那么到底用哪个BAPI呢?

1-1,MM:購買依頼変更BAPI – BAPI_PR_CHANGE

这里面我们本次要用的就是这个 BAPI_PR_CHANGE。

详细的内容也可以参照下面这个链接:

在庫移動登録BAPI | SAP知恵の輪

要在那里查看和执行BAPI 呢?

1-2,SE37 – 查看BAPI的代码和构造

输入 BAPI_PR_CHANGE,点 照会

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

这就是该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  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. 

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

点一下 Import Tab(输入),这里面有好多参数

– NUMBER – 购买依赖番号

  对照上面做的购买依赖票,就是 购买依赖番号:

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

点一下 Table Tab

双击 PRITEM – BAPIMEREQITEMIMP – 转送构造:EnjoySAP 购买依赖-明细Data

这个其实就是购买依赖明细 的构造

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

按一下Ctrl+F,然后查找 Block,找到下面两个明细行的字段

– REQ_BLOCKED – 购买依赖Block标记

– REASON_BLOCKING – 明细Block的理由

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

1-3,SE37 – 界面上执行BAPI

回到上一页,然后点 执行

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

这就是BAPI的执行界面

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

输入

–  NUMBE –

点一下 PRITEM

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

输入

– PREQ – 0010

  这个就是明细行的行番号,指明想要改哪行

  然后点 列 图标

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

按下 Ctrl+F,输入 Block,这样就可以查到列,然后双击对象列

– REQ_BLOCKED – 购买依赖Block标记

– REASON_BLOCKING – 明细Block的理由

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

定位到后对象列后,继续双击该对象列

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

这样就显示了变更页面

在这里输入想更新的字段数据,然后点执行就可以了

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

那么该输入什么值呢?

具体输入什么值这个基本干过一段时间都能知道,这里也简单说一下其中一种方法

比如点一下画面的字段,然后按F1,再点技术情报

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

然后继续双击 项目名 BLCKD

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

 然后继续 Component列的 BLCKD 字段

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

双击Domain BLCKD

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

点 值范围 tab,就能看到值范围

– 1 – 被请求者Block济

– 空白 – 未Block

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

另外其实还可以简单通过 SE16N,SE11 之类的直接看表里面既存数据

就像下面这样

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

回到值输入界面

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

输入之后点返回图标,这里还有一个 PRITEMX 构造

这个一般来说和 PRITEM 成对出现

它的涵义就像一个指示器,指示哪些字段要更改

这里双击它

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

和 PRITEM 一样,输入行番号

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

点 列 图标,找到 BLCKD,然后找到对象列之后,输入 X 到两个列里面,表示这些字段要更改

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

回到输入界面,可以看到 PRITEM,PRITEMX 各有1条数据

点执行

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

这样就执行完了

可以看到 PRITEM/ PRITEMX 各执行一条数据

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

点 RETURN,可以看到已经更新成功

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

回到 ME53N

哎,好像更新失败了啊

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

那么到底为什么没有成功呢?明明都已经出成功的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。

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

输入如下汎用Module序列:

– BAPI_PR_CHANGE

– BAPI_TRANSACTION_COMMIT

  这个就是SAP Commit BAPI

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

上图点 执行,这样第1个汎用Module就开始执行了

和 上面的【1-3】一样,在界面上输入要修改的数据

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

点执行,这样第1个汎用Module就执行完了

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

点一下返回,这样就开始执行第2个BAPI

直接点执行图标

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

这样就执行完了

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

再回到 ME53N,这回确实是更改成功了。

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

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

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

输入

– 标题:任意

– Type:1 – 可实行Program

点保存

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

点 Local Object

这样咱们的可执行程序就做好了。

下面就要通过它来调用购买依赖变更BAPI – BAPI_PR_CHANGE

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

Menu > 编集 > Pattern(模式)

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

输入

– CALL_FUNCTION:BAPI_PR_CHANGE

然后点执行

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

可以看到其实就是简单的把BAPI 给插进来了。

默认把所有参数都屏了。

就是说刚加进来的BAPI 函数是一个毛坯状态,想用什么参数你就打开它。

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用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 = '00' . LS_PRITEM-PREQ_ITEM = '0010' . LS_PRITEM-REQ_BLOCKED = '1' . LS_PRITEM-REASON_BLOCKING = '-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' .

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

点一下激活 图标,然后在最后一行那里打个断点,执行一下看看结果。

激活

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

双击某一行打断点

然后点 执行 图标

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

双击 LT_RETURN

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

再双击 LT_RETURN,这样就能看到结果了,

跟上面 1-3 里面的执行结果是一样的。

仔细看一下的话,如果 TYPE = ‘S’ AND ID = ’06’,那么就表示执行成功了。

咱们在代码里面也加上这个判断,就是说成功之后咱们再Commit。

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用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 . DATA: LS_RETURN LIKE BAPIRET2 . LV_NUM = '00' . LS_PRITEM-PREQ_ITEM = '0010' . LS_PRITEM-REQ_BLOCKED = '1' . LS_PRITEM-REASON_BLOCKING = '-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,执行确认

执行前:

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

代码执行

好像没啥 执行完了 之类的提示哈

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

执行后确认:执行完了之后,再次打开ME53N,可以看到数据已经更改了

SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI

这样就通过在ABAP代码中执行了 BAPI 从而实现修改 购买依赖数据的功能。

可以将 BAPI 理解为SAP系统级函数,通过调用它可以用很少的代码实现特殊/复杂的功能。

可以在SE37 界面上执行BAPI,当然更为常用的是在 自己写的ABAP 或其他代码中调用BAPI,从而实现一些批量修改之类的功能。

以上就是本章的内容。

更多SAP顾问业务知识请点击下面目录链接

SAP学习笔记 – 开发01 – BAPI是什么?通过界面和ABAP代码来调用BAPI

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/113512.html

(0)
上一篇 2025-12-14 07:26
下一篇 2025-12-14 07:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信