移动版网站模板,做网站业务好干吗,点击下载app安装,it培训课程系列文章目录 文章目录 系列文章目录[TOC](文章目录) 前言一、概念二、BDC和BAPI数据导入1、BDC数据导入#xff08;录屏#xff09;2、BAPI数据导入 三、实例1、BAPI2、BDC 总结 前言 一、概念
SAP中#xff0c;对一个事务码反复操作并且达到批量处理数据的效果#xff0…系列文章目录 文章目录 系列文章目录[TOC](文章目录) 前言一、概念二、BDC和BAPI数据导入1、BDC数据导入录屏2、BAPI数据导入 三、实例1、BAPI2、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.定义BDCCALL 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-BSTNR4500000056.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_OKCODEBU.
*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_OKCODEYES.
*perform bdc_transaction using ME22.根据上面的BDCDATA调用事务代码CALL TRANSACTION ME22 USING bdcdataME22代表的是事务代码光标落在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填这些的值除了采购订单号和短文本需要我们自己填入其他的都是默认录屏带出的 2perform
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 BDCDATAME22代表的是事务代码光标落在TRANSACTION上按F1可以弹出帮助文档CALL TRANSACTION-USING中有CALL TRANSACTION的语法用法MODE NN-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-BSTNRis_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_OKCODEBU.
perform bdc_field using RM06E-EBELP0010. record-EBELP_002.Item的行项目号* 处理短文本的字段名字lv_pos is_dbc-ebelp2(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_OKCODEYES.
*perform bdc_transaction using ME22.根据上面的BDCDATA调用事务代码CALL TRANSACTION ME22 USING bdcdataME22代表的是事务代码光标落在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.总结