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中的重要概念,在SAP系统的开发中几乎是必须的。 本章来学习一下BAPI 的直观印象,以及在ABAP代码中的调用。 目录 1, BAPI概述 1,从画面角度来直观体验一下BAPI 1-1,MM:購買依頼変更BAPI - …...
mysql笔记3(数据库、表和数据的基础操作)
文章目录 一、数据库的基础操作1. 显示所有的仓库(数据库)2. 创建数据库注意(命名规范): 3. 删除数据库4. 查看创建数据库的SQL5. 创建数据库时跟随字符编码6. 修改数据库的字符编码 二、表的基础操作1. 引入表的思维2. 引用数据库3. 查看该数据库下面的表4. 创建表…...
计算机毕业设计选题-基于python的企业人事管理系统【源码+文档+数据库】
💖🔥作者主页:毕设木哥 精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻 实战项目 文章目录 实战项目 一、基于python的企业人事管理系…...
科研绘图系列:R语言折线图(linechart plots)
文章目录 介绍加载R包导入数据数据预处理画图组合图形介绍 在R语言中,折线图(Line Plot)是一种常用的数据可视化类型,用于展示数据随时间或有序类别变化的趋势。折线图通过连接数据点来形成一条或多条线,这些线条可以清晰地表示数据的变化方向、速度和模式。 加载R包 k…...
Opencv中的直方图(5)计算EMD距离的函数EMD()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 计算两个加权点配置之间的“最小工作量”距离。 该函数计算地球搬运工距离(Earth Mover’s Distance)和/或两个加权点配…...
KDD 2024 时空数据(Spatio-temporal) ADS论文总结
2024 KDD( ACM SIGKDD Conference on Knowledge Discovery and Data Mining, 知识发现和数据挖掘会议)在2024年8月25日-29日在西班牙巴塞罗那举行。 本文总结了KDD2024有关时空数据(Spatial-temporal) 的相关论文,如有疏漏,欢迎大…...
uniapp+vue3实现小程序和h5解压线上压缩包以及如何访问解压后的视频地址
安装jszip插件 npm install jszip 对应功能实现和逻辑处理: <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 的几大核心优…...
文心快码前端工程师观点分享:人机协同新模式的探索之路(三)
本系列视频来自百度工程效能部的前端研发经理杨经纬,她在由开源中国主办的“AI编程革新研发效能”OSC源创会杭州站105期线下沙龙活动上,从一款文心快码(Baidu Comate)前端工程师的角度,分享了关于智能研发工具本身的研…...
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:先进精简指令集计算机 ARM先进精简指令集计算机(Advanced RISC Machine,简称ARM)是一种基于精简指令集计算机(RISC)原则的计算机处理器架构,由英国的ARM公司开发。这种架构以其低功耗和高性…...
设计模式-行为型模式-迭代器模式
1.迭代器模式的定义 迭代器模式提供一种对容器对象中的各个元素进行访问的方法,而不需要暴露该对象的内部细节; 在软件系统中,容器对象有两个职责:一是存储数据,二是遍历数据;从依赖性上看,前者…...
FRP代理(QUIC通信)实验
访问关系与TCP实验相同,配置不一样 服务端配置 客户端配置 通信数据...
项目依赖拉不下来卡着不动怎么办,node又不支持cnpm
如果你的项目依赖在拉取时卡住,可以尝试以下步骤来解决问题: 检查网络:确保你的网络连接稳定。如果可能,尝试使用 VPN 或更换网络。 使用镜像源: 对于 yarn,可以使用淘宝镜像: yarn confi…...
ansible--role
简介 roles是ansible,playbooks的目录的组织结构,将代码或文件进行模块化,成为roles的文件目录组织结构。 易读,代码可冲哟美好,层次清晰 目录机构 mkdir roles/nginx/{files,handlers,tasks,templates,vars} -ptou…...
SpinalHDL之数据类型(一)
本文作为SpinalHDL学习笔记第五十四篇,介绍SpinalHDL的Bool数据类型。 SpinalHDL技术交流QQ群: Note: 1.本群是个人技术交流群,不是什么官方答疑群; 2.提问是你的权利,但回答不是别人的义务; 3.可以潜水,不能灌水; 4.请文明交流,做这行的都算高层次人才,希望你…...
Ansys Zemax | 什么是Sobol取样?
附件下载 联系工作人员获取附件 本文主要介绍了: 什么是Sobol取样? 和随机光线产生方法相比,Sobol取样有什么优点? Sobol取样有什么限制? 随机取样和Sobol取样模式 一个光源会在位置空间以及角度空间随机产生光…...
Unity 热更 之 【YooAsset 热更】Unity 可以进行热更的资源管理系统,并 【Android 端简单实现·案例热更】
Unity 热更 之 【YooAsset 热更】Unity 可以进行热更的资源管理系统,并 【Android 端简单实现案例热更】 目录 Unity 热更 之 【YooAsset 热更】Unity 可以进行热更的资源管理系统,并 【Android 端简单实现案例热更】 一、简单介绍 二、YooAsset 引…...
vue3写一个无限树形菜单,递归组件
原本使用element plus的el-tree,可是他的UI不匹配,狠难改成自己想要的,所以只能自己去写一个,做法:使用递归组件 效果 组件代码itemDir.vue // itemDir.vue<template><div><ul v-for"node in li…...
3D建模主要使用哪些软件?有什么特点?
3D建模主要使用的软件多种多样,每种软件都有其独特的优势和适用领域。以下是一些主流的3D建模软件: 1. Autodesk 3ds Max 概述:3ds Max是一款功能丰富的建模和动画软件,广泛用于电影、游戏和虚拟现实等领域。 特点:…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...
机器学习的数学基础:线性模型
线性模型 线性模型的基本形式为: f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法,得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...
验证redis数据结构
一、功能验证 1.验证redis的数据结构(如字符串、列表、哈希、集合、有序集合等)是否按照预期工作。 2、常见的数据结构验证方法: ①字符串(string) 测试基本操作 set、get、incr、decr 验证字符串的长度和内容是否正…...
