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

news2024/11/10 21:15:36

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2114193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

日志服务管理

系统日志管理 sysklogd 系统日志服务 在 CentOS5 以及之前的发行版中&#xff0c;其采用的 sysklogd 服务来记录和管理系统日志的。 sysklogd 服务有两个模块&#xff1a; klogd&#xff1a; 用于记录 linux kernel 相关的日志 syslogd&#xff1a;用于记录用户空间应用日志…

OCC开发_箱梁梁体建模

概述 OCC(全称OpenCascade)是一个近年来比较受欢迎的开源三维CAD建模平台&#xff0c;曲线、曲面、实体、渲染等方面功能强大&#xff0c;并且在机械、航空、船舶等许多领域应用广泛。基于OCC的强大功能考虑&#xff0c;本人尝试将其引入桥梁领域。桥梁设计中&#xff0c;比较常…

Nginx核心配置文件结构

一、简单介绍 源码安装的Nginx的核心配置文件默认是放在/usr/local/nginx/conf/nginx.conf yum安装的Nginx的核心配置文件默认是放在/etc/nginx/nginx.conf 使用命令&#xff1a;nginx -t&#xff0c;可以检查测试nginx的配置文件&#xff08;nginx.conf&#xff09;语法是否…

6.1排序——插入排序与希尔排序

本篇博客来梳理两种常见排序算法&#xff1a;插入排序与希尔排序 常见的排序算法如图 写排序算法的原则&#xff1a;先写单趟&#xff0c;再写整体 一、直接插入排序 1&#xff0e;算法思想 先假定第一个数据有序&#xff0c;把第二个数据插入&#xff1b;再假设前两个数据…

iOS剪贴板同步到Windows剪贴板(无需安装软件的方案)

摘要 剪贴板同步能够提高很多的效率&#xff0c;免去复制、发送、复制、粘贴的步骤&#xff0c;只需要在手机上复制&#xff0c;就可以直接在电脑上 ctrlv 粘贴&#xff0c;这方面在 Apple 设备中是做的非常好的&#xff0c;Apple 设备之间的剪贴板同步功能&#xff08;Univer…

2024整理 iptables防火墙学习笔记大全_modepro iptables

Iptables名词和术语 2iptables表&#xff08;tables&#xff09;和链&#xff08;chains&#xff09; 2表及其链的功能 2  Filter表 2  NAT表 2  MANGLE表 2iptables的工作流程 3iptables表和链的工作流程图 3 二、 iptables实战应用 4iptables命令参数详解 4  iptable…

Python基础part1

Python基础 语法 字面量 数字 整数浮点复数布尔 字符串列表 list元组 Tuple集合 Set字典 Dictionary 注释 单行# 单行注释的内容多行“”“ 多行注释的内容 ”“” 单行注释#后要加一个空格再写注释 变量 变量无类型&#xff0c;但数据有类型 语法&#xff1a; 变量名 …

java黑马微项目

1 飞机票 代码实现&#xff1a; import java.util.Scanner; public class F1 {public static void main(String[] args) {Scanner input new Scanner(System.in);System.out.print("请输入票价&#xff1a; ");double jia input.nextDouble();System.out.print(&…

培训第九周(部署k8s基础环境)

一、前期系统环境准备 1、关闭防火墙与selinux [rootk8s-master ~]# systemctl stop firewalld[rootk8s-master ~]# systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.Removed symlink /etc/systemd/system/dbus-o…

快速格式化和格式化的区别有哪些?

磁盘通常需要格式化才能正常使用&#xff0c;通过格式化&#xff0c;磁盘结构才能被操作系统正确识别。磁盘格式化分为快速格式化和格式化&#xff08;完全格式化&#xff09;&#xff0c;它们都是格式化的方法&#xff0c;下面是它们的详细区别。 磁盘快速格式化和格式化的区别…

2024 年高教社杯全国大学生数学建模竞赛B题第三问详细解题思路(终版)

示例代码&#xff1a; import numpy as np import pandas as pd# 参数设定 params {m: 8, # 零配件数量n: 2, # 半成品数量p: [0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10], # 零配件次品率c: [2, 8, 12, 2, 8, 12, 8, 12], # 购买单价d: [1, 1, 2, 1, 1, 2, 1, 2]…

个性化阅读体验:Spring Boot驱动的图书推荐系统

1 绪论 1.1研究背景 随着网络不断的普及发展&#xff0c;图书个性化推荐系统依靠网络技术的支持得到了快速的发展&#xff0c;首先要从学生的实际需求出发&#xff0c;通过了解学生的需求开发出具有针对性的首页、图书信息、好书推荐、留言反馈、个人中心、后台管理功能&#x…

文本分类场景下微调BERT

How to Fine-Tune BERT for Text Classification 论文《How to Fine-Tune BERT for Text Classification?》是2019年发表的一篇论文。这篇文章做了一些实验来分析了如何在文本分类场景下微调BERT&#xff0c;是后面网上讨论如何微调BERT时经常提到的论文。 结论与思路 先来看…

19:HAL—-DAC

一&#xff1a;介绍 1&#xff1a;简历 2&#xff1a;简图 F1,F4,F7的DAC框架图都一样。 触发源&#xff1a; 宏定义补全及解释 #define DAC_TRIGGER_NONE 0x00000000UL /*!< 转换是自动的&#xff0c;一旦DAC1_DHRxxxx寄存器被加载&#xff0c;不由外部触发 */ #define …

ctfshow-php特性(web123-web150plus)

​web123 <?php error_reporting(0); highlight_file(__FILE__); include("flag.php"); $a$_SERVER[argv]; $c$_POST[fun]; if(isset($_POST[CTF_SHOW])&&isset($_POST[CTF_SHOW.COM])&&!isset($_GET[fl0g])){if(!preg_match("/\\\\|\/|\~|…

AI模型的未来之路:全能与专精的博弈与共生

人工智能(AI)领域正迅速发展,伴随着技术的不断进步,AI模型的应用范围也在不断扩展。当前,AI模型的设计和使用面临两个主要趋势:全能型模型和专精型模型。这两者之间的博弈与共生将塑造未来的AI技术格局。本文将从以下七个方面探讨AI模型的未来之路,并提供实用的代码示例…

软考-高级架构师Keywords(上半部分)

概述 本文用于备考时自查知识点掌握情况&#xff0c; 知识点只以关键词方式提点出来&#xff0c;算是对照考纲的细碎化转化。 太简单的知识点不会收录。特别适合 通过中级-软件设计师的同学 / 八股文爱好者 / 408选手 计算机硬件 码距&#xff1a;改变n位成为另一个编码所需要…

业务资源管理模式语言09

示例&#xff1a; 图13 表示了QuoteTheMaintenance 模式的一个实例&#xff0c;在汽车修理店系统中&#xff0c;其中“Vehicle”扮演“Resource”&#xff0c;“Repair Quotation”扮演“Maintenance Quotation”&#xff0c;“Repair shop branch”扮演“Source-party”&…

halcon图像怎么显示在我们指定的区域

要想搞明白这个问题,首先我们要了解句柄的传递关系. halcon生成图像,会产生一个图像句柄,只要把该句柄传递给我们需要显示的组件就可以了. 简单说,就是一个句柄的传递关系. 下面这个例子简单说明句柄传递关系: 我们获取一个图像控件的句柄,把图像句柄传递给halcon的图像窗口句…

BN于神经网络调优

目录 一:神经网络调优 1.算法层面: 2.网络层面 二:调参技巧: 2.合理的参数设置: 3.运行: 三:批标准化(Batch Normalizetion) 1.批标准化公式: 2.过程图: 3.为什么标准化能够是优化过程变得简单: 一:神经网络调优 参数调优也称为超参数调优 1.算法层面…