欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > ABAP开发-批量导入BAPI和BDC_1

ABAP开发-批量导入BAPI和BDC_1

2025/4/3 11:03:20 来源:https://blog.csdn.net/weixin_52203666/article/details/144374717  浏览:    关键词:ABAP开发-批量导入BAPI和BDC_1

系列文章目录


文章目录

  • 系列文章目录
    • @[TOC](文章目录)
  • 前言
  • 一、概念
  • 二、BDC和BAPI数据导入
    • 1、BDC数据导入(录屏)
    • 2、BAPI数据导入
  • 三、实例
    • 1、BAPI
    • 2、BDC
  • 总结

前言


一、概念

SAP中,对一个事务码反复操作并且达到批量处理数据的效果,即批量导入,重复操作一类数据,从而用程序模拟业务人员的操作,节约时间。
批量导入的方法从原理上看分两大类:屏幕录制、功能调用

二、BDC和BAPI数据导入

1、BDC数据导入(录屏)

TCODE:SHDB
Batch Input是一种数据批量输入SAP系统的辅助程序,SAP系统的资料、格式可以通过Batch Input录入SAP系统,Batch Input机制是模拟事务处理将数据录入R/3系统,Batch Input类似SAP的CATT,控制性好,处理能力强
最后的保底方案

2、BAPI数据导入

TCODE:SE37
BAPI是一种SAP系统预留的标准对象的操作函数,可使用SE37查看代码
开发者通过自定义程序,按照操作函数的使用规范,把一定格式的数据,导入到BAPI的参数里,系统会自动创建标准对象,从而达到批处理效果
更可靠,若存在BAPI,推荐用BAPI,不用BDC,系统标准的函数-可以操作标准的对象,不会受到屏幕变化自开发等影响
实现步骤: SE37测试(BAPI_PO_CHANGE->BAPI_TRANSACTION_COMMIT)-》写程序

三、实例

1、BAPI

对采购订单行项目的短文本进行修改

TCODE:ME22
找一个标准采购订单如下,原本的短文本如下,看之后返回,以防在下面操作时被锁
在这里插入图片描述
TCODE:SE37
输入功能模块:BAPI_PO_CHANGE
点显示,可以看到具体代码,标准程序不要点修改!!
在这里插入图片描述
点执行
在这里插入图片描述
在导入参数的PURCHASEORDER中的值中填入采购单号
在这里插入图片描述
点击表中的POITEM,点击值“详细信息查看”
点击“单一结构”
在这里插入图片描述
PO_ITEM中填00010(修改第一个行项目)
因为要修改短文本,所以在SHORT_TEXT中填入修改后的短文本“测试质量流量计&CS200D029C03”
点击对号
在这里插入图片描述
然后退出,就可以看到已经改了一条目
在这里插入图片描述
点击POITEMX,目的:告诉系统改的是谁
在这里插入图片描述
点击“单一条目”
在这里插入图片描述
将PO_ITEM值改为00010,因为要修改的是短文本,所以将SHORT_TEXT值填上"X",点对号
在这里插入图片描述
点击执行
在这里插入图片描述
然后再到se37中,执行测试序列
输入功能模块名称BAPI_TRANSACTION_COMMIT,点击功能模块-》执行-》测试序列
在这里插入图片描述
在这里插入图片描述
测试序列中输入功能模块BAPI_PO_CHANGE、BAPI_TRANSACTION_COMMIT,即要更改的是BAPI_PO_CHANGE,提交更改到数据库 BAPI_TRANSACTION_COMMIT,然后点执行
在这里插入图片描述
同样的,输入采购订单号,PO_ITEM、PO_ITEMX中分别输入要更改的内容
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
都填好之后,返回点执行
在这里插入图片描述
点退回
在这里插入图片描述
来到如下界面,点执行,就提交了
在这里插入图片描述
在这里插入图片描述
再打开ME22,查看该采购订单的短文本,显示已经被修改为“测试质量流量计&CS200D029C03”
在这里插入图片描述

注:SE37中,填入功能模块名称-》显示-》函数模块文档
函数模块文档中通常包含以下部分:
在这里插入图片描述
以BAPI__PO_CHANGE为例
1、Functionality该功能模块的作用
BAPI_PO_CHANGE使我们能改变采购订单

2、Functions in Detail功能详情
Authorization授权
当创建采购订单时,会检查以下授权对象
M_BEST_BSA (document type in PO)采购订单中的文档类型
M_BEST_EKG (purchasing group in PO)采购订单中的采购组
M_BEST_EKO (purchasing organization in PO)采购订单中的采购组织
M_BEST_WRK (plant in PO)采购工厂

3、Transfer具体有哪些字段
Purchase order number采购订单编号:PurchaseOrder字段唯一标识采购订单,必须填充此字段才能执行CHANGE方法;
Header data标头数据:采购订单的Header数据在PoHeader表中传输;
Item data项目数据:采购订单的item数据存储在Poltem表中,数量和交货日期/时间的更改应该在PoSchedule表中进行
Services and items服务和限制:不能使用Change方法对现有项执行更改,只能创建新项目
Conditions条件
Supplier and delivery address供应商和交货地址
Partner roles合作伙伴角色
Export/import data导出导入数据

4、RETURN返回信息
返回信息
如果 PO 已成功更改,则 HEADER 和 item 表中将填充 PO 中的信息。
返回消息
消息在 Return 参数中返回。这还包含有关接口数据是被错误填充还是可能被错误填充的信息(启发式接口检查)。如果已成功创建 PO,则 PO 编号也会与相应的消息一起放置在返回表中。

5、Restrictions限制
使用此功能模块,无法:
创建分包组件(只能使用现有组件)
创建配置(只能使用现有配置)
将文档附加到采购订单
更改外贸数据
更改服务数据
更改或重新分解BOM
无法使用BAPI创建或更改具有开票计划的PO项目

6、Example
对采购订单进行更改的示例
标头数据更改 、项目的更改、交货时间表变更、账户分配变更 、条件变化 、更换合作伙伴

SE37中查看标准程序,事实上我们最不需要关心的是源代码,因为通常是极其复杂的,我们需要关心的是导入、导出、正在更改、表中的信息
导入:
可以看到PURCHASEORDER这个参数不是可选的,即若要修改采购订单,则必须涉及到采购订单号
在这里插入图片描述
表:
上面的实例中,要修改的是短文本,那么可以从表中看到
在这里插入图片描述
在这里插入图片描述
双击关联类型
在这里插入图片描述
可以看到采购订单的采购订单项目,比如PO_ITEM是采购凭证的项目编号,即me22中的项目字段;SHORT_TEXT是要修改的短文本
在这里插入图片描述
在这里插入图片描述
同样的,可以在表中看到POITEMX,双击其关联类型
在这里插入图片描述
可以看到和POITEM是对应的
在这里插入图片描述

2、BDC

TCODE:SHDB
点击新建记录
在这里插入图片描述
输入“记录”、“要录屏的事务代码”、点击“开始记录”
在这里插入图片描述
会跳转到如下界面
在这里插入图片描述
修改短文本,点击保存,弹出会话框,点击“是”
在这里插入图片描述
可以看到如下,要改的采购凭证、项目号、短文本
点击返回,弹出对话框“是否保存更改到记录条目”,点击“是”
通过EKPO-TXZ01(01)、EKPO-TXZ01(02)来区分改的是采购订单的哪个行项目(即改的是哪个项目号的)
在这里插入图片描述
在这里插入图片描述
选中记录,点击程序
在这里插入图片描述
填入程序名,自己起一个名字,点√
在这里插入图片描述
此时,在se38里即可查到此次创建的程序
在这里插入图片描述
需要将代码改为如下:

REPORT zyt36_me22_36130NO STANDARD PAGE HEADING LINE-SIZE 255.* Include bdcrecx1_s:
* The call transaction using is called WITH AUTHORITY-CHECK!
* If you have own auth.-checks you can use include bdcrecx1 instead.
*include bdcrecx1_s.
DATA:   bdcdata LIKE bdcdata    OCCURS 0 WITH HEADER LINE."定义BDC,CALL TRANSACTION时需要传的
DATA:   bdcmessage LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE."用来接收CALL TRANSACTION回来以后的MESSAGE*** End generated data section ***START-OF-SELECTION."调用perform"准备BDC的数据PERFORM bdc_dynpro      USING 'SAPMM06E' '0105'.
*perform bdc_field       using 'BDC_CURSOR'"和光标相关,不用管
*                              'RM06E-BSTNR'.PERFORM bdc_field       USING 'BDC_OKCODE''/00'.PERFORM bdc_field       USING 'RM06E-BSTNR''4500000056'."record-BSTNR_001."PO HEADER号,自己填入采购订单号4500000056PERFORM bdc_dynpro      USING 'SAPMM06E' '0120'.
*perform bdc_field       using 'BDC_CURSOR'
*                              'EKPO-TXZ01(01)'.PERFORM bdc_field       USING 'BDC_OKCODE''=BU'.
*perform bdc_field       using 'RM06E-EBELP'
*                              record-EBELP_002."Item的行项目号PERFORM bdc_field       USING 'EKPO-TXZ01(01)''测试测试BDC质量流量计&CS200D029C03'."record-TXZ01_01_003."短文本PERFORM bdc_dynpro      USING 'SAPLSPO1' '0300'.PERFORM bdc_field       USING 'BDC_OKCODE''=YES'.
*perform bdc_transaction using 'ME22'."根据上面的BDCDATA调用事务代码CALL TRANSACTION 'ME22' USING bdcdata"ME22代表的是事务代码;光标落在TRANSACTION上,按F1,可以弹出帮助文档,CALL TRANSACTION-USING中有CALL TRANSACTION的语法用法MODE 'N'    "N-no screen mode ,不弹出屏幕  A--all screen mode    E--only error screenUPDATE 'A'  "A/S :同步/异步MESSAGES INTO bdcmessage.  "用定义的变量BDCMESSAGE来接MESSAGE*如何确定BDC是否执行成功
*1、sy-subrc = 0  并且需要查看BDCMESSAGE,不能包含A/E/X
*2、sy-subrc <>0 失败,失败里面有一个特殊的情况:sy-subrc = 1001,标识屏幕上面的字段出现了问题,需要检查的bdcdata*成功了才需要提交数据库,否则 ROLL BACK回滚数据IF sy-subrc = 0."成功的第一个条件 sy-subrc = 0LOOP AT  bdcmessage INTO DATA(lw_message).IF lw_message-msgtyp = 'A' OR lw_message-msgtyp = 'E' OR lw_message-msgtyp = 'X'."包含其中任何一个,我们认为调用失败,需要回滚数据CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.EXIT."程序结束ENDIF.ENDLOOP.ELSE.WRITE: / '数据更新失败'.CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.EXIT.ENDIF."成功了才会进行提交的操作CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
* EXPORTING
*   WAIT          =
* IMPORTING
*   RETURN        =.*----------------------------------------------------------------------*
*        Start new screen                                              *
*----------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro.CLEAR bdcdata.bdcdata-program  = program.bdcdata-dynpro   = dynpro.bdcdata-dynbegin = 'X'.APPEND bdcdata.
ENDFORM.*----------------------------------------------------------------------*
*        Insert field                                                  *
*----------------------------------------------------------------------*
FORM bdc_field USING fnam fval.
*  IF FVAL <> NODATA.CLEAR bdcdata.bdcdata-fnam = fnam.bdcdata-fval = fval.APPEND bdcdata.
*  ENDIF.
ENDFORM.

在这里插入图片描述
检查-》激活-》执行,提示标准采购订单已更改
在这里插入图片描述
此时,ME22中即可看到修改后的短文本
在这里插入图片描述

代码解释:
(1)双击“定义BDC”的语句DATA: BDCDATA LIKE BDCDATA OCCURS 0 WITH HEADER LINE.中的 LIKE后的BDCDATA,显示如下:
显示的是为了调用transaction需要往里面填的值,用perform填这些的值,除了采购订单号和短文本需要我们自己填入,其他的都是默认录屏带出的
在这里插入图片描述
(2)perform

  • perform bdc_dynpro :给PROGRAM、DYNPRO 、DYNBEGIN赋值
*        Start new screen                                              *
*----------------------------------------------------------------------*
FORM BDC_DYNPRO USING PROGRAM DYNPRO.CLEAR BDCDATA.BDCDATA-PROGRAM  = PROGRAM.BDCDATA-DYNPRO   = DYNPRO.BDCDATA-DYNBEGIN = 'X'.APPEND BDCDATA.
ENDFORM.
  • perform bdc_field:给FNAM、FVAL赋值
FORM BDC_FIELD USING FNAM FVAL.
*  IF FVAL <> NODATA.CLEAR BDCDATA.BDCDATA-FNAM = FNAM.BDCDATA-FVAL = FVAL.APPEND BDCDATA.
*  ENDIF.
ENDFORM.

(3)CALL TRANSACTION ‘ME22’ USING BDCDATA"

CALL TRANSACTION 'ME22' USING BDCDATA"ME22代表的是事务代码;光标落在TRANSACTION上,按F1,可以弹出帮助文档,CALL TRANSACTION-USING中有CALL TRANSACTION的语法用法MODE 'N'"N-no screen mode ,不弹出屏幕UPDATE 'A'.

在这里插入图片描述
在这里插入图片描述
优化,事实上我们不想要上面的代码那样在里面直接写采购订单号和短文本,我们需要的是传入一个参数,然后来改;思路:定义一个structure,里面包含采购订单号和短文本

创建PERFORM子例程
在这里插入图片描述
在这里插入图片描述
由于这里直接双击perform创建子例程不成功,所以我直接在SE38创建了INCLUDE程序
在这里插入图片描述
在这里插入图片描述
再优化后的代码:
主程序:

REPORT zyt36_me22_36130NO STANDARD PAGE HEADING LINE-SIZE 255.
INCLUDE zyt36_me22_36130_d01.
INCLUDE zyt36_me22_36130_f01.INITIALIZATION."初始化事件里面,给想要改的PO赋值
*准备数据ls_bdc-ebeln = '4500000056'."PO numberls_bdc-ebelp = 10."ITEM number 行项目号ls_bdc-txz01 = 'demo测试测试BDC质量流量计&CS200D029C03'."短文本APPEND ls_bdc TO lt_bdc.START-OF-SELECTION.
*根据LS_BDC,对PO数据进行更改LOOP AT lt_bdc INTO ls_bdc.PERFORM change_po_bdc USING ls_bdc.ENDLOOP.

INCLUDE zyt36_me22_36130_d01:

*&---------------------------------------------------------------------*
*& Include ZYT36_ME22_36130_D01
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
*   data definition    从系统的复制来的
*----------------------------------------------------------------------*
DATA:   bdcdata LIKE bdcdata    OCCURS 0 WITH HEADER LINE."定义BDC ,CALL TRANSACTION时需要传的
DATA:   bdcmessage LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE."用来接收CALL TRANSACTION回来以后的MESSAGEDATA:BEGIN OF RECORD,
* data element: BSTNRbstnr_001(010),
* data element: AUFEPebelp_002(005),
* data element: TXZ01txz01_01_003(040),END OF record.
"定义一个数据结构,用来保存需要更改的PO数据
TYPES: BEGIN OF TY_S_BDC,EBELN TYPE EBELN,"PO号EBELP TYPE EBELP,"行项目号TXZ01 TYPE TXZ01,"短文本END OF TY_S_BDC.
*定义一个变量,用来存放我们需要更改的PO
DATA: LS_BDC TYPE TY_S_BDC,LT_BDC TYPE TABLE OF TY_S_BDC.

INCLUDE zyt36_me22_36130_f01:

*&---------------------------------------------------------------------*
*& Include ZYT36_ME22_36130_F01
*&---------------------------------------------------------------------**&---------------------------------------------------------------------*
*& Form change_po_bdc  根据传入参数修改PO短文本
*&      --> LS_DBC
*&---------------------------------------------------------------------*
FORM change_po_bdc USING is_bdc TYPE TY_S_BDC.DATA : lv_pos TYPE c LENGTH 2,lv_val TYPE bdc_fval."通过bdc的type得来的"调用perform"准备BDC的数据  录屏的形式生成performPERFORM bdc_dynpro      USING 'SAPMM06E' '0105'.
perform bdc_field       using 'BDC_CURSOR'"和光标相关,不用管'RM06E-BSTNR'.PERFORM bdc_field       USING 'BDC_OKCODE''/00'.PERFORM bdc_field       USING 'RM06E-BSTNR'is_dbc-ebeln."record-BSTNR_001."PO HEADER号,自己填入采购订单号4500000056PERFORM bdc_dynpro      USING 'SAPMM06E' '0120'.
*perform bdc_field       using 'BDC_CURSOR'
*                              'EKPO-TXZ01(01)'.PERFORM bdc_field       USING 'BDC_OKCODE''=BU'.
perform bdc_field       using 'RM06E-EBELP''0010'. "record-EBELP_002."Item的行项目号* 处理短文本的字段名字lv_pos = is_dbc-ebelp+2(2)."跳过前两位,取两位lv_val = 'EKPO-TXZ01(' && lv_pos && ')'."拼接短文本字段名PERFORM bdc_field       USING 'EKPO-TXZ01(01)''测试测试BDC质量流量计&CS200D029C03'."record-TXZ01_01_003."短文本PERFORM bdc_dynpro      USING 'SAPLSPO1' '0300'.PERFORM bdc_field       USING 'BDC_OKCODE''=YES'.
*perform bdc_transaction using 'ME22'."根据上面的BDCDATA调用事务代码CALL TRANSACTION 'ME22' USING bdcdata"ME22代表的是事务代码;光标落在TRANSACTION上,按F1,可以弹出帮助文档,CALL TRANSACTION-USING中有CALL TRANSACTION的语法用法MODE 'N'    "N-no screen mode ,不弹出屏幕  A--all screen mode    E--only error screenUPDATE 'A'  "A/S :同步/异步MESSAGES INTO bdcmessage.  "用定义的变量BDCMESSAGE来接MESSAGE*如何确定BDC是否执行成功
*1、sy-subrc = 0  并且需要查看BDCMESSAGE,不能包含A/E/X
*2、sy-subrc <>0 失败,失败里面有一个特殊的情况:sy-subrc = 1001,标识屏幕上面的字段出现了问题,需要检查的bdcdata*成功了才需要提交数据库,否则 ROLL BACK回滚数据IF sy-subrc = 0."成功的第一个条件 sy-subrc = 0LOOP AT  bdcmessage INTO DATA(lw_message).IF lw_message-msgtyp = 'A' OR lw_message-msgtyp = 'E' OR lw_message-msgtyp = 'X'."包含其中任何一个,我们认为调用失败,需要回滚数据CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.EXIT."程序结束ENDIF.ENDLOOP.ELSE.WRITE: / '数据更新失败'.CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.EXIT.ENDIF."成功了才会进行提交的操作CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
* EXPORTING
*   WAIT          =
* IMPORTING
*   RETURN        =.
ENDFORM.
*----------------------------------------------------------------------*
*        Start new screen                      从系统的复制来的                        *
*----------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro.CLEAR bdcdata.bdcdata-program  = program.bdcdata-dynpro   = dynpro.bdcdata-dynbegin = 'X'.APPEND bdcdata.
ENDFORM.*----------------------------------------------------------------------*
*        Insert field                          从系统的复制来的                           *
*----------------------------------------------------------------------*
FORM bdc_field USING fnam fval.
*  IF FVAL <> NODATA.CLEAR bdcdata.bdcdata-fnam = fnam.bdcdata-fval = fval.APPEND bdcdata.
*  ENDIF.
ENDFORM.

总结

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词