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

154 篇文章 7 订阅
4 篇文章 0 订阅

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

  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值