zoukankan      html  css  js  c++  java
  • BAPI和BDC使用小结

    在项目上遇到了要同时用BAPI和BDC更新数据的情况。开发的需求如下:
    ME22N中
    修改采购订单中物料条目的净价和每,然后在物料数据页的供应商物料号中记录旧价格和旧每,同时在EAN/UPC中写入'ZSJ'。

     
    大部分的更新都可以由BAPI完成,但是EAN/UPC在BAPI中找不到对应的字段,而且客户不愿意改字段。一开始看到ME22N这种多条目的事务代码,觉得BDC录屏没法做,但是其实是可以做的,只是比较麻烦。
    下面一点点总结分享。

    BDC部分:

    BDC录屏后,得到的结果基本是没法直接用的,我是通过录了很多次屏,然后东拼西凑、修修改改得出来的。

    录屏的操作流程:其他采购订单->输入采购订单号->确定->项目点击下拉列表选择行项目->修改EAN/UPC->保存,得到的录屏结果如下 :

     

     

    直接录屏的结果是没法用的,必须把红色下划线的部分去掉,保留反而会出错。这些是录屏的时候记录下来的屏幕上一些字段的值,但在程序操作调用BDC的过程中,你无法知道这些字段的具体值是多少,填不对的话反而会出错,所以要去掉。

    而且在填写BDC_FIELD的时候,带BDC_SUBSCR的部分都可以不填写,只要填写一些关于操作和字段赋值的部分就可以了。

    BDC调试:

    BDC需要调试的话就设置模式MODE为A,这样就可以观看前台是怎么样一步一步执行的,便于发现错误。MODE为E是只有发生错误才转到前台,而MODE为N是完全的后台操作。一般先用A或E确认能执行成功后再换成N来执行。

    BDC代码:

     

    总结下BDC的适用范围:

    BDC适用于录制较为单一的操作,并且一般情况下不适用于多条行项目,但是也有例外。在一些特殊的事物代码中,对于行项目的修改也能是一组比较单一的操作,比如ME22N就是每次选择下拉列表,然后修改相应的字段。所以有时候BDC录屏是一件需要业务顾问、技术顾问一起做、互相配合的事。

    BAPI部分:

    由于SAP各个表之间的关联关系非常复杂,一个前台操作可能同时更新了N张表,所以ABAP中严禁直接更新标准表,这会导致不一致性。而为了保持一致性,需要更新和修改的时候则需要使用BAPI。

    BAPI与BDC相比,执行速度会快些、效率会高些,而且比较适合用来更新修改多条行项目的数据。

    BAPI中值得一提的是它的X参数,参数明后代X后缀的参数标示了需要更新哪些相应的字段,所以必须对X参数中需要更新的字段赋值为 X ,否则BAPI并不会更新任何字段。

    X参数:

     

    对需要更新的字段赋值:

     

    另外ABAP中能够支持多个BAPI连续调用,然后同时COMMIT或是ROLLBACK,以此来保证一致性。只需要再调用完BAPI后再调用BAPI_TRANSACTION_COMMIT或是BAPI_TRANSACTION_ROLLBACK。

     

    值得一提的是BAPI_TRANSACTION_COMMIT的WAIT参数。注意:BAPI是异步更新的,所以如果不使用WAIT参数的话,那么它无法保证在执行下条语句时BAPI已经更新成功,这样如果连续两条语句都是写操作,有很大可能会造成读写冲突,比如:我在BAPI执行完后调用BDC,如果不WAIT的话,那么就会有读写冲突,BAPI锁住了一些表或是资源导致BDC无法更新。

  • 相关阅读:
    【Git】为GitHub添加ssh配置
    【Linux】cmake编译指定 gcc/g++
    【Git】提交历史查看
    【AFL(十五)】LAVA-M服务器篇
    Docker实用技巧(五):查看容器占用磁盘大小
    Docker实用技巧(四):限制cpu数量
    【AFL(十四)】afl-plot 使用详解
    【AFL(十三)】afl-whatsup 使用详解
    Docker实用技巧(三):容器与主机之间的端口映射
    【AFL(十二)】make文件管理
  • 原文地址:https://www.cnblogs.com/raychenfj/p/3124942.html
Copyright © 2011-2022 走看看