当前位置: 首页 > news >正文

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

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究竟是什么呢?

其实BAP就是一个SAP系统级函数。

大家玩过Windows开发的都知道Windows有内核函数,可以直接在自己写的代码中调用,传入参数,从而使用很少的代码就能实现一些特殊的/复杂的功能。

这个BAPI就跟那个有点儿像,外界(ABAP代码或其他代码)可以通过调用BAPI,传入参数,就可以直接执行SAP系统里面的一些功能,从而用很少的代码就能实现很复杂的功能。

下面通过一个例子来看一下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'
EXPORTINGINT_TO_EXTERNAL = ' '
TABLEST_FNAMES = T_MGV_FNAMES1T_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'
EXPORTINGINT_TO_EXTERNAL = ' '
TABLEST_FNAMES = T_MGV_FNAMES2T_MATNR  = PRITEM.
LOOP AT PRITEMX ASSIGNING <MGV_PRITEMX>WHERE NOT ( PUR_MAT_EXTERNAL IS INITIAL ANDPUR_MAT_VERSION IS INITIAL ANDPUR_MAT_GUID IS INITIAL ).<MGV_PRITEMX>-PUR_MAT = 'X'.
ENDLOOP.
LOOP AT PRITEMX ASSIGNING <MGV_PRITEMX>WHERE NOT ( MATERIAL_EXTERNAL IS INITIAL ANDMATERIAL_VERSION IS INITIAL ANDMATERIAL_GUID IS INITIAL ).<MGV_PRITEMX>-MATERIAL = 'X'.
ENDLOOP.
*{BAPI End} generation
ENDENHANCEMENT.
*$*$-End:   BAPI_PR_CHANGE_G6-------------------------------------------------------------------$*$** generate data recordSET EXTENDED CHECK OFF.fbgenmac 'BAPI_PR_CHANGE'.                                "#EC *SET EXTENDED CHECK ON.
* define local dataDATA: 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_bapiEXPORTINGim_preq_no = numberim_actyp   = if_bapi_mereq=>verim_testrun = testrun.* set header datalr_bapi->set_header( im_header   = prheader    im_headerx  = prheaderx ).
* set item datalr_bapi->set_items( im_items     = pritem[]    im_itemsx   = pritemx[] ).
* set accouting datalr_bapi->set_account( im_account = praccount[] im_accountx = praccountx[] ).
* set profit segment data for accouting datalr_bapi->set_profitsegment( praccountproitsegment[] ).
*  set subcontracting componentslr_bapi->set_components( im_component  = prcomponents[]im_componentx = prcomponentsx[] ).
*  set serial numberslr_bapi->set_serialno( im_serno = serialnumber[] im_sernox = serialnumberx[] ).
* set delivery addresslr_bapi->set_delivery_address( praddrdelivery[] ).
* set header textslr_bapi->set_header_text( prheadertext[] ).
* set header textslr_bapi->set_item_text( pritemtext[] ).
* set version datalr_bapi->set_version( im_version = prversion[] im_versionx = prversionx[] ).
* set extensioninlr_bapi->set_extensionin( extensionin[] ).
* set srv outlinelr_bapi->set_srv_outline( imt_outline = serviceoutline[] imt_outlinex = serviceoutlinex[] ).
* set service lineslr_bapi->set_srv_service_lines( imt_service_lines  = servicelines[]imt_service_linesx = servicelinesx[] ).
* set limit datalr_bapi->set_srv_limit_data( imt_limit_data  = servicelimit[]imt_limit_datax = servicelimitx[] ).
* set contract limitslr_bapi->set_srv_contract_limits( imt_contract_limits  = servicecontractlimits[]imt_contract_limitsx = servicecontractlimitsx[] ).
* set srv accounting lineslr_bapi->set_srv_acc_lines( imt_srv_acc_data  = serviceaccount[]imt_srv_acc_datax = serviceaccountx[] ).
* set srv longtextslr_bapi->set_srv_longtexts( imt_srv_texts = servicelongtexts[] ).* start processingCALL METHOD lr_bapi->process( ).*- Outbound mapping to returning structures/tables
* get header dataprheaderexp  = lr_bapi->get_header( ).
* get requisition numbernumber = lr_bapi->my_document.
* get header textprheadertext[]   = lr_bapi->get_header_text( ).
* get item datapritemexp[]      = lr_bapi->get_items_exp( ).
* get accouting datapraccount[]      = lr_bapi->get_account( ).
* get subcontracting componentsprcomponents[]   = lr_bapi->get_components( ).
* get serial numbersserialnumber[]   = lr_bapi->get_serialno( ).
* get delivery addresspraddrdelivery[] = lr_bapi->get_delivery_address( ).
* get item textpritemtext[]     = lr_bapi->get_item_text( ).
* get source of supplypritemsource[]   = lr_bapi->get_source( ).
* version dataallversions[]    = lr_bapi->get_version( ).
* get extensionoutextensionout[]   = lr_bapi->get_extensionout( ).
* return messagesreturn[]         = lr_bapi->get_return( ).
* get srv outlineserviceoutline[] = lr_bapi->get_srv_outline( ).
* get service linesservicelines[] = lr_bapi->get_srv_service_lines( ).
* get limit dataservicelimit[] = lr_bapi->get_srv_limit_data( ).
* get contract limitsservicecontractlimits[] = lr_bapi->get_srv_contract_limits( ).
* get srv accounting linesserviceaccount[] = lr_bapi->get_srv_acc_lines( ).
* get srv longtextsservicelongtexts[]  = 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'
EXPORTINGINT_TO_EXTERNAL = 'X'
TABLEST_FNAMES = T_MGV_FNAMES1T_MATNR  = PRITEMEXP.
CALL FUNCTION 'MATNR_BAPI_TABLES_CONVERSION'
EXPORTINGINT_TO_EXTERNAL = 'X'
TABLEST_FNAMES = T_MGV_FNAMES2T_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'EXPORTINGNUMBER                       = LV_NUM
*   PRHEADER                     =
*   PRHEADERX                    =
*   TESTRUN                      =
* IMPORTING
*   PRHEADEREXP                  =TABLESRETURN                       = LT_RETURNPRITEM                       = LT_PRITEMPRITEMX                      = 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'EXPORTINGNUMBER                       = LV_NUM
*   PRHEADER                     =
*   PRHEADERX                    =
*   TESTRUN                      =
* IMPORTING
*   PRHEADEREXP                  =TABLESRETURN                       = LT_RETURNPRITEM                       = LT_PRITEMPRITEMX                      = 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

相关文章:

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

BAPI作为SAP中的重要概念&#xff0c;在SAP系统的开发中几乎是必须的。 本章来学习一下BAPI 的直观印象&#xff0c;以及在ABAP代码中的调用。 目录 1&#xff0c; BAPI概述 1&#xff0c;从画面角度来直观体验一下BAPI 1-1&#xff0c;MM&#xff1a;購買依頼変更BAPI - …...

mysql笔记3(数据库、表和数据的基础操作)

文章目录 一、数据库的基础操作1. 显示所有的仓库(数据库)2. 创建数据库注意(命名规范)&#xff1a; 3. 删除数据库4. 查看创建数据库的SQL5. 创建数据库时跟随字符编码6. 修改数据库的字符编码 二、表的基础操作1. 引入表的思维2. 引用数据库3. 查看该数据库下面的表4. 创建表…...

计算机毕业设计选题-基于python的企业人事管理系统【源码+文档+数据库】

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、基于python的企业人事管理系…...

科研绘图系列:R语言折线图(linechart plots)

文章目录 介绍加载R包导入数据数据预处理画图组合图形介绍 在R语言中,折线图(Line Plot)是一种常用的数据可视化类型,用于展示数据随时间或有序类别变化的趋势。折线图通过连接数据点来形成一条或多条线,这些线条可以清晰地表示数据的变化方向、速度和模式。 加载R包 k…...

Opencv中的直方图(5)计算EMD距离的函数EMD()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算两个加权点配置之间的“最小工作量”距离。 该函数计算地球搬运工距离&#xff08;Earth Mover’s Distance&#xff09;和/或两个加权点配…...

KDD 2024 时空数据(Spatio-temporal) ADS论文总结

2024 KDD&#xff08; ACM SIGKDD Conference on Knowledge Discovery and Data Mining, 知识发现和数据挖掘会议&#xff09;在2024年8月25日-29日在西班牙巴塞罗那举行。 本文总结了KDD2024有关时空数据(Spatial-temporal) 的相关论文&#xff0c;如有疏漏&#xff0c;欢迎大…...

uniapp+vue3实现小程序和h5解压线上压缩包以及如何访问解压后的视频地址

安装jszip插件 npm install jszip 对应功能实现和逻辑处理&#xff1a; <script setup>import { onMounted, reactive, ref } from vueimport { onHide, onUnload } from dcloudio/uni-appimport JSZip from jsziplet videoSrc ref() // 视频地址// 创建JSZip实例con…...

探索 Zed 编辑器:速度与协作的巅峰之作

Zed 是一款备受瞩目的代码编辑器,专为现代开发者打造。本文将深入介绍 Zed 的独特优势,以及如何快速上手使用这款编辑器,助你在编程工作中大幅提升效率。 一:Zed 编辑器的优势 Zed 是近年来崭露头角的一款代码编辑器,迅速赢得了众多开发者的青睐。以下是 Zed 的几大核心优…...

文心快码前端工程师观点分享:人机协同新模式的探索之路(三)

本系列视频来自百度工程效能部的前端研发经理杨经纬&#xff0c;她在由开源中国主办的“AI编程革新研发效能”OSC源创会杭州站105期线下沙龙活动上&#xff0c;从一款文心快码&#xff08;Baidu Comate&#xff09;前端工程师的角度&#xff0c;分享了关于智能研发工具本身的研…...

Qt基础类03-直线类QLine

Qt基础类03-直线类QLine 摘要基本信息成员函数程序全貌QLine::QLine()QLine::QLine(const QPoint &p1, const QPoint &p2)QLine::QLine(int x1, int y1, int x2, int y2)QPoint QLine::p1() constQPoint QLine::p2() constint QLine::x1() constint QLine::x2() consti…...

集成电路学习:什么是ARM先进精简指令集计算机

ARM&#xff1a;先进精简指令集计算机 ARM先进精简指令集计算机&#xff08;Advanced RISC Machine&#xff0c;简称ARM&#xff09;是一种基于精简指令集计算机&#xff08;RISC&#xff09;原则的计算机处理器架构&#xff0c;由英国的ARM公司开发。这种架构以其低功耗和高性…...

设计模式-行为型模式-迭代器模式

1.迭代器模式的定义 迭代器模式提供一种对容器对象中的各个元素进行访问的方法&#xff0c;而不需要暴露该对象的内部细节&#xff1b; 在软件系统中&#xff0c;容器对象有两个职责&#xff1a;一是存储数据&#xff0c;二是遍历数据&#xff1b;从依赖性上看&#xff0c;前者…...

FRP代理(QUIC通信)实验

访问关系与TCP实验相同&#xff0c;配置不一样 服务端配置 客户端配置 通信数据...

项目依赖拉不下来卡着不动怎么办,node又不支持cnpm

如果你的项目依赖在拉取时卡住&#xff0c;可以尝试以下步骤来解决问题&#xff1a; 检查网络&#xff1a;确保你的网络连接稳定。如果可能&#xff0c;尝试使用 VPN 或更换网络。 使用镜像源&#xff1a; 对于 yarn&#xff0c;可以使用淘宝镜像&#xff1a; yarn confi…...

ansible--role

简介 roles是ansible&#xff0c;playbooks的目录的组织结构&#xff0c;将代码或文件进行模块化&#xff0c;成为roles的文件目录组织结构。 易读&#xff0c;代码可冲哟美好&#xff0c;层次清晰 目录机构 mkdir roles/nginx/{files,handlers,tasks,templates,vars} -ptou…...

SpinalHDL之数据类型(一)

本文作为SpinalHDL学习笔记第五十四篇,介绍SpinalHDL的Bool数据类型。 SpinalHDL技术交流QQ群: Note: 1.本群是个人技术交流群,不是什么官方答疑群; 2.提问是你的权利,但回答不是别人的义务; 3.可以潜水,不能灌水; 4.请文明交流,做这行的都算高层次人才,希望你…...

Ansys Zemax | 什么是Sobol取样?

附件下载 联系工作人员获取附件 本文主要介绍了&#xff1a; 什么是Sobol取样&#xff1f; 和随机光线产生方法相比&#xff0c;Sobol取样有什么优点&#xff1f; Sobol取样有什么限制&#xff1f; 随机取样和Sobol取样模式 一个光源会在位置空间以及角度空间随机产生光…...

Unity 热更 之 【YooAsset 热更】Unity 可以进行热更的资源管理系统,并 【Android 端简单实现·案例热更】

Unity 热更 之 【YooAsset 热更】Unity 可以进行热更的资源管理系统&#xff0c;并 【Android 端简单实现案例热更】 目录 Unity 热更 之 【YooAsset 热更】Unity 可以进行热更的资源管理系统&#xff0c;并 【Android 端简单实现案例热更】 一、简单介绍 二、YooAsset 引…...

vue3写一个无限树形菜单,递归组件

原本使用element plus的el-tree&#xff0c;可是他的UI不匹配&#xff0c;狠难改成自己想要的&#xff0c;所以只能自己去写一个&#xff0c;做法&#xff1a;使用递归组件 效果 组件代码itemDir.vue // itemDir.vue<template><div><ul v-for"node in li…...

3D建模主要使用哪些软件?有什么特点?

3D建模主要使用的软件多种多样&#xff0c;每种软件都有其独特的优势和适用领域。以下是一些主流的3D建模软件&#xff1a; 1. Autodesk 3ds Max 概述&#xff1a;3ds Max是一款功能丰富的建模和动画软件&#xff0c;广泛用于电影、游戏和虚拟现实等领域。 特点&#xff1a;…...

Android Studio 加载多个FLutter项目

按顺序操作即可 选择工程 选择Modules, 导入 module 选中创建module 选择要导入的目录&#xff0c;只选择主目录&#xff0c;下面的文件不要选 添加完成&#xff0c;点击ok后&#xff0c;会进行导入 最终导入成功...

SealSuite 一站式 IT 管理与办公安全解决方案,助力出海企业夯实数字化底座

数字化办公时代&#xff0c;企业升级 IT 基础设施&#xff0c;已不再是选择题&#xff0c;而是必答题。 数字化办公时代&#xff0c;企业为何要升级 IT 基础设施&#xff1f; 随着时代变化与科技进步&#xff0c;人们的工作方式也发生了巨大变化。如今&#xff0c;远程办公、全…...

l超市售货管理系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;会员管理&#xff0c;供应商信息管理&#xff0c;商品管理&#xff0c;出入库管理&#xff0c;公告管理&#xff0c;轮播图信息 微信端账号功能包括&#xff1a;系统首页&#xff0c;公告&#xff0c;…...

systemverilog、verilog的部分常用内部函数

1. $ceil 作用&#xff1a;将给定的实数或浮点数向上取整。示例&#xff1a;$ceil(3.2) 返回 4。 2. $floor 作用&#xff1a;将给定的实数或浮点数向下取整。示例&#xff1a;$floor(3.9) 返回 3。 3. $value$plusargs 作用&#xff1a;从命令行读取传递给仿真器的参数。…...

Python趣味绘图案例

文章目录 系列文章趣味绘图案例1. 绘制简单的正方形2. 绘制五角星3. 绘制同心圆4. 绘制彩虹弧5. 绘制螺旋线6. 绘制六边形7. 绘制花形图案8. 绘制波浪线9. 绘制柱状图10. 绘制饼图 系列文章 序号直达链接表白系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Pyt…...

P3588 [POI2015] PUS

~~~~~ P3588 [POI2015] PUS ~~~~~ 总题单链接 思路 ~~~~~ 这道题的关键点在于线段树优化建图。 ~~~~~ 对每条限制新建一个虚电 p p p&#xff0c;将输入的 x 1 ∼ k x_{1\sim k} x1∼k​ 连向 p p p&#xff0c;再将 p p p 连向区间内单的其他点&#xff0c;建完图后拓扑排…...

指针(四)

指针和数组笔试题解析 一维数组 字符数组 &#xff08;没有\0&#xff09; 字符数组&#xff08;有\0&#xff09; 重点讲一下printf("%d\n", strlen(*p))&#xff1b; 这个strlen函数中是从地址开始寻找&#xff0c;而非元素本身&#xff1b;假设计算的是元素本…...

0902,DEQUE,LIST,VECTOR

目录 01_vector.cc 02_vector.cc 作业 01STL包括哪些组件&#xff1f;各自具有哪些特点&#xff1f; 02 序列式容器包括哪些&#xff1f;他们之间有哪些异同&#xff1f; 03 下面程序有什么错误&#xff1f; 04 创建和初始化vector的方法&#xff0c;每种都给出一个实例…...

LeetCode 每日一题 2024/9/2-2024/9/8

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 9/2 3153. 所有数对中数位不同之和9/3 2708. 一个小组的最大实力值9/4 2860. 让所有学生保持开心的分组方法数9/5 3174. 清除数字9/6 3176. 求出最长好子序列 I9/7 3177. 求…...

Linux中的Vim文本编辑器

Linux中的Vim是一个非常强大的文本编辑器&#xff0c;它提供了丰富的命令来支持各种文本编辑操作。以下是一个Vim常用命令的详细总结&#xff0c;涵盖了基本操作、编辑命令、移动光标、查找替换、保存退出等多个方面。 一、基本操作 启动Vim vim&#xff1a;直接启动Vim编辑器…...